Codebase list slic3r-prusa / 5dd15c3
Imported Upstream version 1.31.4 Chow Loong Jin 7 years ago
404 changed file(s) with 131155 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
0 Did you encounter an issue with using Slic3r? Fear not! This guide will help you to write a good bug report in just a few, simple steps.
1
2 There is a good chance that the issue, you have encountered, is already reported. Please check the [list of reported issues](https://github.com/alexrj/Slic3r/issues) before creating a new issue report. If you find an existing issue report, feel free to add further information to that report.
3
4 If possible, please include the following information when [reporting an issue](https://github.com/alexrj/Slic3r/issues/new):
5 * Slic3r version (See the about dialog for the version number. If running from git, please include the git commit ID from `git rev-parse HEAD` also.)
6 * Operating system type + version
7 * Steps to reproduce the issue, including:
8 * Command line parameters used, if any
9 * Slic3r configuration file (Use ``Export Config...`` from the ``File`` menu - please don't export a bundle)
10 * Expected result
11 * Actual result
12 * Any error messages
13 * If the issue is related to G-code generation, please include the following:
14 * STL, OBJ or AMF input file (please make sure the input file is not broken, e.g. non-manifold, before reporting a bug)
15 * a screenshot of the G-code layer with the issue (e.g. using [Pronterface](https://github.com/kliment/Printrun))
16
17 Please make sure only to include one issue per report. If you encounter multiple, unrelated issues, please report them as such.
18
19 Simon Tatham has written an excellent on article on [How to Report Bugs Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html) which is well worth reading, although it is not specific to Slic3r.
20
0 ### Version
1 _Version of Slic3r used goes here_
2
3 _Use `About->About Slic3r` for release versions_
4
5 _For -dev versions, use `git describe --tag` or get the hash value for the version you downloaded or `git rev-parse HEAD`_
6
7 ### Operating system type + version
8 _What OS are you using, and state any version #s_
9
10 ### Behavior
11 * _Describe the problem_
12 * _Steps needed to reproduce the problem_
13 * _If this is a command-line slicing issue, include the options used_
14 * _Expected Results_
15 * _Actual Results_
16 * _Screenshots from __*Slic3r*__ preview are preferred_
17
18 _Is this a new feature request?_
19
20 #### STL/Config (.ZIP) where problem occurs
21 _Upload a zipped copy of an STL and your config (`File -> Export Config`)_
0 Build
1 Build.bat
2 MYMETA.json
3 MYMETA.yml
4 _build
5 blib
6 xs/buildtmp
7 *.o
8 MANIFEST.bak
9 xs/MANIFEST.bak
10 xs/assertlib*
11 .init_bundle.ini
0 language: perl
1 install: true
2 script: perl ./Build.PL
3 perl:
4 - "5.14"
5 - "5.18"
6 - "5.20"
7 branches:
8 only:
9 - master
10 - stable
11 sudo: false
12 cache:
13 - apt
14 addons:
15 apt:
16 sources:
17 - boost-latest
18 packages:
19 - libboost-thread1.55-dev
20 - libboost-system1.55-dev
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Config;
6 use File::Spec;
7
8 my %prereqs = qw(
9 Devel::CheckLib 0
10 Encode 0
11 Encode::Locale 1.05
12 ExtUtils::MakeMaker 6.80
13 ExtUtils::ParseXS 3.22
14 File::Basename 0
15 File::Spec 0
16 Getopt::Long 0
17 Module::Build::WithXSpp 0.14
18 Moo 1.003001
19 POSIX 0
20 Scalar::Util 0
21 Test::More 0
22 Thread::Semaphore 0
23 IO::Scalar 0
24 threads 1.96
25 Time::HiRes 0
26 Unicode::Normalize 0
27 );
28 my %recommends = qw(
29 Class::XSAccessor 0
30 XML::SAX::ExpatXS 0
31 Test::Harness 0
32 );
33
34 my $sudo = grep { $_ eq '--sudo' } @ARGV;
35 my $gui = grep { $_ eq '--gui' } @ARGV;
36 my $xs_only = grep { $_ eq '--xs' } @ARGV;
37 if ($gui) {
38 %prereqs = qw(
39 Class::Accessor 0
40 Wx 0.9918
41 Socket 2.016
42 );
43 %recommends = qw(
44 Growl::GNTP 0.15
45 Wx::GLCanvas 0
46 OpenGL <0.70
47 LWP::UserAgent 0
48 Net::Bonjour 0
49 );
50 if ($^O eq 'MSWin32') {
51 $recommends{"Win32::TieRegistry"} = 0;
52
53 # we need an up-to-date Win32::API because older aren't thread-safe (GH #2517)
54 $prereqs{'Win32::API'} = 0.79;
55 }
56 } elsif ($xs_only) {
57 %prereqs = %recommends = ();
58 }
59
60 my @missing_prereqs = ();
61 if ($ENV{SLIC3R_NO_AUTO}) {
62 foreach my $module (sort keys %prereqs) {
63 my $version = $prereqs{$module};
64 next if eval "use $module $version; 1";
65 push @missing_prereqs, $module if exists $prereqs{$module};
66 print "Missing prerequisite $module $version\n";
67 }
68 foreach my $module (sort keys %recommends) {
69 my $version = $recommends{$module};
70 next if eval "use $module $version; 1";
71 print "Missing optional $module $version\n";
72 }
73 } else {
74 my @try = (
75 $ENV{CPANM} // (),
76 File::Spec->catfile($Config{sitebin}, 'cpanm'),
77 File::Spec->catfile($Config{installscript}, 'cpanm'),
78 );
79
80 my $cpanm;
81 foreach my $path (@try) {
82 if (-e $path) { # don't use -x because it fails on Windows
83 $cpanm = $path;
84 last;
85 }
86 }
87 if (!$cpanm) {
88 if ($^O =~ /^(?:darwin|linux)$/ && system(qw(which cpanm)) == 0) {
89 $cpanm = 'cpanm';
90 }
91 }
92 die <<'EOF'
93 cpanm was not found. Please install it before running this script.
94
95 There are several ways to install cpanm, try one of these:
96
97 apt-get install cpanminus
98 curl -L http://cpanmin.us | perl - --sudo App::cpanminus
99 cpan App::cpanminus
100
101 If it is installed in a non-standard location you can do:
102
103 CPANM=/path/to/cpanm perl Build.PL
104
105 EOF
106 if !$cpanm;
107 my @cpanm_args = ();
108 push @cpanm_args, "--sudo" if $sudo;
109
110 # make sure our cpanm is updated (old ones don't support the ~ syntax)
111 system $cpanm, @cpanm_args, 'App::cpanminus';
112
113 # install the Windows-compatible Math::Libm
114 if ($^O eq 'MSWin32' && !eval "use Math::Libm; 1") {
115 system $cpanm, @cpanm_args, 'https://github.com/alexrj/Math-Libm/tarball/master';
116 }
117
118 my %modules = (%prereqs, %recommends);
119 foreach my $module (sort keys %modules) {
120 my $version = $modules{$module};
121 my @cmd = ($cpanm, @cpanm_args);
122
123 # temporary workaround for upstream bug in test
124 push @cmd, '--notest'
125 if $module =~ /^(?:OpenGL|Math::PlanePath|Test::Harness)$/;
126
127 push @cmd, "$module~$version";
128 if ($module eq 'XML::SAX::ExpatXS' && $^O eq 'MSWin32') {
129 my $mingw = 'C:\dev\CitrusPerl\mingw64';
130 $mingw = 'C:\dev\CitrusPerl\mingw32' if !-d $mingw;
131 if (!-d $mingw) {
132 print "Could not find the MinGW directory at $mingw; skipping XML::SAX::ExpatXS (only needed for faster parsing of AMF files)\n";
133 } else {
134 push @cmd, sprintf('--configure-args="EXPATLIBPATH=%s\lib EXPATINCPATH=%s\include"', $mingw, $mingw);
135 }
136 }
137 my $res = system @cmd;
138 if ($res != 0) {
139 if (exists $prereqs{$module}) {
140 push @missing_prereqs, $module;
141 } else {
142 printf "Don't worry, this module is optional.\n";
143 }
144 }
145 }
146
147 if (!$gui) {
148 # clean xs directory before reinstalling, to make sure Build is called
149 # with current perl binary
150 if (-e './xs/Build') {
151 if ($^O eq 'MSWin32') {
152 system '.\xs\Build', 'distclean';
153 } else {
154 system './xs/Build', 'distclean';
155 }
156 }
157 my $res = system $cpanm, @cpanm_args, '--reinstall', '--verbose', './xs';
158 if ($res != 0) {
159 die "The XS/C++ code failed to compile, aborting\n";
160 }
161 }
162 }
163
164 if (@missing_prereqs) {
165 printf "The following prerequisites failed to install: %s\n", join(', ', @missing_prereqs);
166 exit 1;
167 } elsif (!$gui) {
168 eval "use App::Prove; 1" or die "Failed to load App::Prove";
169 my $res = App::Prove->new->run ? 0 : 1;
170 if ($res == 0) {
171 print "If you also want to use the GUI you can now run `perl Build.PL --gui` to install the required modules.\n";
172 } else {
173 print "Some tests failed. Please report the failure to the author!\n";
174 }
175 exit $res;
176 }
177
178 __END__
0 _Q: Oh cool, a new RepRap slicer?_
1
2 A: Yes.
3
4 Slic3r [![Build Status](https://travis-ci.org/alexrj/Slic3r.png?branch=master)](https://travis-ci.org/alexrj/Slic3r)
5 ======
6
7 Slic3r takes 3D models (STL, OBJ, AMF) and converts them into G-code instructions for
8 3D printers. It's compatible with any modern printer based on the RepRap toolchain,
9 including all those based on the Marlin, Sprinter and Repetier firmware. It also works
10 with Mach3, LinuxCNC and Machinekit controllers.
11
12 See the [project homepage](http://slic3r.org/) at slic3r.org and the
13 [manual](http://manual.slic3r.org/) for more information.
14
15 ### What language is it written in?
16
17 The core geometric algorithms and data structures are written in C++,
18 and Perl is used for high-level flow abstraction, GUI and testing.
19 If you're wondering why Perl, see http://xkcd.com/224/
20
21 The C++ API is public and its use in other projects is encouraged.
22 The goal is to make Slic3r fully modular so that any part of its logic
23 can be used separately.
24
25 ### What are Slic3r's main features?
26
27 Key features are:
28
29 * **multi-platform** (Linux/Mac/Win) and packaged as standalone-app with no dependencies required
30 * complete **command-line interface** to use it with no GUI
31 * multi-material **(multiple extruders)** object printing
32 * multiple G-code flavors supported (RepRap, Makerbot, Mach3, Machinekit etc.)
33 * ability to plate **multiple objects having distinct print settings**
34 * **multithread** processing
35 * **STL auto-repair** (tolerance for broken models)
36 * wide automated unit testing
37
38 Other major features are:
39
40 * combine infill every 'n' perimeters layer to speed up printing
41 * **3D preview** (including multi-material files)
42 * **multiple layer heights** in a single print
43 * **spiral vase** mode for bumpless vases
44 * fine-grained configuration of speed, acceleration, extrusion width
45 * several infill patterns including honeycomb, spirals, Hilbert curves
46 * support material, raft, brim, skirt
47 * **standby temperature** and automatic wiping for multi-extruder printing
48 * customizable **G-code macros** and output filename with variable placeholders
49 * support for **post-processing scripts**
50 * **cooling logic** controlling fan speed and dynamic print speed
51
52 ### How to install?
53
54 You can just download a precompiled package from [slic3r.org](http://slic3r.org/);
55 it will run without the need for any dependency.
56
57 If you want to compile the source yourself just do the following (checkout
58 [slic3r.org](http://slic3r.org/download) for more details):
59
60 ```
61 $ git clone https://github.com/alexrj/Slic3r.git
62 $ cd Slic3r
63 $ perl Build.PL --sudo
64 $ perl Build.PL --sudo --gui
65 $ ./slic3r.pl
66 ```
67
68 ### Can I help?
69
70 Sure! Drop me a line at aar@cpan.org. You can also
71 find me in #reprap and in #slic3r on FreeNode with the nickname _Sound_.
72 Before sending patches and pull requests contact me to discuss your proposed
73 changes: this way we'll ensure nobody wastes their time and no conflicts arise
74 in development.
75
76 ### What's Slic3r license?
77
78 Slic3r is licensed under the _GNU Affero General Public License, version 3_.
79 The author is Alessandro Ranellucci.
80
81 The [Silk icon set](http://www.famfamfam.com/lab/icons/silk/) used in Slic3r is
82 licensed under the _Creative Commons Attribution 3.0 License_.
83 The author of the Silk icon set is Mark James.
84
85 ### How can I invoke slic3r.pl using the command line?
86
87 Usage: slic3r.pl [ OPTIONS ] [ file.stl ] [ file2.stl ] ...
88
89 --help Output this usage screen and exit
90 --version Output the version of Slic3r and exit
91 --save <file> Save configuration to the specified file
92 --load <file> Load configuration from the specified file. It can be used
93 more than once to load options from multiple files.
94 -o, --output <file> File to output gcode to (by default, the file will be saved
95 into the same directory as the input file using the
96 --output-filename-format to generate the filename.) If a
97 directory is specified for this option, the output will
98 be saved under that directory, and the filename will be
99 generated by --output-filename-format.
100
101 Non-slicing actions (no G-code will be generated):
102 --repair Repair given STL files and save them as <name>_fixed.obj
103 --cut <z> Cut given input files at given Z (relative) and export
104 them as <name>_upper.stl and <name>_lower.stl
105 --split Split the shells contained in given STL file into several STL files
106 --info Output information about the supplied file(s) and exit
107
108 -j, --threads <num> Number of threads to use (1+, default: 2)
109
110 GUI options:
111 --gui Forces the GUI launch instead of command line slicing (if you
112 supply a model file, it will be loaded into the plater)
113 --no-plater Disable the plater tab
114 --gui-mode Overrides the configured mode (simple/expert)
115 --autosave <file> Automatically export current configuration to the specified file
116
117 Output options:
118 --output-filename-format
119 Output file name format; all config options enclosed in brackets
120 will be replaced by their values, as well as [input_filename_base]
121 and [input_filename] (default: [input_filename_base].gcode)
122 --post-process Generated G-code will be processed with the supplied script;
123 call this more than once to process through multiple scripts.
124 --export-svg Export a SVG file containing slices instead of G-code.
125 -m, --merge If multiple files are supplied, they will be composed into a single
126 print rather than processed individually.
127
128 Printer options:
129 --nozzle-diameter Diameter of nozzle in mm (default: 0.5)
130 --print-center Coordinates in mm of the point to center the print around
131 (default: 100,100)
132 --z-offset Additional height in mm to add to vertical coordinates
133 (+/-, default: 0)
134 --gcode-flavor The type of G-code to generate (reprap/teacup/makerware/sailfish/mach3/machinekit/no-extrusion,
135 default: reprap)
136 --use-relative-e-distances Enable this to get relative E values (default: no)
137 --use-firmware-retraction Enable firmware-controlled retraction using G10/G11 (default: no)
138 --use-volumetric-e Express E in cubic millimeters and prepend M200 (default: no)
139 --gcode-arcs Use G2/G3 commands for native arcs (experimental, not supported
140 by all firmwares)
141 --gcode-comments Make G-code verbose by adding comments (default: no)
142 --pressure-advance Adjust pressure using the experimental advance algorithm (K constant,
143 set zero to disable; default: 0)
144
145 Filament options:
146 --filament-diameter Diameter in mm of your raw filament (default: 3)
147 --extrusion-multiplier
148 Change this to alter the amount of plastic extruded. There should be
149 very little need to change this value, which is only useful to
150 compensate for filament packing (default: 1)
151 --temperature Extrusion temperature in degree Celsius, set 0 to disable (default: 200)
152 --first-layer-temperature Extrusion temperature for the first layer, in degree Celsius,
153 set 0 to disable (default: same as --temperature)
154 --bed-temperature Heated bed temperature in degree Celsius, set 0 to disable (default: 0)
155 --first-layer-bed-temperature Heated bed temperature for the first layer, in degree Celsius,
156 set 0 to disable (default: same as --bed-temperature)
157
158 Speed options:
159 --travel-speed Speed of non-print moves in mm/s (default: 130)
160 --perimeter-speed Speed of print moves for perimeters in mm/s (default: 30)
161 --small-perimeter-speed
162 Speed of print moves for small perimeters in mm/s or % over perimeter speed
163 (default: 30)
164 --external-perimeter-speed
165 Speed of print moves for the external perimeter in mm/s or % over perimeter speed
166 (default: 70%)
167 --infill-speed Speed of print moves in mm/s (default: 60)
168 --solid-infill-speed Speed of print moves for solid surfaces in mm/s or % over infill speed
169 (default: 60)
170 --top-solid-infill-speed Speed of print moves for top surfaces in mm/s or % over solid infill speed
171 (default: 50)
172 --support-material-speed
173 Speed of support material print moves in mm/s (default: 60)
174 --support-material-interface-speed
175 Speed of support material interface print moves in mm/s or % over support material
176 speed (default: 100%)
177 --bridge-speed Speed of bridge print moves in mm/s (default: 60)
178 --gap-fill-speed Speed of gap fill print moves in mm/s (default: 20)
179 --first-layer-speed Speed of print moves for bottom layer, expressed either as an absolute
180 value or as a percentage over normal speeds (default: 30%)
181
182 Acceleration options:
183 --perimeter-acceleration
184 Overrides firmware's default acceleration for perimeters. (mm/s^2, set zero
185 to disable; default: 0)
186 --infill-acceleration
187 Overrides firmware's default acceleration for infill. (mm/s^2, set zero
188 to disable; default: 0)
189 --bridge-acceleration
190 Overrides firmware's default acceleration for bridges. (mm/s^2, set zero
191 to disable; default: 0)
192 --first-layer-acceleration
193 Overrides firmware's default acceleration for first layer. (mm/s^2, set zero
194 to disable; default: 0)
195 --default-acceleration
196 Acceleration will be reset to this value after the specific settings above
197 have been applied. (mm/s^2, set zero to disable; default: 0)
198
199 Accuracy options:
200 --layer-height Layer height in mm (default: 0.3)
201 --first-layer-height Layer height for first layer (mm or %, default: 0.35)
202 --infill-every-layers
203 Infill every N layers (default: 1)
204 --solid-infill-every-layers
205 Force a solid layer every N layers (default: 0)
206
207 Print options:
208 --perimeters Number of perimeters/horizontal skins (range: 0+, default: 3)
209 --top-solid-layers Number of solid layers to do for top surfaces (range: 0+, default: 3)
210 --bottom-solid-layers Number of solid layers to do for bottom surfaces (range: 0+, default: 3)
211 --solid-layers Shortcut for setting the two options above at once
212 --fill-density Infill density (range: 0%-100%, default: 40%)
213 --fill-angle Infill angle in degrees (range: 0-90, default: 45)
214 --fill-pattern Pattern to use to fill non-solid layers (default: honeycomb)
215 --solid-fill-pattern Pattern to use to fill solid layers (default: rectilinear)
216 --start-gcode Load initial G-code from the supplied file. This will overwrite
217 the default command (home all axes [G28]).
218 --end-gcode Load final G-code from the supplied file. This will overwrite
219 the default commands (turn off temperature [M104 S0],
220 home X axis [G28 X], disable motors [M84]).
221 --before-layer-gcode Load before-layer-change G-code from the supplied file (default: nothing).
222 --layer-gcode Load after-layer-change G-code from the supplied file (default: nothing).
223 --toolchange-gcode Load tool-change G-code from the supplied file (default: nothing).
224 --seam-position Position of loop starting points (random/nearest/aligned, default: aligned).
225 --external-perimeters-first Reverse perimeter order. (default: no)
226 --spiral-vase Experimental option to raise Z gradually when printing single-walled vases
227 (default: no)
228 --only-retract-when-crossing-perimeters
229 Disable retraction when travelling between infill paths inside the same island.
230 (default: no)
231 --solid-infill-below-area
232 Force solid infill when a region has a smaller area than this threshold
233 (mm^2, default: 70)
234 --infill-only-where-needed
235 Only infill under ceilings (default: no)
236 --infill-first Make infill before perimeters (default: no)
237
238 Quality options (slower slicing):
239 --extra-perimeters Add more perimeters when needed (default: yes)
240 --ensure_vertical_shell_thickness Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers). (default: no)
241 --avoid-crossing-perimeters Optimize travel moves so that no perimeters are crossed (default: no)
242 --thin-walls Detect single-width walls (default: yes)
243 --overhangs Experimental option to use bridge flow, speed and fan for overhangs
244 (default: yes)
245
246 Support material options:
247 --support-material Generate support material for overhangs
248 --support-material-threshold
249 Overhang threshold angle (range: 0-90, set 0 for automatic detection,
250 default: 0)
251 --support-material-pattern
252 Pattern to use for support material (default: honeycomb)
253 --support-material-spacing
254 Spacing between pattern lines (mm, default: 2.5)
255 --support-material-angle
256 Support material angle in degrees (range: 0-90, default: 0)
257 --support-material-contact-distance
258 Vertical distance between object and support material
259 (0+, default: 0.2)
260 --support-material-interface-layers
261 Number of perpendicular layers between support material and object (0+, default: 3)
262 --support-material-interface-spacing
263 Spacing between interface pattern lines (mm, set 0 to get a solid layer, default: 0)
264 --raft-layers Number of layers to raise the printed objects by (range: 0+, default: 0)
265 --support-material-enforce-layers
266 Enforce support material on the specified number of layers from bottom,
267 regardless of --support-material and threshold (0+, default: 0)
268 --dont-support-bridges
269 Experimental option for preventing support material from being generated under bridged areas (default: yes)
270
271 Retraction options:
272 --retract-length Length of retraction in mm when pausing extrusion (default: 1)
273 --retract-speed Speed for retraction in mm/s (default: 30)
274 --retract-restart-extra
275 Additional amount of filament in mm to push after
276 compensating retraction (default: 0)
277 --retract-before-travel
278 Only retract before travel moves of this length in mm (default: 2)
279 --retract-lift Lift Z by the given distance in mm when retracting (default: 0)
280 --retract-lift-above Only lift Z when above the specified height (default: 0)
281 --retract-lift-below Only lift Z when below the specified height (default: 0)
282 --retract-layer-change
283 Enforce a retraction before each Z move (default: no)
284 --wipe Wipe the nozzle while doing a retraction (default: no)
285
286 Retraction options for multi-extruder setups:
287 --retract-length-toolchange
288 Length of retraction in mm when disabling tool (default: 10)
289 --retract-restart-extra-toolchange
290 Additional amount of filament in mm to push after
291 switching tool (default: 0)
292
293 Cooling options:
294 --cooling Enable fan and cooling control
295 --min-fan-speed Minimum fan speed (default: 35%)
296 --max-fan-speed Maximum fan speed (default: 100%)
297 --bridge-fan-speed Fan speed to use when bridging (default: 100%)
298 --fan-below-layer-time Enable fan if layer print time is below this approximate number
299 of seconds (default: 60)
300 --slowdown-below-layer-time Slow down if layer print time is below this approximate number
301 of seconds (default: 30)
302 --min-print-speed Minimum print speed (mm/s, default: 10)
303 --disable-fan-first-layers Disable fan for the first N layers (default: 1)
304 --fan-always-on Keep fan always on at min fan speed, even for layers that don't need
305 cooling
306
307 Skirt options:
308 --skirts Number of skirts to draw (0+, default: 1)
309 --skirt-distance Distance in mm between innermost skirt and object
310 (default: 6)
311 --skirt-height Height of skirts to draw (expressed in layers, 0+, default: 1)
312 --min-skirt-length Generate no less than the number of loops required to consume this length
313 of filament on the first layer, for each extruder (mm, 0+, default: 0)
314 --brim-width Width of the brim that will get added to each object to help adhesion
315 (mm, default: 0)
316
317 Transform options:
318 --scale Factor for scaling input object (default: 1)
319 --rotate Rotation angle in degrees (0-360, default: 0)
320 --duplicate Number of items with auto-arrange (1+, default: 1)
321 --duplicate-grid Number of items with grid arrangement (default: 1,1)
322 --duplicate-distance Distance in mm between copies (default: 6)
323 --dont-arrange Don't arrange the objects on the build plate. The model coordinates
324 define the absolute positions on the build plate.
325 The option --print-center will be ignored.
326 --xy-size-compensation
327 Grow/shrink objects by the configured absolute distance (mm, default: 0)
328
329 Sequential printing options:
330 --complete-objects When printing multiple objects and/or copies, complete each one before
331 starting the next one; watch out for extruder collisions (default: no)
332 --extruder-clearance-radius Radius in mm above which extruder won't collide with anything
333 (default: 20)
334 --extruder-clearance-height Maximum vertical extruder depth; i.e. vertical distance from
335 extruder tip and carriage bottom (default: 20)
336
337 Miscellaneous options:
338 --notes Notes to be added as comments to the output file
339 --resolution Minimum detail resolution (mm, set zero for full resolution, default: 0)
340
341 Flow options (advanced):
342 --extrusion-width Set extrusion width manually; it accepts either an absolute value in mm
343 (like 0.65) or a percentage over layer height (like 200%)
344 --first-layer-extrusion-width
345 Set a different extrusion width for first layer
346 --perimeter-extrusion-width
347 Set a different extrusion width for perimeters
348 --external-perimeter-extrusion-width
349 Set a different extrusion width for external perimeters
350 --infill-extrusion-width
351 Set a different extrusion width for infill
352 --solid-infill-extrusion-width
353 Set a different extrusion width for solid infill
354 --top-infill-extrusion-width
355 Set a different extrusion width for top infill
356 --support-material-extrusion-width
357 Set a different extrusion width for support material
358 --infill-overlap Overlap between infill and perimeters (default: 15%)
359 --bridge-flow-ratio Multiplier for extrusion when bridging (> 0, default: 1)
360
361 Multiple extruder options:
362 --extruder-offset Offset of each extruder, if firmware doesn't handle the displacement
363 (can be specified multiple times, default: 0x0)
364 --perimeter-extruder
365 Extruder to use for perimeters and brim (1+, default: 1)
366 --infill-extruder Extruder to use for infill (1+, default: 1)
367 --solid-infill-extruder Extruder to use for solid infill (1+, default: 1)
368 --support-material-extruder
369 Extruder to use for support material, raft and skirt (1+, default: 1)
370 --support-material-interface-extruder
371 Extruder to use for support material interface (1+, default: 1)
372 --ooze-prevention Drop temperature and park extruders outside a full skirt for automatic wiping
373 (default: no)
374 --ooze-prevention Drop temperature and park extruders outside a full skirt for automatic wiping
375 (default: no)
376 --standby-temperature-delta
377 Temperature difference to be applied when an extruder is not active and
378 --ooze-prevention is enabled (default: -5)
379
380
381 If you want to change a preset file, just do
382
383 slic3r.pl --load config.ini --layer-height 0.25 --save config.ini
384
385 If you want to slice a file overriding an option contained in your preset file:
386
387 slic3r.pl --load config.ini --layer-height 0.25 file.stl
0 How to build Slic3r on Mac OS X 10.7 Lion 64bit
1 ---------------------------------------------
2 Vojtech Bubnik, 2016-04-26
3
4
5 1) Install Mac OS X 10.7 Lion 64 bit with X Code
6 ------------------------------------------------
7
8 One has to build the OSX Slic3r on a real Mac, either directly on the system, or on a virtualized OSX. On Mac, two commercial solutions are available to legally virtualize MacOS on MacOS:
9 http://www.parallels.com/eu/products/desktop/
10 http://www.vmware.com/products/workstation/
11
12 Installation of a X Code on an OS X 10.7 Lion needs a bit of work. The latest X Code supported by the Lion on a Virtual Box is 4.21. The trouble is, the certificates of the X Code 4.21 installation package expired. One way to work around the certificate is to flatten the installation package by unpacking and repacking it:
13 pkgutil --expand Foobar.pkg foobar
14 pkgutil --flatten foobar barfoo.pkg
15
16 The flattened package is available here:
17 \\rs.prusa\Development\Slic3r-Prusa\installxcode_421_lion_fixed.pkg
18
19 This installer does not install the X Code directly. Instead, it installs another installer with a set of 47 pkg files. These files have their certificates expired as well. You will find the packages on your MacOS here:
20 /Applications/Install Xcode.app/Contents/Resources/Packages/
21
22 It is best to flatten them in a loop:
23 cd /Applications/Install\ Xcode.app/Contents/Resources/Packages/
24 for f in *.pkg; do
25 pkgutil --expand $f /tmp/$f
26 rm -f $f
27 pkgutil --flatten /tmp/$f $f
28 done
29
30 After that, you may finish the installation of Xcode by running
31 /Applications/Install\ Xcode.app
32
33
34 1b) Installing the Xcode on a newer system
35 -------------------------------------------
36 You will need to register as an Apple developer on
37 https://developer.apple.com/
38 log in and download and install Xcode
39 https://developer.apple.com/downloads/
40 You will likely need to download and install Xcode Command Line Tools, though the Xcode 4.1 came with the command line tools installed.
41
42
43 2) Prepare the development environment
44 --------------------------------------
45
46 Install the brew package manager:
47 http://brew.sh/
48 The brew package manager requires the git command line tool. Normally the git tool is installed as part of the Xcode command line tools.
49 Copy and execute a command line from the top of http://brew.sh/ . It is possible, that the invocation of git fails because of some parameters the old git does not recognize. If so, invoke the git call manually.
50
51 Compile the boost library using brew. Following line compiles a 64bit boost with both static and shared libraries.
52 brew install boost --universal
53
54 Install dylibbundler tool. The dylibbundler tool serves to collect dependent dynamic libraries and fix their linkage. Execute
55 brew install dylibbundler
56
57 3) Install perl
58 ---------------
59
60 We don't want to distribute perl pre-installed on the Mac OS box. First, the system perl installation is not correct on some Mac OS versions, second it is not rellocatable. To compile a 64bit rellocatable perl, we use the perlbrew distribution. The perlbrew distribution installs into a user home directory and it allows switching between multiple versions of perl.
61 http://perlbrew.pl/
62
63 First install perlbrew
64 \curl -L http://install.perlbrew.pl | bash
65 Then compile the newest perl with the rellocatable @INC path and with multithreading enabled, execute following line:
66 perlbrew install --threads -Duserelocatableinc --switch perl-5.22.0
67 The --switch parameter switches the active perl to the currently compiled one.
68 Available perl versions could be listed by calling
69 perlbrew available
70
71 Initialize CPAN, install PAR and PAR::Packer modules
72 execute cpan command, from the cpan prompt, run
73 install App::cpanminus
74 install PAR
75 install PAR::Packer
76 quit
77
78 4) Download and install Slic3r
79 ------------------------------
80
81 git clone git://github.com/alexrj/Slic3r
82 cd Slic3r
83 perl Build.PL
84
85 Now Slic3r shall be compiled. You may try to execute
86 perl slic3r.pl
87 to get a help screen, or
88 perl slic3r.pl some_model.stl
89 to have the model sliced.
90
91 5) Download and compile the GUI libraries needed to execute Slic3r in GUI mode
92 ------------------------------------------------------------------------------
93
94 For the current Slic3r 1.2.30 code base, set the environment variable SLIC3R_STATIC to link a static version of the boost library:
95 export SLIC3R_STATIC=1
96
97 then execute
98 perl Build.PL --gui
99 and keep your fingers crossed. The Build.PL script downloads and compiles the WxWidgets 3.0 through a Alien::Wx PERL package. The WxWidget shared libraries will land into
100 ~/perl5/perlbrew/perls/perl-5.22.1/lib/site_perl/5.22.1/darwin-thread-multi-2level/Alien/wxWidgets/
101
102 On Maverics, we experienced following issue compiling WxPerl:
103 http://wiki.bolay.net/doku.php?id=acdsn:acdsn-a:mac
104
105 Now you could run the GUI version of slic3r by calling
106 perl slic3r.pl --gui
107 If some dependency is missing, the MacOS system will let you know.
108
109 6) Packing the Slic3r
110 ---------------------
111
112 Perl is an operating system on its own. Many modules are shared among multiple applications and it is difficult to extract a stand-alone application from a perl installation manually. Fortunately, tools are available, which automate the process to some extent. One of the tools is the PAR::Packer. The PAR::Packer tool (pp executable) is able to create a standalone executable for a perl script. The standalone executable contains a PAR archive (a zip file) bundled with a perl interpreter. When executed, the bundled executable will decompress most of the PAR archive into a temp folder. Because of that, we will use the PAR::Packer to resolve and collect the dependencies, but we will create an installer manually.
113
114 The PAR::Packer could analyze the dependencies by a statical analysis, or at a runtime. The statical analysis does not resolve the dynamically loaded modules. On the other side, the statical analysis is pessimistic, therefore it often collects unneeded packages. The dynamic analysis may miss some package, if not all branches of a code are executed. We will try to solely depend on the dynamic analysis to keep the installation size minimal. We may need to develop a protocol or an automatic UI tool to exercise as much as possible from the Slic3r GUI to pack the GUI version reliably. Once a reliable list of dependencies is collected, we may not need the PAR::Packer anymore.
115
116 To create a PAR archive of a command line slic3r, execute
117 pp -e -p -x slic3r.pl --xargs cube.stl -o slic3r.par
118 and let the slic3r slice a cube.stl to load the dynamic modules.
119
120 To create a PAR archive of a GUI slic3r, execute
121 pp -e -p -x slic3r.pl --xargs --gui -o slic3r.par
122 and exercise the slic3r gui to load all modules.
123
124 Rename the slic3r.par file to slic3r.zip and decompress. Most of the code needed to execute Slic3r is there, only the perl executable is missing for the command line slic3r, and the WxWidgets shared libraries and the liblzma shared library are missing for the GUI version.
125
126 7) Collecting the dependent shared libraries, making the link paths relative
127 ----------------------------------------------------------------------------
128
129 We have linked Slic3r against a static boost library, therefore the command line slic3r is not dependent on any non-system shared library. The situation is different for the GUI slic3r, which links dynamically against WxWidgets and liblzma.
130
131 The trick developed by Apple to allow rellocable shared libraries is to addres a shared library relatively to the path of the executable by encoding a special token @executable_path at the start of the path. Unfortunately the libraries requried by Slic3r are compiled with absolute paths.
132
133 Once the slic3r.par archive is unpacked, one may list the native shared libraries by
134 find ./ -name '*.bundle'
135 and one may list the dependencies by running
136 otool -L somefile.bundle
137 Most of the dependencies point to system directores and these dependences are always fulfilled. Dependencies pointing to the WxWidget libraries need to be fixed. These have a form
138 ~/perlbrew/perls/perl-5.22.1/lib/site_perl/5.22.1/darwin-thread-multi-2level/Alien/wxWidgets/osx_cocoa_3_0_2_uni/lib/libwx_*.dylib
139 and we need to replace them with
140 @executable_path/../Frameworks/libwx_*.dylib
141 Another dependency, which needs our attention is
142 /usr/local/Cellar/xz/5.2.2/lib/liblzma.5.dylib
143
144 Fortunately, a tool dylibbundler was developed to address this problem.
145 First install dylibbundler by calling
146 brew dylibbundler
147
148 For some installations, the dylibbundler tool sufficiently fixes all dependencies. Unfortunately, the WxWidgets installation is inconsistent in the versioning, therefore a certain clean-up is required. Namely, the WxWidgets libraries are compiled with the full build number in their file name. For example, the base library is built as libwx_baseu-3.0.0.2.0.dylib and a symlink is created libwx_baseu-3.0.dylib pointing to the full name. Then some of the Wx libraries link against the full name and some against the symlink, leading the dylibbundler to pack both. We solved the problem by whipping up a following script:
149 \\rs.prusa\Development\Slic3r-Prusa\How_to_build_on_MacOSX_Lion\fix_dependencies.sh
150
151 call
152 slic3r_dependencies.sh --fix
153 to collect the shared libraries into Content/Frameworks and to fix their linkage.
154
155 call
156 slic3r_dependencies.sh --show
157 to list dependent libraries in a sorted order. All the non-system dependencies shall start with @executable_path after the fix.
158
159
160
161 8) Packing Slic3r into a dmg image using a bunch of scripts
162 -----------------------------------------------------------
163
164 Instead of relying on the PAR::Packer to collect the dependencies, we have used PAR::Packer to extract the dependencies, we manually cleaned them up and created an installer script.
165 \\rs.prusa\Development\Slic3r-Prusa\How_to_build_on_MacOSX_Lion\Slic3r-Build-MacOS
166 First compile Slic3r, then call build_dmg.sh with a path to the Slic3r source tree as a parameter.
167 The script will collect all dependencies into Slic3r.app and it will create Slic3r.dmg.
168 If SLIC3R_GUI variable is defined, a GUI variant of Slic3r will be packed.
169
170
171
172
173 How to build on Windows
174 -----------------------
175
176 The prefered perl distribution on MS Windows is the Strawberry Perl 5.22.1.3 (32bit)
177 http://strawberryperl.com/
178
179 Let it install into c:\strawberry
180 You may make a copy of the distribution. We recommend to make following copies:
181 For a release command line only build: c:\strawberry-minimal
182 For a release GUI build: c:\strawberry-minimal-gui
183 For a development build with debugging information: c:\strawberry-debug
184 and to make one of them active by making a directory junction:
185 mklink /d c:\Strawberry c:\Strawberry-debug
186
187 Building boost:
188 Slic3r seems to have a trouble with the latest boost 1.60.0 on Windows. Please use 1.59.
189 Decompress it to
190 c:\dev\
191 otherwise it will not be found by the Build.PL on Windows. You may consider to hack xs\Build.PL with your prefered boost path.
192 run
193 bootstrap.bat mingw
194 b2 toolset=gcc
195
196 Install git command line
197 https://git-scm.com/
198
199 Download Slic3r source code
200 git clone git://github.com/alexrj/Slic3r.git
201
202 Run compilation
203 cd Slic3r
204 perl Build.PL
205 perl Build.PL --gui
206
207 With a bit of luck, you will end up with a working Slic3r including GUI.
208
209
210
211
212 Packing on Windows
213 ------------------
214
215 Life is easy on Windows. PAR::Packer will help again to collect the dependencies. The basic procedure is the same as for MacOS:
216
217 To create a PAR archive of a command line slic3r, execute
218 pp -e -p -x slic3r.pl --xargs cube.stl -o slic3r.par
219 and let the slic3r slice a cube.stl to load the dynamic modules.
220
221 To create a PAR archive of a GUI slic3r, execute
222 pp -e -p -x slic3r.pl --xargs --gui -o slic3r.par
223 and exercise the slic3r gui to load all modules.
224
225 The standalone installation is then created from the PAR archive by renaming it into a zip and adding following binaries from c:\strawberry to the root of the extracted zip:
226 perl5.22.1.exe
227 perl522.dll
228 libgcc_s_sjlj-1.dll
229 libstdc++-6.dll
230 libwinpthread-1.dll
231
232 The GUI build requires following DLLs in addition:
233 libglut-0_.dll
234 wxbase30u_gcc_custom.dll
235 wxmsw30u_adv_gcc_custom.dll
236 wxmsw30u_core_gcc_custom.dll
237 wxmsw30u_gl_gcc_custom.dll
238 wxmsw30u_html_gcc_custom.dll
239
240 and the var directory with the icons needs to be copied to the destination directory.
241
242 To run the slic3r, move the script\slic3r.pl one level up and create a following tiny windows batch in the root of the unpacked zip:
243 @perl5.22.1.exe slic3r.pl %*
244 A windows shortcut may be created for the GUI version. Instead of the perl.exe, it is better to use the wperl.exe to start the GUI Slic3r, because it does not open a text console.
245
246 The strawberry perl is already rellocatable, which means that the perl interpreter will find the perl modules in the lib directory,
247 and Windows look up the missing DLLs in the directory of the executable, therefore no further rellocation effort is necessary.
248
249
250 Packing on Windows, a single EXE solution
251 -----------------------------------------
252
253 One may try to create a PAR executable for command line slic3r:
254 pp -M Encode::Locale -M Moo -M Thread::Semaphore -M Slic3r::XS -M Unicode::Normalize -o slic3r.exe slic3r.pl
255
256 One may as well create a PAR executable for Windows GUI:
257 pp -M Encode::Locale -M Moo -M Thread::Semaphore -M OpenGL -M Slic3r::XS -M Unicode::Normalize -M Wx -M Class::Accessor -M Wx::DND -M Wx::Grid -M Wx::Print -M Wx::Html -M Wx::GLCanvas -M Math::Trig -M threads -M threads::shared -M Thread::Queue -l C:\strawberry\perl\site\lib\auto\Wx\Wx.xs.dll -o -l C:\strawberry\perl\site\lib\Alien\wxWidgets\msw_3_0_2_uni_gcc_3_4\lib\wxbase30u_gcc_custom.dll -l C:\strawberry\perl\site\lib\Alien\wxWidgets\msw_3_0_2_uni_gcc_3_4\lib\wxmsw30u_core_gcc_custom.dll -l C:\strawberry\perl\site\lib\Alien\wxWidgets\msw_3_0_2_uni_gcc_3_4\lib\wxmsw30u_gl_gcc_custom.dll -l C:\strawberry\perl\site\lib\Alien\wxWidgets\msw_3_0_2_uni_gcc_3_4\lib\wxmsw30u_adv_gcc_custom.dll -l C:\strawberry\perl\site\lib\Alien\wxWidgets\msw_3_0_2_uni_gcc_3_4\lib\wxmsw30u_html_gcc_custom.dll -o slic3r.exe slic3r.pl
258
259 Remember, that these executables will unpack into a temporary directory. The directory may be declared by setting an environment variable PAR_GLOBAL_TEMP. Otherwise the temporaries are unpacked into
260 C:\Users\xxx\AppData\Local\Temp\par-xxxxxx
261
262
263 Debugging the perl, debugging on Windows
264 ----------------------------------------
265
266 It is possible to debug perl using the integrated debugger. The EPIC plugin for Eclipse works very well with an older eclipse-SDK-3.6.2. There is a catch though: The Perl debugger does not work correctly with multiple threads running under the Perl interpreter. If that happens, the EPIC plugin gets confused and the debugger stops working. The same happens with the Komodo IDE.
267
268 Debugging the C++ code works fine using the latest Eclipse for C++ and the gdb of MinGW. The gdb packed with the Strawberry distribution does not contain the Python support, so pretty printing of the stl containers only works if another gdb build is used. The one of the QT installation works well.
269
270 It is yet a bit more complicated. The Strawberry MINGW is compiled for a different C++ exception passing model (SJLJ) than the other MINGWs, so one cannot simply combine MINGWs on Windows. For an unknown reason the nice debugger of the QT Creator hangs when debugging the C++ compiled by the Strawberry MINGW. Mabe it is because of the different exception passing models.
271
272 And to disable optimization of the C/C++ code, one has to manually modify Config_heavy.pl in the Perl central installation. The SLIC3R_DEBUG environment variable did not override all the -O2 and -O3 flags that the perl build adds the gcc execution line.
0 # Extends C++ class Slic3r::DynamicPrintConfig
1 # This perl class does not keep any perl class variables,
2 # all the storage is handled by the underlying C++ code.
3 package Slic3r::Config;
4 use strict;
5 use warnings;
6 use utf8;
7
8 use List::Util qw(first max);
9
10 # cemetery of old config settings
11 our @Ignore = qw(duplicate_x duplicate_y multiply_x multiply_y support_material_tool acceleration
12 adjust_overhang_flow standby_temperature scale rotate duplicate duplicate_grid
13 rotate scale duplicate_grid start_perimeters_at_concave_points start_perimeters_at_non_overhang
14 randomize_start seal_position bed_size print_center g0 vibration_limit);
15
16 # C++ Slic3r::PrintConfigDef exported as a Perl hash of hashes.
17 # The C++ counterpart is a constant singleton.
18 our $Options = print_config_def();
19
20 # overwrite the hard-coded readonly value (this information is not available in XS)
21 $Options->{threads}{readonly} = !$Slic3r::have_threads;
22
23 # generate accessors
24 {
25 no strict 'refs';
26 for my $opt_key (keys %$Options) {
27 *{$opt_key} = sub { $_[0]->get($opt_key) };
28 }
29 }
30
31 # Fill in the underlying C++ Slic3r::DynamicPrintConfig with the content of the defaults
32 # provided by the C++ class Slic3r::FullPrintConfig.
33 sub new_from_defaults {
34 my $class = shift;
35 my (@opt_keys) = @_;
36
37 my $self = $class->new;
38 # Instantiating the C++ class Slic3r::FullPrintConfig.
39 my $defaults = Slic3r::Config::Full->new;
40 if (@opt_keys) {
41 $self->set($_, $defaults->get($_))
42 for grep $defaults->has($_), @opt_keys;
43 } else {
44 $self->apply_static($defaults);
45 }
46 return $self;
47 }
48
49 # From command line parameters
50 sub new_from_cli {
51 my $class = shift;
52 my %args = @_;
53
54 # Delete hash keys with undefined value.
55 delete $args{$_} for grep !defined $args{$_}, keys %args;
56
57 # Replace the start_gcode, end_gcode ... hash values
58 # with the content of the files they reference.
59 for (qw(start end layer toolchange)) {
60 my $opt_key = "${_}_gcode";
61 if ($args{$opt_key}) {
62 if (-e $args{$opt_key}) {
63 Slic3r::open(\my $fh, "<", $args{$opt_key})
64 or die "Failed to open $args{$opt_key}\n";
65 binmode $fh, ':utf8';
66 $args{$opt_key} = do { local $/; <$fh> };
67 close $fh;
68 }
69 }
70 }
71
72 my $self = $class->new;
73 foreach my $opt_key (keys %args) {
74 my $opt_def = $Options->{$opt_key};
75
76 # we use set_deserialize() for bool options since GetOpt::Long doesn't handle
77 # arrays of boolean values
78 if ($opt_key =~ /^(?:bed_shape|duplicate_grid|extruder_offset)$/ || $opt_def->{type} eq 'bool') {
79 $self->set_deserialize($opt_key, $args{$opt_key});
80 } elsif (my $shortcut = $opt_def->{shortcut}) {
81 $self->set($_, $args{$opt_key}) for @$shortcut;
82 } else {
83 $self->set($opt_key, $args{$opt_key});
84 }
85 }
86
87 return $self;
88 }
89
90 sub merge {
91 my $class = shift;
92 my $config = $class->new;
93 $config->apply($_) for @_;
94 return $config;
95 }
96
97 # Load a flat ini file without a category into the underlying C++ Slic3r::DynamicConfig class,
98 # convert legacy configuration names.
99 sub load {
100 my $class = shift;
101 my ($file) = @_;
102
103 my $ini = __PACKAGE__->read_ini($file);
104 return $class->load_ini_hash($ini->{_});
105 }
106
107 # Deserialize a perl hash into the underlying C++ Slic3r::DynamicConfig class,
108 # convert legacy configuration names.
109 sub load_ini_hash {
110 my $class = shift;
111 my ($ini_hash) = @_;
112
113 my $config = $class->new;
114 foreach my $opt_key (keys %$ini_hash) {
115 ($opt_key, my $value) = _handle_legacy($opt_key, $ini_hash->{$opt_key});
116 next if !defined $opt_key;
117 $config->set_deserialize($opt_key, $value);
118 }
119 return $config;
120 }
121
122 sub clone {
123 my $self = shift;
124
125 my $new = (ref $self)->new;
126 $new->apply($self);
127 return $new;
128 }
129
130 sub get_value {
131 my $self = shift;
132 my ($opt_key) = @_;
133
134 return $Options->{$opt_key}{ratio_over}
135 ? $self->get_abs_value($opt_key)
136 : $self->get($opt_key);
137 }
138
139 sub _handle_legacy {
140 my ($opt_key, $value) = @_;
141
142 # handle legacy options
143 if ($opt_key =~ /^(extrusion_width|bottom_layer_speed|first_layer_height)_ratio$/) {
144 $opt_key = $1;
145 $opt_key =~ s/^bottom_layer_speed$/first_layer_speed/;
146 $value = $value =~ /^\d+(?:\.\d+)?$/ && $value != 0 ? ($value*100) . "%" : 0;
147 }
148 if ($opt_key eq 'threads' && !$Slic3r::have_threads) {
149 $value = 1;
150 }
151 if ($opt_key eq 'gcode_flavor' && $value eq 'makerbot') {
152 $value = 'makerware';
153 }
154 if ($opt_key eq 'fill_density' && defined($value) && $value !~ /%/ && $value <= 1) {
155 # fill_density was turned into a percent value
156 $value *= 100;
157 $value = "$value"; # force update of the PV value, workaround for bug https://rt.cpan.org/Ticket/Display.html?id=94110
158 }
159 if ($opt_key eq 'randomize_start' && $value) {
160 $opt_key = 'seam_position';
161 $value = 'random';
162 }
163 if ($opt_key eq 'bed_size' && $value) {
164 $opt_key = 'bed_shape';
165 my ($x, $y) = split /,/, $value;
166 $value = "0x0,${x}x0,${x}x${y},0x${y}";
167 }
168 return () if first { $_ eq $opt_key } @Ignore;
169
170 # For historical reasons, the world's full of configs having these very low values;
171 # to avoid unexpected behavior we need to ignore them. Banning these two hard-coded
172 # values is a dirty hack and will need to be removed sometime in the future, but it
173 # will avoid lots of complaints for now.
174 if ($opt_key eq 'perimeter_acceleration' && $value == '25') {
175 $value = 0;
176 }
177 if ($opt_key eq 'infill_acceleration' && $value == '50') {
178 $value = 0;
179 }
180
181 if (!exists $Options->{$opt_key}) {
182 my @keys = grep { $Options->{$_}{aliases} && grep $_ eq $opt_key, @{$Options->{$_}{aliases}} } keys %$Options;
183 if (!@keys) {
184 warn "Unknown option $opt_key\n";
185 return ();
186 }
187 $opt_key = $keys[0];
188 }
189
190 return ($opt_key, $value);
191 }
192
193 # Create a hash of hashes from the underlying C++ Slic3r::DynamicPrintConfig.
194 # The first hash key is '_' meaning no category.
195 sub as_ini {
196 my ($self) = @_;
197
198 my $ini = { _ => {} };
199 foreach my $opt_key (sort @{$self->get_keys}) {
200 next if $Options->{$opt_key}{shortcut};
201 $ini->{_}{$opt_key} = $self->serialize($opt_key);
202 }
203 return $ini;
204 }
205
206 # Save the content of the underlying C++ Slic3r::DynamicPrintConfig as a flat ini file without any category.
207 sub save {
208 my $self = shift;
209 my ($file) = @_;
210
211 __PACKAGE__->write_ini($file, $self->as_ini);
212 }
213
214 # this method is idempotent by design and only applies to ::DynamicConfig or ::Full
215 # objects because it performs cross checks
216 sub validate {
217 my $self = shift;
218
219 # -j, --threads
220 die "Invalid value for --threads\n"
221 if $self->threads < 1;
222
223 # --layer-height
224 die "Invalid value for --layer-height\n"
225 if $self->layer_height <= 0;
226 die "--layer-height must be a multiple of print resolution\n"
227 if $self->layer_height / &Slic3r::SCALING_FACTOR % 1 != 0;
228
229 # --first-layer-height
230 die "Invalid value for --first-layer-height\n"
231 if $self->first_layer_height !~ /^(?:\d*(?:\.\d+)?)%?$/;
232 die "Invalid value for --first-layer-height\n"
233 if $self->get_value('first_layer_height') <= 0;
234
235 # --filament-diameter
236 die "Invalid value for --filament-diameter\n"
237 if grep $_ < 1, @{$self->filament_diameter};
238
239 # --nozzle-diameter
240 die "Invalid value for --nozzle-diameter\n"
241 if grep $_ < 0, @{$self->nozzle_diameter};
242
243 # --perimeters
244 die "Invalid value for --perimeters\n"
245 if $self->perimeters < 0;
246
247 # --solid-layers
248 die "Invalid value for --solid-layers\n" if defined $self->solid_layers && $self->solid_layers < 0;
249 die "Invalid value for --top-solid-layers\n" if $self->top_solid_layers < 0;
250 die "Invalid value for --bottom-solid-layers\n" if $self->bottom_solid_layers < 0;
251
252 # --gcode-flavor
253 die "Invalid value for --gcode-flavor\n"
254 if !first { $_ eq $self->gcode_flavor } @{$Options->{gcode_flavor}{values}};
255
256 die "--use-firmware-retraction is only supported by Marlin firmware\n"
257 if $self->use_firmware_retraction && $self->gcode_flavor ne 'reprap' && $self->gcode_flavor ne 'machinekit';
258
259 die "--use-firmware-retraction is not compatible with --wipe\n"
260 if $self->use_firmware_retraction && first {$_} @{$self->wipe};
261
262 # --fill-pattern
263 die "Invalid value for --fill-pattern\n"
264 if !first { $_ eq $self->fill_pattern } @{$Options->{fill_pattern}{values}};
265
266 # --external-fill-pattern
267 die "Invalid value for --external-fill-pattern\n"
268 if !first { $_ eq $self->external_fill_pattern } @{$Options->{external_fill_pattern}{values}};
269
270 # --fill-density
271 die "The selected fill pattern is not supposed to work at 100% density\n"
272 if $self->fill_density == 100
273 && !first { $_ eq $self->fill_pattern } @{$Options->{external_fill_pattern}{values}};
274
275 # --infill-every-layers
276 die "Invalid value for --infill-every-layers\n"
277 if $self->infill_every_layers !~ /^\d+$/ || $self->infill_every_layers < 1;
278
279 # --skirt-height
280 die "Invalid value for --skirt-height\n"
281 if $self->skirt_height < -1; # -1 means as tall as the object
282
283 # --bridge-flow-ratio
284 die "Invalid value for --bridge-flow-ratio\n"
285 if $self->bridge_flow_ratio <= 0;
286
287 # extruder clearance
288 die "Invalid value for --extruder-clearance-radius\n"
289 if $self->extruder_clearance_radius <= 0;
290 die "Invalid value for --extruder-clearance-height\n"
291 if $self->extruder_clearance_height <= 0;
292
293 # --extrusion-multiplier
294 die "Invalid value for --extrusion-multiplier\n"
295 if defined first { $_ <= 0 } @{$self->extrusion_multiplier};
296
297 # --default-acceleration
298 die "Invalid zero value for --default-acceleration when using other acceleration settings\n"
299 if ($self->perimeter_acceleration || $self->infill_acceleration || $self->bridge_acceleration || $self->first_layer_acceleration)
300 && !$self->default_acceleration;
301
302 # --spiral-vase
303 if ($self->spiral_vase) {
304 # Note that we might want to have more than one perimeter on the bottom
305 # solid layers.
306 die "Can't make more than one perimeter when spiral vase mode is enabled\n"
307 if $self->perimeters > 1;
308
309 die "Can't make less than one perimeter when spiral vase mode is enabled\n"
310 if $self->perimeters < 1;
311
312 die "Spiral vase mode can only print hollow objects, so you need to set Fill density to 0\n"
313 if $self->fill_density > 0;
314
315 die "Spiral vase mode is not compatible with top solid layers\n"
316 if $self->top_solid_layers > 0;
317
318 die "Spiral vase mode is not compatible with support material\n"
319 if $self->support_material || $self->support_material_enforce_layers > 0;
320 }
321
322 # extrusion widths
323 {
324 my $max_nozzle_diameter = max(@{ $self->nozzle_diameter });
325 die "Invalid extrusion width (too large)\n"
326 if defined first { $_ > 10 * $max_nozzle_diameter }
327 map $self->get_abs_value_over("${_}_extrusion_width", $self->layer_height),
328 qw(perimeter infill solid_infill top_infill support_material first_layer);
329 }
330
331 # general validation, quick and dirty
332 foreach my $opt_key (@{$self->get_keys}) {
333 my $opt = $Options->{$opt_key};
334 next unless defined $self->$opt_key;
335 next unless defined $opt->{cli} && $opt->{cli} =~ /=(.+)$/;
336 my $type = $1;
337 my @values = ();
338 if ($type =~ s/\@$//) {
339 die "Invalid value for $opt_key\n" if ref($self->$opt_key) ne 'ARRAY';
340 @values = @{ $self->$opt_key };
341 } else {
342 @values = ($self->$opt_key);
343 }
344 foreach my $value (@values) {
345 if ($type eq 'i' || $type eq 'f' || $opt->{type} eq 'percent') {
346 $value =~ s/%$// if $opt->{type} eq 'percent';
347 die "Invalid value for $opt_key\n"
348 if ($type eq 'i' && $value !~ /^-?\d+$/)
349 || (($type eq 'f' || $opt->{type} eq 'percent') && $value !~ /^-?(?:\d+|\d*\.\d+)$/)
350 || (defined $opt->{min} && $value < $opt->{min})
351 || (defined $opt->{max} && $value > $opt->{max});
352 } elsif ($type eq 's' && $opt->{type} eq 'select') {
353 die "Invalid value for $opt_key\n"
354 unless first { $_ eq $value } @{ $opt->{values} };
355 }
356 }
357 }
358
359 return 1;
360 }
361
362 # CLASS METHODS:
363
364 # Write a "Windows" style ini file with categories enclosed in squre brackets.
365 sub write_ini {
366 my $class = shift;
367 my ($file, $ini) = @_;
368
369 Slic3r::open(\my $fh, '>', $file);
370 binmode $fh, ':utf8';
371 my $localtime = localtime;
372 printf $fh "# generated by Slic3r $Slic3r::VERSION on %s\n", "$localtime";
373 # make sure the _ category is the first one written
374 foreach my $category (sort { ($a eq '_') ? -1 : ($a cmp $b) } keys %$ini) {
375 printf $fh "\n[%s]\n", $category if $category ne '_';
376 foreach my $key (sort keys %{$ini->{$category}}) {
377 printf $fh "%s = %s\n", $key, $ini->{$category}{$key};
378 }
379 }
380 close $fh;
381 }
382
383 # Parse a "Windows" style ini file with categories enclosed in squre brackets.
384 # Returns a hash of hashes over strings.
385 # {category}{name}=value
386 # Non-categorized entries are stored under a category '_'.
387 sub read_ini {
388 my $class = shift;
389 my ($file) = @_;
390
391 local $/ = "\n";
392 Slic3r::open(\my $fh, '<', $file)
393 or die "Unable to open $file: $!\n";
394 binmode $fh, ':utf8';
395
396 my $ini = { _ => {} };
397 my $category = '_';
398 while (<$fh>) {
399 s/\R+$//;
400 next if /^\s+/;
401 next if /^$/;
402 next if /^\s*#/;
403 if (/^\[(.+?)\]$/) {
404 $category = $1;
405 next;
406 }
407 /^(\w+) *= *(.*)/ or die "Unreadable configuration file (invalid data at line $.)\n";
408 $ini->{$category}{$1} = $2;
409 }
410 close $fh;
411
412 return $ini;
413 }
414
415 package Slic3r::Config::Static;
416 use parent 'Slic3r::Config';
417
418 sub Slic3r::Config::GCode::new { Slic3r::Config::Static::new_GCodeConfig }
419 sub Slic3r::Config::Print::new { Slic3r::Config::Static::new_PrintConfig }
420 sub Slic3r::Config::PrintObject::new { Slic3r::Config::Static::new_PrintObjectConfig }
421 sub Slic3r::Config::PrintRegion::new { Slic3r::Config::Static::new_PrintRegionConfig }
422 sub Slic3r::Config::Full::new { Slic3r::Config::Static::new_FullPrintConfig }
423
424 1;
0 package Slic3r::ExPolygon;
1 use strict;
2 use warnings;
3
4 # an ExPolygon is a polygon with holes
5
6 use List::Util qw(first);
7 use Slic3r::Geometry qw(X Y A B point_in_polygon epsilon scaled_epsilon);
8 use Slic3r::Geometry::Clipper qw(union_ex diff_pl);
9
10 sub wkt {
11 my $self = shift;
12 return sprintf "POLYGON(%s)",
13 join ',', map "($_)", map { join ',', map "$_->[0] $_->[1]", @$_ } @$self;
14 }
15
16 sub dump_perl {
17 my $self = shift;
18 return sprintf "[%s]",
19 join ',', map "[$_]", map { join ',', map "[$_->[0],$_->[1]]", @$_ } @$self;
20 }
21
22 sub offset {
23 my $self = shift;
24 return Slic3r::Geometry::Clipper::offset(\@$self, @_);
25 }
26
27 sub offset_ex {
28 my $self = shift;
29 return Slic3r::Geometry::Clipper::offset_ex(\@$self, @_);
30 }
31
32 sub noncollapsing_offset_ex {
33 my $self = shift;
34 my ($distance, @params) = @_;
35
36 return $self->offset_ex($distance + 1, @params);
37 }
38
39 sub bounding_box {
40 my $self = shift;
41 return $self->contour->bounding_box;
42 }
43
44 package Slic3r::ExPolygon::Collection;
45 use Slic3r::Geometry qw(X1 Y1);
46
47 sub size {
48 my $self = shift;
49 return [ Slic3r::Geometry::size_2D([ map @$_, map @$_, @$self ]) ];
50 }
51
52 1;
0 package Slic3r::ExtrusionLoop;
1 use strict;
2 use warnings;
3
4 use parent qw(Exporter);
5
6 our @EXPORT_OK = qw(EXTRL_ROLE_DEFAULT
7 EXTRL_ROLE_CONTOUR_INTERNAL_PERIMETER EXTRL_ROLE_SKIRT);
8 our %EXPORT_TAGS = (roles => \@EXPORT_OK);
9
10
11 1;
0 package Slic3r::ExtrusionPath;
1 use strict;
2 use warnings;
3
4 use parent qw(Exporter);
5
6 our @EXPORT_OK = qw(EXTR_ROLE_PERIMETER EXTR_ROLE_EXTERNAL_PERIMETER EXTR_ROLE_OVERHANG_PERIMETER
7 EXTR_ROLE_FILL EXTR_ROLE_SOLIDFILL EXTR_ROLE_TOPSOLIDFILL EXTR_ROLE_GAPFILL EXTR_ROLE_BRIDGE
8 EXTR_ROLE_SKIRT EXTR_ROLE_SUPPORTMATERIAL EXTR_ROLE_SUPPORTMATERIAL_INTERFACE
9 EXTR_ROLE_NONE);
10 our %EXPORT_TAGS = (roles => \@EXPORT_OK);
11
12 1;
0 package Slic3r::Flow;
1 use strict;
2 use warnings;
3
4 use parent qw(Exporter);
5
6 our @EXPORT_OK = qw(FLOW_ROLE_EXTERNAL_PERIMETER FLOW_ROLE_PERIMETER FLOW_ROLE_INFILL
7 FLOW_ROLE_SOLID_INFILL
8 FLOW_ROLE_TOP_SOLID_INFILL FLOW_ROLE_SUPPORT_MATERIAL
9 FLOW_ROLE_SUPPORT_MATERIAL_INTERFACE);
10 our %EXPORT_TAGS = (roles => \@EXPORT_OK);
11
12 1;
0 package Slic3r::Format::AMF::Parser;
1 use strict;
2 use warnings;
3
4 use base 'XML::SAX::Base';
5
6 my %xyz_index = (x => 0, y => 1, z => 2); #=
7
8 sub new {
9 my $self = shift->SUPER::new(@_);
10 $self->{_tree} = [];
11 $self->{_objects_map} = {}; # this hash maps AMF object IDs to object indexes in $model->objects
12 $self->{_instances} = {}; # apply these lazily to make sure all objects have been parsed
13 $self;
14 }
15
16 sub start_element {
17 my $self = shift;
18 my $data = shift;
19
20 if ($data->{LocalName} eq 'object') {
21 $self->{_object} = $self->{_model}->add_object;
22 $self->{_object_vertices} = [];
23 $self->{_objects_map}{ $self->_get_attribute($data, 'id') } = $#{ $self->{_model}->objects };
24 } elsif ($data->{LocalName} eq 'vertex') {
25 $self->{_vertex} = ["", "", ""];
26 } elsif ($self->{_vertex} && $data->{LocalName} =~ /^[xyz]$/ && $self->{_tree}[-1] eq 'coordinates') {
27 $self->{_coordinate} = $data->{LocalName};
28 } elsif ($data->{LocalName} eq 'volume') {
29 $self->{_volume} = $self->{_object}->add_volume(
30 material_id => $self->_get_attribute($data, 'materialid') // undef,
31 mesh => Slic3r::TriangleMesh->new,
32 );
33 $self->{_volume_facets} = [];
34 } elsif ($data->{LocalName} eq 'triangle') {
35 $self->{_triangle} = ["", "", ""];
36 } elsif ($self->{_triangle} && $data->{LocalName} =~ /^v([123])$/ && $self->{_tree}[-1] eq 'triangle') {
37 $self->{_vertex_idx} = $1-1;
38 } elsif ($data->{LocalName} eq 'material') {
39 my $material_id = $self->_get_attribute($data, 'id') // '_';
40 $self->{_material} = $self->{_model}->set_material($material_id);
41 } elsif ($data->{LocalName} eq 'metadata') {
42 $self->{_metadata_type} = $self->_get_attribute($data, 'type');
43 $self->{_metadata_value} = '';
44 } elsif ($data->{LocalName} eq 'constellation') {
45 $self->{_constellation} = 1; # we merge all constellations as we don't support more than one
46 } elsif ($data->{LocalName} eq 'instance' && $self->{_constellation}) {
47 my $object_id = $self->_get_attribute($data, 'objectid');
48 $self->{_instances}{$object_id} ||= [];
49 push @{ $self->{_instances}{$object_id} }, $self->{_instance} = {};
50 } elsif ($data->{LocalName} =~ /^(?:deltax|deltay|rz)$/ && $self->{_instance}) {
51 $self->{_instance_property} = $data->{LocalName};
52 }
53
54 push @{$self->{_tree}}, $data->{LocalName};
55 }
56
57 sub characters {
58 my $self = shift;
59 my $data = shift;
60
61 if ($self->{_vertex} && $self->{_coordinate}) {
62 $self->{_vertex}[ $xyz_index{$self->{_coordinate}} ] .= $data->{Data};
63 } elsif ($self->{_triangle} && defined $self->{_vertex_idx}) {
64 $self->{_triangle}[ $self->{_vertex_idx} ] .= $data->{Data};
65 } elsif ($self->{_metadata_type}) {
66 $self->{_metadata_value} .= $data->{Data};
67 } elsif ($self->{_instance_property}) {
68 $self->{_instance}{ $self->{_instance_property} } .= $data->{Data};
69 }
70 }
71
72 sub end_element {
73 my $self = shift;
74 my $data = shift;
75
76 pop @{$self->{_tree}};
77
78 if ($data->{LocalName} eq 'object') {
79 $self->{_object} = undef;
80 $self->{_object_vertices} = undef;
81 } elsif ($data->{LocalName} eq 'vertex') {
82 push @{$self->{_object_vertices}}, $self->{_vertex};
83 $self->{_vertex} = undef;
84 } elsif ($self->{_coordinate} && $data->{LocalName} =~ /^[xyz]$/) {
85 $self->{_coordinate} = undef;
86 } elsif ($data->{LocalName} eq 'volume') {
87 $self->{_volume}->mesh->ReadFromPerl($self->{_object_vertices}, $self->{_volume_facets});
88 $self->{_volume}->mesh->repair;
89 $self->{_volume} = undef;
90 $self->{_volume_facets} = undef;
91 } elsif ($data->{LocalName} eq 'triangle') {
92 push @{$self->{_volume_facets}}, $self->{_triangle};
93 $self->{_triangle} = undef;
94 } elsif (defined $self->{_vertex_idx} && $data->{LocalName} =~ /^v[123]$/) {
95 $self->{_vertex_idx} = undef;
96 } elsif ($data->{LocalName} eq 'material') {
97 $self->{_material} = undef;
98 } elsif ($data->{LocalName} eq 'metadata') {
99 my $value = $self->{_metadata_value};
100 if ($self->{_metadata_type} =~ /^slic3r\.(.+)/) {
101 my $opt_key = $1;
102 if (exists $Slic3r::Config::Options->{$opt_key}) {
103 my $config;
104 if ($self->{_material}) {
105 $config = $self->{_material}->config;
106 } elsif ($self->{_volume}) {
107 $config = $self->{_volume}->config;
108 } elsif ($self->{_object}) {
109 $config = $self->{_object}->config;
110 }
111
112 $config->set_deserialize($opt_key, $value) if defined $config;
113 } elsif ($opt_key eq 'modifier' && $self->{_volume}) {
114 $self->{_volume}->set_modifier($value);
115 }
116 } elsif ($self->{_metadata_type} eq 'name' && $self->{_volume}) {
117 $self->{_volume}->set_name($value);
118 } elsif ($self->{_metadata_type} eq 'name' && $self->{_object}) {
119 $self->{_object}->set_name($value);
120 } elsif ($self->{_material}) {
121 $self->{_material}->set_attribute($self->{_metadata_type}, $value);
122 }
123 $self->{_metadata_type} = undef;
124 $self->{_metadata_value} = undef;
125 } elsif ($data->{LocalName} eq 'constellation') {
126 $self->{_constellation} = undef;
127 } elsif ($data->{LocalName} eq 'instance') {
128 $self->{_instance} = undef;
129 } elsif ($data->{LocalName} =~ /^(?:deltax|deltay|rz)$/ && $self->{_instance}) {
130 $self->{_instance_property} = undef;
131 }
132 }
133
134 sub end_document {
135 my $self = shift;
136
137 foreach my $object_id (keys %{ $self->{_instances} }) {
138 my $new_object_id = $self->{_objects_map}{$object_id};
139 if (!defined $new_object_id) {
140 warn "Undefined object $object_id referenced in constellation\n";
141 next;
142 }
143
144 foreach my $instance (@{ $self->{_instances}{$object_id} }) {
145 next if !defined($instance->{deltax}) || !defined($instance->{deltay});
146 $self->{_model}->objects->[$new_object_id]->add_instance(
147 rotation => $instance->{rz} || 0,
148 offset => Slic3r::Pointf->new($instance->{deltax} || 0, $instance->{deltay} || 0),
149 );
150 }
151 }
152 }
153
154 sub _get_attribute {
155 my $self = shift;
156 my ($data, $name) = @_;
157
158 return +(map $_->{Value}, grep $_->{Name} eq $name, values %{$data->{Attributes}})[0];
159 }
160
161 1;
0 package Slic3r::Format::AMF;
1 use Moo;
2
3 use Slic3r::Geometry qw(X Y Z);
4
5 sub read_file {
6 my $self = shift;
7 my ($file) = @_;
8
9 eval qq{
10 require Slic3r::Format::AMF::Parser;
11 use XML::SAX::ParserFactory;
12 1;
13 } or die "AMF parsing requires XML::SAX\n";
14
15 Slic3r::open(\my $fh, '<', $file) or die "Failed to open $file\n";
16
17 my $model = Slic3r::Model->new;
18 XML::SAX::ParserFactory
19 ->parser(Handler => Slic3r::Format::AMF::Parser->new(_model => $model))
20 ->parse_file($fh);
21 close $fh;
22
23 return $model;
24 }
25
26 sub write_file {
27 my $self = shift;
28 my ($file, $model, %params) = @_;
29
30 my %vertices_offset = ();
31
32 Slic3r::open(\my $fh, '>', $file);
33 binmode $fh, ':utf8';
34 printf $fh qq{<?xml version="1.0" encoding="UTF-8"?>\n};
35 printf $fh qq{<amf unit="millimeter">\n};
36 printf $fh qq{ <metadata type="cad">Slic3r %s</metadata>\n}, $Slic3r::VERSION;
37 for my $material_id (sort @{ $model->material_names }) {
38 next if $material_id eq '';
39 my $material = $model->get_material($material_id);
40 # note that material-id must never be 0 since it's reserved by the AMF spec
41 printf $fh qq{ <material id="%s">\n}, $material_id;
42 for (keys %{$material->attributes}) {
43 printf $fh qq{ <metadata type=\"%s\">%s</metadata>\n}, $_, $material->attributes->{$_};
44 }
45 my $config = $material->config;
46 foreach my $opt_key (@{$config->get_keys}) {
47 printf $fh qq{ <metadata type=\"slic3r.%s\">%s</metadata>\n}, $opt_key, $config->serialize($opt_key);
48 }
49 printf $fh qq{ </material>\n};
50 }
51 my $instances = '';
52 for my $object_id (0 .. $#{ $model->objects }) {
53 my $object = $model->objects->[$object_id];
54 printf $fh qq{ <object id="%d">\n}, $object_id;
55
56 my $config = $object->config;
57 foreach my $opt_key (@{$config->get_keys}) {
58 printf $fh qq{ <metadata type=\"slic3r.%s\">%s</metadata>\n}, $opt_key, $config->serialize($opt_key);
59 }
60 if ($object->name) {
61 printf $fh qq{ <metadata type=\"name\">%s</metadata>\n}, $object->name;
62 }
63
64 printf $fh qq{ <mesh>\n};
65 printf $fh qq{ <vertices>\n};
66 my @vertices_offset = ();
67 {
68 my $vertices_offset = 0;
69 foreach my $volume (@{ $object->volumes }) {
70 push @vertices_offset, $vertices_offset;
71 my $vertices = $volume->mesh->vertices;
72 foreach my $vertex (@$vertices) {
73 printf $fh qq{ <vertex>\n};
74 printf $fh qq{ <coordinates>\n};
75 printf $fh qq{ <x>%s</x>\n}, $vertex->[X];
76 printf $fh qq{ <y>%s</y>\n}, $vertex->[Y];
77 printf $fh qq{ <z>%s</z>\n}, $vertex->[Z];
78 printf $fh qq{ </coordinates>\n};
79 printf $fh qq{ </vertex>\n};
80 }
81 $vertices_offset += scalar(@$vertices);
82 }
83 }
84 printf $fh qq{ </vertices>\n};
85 foreach my $volume (@{ $object->volumes }) {
86 my $vertices_offset = shift @vertices_offset;
87 printf $fh qq{ <volume%s>\n},
88 ($volume->material_id eq '') ? '' : (sprintf ' materialid="%s"', $volume->material_id);
89
90 my $config = $volume->config;
91 foreach my $opt_key (@{$config->get_keys}) {
92 printf $fh qq{ <metadata type=\"slic3r.%s\">%s</metadata>\n}, $opt_key, $config->serialize($opt_key);
93 }
94 if ($volume->name) {
95 printf $fh qq{ <metadata type=\"name\">%s</metadata>\n}, $volume->name;
96 }
97 if ($volume->modifier) {
98 printf $fh qq{ <metadata type=\"slic3r.modifier\">1</metadata>\n};
99 }
100
101 foreach my $facet (@{$volume->mesh->facets}) {
102 printf $fh qq{ <triangle>\n};
103 printf $fh qq{ <v%d>%d</v%d>\n}, $_, $facet->[$_-1] + $vertices_offset, $_ for 1..3;
104 printf $fh qq{ </triangle>\n};
105 }
106 printf $fh qq{ </volume>\n};
107 }
108 printf $fh qq{ </mesh>\n};
109 printf $fh qq{ </object>\n};
110 if ($object->instances) {
111 foreach my $instance (@{$object->instances}) {
112 $instances .= sprintf qq{ <instance objectid="%d">\n}, $object_id;
113 $instances .= sprintf qq{ <deltax>%s</deltax>\n}, $instance->offset->[X];
114 $instances .= sprintf qq{ <deltay>%s</deltay>\n}, $instance->offset->[Y];
115 $instances .= sprintf qq{ <rz>%s</rz>\n}, $instance->rotation;
116 $instances .= sprintf qq{ </instance>\n};
117 }
118 }
119 }
120 if ($instances) {
121 printf $fh qq{ <constellation id="1">\n};
122 printf $fh $instances;
123 printf $fh qq{ </constellation>\n};
124 }
125 printf $fh qq{</amf>\n};
126 close $fh;
127 }
128
129 1;
0 package Slic3r::Format::OBJ;
1 use Moo;
2
3 use File::Basename qw(basename);
4
5 sub read_file {
6 my $self = shift;
7 my ($file) = @_;
8
9 Slic3r::open(\my $fh, '<', $file) or die "Failed to open $file\n";
10 my $vertices = [];
11 my $facets = [];
12 while (<$fh>) {
13 if (/^v ([^ ]+)\s+([^ ]+)\s+([^ ]+)/) {
14 push @$vertices, [$1, $2, $3];
15 } elsif (/^f (\d+).*? (\d+).*? (\d+).*?/) {
16 push @$facets, [ $1-1, $2-1, $3-1 ];
17 }
18 }
19 close $fh;
20
21 my $mesh = Slic3r::TriangleMesh->new;
22 $mesh->ReadFromPerl($vertices, $facets);
23 $mesh->repair;
24
25 my $model = Slic3r::Model->new;
26
27 my $basename = basename($file);
28 my $object = $model->add_object(input_file => $file, name => $basename);
29 my $volume = $object->add_volume(mesh => $mesh, name => $basename);
30 return $model;
31 }
32
33 1;
0 package Slic3r::Format::STL;
1 use Moo;
2
3 use File::Basename qw(basename);
4
5 sub read_file {
6 my $self = shift;
7 my ($file) = @_;
8
9 my $path = Slic3r::encode_path($file);
10 die "Failed to open $file\n" if !-e $path;
11
12 my $mesh = Slic3r::TriangleMesh->new;
13 $mesh->ReadSTLFile($path);
14 $mesh->repair;
15
16 die "This STL file couldn't be read because it's empty.\n"
17 if $mesh->facets_count == 0;
18
19 my $model = Slic3r::Model->new;
20
21 my $basename = basename($file);
22 my $object = $model->add_object(input_file => $file, name => $basename);
23 my $volume = $object->add_volume(mesh => $mesh, name => $basename);
24 return $model;
25 }
26
27 sub write_file {
28 my $self = shift;
29 my ($file, $mesh, %params) = @_;
30
31 $mesh = $mesh->mesh if $mesh->isa('Slic3r::Model');
32
33 my $path = Slic3r::encode_path($file);
34
35 $params{binary}
36 ? $mesh->write_binary($path)
37 : $mesh->write_ascii($path);
38 }
39
40 1;
0 package Slic3r::GCode::ArcFitting;
1 use Moo;
2
3 use Slic3r::Geometry qw(X Y PI scale unscale epsilon scaled_epsilon deg2rad angle3points);
4
5 extends 'Slic3r::GCode::Reader';
6 has 'config' => (is => 'ro', required => 0);
7 has 'min_segments' => (is => 'rw', default => sub { 2 });
8 has 'min_total_angle' => (is => 'rw', default => sub { deg2rad(30) });
9 has 'max_relative_angle' => (is => 'rw', default => sub { deg2rad(15) });
10 has 'len_epsilon' => (is => 'rw', default => sub { scale 0.2 });
11 has 'angle_epsilon' => (is => 'rw', default => sub { abs(deg2rad(10)) });
12 has '_extrusion_axis' => (is => 'lazy');
13 has '_path' => (is => 'rw');
14 has '_cur_F' => (is => 'rw');
15 has '_cur_E' => (is => 'rw');
16 has '_cur_E0' => (is => 'rw');
17 has '_comment' => (is => 'rw');
18
19 sub _build__extrusion_axis {
20 my ($self) = @_;
21 return $self->config ? $self->config->get_extrusion_axis : 'E';
22 }
23
24 sub process {
25 my $self = shift;
26 my ($gcode) = @_;
27
28 die "Arc fitting is not available (incomplete feature)\n";
29 die "Arc fitting doesn't support extrusion axis not being E\n" if $self->_extrusion_axis ne 'E';
30
31 my $new_gcode = "";
32
33 $self->parse($gcode, sub {
34 my ($reader, $cmd, $args, $info) = @_;
35
36 if ($info->{extruding} && $info->{dist_XY} > 0) {
37 # this is an extrusion segment
38
39 # get segment
40 my $line = Slic3r::Line->new(
41 Slic3r::Point->new_scale($self->X, $self->Y),
42 Slic3r::Point->new_scale($args->{X}, $args->{Y}),
43 );
44
45 # get segment speed
46 my $F = $args->{F} // $reader->F;
47
48 # get extrusion per unscaled distance unit
49 my $e = $info->{dist_E} / unscale($line->length);
50
51 if ($self->_path && $F == $self->_cur_F && abs($e - $self->_cur_E) < epsilon) {
52 # if speed and extrusion per unit are the same as the previous segments,
53 # append this segment to path
54 $self->_path->append($line->b);
55 } elsif ($self->_path) {
56 # segment can't be appended to previous path, so we flush the previous one
57 # and start over
58 $new_gcode .= $self->path_to_gcode;
59 $self->_path(undef);
60 }
61
62 if (!$self->_path) {
63 # if this is the first segment of a path, start it from scratch
64 $self->_path(Slic3r::Polyline->new(@$line));
65 $self->_cur_F($F);
66 $self->_cur_E($e);
67 $self->_cur_E0($self->E);
68 $self->_comment($info->{comment});
69 }
70 } else {
71 # if we have a path, we flush it and go on
72 $new_gcode .= $self->path_to_gcode if $self->_path;
73 $new_gcode .= $info->{raw} . "\n";
74 $self->_path(undef);
75 }
76 });
77
78 $new_gcode .= $self->path_to_gcode if $self->_path;
79 return $new_gcode;
80 }
81
82 sub path_to_gcode {
83 my ($self) = @_;
84
85 my @chunks = $self->detect_arcs($self->_path);
86
87 my $gcode = "";
88 my $E = $self->_cur_E0;
89 foreach my $chunk (@chunks) {
90 if ($chunk->isa('Slic3r::Polyline')) {
91 my @lines = @{$chunk->lines};
92
93 $gcode .= sprintf "G1 F%s\n", $self->_cur_F;
94 foreach my $line (@lines) {
95 $E += $self->_cur_E * unscale($line->length);
96 $gcode .= sprintf "G1 X%.3f Y%.3f %s%.5f",
97 (map unscale($_), @{$line->b}),
98 $self->_extrusion_axis, $E;
99 $gcode .= sprintf " ; %s", $self->_comment if $self->_comment;
100 $gcode .= "\n";
101 }
102 } elsif ($chunk->isa('Slic3r::GCode::ArcFitting::Arc')) {
103 $gcode .= !$chunk->is_ccw ? "G2" : "G3";
104 $gcode .= sprintf " X%.3f Y%.3f", map unscale($_), @{$chunk->end}; # destination point
105
106 # XY distance of the center from the start position
107 $gcode .= sprintf " I%.3f", unscale($chunk->center->[X] - $chunk->start->[X]);
108 $gcode .= sprintf " J%.3f", unscale($chunk->center->[Y] - $chunk->start->[Y]);
109
110 $E += $self->_cur_E * unscale($chunk->length);
111 $gcode .= sprintf " %s%.5f", $self->_extrusion_axis, $E;
112
113 $gcode .= sprintf " F%s\n", $self->_cur_F;
114 }
115 }
116 return $gcode;
117 }
118
119 sub detect_arcs {
120 my ($self, $path) = @_;
121
122 my @chunks = ();
123 my @arc_points = ();
124 my $polyline = undef;
125 my $arc_start = undef;
126
127 my @points = @$path;
128 for (my $i = 1; $i <= $#points; ++$i) {
129 my $end = undef;
130
131 # we need at least three points to check whether they form an arc
132 if ($i < $#points) {
133 my $len = $points[$i-1]->distance_to($points[$i]);
134 my $rel_angle = PI - angle3points(@points[$i, $i-1, $i+1]);
135 if (abs($rel_angle) <= $self->max_relative_angle) {
136 for (my $j = $i+1; $j <= $#points; ++$j) {
137 # check whether @points[($i-1)..$j] form an arc
138 last if abs($points[$j-1]->distance_to($points[$j]) - $len) > $self->len_epsilon;
139 last if abs(PI - angle3points(@points[$j-1, $j-2, $j]) - $rel_angle) > $self->angle_epsilon;
140
141 $end = $j;
142 }
143 }
144 }
145
146 if (defined $end && ($end - $i + 1) >= $self->min_segments) {
147 my $arc = polyline_to_arc(Slic3r::Polyline->new(@points[($i-1)..$end]));
148
149 if (1||$arc->angle >= $self->min_total_angle) {
150 push @chunks, $arc;
151
152 # continue scanning after arc points
153 $i = $end;
154 next;
155 }
156 }
157
158 # if last chunk was a polyline, append to it
159 if (@chunks && $chunks[-1]->isa('Slic3r::Polyline')) {
160 $chunks[-1]->append($points[$i]);
161 } else {
162 push @chunks, Slic3r::Polyline->new(@points[($i-1)..$i]);
163 }
164 }
165
166 return @chunks;
167 }
168
169 sub polyline_to_arc {
170 my ($polyline) = @_;
171
172 my @points = @$polyline;
173
174 my $is_ccw = $points[2]->ccw(@points[0,1]) > 0;
175
176 # to find the center, we intersect the perpendicular lines
177 # passing by first and last vertex;
178 # a better method would be to draw all the perpendicular lines
179 # and find the centroid of the enclosed polygon, or to
180 # intersect multiple lines and find the centroid of the convex hull
181 # around the intersections
182 my $arc_center;
183 {
184 my $first_ray = Slic3r::Line->new(@points[0,1]);
185 $first_ray->rotate(PI/2 * ($is_ccw ? 1 : -1), $points[0]);
186
187 my $last_ray = Slic3r::Line->new(@points[-2,-1]);
188 $last_ray->rotate(PI/2 * ($is_ccw ? -1 : 1), $points[-1]);
189
190 # require non-parallel rays in order to compute an accurate center
191 return if abs($first_ray->atan2_ - $last_ray->atan2_) < deg2rad(30);
192
193 $arc_center = $first_ray->intersection($last_ray, 0) or return;
194 }
195
196 # angle measured in ccw orientation
197 my $abs_angle = Slic3r::Geometry::angle3points($arc_center, @points[0,-1]);
198
199 my $rel_angle = $is_ccw
200 ? $abs_angle
201 : (2*PI - $abs_angle);
202
203 my $arc = Slic3r::GCode::ArcFitting::Arc->new(
204 start => $points[0]->clone,
205 end => $points[-1]->clone,
206 center => $arc_center,
207 is_ccw => $is_ccw || 0,
208 angle => $rel_angle,
209 );
210
211 if (0) {
212 printf "points = %d, path length = %f, arc angle = %f, arc length = %f\n",
213 scalar(@points),
214 unscale(Slic3r::Polyline->new(@points)->length),
215 Slic3r::Geometry::rad2deg($rel_angle),
216 unscale($arc->length);
217 }
218
219 return $arc;
220 }
221
222 package Slic3r::GCode::ArcFitting::Arc;
223 use Moo;
224
225 has 'start' => (is => 'ro', required => 1);
226 has 'end' => (is => 'ro', required => 1);
227 has 'center' => (is => 'ro', required => 1);
228 has 'is_ccw' => (is => 'ro', required => 1);
229 has 'angle' => (is => 'ro', required => 1);
230
231 sub radius {
232 my ($self) = @_;
233 return $self->start->distance_to($self->center);
234 }
235
236 sub length {
237 my ($self) = @_;
238 return $self->radius * $self->angle;
239 }
240
241 1;
0 # A standalone (no C++ implementation) G-code filter, to control cooling of the print.
1 # The G-code is processed per layer. Once a layer is collected, fan start / stop commands are edited
2 # and the print is modified to stretch over a minimum layer time.
3
4 package Slic3r::GCode::CoolingBuffer;
5 use Moo;
6
7 has 'config' => (is => 'ro', required => 1); # Slic3r::Config::Print
8 has 'gcodegen' => (is => 'ro', required => 1); # Slic3r::GCode C++ instance
9 has 'gcode' => (is => 'rw', default => sub {""}); # Cache of a G-code snippet emitted for a single layer.
10 has 'elapsed_time' => (is => 'rw', default => sub {0});
11 has 'layer_id' => (is => 'rw');
12 has 'last_z' => (is => 'rw', default => sub { {} }); # obj_id => z (basically a 'last seen' table)
13 has 'min_print_speed' => (is => 'lazy');
14
15 sub _build_min_print_speed {
16 my $self = shift;
17 return 60 * $self->config->min_print_speed;
18 }
19
20 sub append {
21 my $self = shift;
22 my ($gcode, $obj_id, $layer_id, $print_z) = @_;
23
24 my $return = "";
25 if (exists $self->last_z->{$obj_id} && $self->last_z->{$obj_id} != $print_z) {
26 # A layer was finished, Z of the object's layer changed. Process the layer.
27 $return = $self->flush;
28 }
29
30 $self->layer_id($layer_id);
31 $self->last_z->{$obj_id} = $print_z;
32 $self->gcode($self->gcode . $gcode);
33 #FIXME Vojtech: This is a very rough estimate of the print time,
34 # not taking into account the acceleration profiles generated by the printer firmware.
35 $self->elapsed_time($self->elapsed_time + $self->gcodegen->elapsed_time);
36 $self->gcodegen->set_elapsed_time(0);
37
38 return $return;
39 }
40
41 sub flush {
42 my $self = shift;
43
44 my $gcode = $self->gcode;
45 my $elapsed = $self->elapsed_time;
46 $self->gcode("");
47 $self->elapsed_time(0);
48 $self->last_z({}); # reset the whole table otherwise we would compute overlapping times
49
50 my $fan_speed = $self->config->fan_always_on ? $self->config->min_fan_speed : 0;
51 my $speed_factor = 1;
52 if ($self->config->cooling) {
53 Slic3r::debugf "Layer %d estimated printing time: %d seconds\n", $self->layer_id, $elapsed;
54 if ($elapsed < $self->config->slowdown_below_layer_time) {
55 # Layer time very short. Enable the fan to a full throttle and slow down the print
56 # (stretch the layer print time to slowdown_below_layer_time).
57 $fan_speed = $self->config->max_fan_speed;
58 $speed_factor = $elapsed / $self->config->slowdown_below_layer_time;
59 } elsif ($elapsed < $self->config->fan_below_layer_time) {
60 # Layer time quite short. Enable the fan proportionally according to the current layer time.
61 $fan_speed = $self->config->max_fan_speed - ($self->config->max_fan_speed - $self->config->min_fan_speed)
62 * ($elapsed - $self->config->slowdown_below_layer_time)
63 / ($self->config->fan_below_layer_time - $self->config->slowdown_below_layer_time); #/
64 }
65 Slic3r::debugf " fan = %d%%, speed = %d%%\n", $fan_speed, $speed_factor * 100;
66
67 if ($speed_factor < 1) {
68 # Adjust feed rate of G1 commands marked with an _EXTRUDE_SET_SPEED
69 # as long as they are not _WIPE moves (they cannot if they are _EXTRUDE_SET_SPEED)
70 # and they are not preceded directly by _BRIDGE_FAN_START (do not adjust bridging speed).
71 $gcode =~ s/^(?=.*?;_EXTRUDE_SET_SPEED)(?!.*?;_WIPE)(?<!;_BRIDGE_FAN_START\n)(G1\sF)(\d+(?:\.\d+)?)/
72 my $new_speed = $2 * $speed_factor;
73 $1 . sprintf("%.3f", $new_speed < $self->min_print_speed ? $self->min_print_speed : $new_speed)
74 /gexm;
75 }
76 }
77 $fan_speed = 0 if $self->layer_id < $self->config->disable_fan_first_layers;
78 $gcode = $self->gcodegen->writer->set_fan($fan_speed) . $gcode;
79
80 # bridge fan speed
81 if (!$self->config->cooling || $self->config->bridge_fan_speed == 0 || $self->layer_id < $self->config->disable_fan_first_layers) {
82 $gcode =~ s/^;_BRIDGE_FAN_(?:START|END)\n//gm;
83 } else {
84 $gcode =~ s/^;_BRIDGE_FAN_START\n/ $self->gcodegen->writer->set_fan($self->config->bridge_fan_speed, 1) /gmex;
85 $gcode =~ s/^;_BRIDGE_FAN_END\n/ $self->gcodegen->writer->set_fan($fan_speed, 1) /gmex;
86 }
87 $gcode =~ s/;_WIPE//g;
88 $gcode =~ s/;_EXTRUDE_SET_SPEED//g;
89
90 return $gcode;
91 }
92
93 1;
0 package Slic3r::GCode::MotionPlanner;
1 use Moo;
2
3 has 'islands' => (is => 'ro', required => 1); # arrayref of ExPolygons
4 has 'internal' => (is => 'ro', default => sub { 1 });
5 has '_space' => (is => 'ro', default => sub { Slic3r::GCode::MotionPlanner::ConfigurationSpace->new });
6 has '_inner' => (is => 'ro', default => sub { [] }); # arrayref of ExPolygons
7
8 use List::Util qw(first max);
9 use Slic3r::Geometry qw(A B scale epsilon);
10 use Slic3r::Geometry::Clipper qw(offset offset_ex diff_ex intersection_pl);
11
12 # clearance (in mm) from the perimeters
13 has '_inner_margin' => (is => 'ro', default => sub { scale 1 });
14 has '_outer_margin' => (is => 'ro', default => sub { scale 2 });
15
16 # this factor weigths the crossing of a perimeter
17 # vs. the alternative path. a value of 5 means that
18 # a perimeter will be crossed if the alternative path
19 # is >= 5x the length of the straight line we could
20 # follow if we decided to cross the perimeter.
21 # a nearly-infinite value for this will only permit
22 # perimeter crossing when there's no alternative path.
23 use constant CROSSING_PENALTY => 20;
24
25 use constant POINT_DISTANCE => 10; # unscaled
26
27 # setup our configuration space
28 sub BUILD {
29 my $self = shift;
30
31 my $point_distance = scale POINT_DISTANCE;
32 my $nodes = $self->_space->nodes;
33 my $edges = $self->_space->edges;
34
35 # process individual islands
36 for my $i (0 .. $#{$self->islands}) {
37 my $expolygon = $self->islands->[$i];
38
39 # find external margin
40 my $outer = offset([ @$expolygon ], +$self->_outer_margin);
41 my @outer_points = map @{$_->equally_spaced_points($point_distance)}, @$outer;
42
43 # add outer points to graph
44 my $o_outer = $self->_space->add_nodes(@outer_points);
45
46 # find pairs of visible outer points and add them to the graph
47 for my $i (0 .. $#outer_points) {
48 for my $j (($i+1) .. $#outer_points) {
49 my ($a, $b) = ($outer_points[$i], $outer_points[$j]);
50 my $line = Slic3r::Polyline->new($a, $b);
51 # outer points are visible when their line has empty intersection with islands
52 my $intersection = intersection_pl(
53 [ $line ],
54 [ map @$_, @{$self->islands} ],
55 );
56 if (!@$intersection) {
57 $self->_space->add_edge($i+$o_outer, $j+$o_outer, $line->length);
58 }
59 }
60 }
61
62 if ($self->internal) {
63 # find internal margin
64 my $inner = offset_ex([ @$expolygon ], -$self->_inner_margin);
65 push @{ $self->_inner }, @$inner;
66 my @inner_points = map @{$_->equally_spaced_points($point_distance)}, map @$_, @$inner;
67
68 # add points to graph and get their offset
69 my $o_inner = $self->_space->add_nodes(@inner_points);
70
71 # find pairs of visible inner points and add them to the graph
72 for my $i (0 .. $#inner_points) {
73 for my $j (($i+1) .. $#inner_points) {
74 my ($a, $b) = ($inner_points[$i], $inner_points[$j]);
75 my $line = Slic3r::Line->new($a, $b);
76 # turn $inner into an ExPolygonCollection and use $inner->contains_line()
77 if (first { $_->contains_line($line) } @$inner) {
78 $self->_space->add_edge($i+$o_inner, $j+$o_inner, $line->length);
79 }
80 }
81 }
82
83 # generate the stripe around slice contours
84 my $contour = diff_ex(
85 $outer,
86 [ map @$_, @$inner ],
87 );
88
89 # find pairs of visible points in this area and add them to the graph
90 for my $i (0 .. $#inner_points) {
91 for my $j (0 .. $#outer_points) {
92 my ($a, $b) = ($inner_points[$i], $outer_points[$j]);
93 my $line = Slic3r::Line->new($a, $b);
94 # turn $contour into an ExPolygonCollection and use $contour->contains_line()
95 if (first { $_->contains_line($line) } @$contour) {
96 $self->_space->add_edge($i+$o_inner, $j+$o_outer, $line->length * CROSSING_PENALTY);
97 }
98 }
99 }
100 }
101 }
102
103 # since Perl has no infinity symbol and we don't want to overcomplicate
104 # the Dijkstra algorithm with string constants or -1 values
105 $self->_space->_infinity(10 * (max(map values %$_, values %{$self->_space->edges}) // 0));
106
107 if (0) {
108 require "Slic3r/SVG.pm";
109 Slic3r::SVG::output("space.svg",
110 no_arrows => 1,
111 expolygons => $self->islands,
112 lines => $self->_space->get_lines,
113 points => $self->_space->nodes,
114 );
115 printf "%d islands\n", scalar @{$self->islands};
116
117 eval "use Devel::Size";
118 print "MEMORY USAGE:\n";
119 printf " %-19s = %.1fMb\n", $_, Devel::Size::total_size($self->$_)/1024/1024
120 for qw(_space islands);
121 printf " %-19s = %.1fMb\n", $_, Devel::Size::total_size($self->_space->$_)/1024/1024
122 for qw(nodes edges);
123 printf " %-19s = %.1fMb\n", 'self', Devel::Size::total_size($self)/1024/1024;
124
125 exit if $self->internal;
126 }
127 }
128
129 sub shortest_path {
130 my $self = shift;
131 my ($from, $to) = @_;
132
133 return Slic3r::Polyline->new($from, $to)
134 if !@{$self->_space->nodes};
135
136 # create a temporary configuration space
137 my $space = $self->_space->clone;
138
139 # add from/to points to the temporary configuration space
140 my $node_from = $self->_add_point_to_space($from, $space);
141 my $node_to = $self->_add_point_to_space($to, $space);
142
143 # compute shortest path
144 my $path = $space->shortest_path($node_from, $node_to);
145
146 if (!$path->is_valid) {
147 Slic3r::debugf "Failed to compute shortest path.\n";
148 return Slic3r::Polyline->new($from, $to);
149 }
150
151 if (0) {
152 require "Slic3r/SVG.pm";
153 Slic3r::SVG::output("path.svg",
154 no_arrows => 1,
155 expolygons => $self->islands,
156 lines => $space->get_lines,
157 red_points => [$from, $to],
158 red_polylines => [$path],
159 );
160 exit;
161 }
162
163 return $path;
164 }
165
166 # returns the index of the new node
167 sub _add_point_to_space {
168 my ($self, $point, $space) = @_;
169
170 my $n = $space->add_nodes($point);
171
172 # check whether we are inside an island or outside
173 my $inside = defined first { $self->islands->[$_]->contains_point($point) } 0..$#{$self->islands};
174
175 # find candidates by checking visibility from $from to them
176 foreach my $idx (0..$#{$space->nodes}) {
177 my $line = Slic3r::Line->new($point, $space->nodes->[$idx]);
178 # if $point is inside an island, it is visible from $idx when island contains their line
179 # if $point is outside an island, it is visible from $idx when their line does not cross any island
180 if (
181 ($inside && defined first { $_->contains_line($line) } @{$self->_inner})
182 || (!$inside && !@{intersection_pl(
183 [ $line->as_polyline ],
184 [ map @$_, @{$self->islands} ],
185 )})
186 ) {
187 # $n ($point) and $idx are visible
188 $space->add_edge($n, $idx, $line->length);
189 }
190 }
191
192 # if we found no visibility, retry with larger margins
193 if (!exists $space->edges->{$n} && $inside) {
194 foreach my $idx (0..$#{$space->nodes}) {
195 my $line = Slic3r::Line->new($point, $space->nodes->[$idx]);
196 if (defined first { $_->contains_line($line) } @{$self->islands}) {
197 # $n ($point) and $idx are visible
198 $space->add_edge($n, $idx, $line->length);
199 }
200 }
201 }
202
203 warn "Temporary node is not visible from any other node"
204 if !exists $space->edges->{$n};
205
206 return $n;
207 }
208
209 package Slic3r::GCode::MotionPlanner::ConfigurationSpace;
210 use Moo;
211
212 has 'nodes' => (is => 'rw', default => sub { [] }); # [ Point, ... ]
213 has 'edges' => (is => 'rw', default => sub { {} }); # node_idx => { node_idx => distance, ... }
214 has '_infinity' => (is => 'rw');
215
216 sub clone {
217 my $self = shift;
218
219 return (ref $self)->new(
220 nodes => [ map $_->clone, @{$self->nodes} ],
221 edges => { map { $_ => { %{$self->edges->{$_}} } } keys %{$self->edges} },
222 _infinity => $self->_infinity,
223 );
224 }
225
226 sub nodes_count {
227 my $self = shift;
228 return scalar(@{ $self->nodes });
229 }
230
231 sub add_nodes {
232 my ($self, @nodes) = @_;
233
234 my $offset = $self->nodes_count;
235 push @{ $self->nodes }, @nodes;
236 return $offset;
237 }
238
239 sub add_edge {
240 my ($self, $a, $b, $dist) = @_;
241 $self->edges->{$a}{$b} = $self->edges->{$b}{$a} = $dist;
242 }
243
244 sub shortest_path {
245 my ($self, $node_from, $node_to) = @_;
246
247 my $edges = $self->edges;
248 my (%dist, %visited, %prev);
249 $dist{$_} = $self->_infinity for keys %$edges;
250 $dist{$node_from} = 0;
251
252 my @queue = ($node_from);
253 while (@queue) {
254 my $u = -1;
255 {
256 # find node in @queue with smallest distance in %dist and has not been visited
257 my $d = -1;
258 foreach my $n (@queue) {
259 next if $visited{$n};
260 if ($u == -1 || $dist{$n} < $d) {
261 $u = $n;
262 $d = $dist{$n};
263 }
264 }
265 }
266 last if $u == $node_to;
267
268 # remove $u from @queue
269 @queue = grep $_ != $u, @queue;
270 $visited{$u} = 1;
271
272 # loop through neighbors of $u
273 foreach my $v (keys %{ $edges->{$u} }) {
274 my $alt = $dist{$u} + $edges->{$u}{$v};
275 if ($alt < $dist{$v}) {
276 $dist{$v} = $alt;
277 $prev{$v} = $u;
278 if (!$visited{$v}) {
279 push @queue, $v;
280 }
281 }
282 }
283 }
284
285 my @points = ();
286 {
287 my $u = $node_to;
288 while (exists $prev{$u}) {
289 unshift @points, $self->nodes->[$u];
290 $u = $prev{$u};
291 }
292 unshift @points, $self->nodes->[$node_from];
293 }
294
295 return Slic3r::Polyline->new(@points);
296 }
297
298 # for debugging purposes
299 sub get_lines {
300 my $self = shift;
301
302 my @lines = ();
303 my %lines = ();
304 for my $i (keys %{$self->edges}) {
305 for my $j (keys %{$self->edges->{$i}}) {
306 my $line_id = join '_', sort $i, $j;
307 next if $lines{$line_id};
308 $lines{$line_id} = 1;
309 push @lines, Slic3r::Line->new(map $self->nodes->[$_], $i, $j);
310 }
311 }
312
313 return [@lines];
314 }
315
316 1;
0 # A pure perl (no C++ implementation) G-code filter, to control the pressure inside the nozzle.
1
2 package Slic3r::GCode::PressureRegulator;
3 use Moo;
4
5 has 'config' => (is => 'ro', required => 1);
6 has 'enable' => (is => 'rw', default => sub { 0 });
7 has 'reader' => (is => 'ro', default => sub { Slic3r::GCode::Reader->new });
8 has '_extrusion_axis' => (is => 'rw', default => sub { "E" });
9 has '_tool' => (is => 'rw', default => sub { 0 });
10 has '_last_print_F' => (is => 'rw', default => sub { 0 });
11 has '_advance' => (is => 'rw', default => sub { 0 }); # extra E injected
12
13 use Slic3r::Geometry qw(epsilon);
14
15 # Acknowledgements:
16 # The advance algorithm was proposed by Matthew Roberts.
17 # The initial work on this Slic3r feature was done by Luís Andrade (lluis)
18
19 sub BUILD {
20 my ($self) = @_;
21
22 $self->reader->apply_print_config($self->config);
23 $self->_extrusion_axis($self->config->get_extrusion_axis);
24 }
25
26 sub process {
27 my $self = shift;
28 my ($gcode, $flush) = @_;
29
30 my $new_gcode = "";
31
32 $self->reader->parse($gcode, sub {
33 my ($reader, $cmd, $args, $info) = @_;
34
35 if ($cmd =~ /^T(\d+)/) {
36 $self->_tool($1);
37 } elsif ($info->{extruding} && $info->{dist_XY} > 0) {
38 # This is a print move.
39 my $F = $args->{F} // $reader->F;
40 if ($F != $self->_last_print_F) {
41 # We are setting a (potentially) new speed, so we calculate the new advance amount.
42
43 # First calculate relative flow rate (mm of filament over mm of travel)
44 my $rel_flow_rate = $info->{dist_E} / $info->{dist_XY};
45
46 # Then calculate absolute flow rate (mm/sec of feedstock)
47 my $flow_rate = $rel_flow_rate * $F / 60;
48
49 # And finally calculate advance by using the user-configured K factor.
50 my $new_advance = $self->config->pressure_advance * ($flow_rate**2);
51
52 if (abs($new_advance - $self->_advance) > 1E-5) {
53 my $new_E = ($self->config->use_relative_e_distances ? 0 : $reader->E) + ($new_advance - $self->_advance);
54 $new_gcode .= sprintf "G1 %s%.5f F%.3f ; pressure advance\n",
55 $self->_extrusion_axis, $new_E, $self->_unretract_speed;
56 $new_gcode .= sprintf "G92 %s%.5f ; restore E\n", $self->_extrusion_axis, $reader->E
57 if !$self->config->use_relative_e_distances;
58 $self->_advance($new_advance);
59 }
60
61 $self->_last_print_F($F);
62 }
63 } elsif (($info->{retracting} || $cmd eq 'G10') && $self->_advance != 0) {
64 # We need to bring pressure to zero when retracting.
65 $new_gcode .= $self->_discharge($args->{F});
66 }
67
68 $new_gcode .= "$info->{raw}\n";
69 });
70
71 if ($flush) {
72 $new_gcode .= $self->_discharge;
73 }
74
75 return $new_gcode;
76 }
77
78 sub _discharge {
79 my ($self, $F) = @_;
80
81 my $new_E = ($self->config->use_relative_e_distances ? 0 : $self->reader->E) - $self->_advance;
82 my $gcode = sprintf "G1 %s%.5f F%.3f ; pressure discharge\n",
83 $self->_extrusion_axis, $new_E, $F // $self->_unretract_speed;
84 $gcode .= sprintf "G92 %s%.5f ; restore E\n", $self->_extrusion_axis, $self->reader->E
85 if !$self->config->use_relative_e_distances;
86 $self->_advance(0);
87
88 return $gcode;
89 }
90
91 sub _unretract_speed {
92 my ($self) = @_;
93 return $self->config->get_at('retract_speed', $self->_tool) * 60;
94 }
95
96 1;
0 package Slic3r::GCode::Reader;
1 use Moo;
2
3 has 'config' => (is => 'ro', default => sub { Slic3r::Config::GCode->new });
4 has 'X' => (is => 'rw', default => sub {0});
5 has 'Y' => (is => 'rw', default => sub {0});
6 has 'Z' => (is => 'rw', default => sub {0});
7 has 'E' => (is => 'rw', default => sub {0});
8 has 'F' => (is => 'rw', default => sub {0});
9 has '_extrusion_axis' => (is => 'rw', default => sub {"E"});
10
11 our $Verbose = 0;
12 my @AXES = qw(X Y Z E);
13
14 sub apply_print_config {
15 my ($self, $print_config) = @_;
16
17 $self->config->apply_static($print_config);
18 $self->_extrusion_axis($self->config->get_extrusion_axis);
19 }
20
21 sub clone {
22 my $self = shift;
23 return (ref $self)->new(
24 map { $_ => $self->$_ } (@AXES, 'F', '_extrusion_axis', 'config'),
25 );
26 }
27
28 sub parse {
29 my $self = shift;
30 my ($gcode, $cb) = @_;
31
32 foreach my $raw_line (split /\R+/, $gcode) {
33 print "$raw_line\n" if $Verbose || $ENV{SLIC3R_TESTS_GCODE};
34 my $line = $raw_line;
35 $line =~ s/\s*;(.*)//; # strip comment
36 my %info = (comment => $1, raw => $raw_line);
37
38 # parse command
39 my ($command, @args) = split /\s+/, $line;
40 $command //= '';
41 my %args = map { /([A-Z])(.*)/; ($1 => $2) } @args;
42
43 # convert extrusion axis
44 if (exists $args{ $self->_extrusion_axis }) {
45 $args{E} = $args{ $self->_extrusion_axis };
46 }
47
48 # check motion
49 if ($command =~ /^G[01]$/) {
50 foreach my $axis (@AXES) {
51 if (exists $args{$axis}) {
52 $self->$axis(0) if $axis eq 'E' && $self->config->use_relative_e_distances;
53 $info{"dist_$axis"} = $args{$axis} - $self->$axis;
54 $info{"new_$axis"} = $args{$axis};
55 } else {
56 $info{"dist_$axis"} = 0;
57 $info{"new_$axis"} = $self->$axis;
58 }
59 }
60 $info{dist_XY} = sqrt(($info{dist_X}**2) + ($info{dist_Y}**2));
61 if (exists $args{E}) {
62 if ($info{dist_E} > 0) {
63 $info{extruding} = 1;
64 } elsif ($info{dist_E} < 0) {
65 $info{retracting} = 1
66 }
67 } else {
68 $info{travel} = 1;
69 }
70 }
71
72 # run callback
73 $cb->($self, $command, \%args, \%info);
74
75 # update coordinates
76 if ($command =~ /^(?:G[01]|G92)$/) {
77 for my $axis (@AXES, 'F') {
78 $self->$axis($args{$axis}) if exists $args{$axis};
79 }
80 }
81
82 # TODO: update temperatures
83 }
84 }
85
86 1;
0 package Slic3r::GCode::SpiralVase;
1 use Moo;
2
3 has 'config' => (is => 'ro', required => 1);
4 has 'enable' => (is => 'rw', default => sub { 0 });
5 has 'reader' => (is => 'ro', default => sub { Slic3r::GCode::Reader->new });
6
7 use Slic3r::Geometry qw(unscale);
8
9 sub BUILD {
10 my ($self) = @_;
11 $self->reader->apply_print_config($self->config);
12 }
13
14 sub process_layer {
15 my $self = shift;
16 my ($gcode) = @_;
17
18 # This post-processor relies on several assumptions:
19 # - all layers are processed through it, including those that are not supposed
20 # to be transformed, in order to update the reader with the XY positions
21 # - each call to this method includes a full layer, with a single Z move
22 # at the beginning
23 # - each layer is composed by suitable geometry (i.e. a single complete loop)
24 # - loops were not clipped before calling this method
25
26 # if we're not going to modify G-code, just feed it to the reader
27 # in order to update positions
28 if (!$self->enable) {
29 $self->reader->parse($gcode, sub {});
30 return $gcode;
31 }
32
33 # get total XY length for this layer by summing all extrusion moves
34 my $total_layer_length = 0;
35 my $layer_height = 0;
36 my $z = undef;
37 $self->reader->clone->parse($gcode, sub {
38 my ($reader, $cmd, $args, $info) = @_;
39
40 if ($cmd eq 'G1') {
41 if ($info->{extruding}) {
42 $total_layer_length += $info->{dist_XY};
43 } elsif (exists $args->{Z}) {
44 $layer_height += $info->{dist_Z};
45 $z //= $args->{Z};
46 }
47 }
48 });
49
50 #use XXX; XXX [ $gcode, $layer_height, $z, $total_layer_length ];
51 # remove layer height from initial Z
52 $z -= $layer_height;
53
54 my $new_gcode = "";
55 $self->reader->parse($gcode, sub {
56 my ($reader, $cmd, $args, $info) = @_;
57
58 if ($cmd eq 'G1' && exists $args->{Z}) {
59 # if this is the initial Z move of the layer, replace it with a
60 # (redundant) move to the last Z of previous layer
61 my $line = $info->{raw};
62 $line =~ s/ Z[.0-9]+/ Z$z/;
63 $new_gcode .= "$line\n";
64 } elsif ($cmd eq 'G1' && !exists($args->{Z}) && $info->{dist_XY}) {
65 # horizontal move
66 my $line = $info->{raw};
67 if ($info->{extruding}) {
68 $z += $info->{dist_XY} * $layer_height / $total_layer_length;
69 $line =~ s/^G1 /sprintf 'G1 Z%.3f ', $z/e;
70 $new_gcode .= "$line\n";
71 }
72 # skip travel moves: the move to first perimeter point will
73 # cause a visible seam when loops are not aligned in XY; by skipping
74 # it we blend the first loop move in the XY plane (although the smoothness
75 # of such blend depend on how long the first segment is; maybe we should
76 # enforce some minimum length?)
77 } else {
78 $new_gcode .= "$info->{raw}\n";
79 }
80 });
81
82 return $new_gcode;
83 }
84
85 1;
0 # Bed shape dialog
1
2 package Slic3r::GUI::2DBed;
3 use strict;
4 use warnings;
5
6 use List::Util qw(min max);
7 use Slic3r::Geometry qw(PI X Y unscale deg2rad);
8 use Slic3r::Geometry::Clipper qw(intersection_pl);
9 use Wx qw(:misc :pen :brush :font :systemsettings wxTAB_TRAVERSAL wxSOLID);
10 use Wx::Event qw(EVT_PAINT EVT_ERASE_BACKGROUND EVT_MOUSE_EVENTS EVT_SIZE);
11 use base qw(Wx::Panel Class::Accessor);
12
13 __PACKAGE__->mk_accessors(qw(bed_shape interactive pos _scale_factor _shift on_move _painted));
14
15 sub new {
16 my ($class, $parent, $bed_shape) = @_;
17
18 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, [250,-1], wxTAB_TRAVERSAL);
19 $self->{user_drawn_background} = $^O ne 'darwin';
20 $self->bed_shape($bed_shape // []);
21 EVT_PAINT($self, \&_repaint);
22 EVT_ERASE_BACKGROUND($self, sub {}) if $self->{user_drawn_background};
23 EVT_MOUSE_EVENTS($self, \&_mouse_event);
24 EVT_SIZE($self, sub { $self->Refresh; });
25 return $self;
26 }
27
28 sub _repaint {
29 my ($self, $event) = @_;
30
31 my $dc = Wx::AutoBufferedPaintDC->new($self);
32 my ($cw, $ch) = $self->GetSizeWH;
33 return if $cw == 0; # when canvas is not rendered yet, size is 0,0
34
35 if ($self->{user_drawn_background}) {
36 # On all systems the AutoBufferedPaintDC() achieves double buffering.
37 # On MacOS the background is erased, on Windows the background is not erased
38 # and on Linux/GTK the background is erased to gray color.
39 # Fill DC with the background on Windows & Linux/GTK.
40 my $color = Wx::SystemSettings::GetSystemColour(wxSYS_COLOUR_3DLIGHT);
41 $dc->SetPen(Wx::Pen->new($color, 1, wxSOLID));
42 $dc->SetBrush(Wx::Brush->new($color, wxSOLID));
43 my $rect = $self->GetUpdateRegion()->GetBox();
44 $dc->DrawRectangle($rect->GetLeft(), $rect->GetTop(), $rect->GetWidth(), $rect->GetHeight());
45 }
46
47 # turn $cw and $ch from sizes to max coordinates
48 $cw--;
49 $ch--;
50
51 my $cbb = Slic3r::Geometry::BoundingBoxf->new_from_points([
52 Slic3r::Pointf->new(0, 0),
53 Slic3r::Pointf->new($cw, $ch),
54 ]);
55
56 # leave space for origin point
57 $cbb->set_x_min($cbb->x_min + 4);
58 $cbb->set_x_max($cbb->x_max - 4);
59 $cbb->set_y_max($cbb->y_max - 4);
60
61 # leave space for origin label
62 $cbb->set_y_max($cbb->y_max - 13);
63
64 # read new size
65 ($cw, $ch) = @{$cbb->size};
66 my $ccenter = $cbb->center;
67
68 # get bounding box of bed shape in G-code coordinates
69 my $bed_shape = $self->bed_shape;
70 my $bed_polygon = Slic3r::Polygon->new_scale(@$bed_shape);
71 my $bb = Slic3r::Geometry::BoundingBoxf->new_from_points($bed_shape);
72 $bb->merge_point(Slic3r::Pointf->new(0,0)); # origin needs to be in the visible area
73 my ($bw, $bh) = @{$bb->size};
74 my $bcenter = $bb->center;
75
76 # calculate the scaling factor for fitting bed shape in canvas area
77 my $sfactor = min($cw/$bw, $ch/$bh);
78 my $shift = Slic3r::Pointf->new(
79 $ccenter->x - $bcenter->x * $sfactor,
80 $ccenter->y - $bcenter->y * $sfactor, #-
81 );
82 $self->_scale_factor($sfactor);
83 $self->_shift(Slic3r::Pointf->new(
84 $shift->x + $cbb->x_min,
85 $shift->y - ($cbb->y_max-$self->GetSize->GetHeight), #++
86 ));
87
88 # draw bed fill
89 {
90 $dc->SetPen(Wx::Pen->new(Wx::Colour->new(0,0,0), 1, wxSOLID));
91 $dc->SetBrush(Wx::Brush->new(Wx::Colour->new(255,255,255), wxSOLID));
92 $dc->DrawPolygon([ map $self->to_pixels($_), @$bed_shape ], 0, 0);
93 }
94
95 # draw grid
96 {
97 my $step = 10; # 1cm grid
98 my @polylines = ();
99 for (my $x = $bb->x_min - ($bb->x_min % $step) + $step; $x < $bb->x_max; $x += $step) {
100 push @polylines, Slic3r::Polyline->new_scale([$x, $bb->y_min], [$x, $bb->y_max]);
101 }
102 for (my $y = $bb->y_min - ($bb->y_min % $step) + $step; $y < $bb->y_max; $y += $step) {
103 push @polylines, Slic3r::Polyline->new_scale([$bb->x_min, $y], [$bb->x_max, $y]);
104 }
105 @polylines = @{intersection_pl(\@polylines, [$bed_polygon])};
106
107 $dc->SetPen(Wx::Pen->new(Wx::Colour->new(230,230,230), 1, wxSOLID));
108 $dc->DrawLine(map @{$self->to_pixels([map unscale($_), @$_])}, @$_[0,-1]) for @polylines;
109 }
110
111 # draw bed contour
112 {
113 $dc->SetPen(Wx::Pen->new(Wx::Colour->new(0,0,0), 1, wxSOLID));
114 $dc->SetBrush(Wx::Brush->new(Wx::Colour->new(255,255,255), wxTRANSPARENT));
115 $dc->DrawPolygon([ map $self->to_pixels($_), @$bed_shape ], 0, 0);
116 }
117
118 my $origin_px = $self->to_pixels(Slic3r::Pointf->new(0,0));
119
120 # draw axes
121 {
122 my $axes_len = 50;
123 my $arrow_len = 6;
124 my $arrow_angle = deg2rad(45);
125 $dc->SetPen(Wx::Pen->new(Wx::Colour->new(255,0,0), 2, wxSOLID)); # red
126 my $x_end = Slic3r::Pointf->new($origin_px->[X] + $axes_len, $origin_px->[Y]);
127 $dc->DrawLine(@$origin_px, @$x_end);
128 foreach my $angle (-$arrow_angle, +$arrow_angle) {
129 my $end = $x_end->clone;
130 $end->translate(-$arrow_len, 0);
131 $end->rotate($angle, $x_end);
132 $dc->DrawLine(@$x_end, @$end);
133 }
134
135 $dc->SetPen(Wx::Pen->new(Wx::Colour->new(0,255,0), 2, wxSOLID)); # green
136 my $y_end = Slic3r::Pointf->new($origin_px->[X], $origin_px->[Y] - $axes_len);
137 $dc->DrawLine(@$origin_px, @$y_end);
138 foreach my $angle (-$arrow_angle, +$arrow_angle) {
139 my $end = $y_end->clone;
140 $end->translate(0, +$arrow_len);
141 $end->rotate($angle, $y_end);
142 $dc->DrawLine(@$y_end, @$end);
143 }
144 }
145
146 # draw origin
147 {
148 $dc->SetPen(Wx::Pen->new(Wx::Colour->new(0,0,0), 1, wxSOLID));
149 $dc->SetBrush(Wx::Brush->new(Wx::Colour->new(0,0,0), wxSOLID));
150 $dc->DrawCircle(@$origin_px, 3);
151
152 $dc->SetTextForeground(Wx::Colour->new(0,0,0));
153 $dc->SetFont(Wx::Font->new(10, wxDEFAULT, wxNORMAL, wxNORMAL));
154 $dc->DrawText("(0,0)", $origin_px->[X] + 1, $origin_px->[Y] + 2);
155 }
156
157 # draw current position
158 if (defined $self->pos) {
159 my $pos_px = $self->to_pixels($self->pos);
160 $dc->SetPen(Wx::Pen->new(Wx::Colour->new(200,0,0), 2, wxSOLID));
161 $dc->SetBrush(Wx::Brush->new(Wx::Colour->new(200,0,0), wxTRANSPARENT));
162 $dc->DrawCircle(@$pos_px, 5);
163
164 $dc->DrawLine($pos_px->[X]-15, $pos_px->[Y], $pos_px->[X]+15, $pos_px->[Y]);
165 $dc->DrawLine($pos_px->[X], $pos_px->[Y]-15, $pos_px->[X], $pos_px->[Y]+15);
166 }
167
168 $self->_painted(1);
169 }
170
171 sub _mouse_event {
172 my ($self, $event) = @_;
173
174 return if !$self->interactive;
175 return if !$self->_painted;
176
177 my $pos = $event->GetPosition;
178 my $point = $self->to_units([ $pos->x, $pos->y ]); #]]
179 if ($event->LeftDown || $event->Dragging) {
180 $self->on_move->($point) if $self->on_move;
181 $self->Refresh;
182 }
183 }
184
185 # convert G-code coordinates into pixels
186 sub to_pixels {
187 my ($self, $point) = @_;
188
189 my $p = Slic3r::Pointf->new(@$point);
190 $p->scale($self->_scale_factor);
191 $p->translate(@{$self->_shift});
192 return [$p->x, $self->GetSize->GetHeight - $p->y]; #]]
193 }
194
195 # convert pixels into G-code coordinates
196 sub to_units {
197 my ($self, $point) = @_;
198
199 my $p = Slic3r::Pointf->new(
200 $point->[X],
201 $self->GetSize->GetHeight - $point->[Y],
202 );
203 $p->translate(@{$self->_shift->negative});
204 $p->scale(1/$self->_scale_factor);
205 return $p;
206 }
207
208 sub set_pos {
209 my ($self, $pos) = @_;
210
211 $self->pos($pos);
212 $self->Refresh;
213 }
214
215 1;
0 # Implements pure perl packages
1 #
2 # Slic3r::GUI::3DScene::Base;
3 # Slic3r::GUI::3DScene::Volume;
4 # Slic3r::GUI::3DScene;
5 #
6 # It uses static methods of a C++ class Slic3r::GUI::_3DScene::GLVertexArray
7 # for efficient building of vertex arrays for OpenGL rendering.
8 #
9 # Slic3r::GUI::Plater::3D derives from Slic3r::GUI::3DScene,
10 # Slic3r::GUI::Plater::3DPreview, Slic3r::GUI::Plater::3DToolpaths,
11 # Slic3r::GUI::Plater::ObjectCutDialog and Slic3r::GUI::Plater::ObjectPartsPanel
12 # own $self->{canvas} of the Slic3r::GUI::3DScene type.
13 #
14 # Therefore the 3DScene supports renderng of STLs, extrusions and cutting planes,
15 # and camera manipulation.
16
17 package Slic3r::GUI::3DScene::Base;
18 use strict;
19 use warnings;
20
21 use Wx::Event qw(EVT_PAINT EVT_SIZE EVT_ERASE_BACKGROUND EVT_IDLE EVT_MOUSEWHEEL EVT_MOUSE_EVENTS);
22 # must load OpenGL *before* Wx::GLCanvas
23 use OpenGL qw(:glconstants :glfunctions :glufunctions :gluconstants);
24 use base qw(Wx::GLCanvas Class::Accessor);
25 use Math::Trig qw(asin tan);
26 use List::Util qw(reduce min max first);
27 use Slic3r::Geometry qw(X Y Z MIN MAX triangle_normal normalize deg2rad tan scale unscale scaled_epsilon);
28 use Slic3r::Geometry::Clipper qw(offset_ex intersection_pl);
29 use Wx::GLCanvas qw(:all);
30 use Slic3r::Geometry qw(PI);
31
32 # _dirty: boolean flag indicating, that the screen has to be redrawn on EVT_IDLE.
33 # volumes: reference to vector of Slic3r::GUI::3DScene::Volume.
34 # _camera_type: 'perspective' or 'ortho'
35 __PACKAGE__->mk_accessors( qw(_quat _dirty init
36 enable_picking
37 enable_moving
38 on_viewport_changed
39 on_hover
40 on_select
41 on_double_click
42 on_right_click
43 on_move
44 volumes
45 _sphi _stheta
46 cutting_plane_z
47 cut_lines_vertices
48 bed_shape
49 bed_triangles
50 bed_grid_lines
51 background
52 origin
53 _mouse_pos
54 _hover_volume_idx
55 _drag_volume_idx
56 _drag_start_pos
57 _drag_start_xy
58 _dragged
59 _camera_type
60 _camera_target
61 _camera_distance
62 _zoom
63 ) );
64
65 use constant TRACKBALLSIZE => 0.8;
66 use constant TURNTABLE_MODE => 1;
67 use constant GROUND_Z => -0.02;
68 # For mesh selection: Not selected - bright yellow.
69 use constant DEFAULT_COLOR => [1,1,0];
70 # For mesh selection: Selected - bright green.
71 use constant SELECTED_COLOR => [0,1,0,1];
72 # For mesh selection: Mouse hovers over the object, but object not selected yet - dark green.
73 use constant HOVER_COLOR => [0.4,0.9,0,1];
74
75 # phi / theta angles to orient the camera.
76 use constant VIEW_DEFAULT => [45.0,45.0];
77 use constant VIEW_LEFT => [90.0,90.0];
78 use constant VIEW_RIGHT => [-90.0,90.0];
79 use constant VIEW_TOP => [0.0,0.0];
80 use constant VIEW_BOTTOM => [0.0,180.0];
81 use constant VIEW_FRONT => [0.0,90.0];
82 use constant VIEW_REAR => [180.0,90.0];
83
84 # make OpenGL::Array thread-safe
85 {
86 no warnings 'redefine';
87 *OpenGL::Array::CLONE_SKIP = sub { 1 };
88 }
89
90 sub new {
91 my ($class, $parent) = @_;
92
93 # We can only enable multi sample anti aliasing wih wxWidgets 3.0.3 and with a hacked Wx::GLCanvas,
94 # which exports some new WX_GL_XXX constants, namely WX_GL_SAMPLE_BUFFERS and WX_GL_SAMPLES.
95 my $can_multisample =
96 Wx::wxVERSION >= 3.000003 &&
97 defined Wx::GLCanvas->can('WX_GL_SAMPLE_BUFFERS') &&
98 defined Wx::GLCanvas->can('WX_GL_SAMPLES');
99 my $attrib = [WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 24];
100 if ($can_multisample) {
101 # Request a window with multi sampled anti aliasing. This is a new feature in Wx 3.0.3 (backported from 3.1.0).
102 # Use eval to avoid compilation, if the subs WX_GL_SAMPLE_BUFFERS and WX_GL_SAMPLES are missing.
103 eval 'push(@$attrib, (WX_GL_SAMPLE_BUFFERS, 1, WX_GL_SAMPLES, 4));';
104 }
105 # wxWidgets expect the attrib list to be ended by zero.
106 push(@$attrib, 0);
107
108 # we request a depth buffer explicitely because it looks like it's not created by
109 # default on Linux, causing transparency issues
110 my $self = $class->SUPER::new($parent, -1, Wx::wxDefaultPosition, Wx::wxDefaultSize, 0, "", $attrib);
111 if (Wx::wxVERSION >= 3.000003) {
112 # Wx 3.0.3 contains an ugly hack to support some advanced OpenGL attributes through the attribute list.
113 # The attribute list is transferred between the wxGLCanvas and wxGLContext constructors using a single static array s_wglContextAttribs.
114 # Immediatelly force creation of the OpenGL context to consume the static variable s_wglContextAttribs.
115 $self->GetContext();
116 }
117
118 $self->background(1);
119 $self->_quat((0, 0, 0, 1));
120 $self->_stheta(45);
121 $self->_sphi(45);
122 $self->_zoom(1);
123
124 # 3D point in model space
125 $self->_camera_type('ortho');
126 # $self->_camera_type('perspective');
127 $self->_camera_target(Slic3r::Pointf3->new(0,0,0));
128 $self->_camera_distance(0.);
129
130 $self->reset_objects;
131
132 EVT_PAINT($self, sub {
133 my $dc = Wx::PaintDC->new($self);
134 $self->Render($dc);
135 });
136 EVT_SIZE($self, sub { $self->_dirty(1) });
137 EVT_IDLE($self, sub {
138 return unless $self->_dirty;
139 return if !$self->IsShownOnScreen;
140 $self->Resize( $self->GetSizeWH );
141 $self->Refresh;
142 });
143 EVT_MOUSEWHEEL($self, sub {
144 my ($self, $e) = @_;
145
146 # Calculate the zoom delta and apply it to the current zoom factor
147 my $zoom = $e->GetWheelRotation() / $e->GetWheelDelta();
148 $zoom = max(min($zoom, 4), -4);
149 $zoom /= 10;
150 $self->_zoom($self->_zoom / (1-$zoom));
151
152 # In order to zoom around the mouse point we need to translate
153 # the camera target
154 my $size = Slic3r::Pointf->new($self->GetSizeWH);
155 my $pos = Slic3r::Pointf->new($e->GetX, $size->y - $e->GetY); #-
156 $self->_camera_target->translate(
157 # ($pos - $size/2) represents the vector from the viewport center
158 # to the mouse point. By multiplying it by $zoom we get the new,
159 # transformed, length of such vector.
160 # Since we want that point to stay fixed, we move our camera target
161 # in the opposite direction by the delta of the length of such vector
162 # ($zoom - 1). We then scale everything by 1/$self->_zoom since
163 # $self->_camera_target is expressed in terms of model units.
164 -($pos->x - $size->x/2) * ($zoom) / $self->_zoom,
165 -($pos->y - $size->y/2) * ($zoom) / $self->_zoom,
166 0,
167 ) if 0;
168 $self->on_viewport_changed->() if $self->on_viewport_changed;
169 $self->_dirty(1);
170 $self->Refresh;
171 });
172 EVT_MOUSE_EVENTS($self, \&mouse_event);
173
174 return $self;
175 }
176
177 sub mouse_event {
178 my ($self, $e) = @_;
179
180 my $pos = Slic3r::Pointf->new($e->GetPositionXY);
181 if ($e->Entering && &Wx::wxMSW) {
182 # wxMSW needs focus in order to catch mouse wheel events
183 $self->SetFocus;
184 } elsif ($e->LeftDClick) {
185 $self->on_double_click->()
186 if $self->on_double_click;
187 } elsif ($e->LeftDown || $e->RightDown) {
188 # If user pressed left or right button we first check whether this happened
189 # on a volume or not.
190 my $volume_idx = $self->_hover_volume_idx // -1;
191
192 # select volume in this 3D canvas
193 if ($self->enable_picking) {
194 $self->deselect_volumes;
195 $self->select_volume($volume_idx);
196
197 if ($volume_idx != -1) {
198 my $group_id = $self->volumes->[$volume_idx]->select_group_id;
199 my @volumes;
200 if ($group_id != -1) {
201 $self->select_volume($_)
202 for grep $self->volumes->[$_]->select_group_id == $group_id,
203 0..$#{$self->volumes};
204 }
205 }
206
207 $self->Refresh;
208 }
209
210 # propagate event through callback
211 $self->on_select->($volume_idx)
212 if $self->on_select;
213
214 if ($volume_idx != -1) {
215 if ($e->LeftDown && $self->enable_moving) {
216 $self->_drag_volume_idx($volume_idx);
217 $self->_drag_start_pos($self->mouse_to_3d(@$pos));
218 } elsif ($e->RightDown) {
219 # if right clicking on volume, propagate event through callback
220 $self->on_right_click->($e->GetPosition)
221 if $self->on_right_click;
222 }
223 }
224 } elsif ($e->Dragging && $e->LeftIsDown && defined($self->_drag_volume_idx)) {
225 # get new position at the same Z of the initial click point
226 my $mouse_ray = $self->mouse_ray($e->GetX, $e->GetY);
227 my $cur_pos = $mouse_ray->intersect_plane($self->_drag_start_pos->z);
228
229 # calculate the translation vector
230 my $vector = $self->_drag_start_pos->vector_to($cur_pos);
231
232 # get volume being dragged
233 my $volume = $self->volumes->[$self->_drag_volume_idx];
234
235 # get all volumes belonging to the same group, if any
236 my @volumes;
237 if ($volume->drag_group_id == -1) {
238 @volumes = ($volume);
239 } else {
240 @volumes = grep $_->drag_group_id == $volume->drag_group_id, @{$self->volumes};
241 }
242
243 # apply new temporary volume origin and ignore Z
244 $_->origin->translate($vector->x, $vector->y, 0) for @volumes; #,,
245 $self->_drag_start_pos($cur_pos);
246 $self->_dragged(1);
247 $self->Refresh;
248 } elsif ($e->Dragging) {
249 if ($e->LeftIsDown) {
250 # if dragging over blank area with left button, rotate
251 if (defined $self->_drag_start_pos) {
252 my $orig = $self->_drag_start_pos;
253 if (TURNTABLE_MODE) {
254 $self->_sphi($self->_sphi + ($pos->x - $orig->x) * TRACKBALLSIZE);
255 $self->_stheta($self->_stheta - ($pos->y - $orig->y) * TRACKBALLSIZE); #-
256 $self->_stheta(150) if $self->_stheta > 150;
257 $self->_stheta(0) if $self->_stheta < 0;
258 } else {
259 my $size = $self->GetClientSize;
260 my @quat = trackball(
261 $orig->x / ($size->width / 2) - 1,
262 1 - $orig->y / ($size->height / 2), #/
263 $pos->x / ($size->width / 2) - 1,
264 1 - $pos->y / ($size->height / 2), #/
265 );
266 $self->_quat(mulquats($self->_quat, \@quat));
267 }
268 $self->on_viewport_changed->() if $self->on_viewport_changed;
269 $self->Refresh;
270 }
271 $self->_drag_start_pos($pos);
272 } elsif ($e->MiddleIsDown || $e->RightIsDown) {
273 # if dragging over blank area with right button, translate
274
275 if (defined $self->_drag_start_xy) {
276 # get point in model space at Z = 0
277 my $cur_pos = $self->mouse_ray($e->GetX, $e->GetY)->intersect_plane(0);
278 my $orig = $self->mouse_ray(@{$self->_drag_start_xy})->intersect_plane(0);
279 $self->_camera_target->translate(
280 @{$orig->vector_to($cur_pos)->negative},
281 );
282 $self->on_viewport_changed->() if $self->on_viewport_changed;
283 $self->Refresh;
284 }
285 $self->_drag_start_xy($pos);
286 }
287 } elsif ($e->LeftUp || $e->MiddleUp || $e->RightUp) {
288 if ($self->on_move && defined($self->_drag_volume_idx) && $self->_dragged) {
289 # get all volumes belonging to the same group, if any
290 my @volume_idxs;
291 my $group_id = $self->volumes->[$self->_drag_volume_idx]->drag_group_id;
292 if ($group_id == -1) {
293 @volume_idxs = ($self->_drag_volume_idx);
294 } else {
295 @volume_idxs = grep $self->volumes->[$_]->drag_group_id == $group_id,
296 0..$#{$self->volumes};
297 }
298 $self->on_move->(@volume_idxs);
299 }
300 $self->_drag_volume_idx(undef);
301 $self->_drag_start_pos(undef);
302 $self->_drag_start_xy(undef);
303 $self->_dragged(undef);
304 } elsif ($e->Moving) {
305 $self->_mouse_pos($pos);
306 $self->Refresh;
307 } else {
308 $e->Skip();
309 }
310 }
311
312 # Reset selection.
313 sub reset_objects {
314 my ($self) = @_;
315
316 $self->volumes([]);
317 $self->_dirty(1);
318 }
319
320 # Setup camera to view all objects.
321 sub set_viewport_from_scene {
322 my ($self, $scene) = @_;
323
324 $self->_sphi($scene->_sphi);
325 $self->_stheta($scene->_stheta);
326 $self->_camera_target($scene->_camera_target);
327 $self->_zoom($scene->_zoom);
328 $self->_quat($scene->_quat);
329 $self->_dirty(1);
330 }
331
332 # Set the camera to a default orientation,
333 # zoom to volumes.
334 sub select_view {
335 my ($self, $direction) = @_;
336 my $dirvec;
337 if (ref($direction)) {
338 $dirvec = $direction;
339 } else {
340 if ($direction eq 'default') {
341 $dirvec = VIEW_DEFAULT;
342 } elsif ($direction eq 'left') {
343 $dirvec = VIEW_LEFT;
344 } elsif ($direction eq 'right') {
345 $dirvec = VIEW_RIGHT;
346 } elsif ($direction eq 'top') {
347 $dirvec = VIEW_TOP;
348 } elsif ($direction eq 'bottom') {
349 $dirvec = VIEW_BOTTOM;
350 } elsif ($direction eq 'front') {
351 $dirvec = VIEW_FRONT;
352 } elsif ($direction eq 'rear') {
353 $dirvec = VIEW_REAR;
354 }
355 }
356 my $bb = $self->volumes_bounding_box;
357 if (! $bb->empty) {
358 $self->_sphi($dirvec->[0]);
359 $self->_stheta($dirvec->[1]);
360 # Avoid gimball lock.
361 $self->_stheta(150) if $self->_stheta > 150;
362 $self->_stheta(0) if $self->_stheta < 0;
363 # View everything.
364 $self->zoom_to_bounding_box($bb);
365 $self->on_viewport_changed->() if $self->on_viewport_changed;
366 $self->Refresh;
367 }
368 }
369
370 sub zoom_to_bounding_box {
371 my ($self, $bb) = @_;
372 return if ($bb->empty);
373
374 # calculate the zoom factor needed to adjust viewport to
375 # bounding box
376 my $max_size = max(@{$bb->size}) * 2;
377 my $min_viewport_size = min($self->GetSizeWH);
378 $self->_zoom($min_viewport_size / $max_size);
379
380 # center view around bounding box center
381 $self->_camera_target($bb->center);
382
383 $self->on_viewport_changed->() if $self->on_viewport_changed;
384 }
385
386 sub zoom_to_bed {
387 my ($self) = @_;
388
389 if ($self->bed_shape) {
390 $self->zoom_to_bounding_box($self->bed_bounding_box);
391 }
392 }
393
394 sub zoom_to_volume {
395 my ($self, $volume_idx) = @_;
396
397 my $volume = $self->volumes->[$volume_idx];
398 my $bb = $volume->transformed_bounding_box;
399 $self->zoom_to_bounding_box($bb);
400 }
401
402 sub zoom_to_volumes {
403 my ($self) = @_;
404 $self->zoom_to_bounding_box($self->volumes_bounding_box);
405 }
406
407 sub volumes_bounding_box {
408 my ($self) = @_;
409
410 my $bb = Slic3r::Geometry::BoundingBoxf3->new;
411 $bb->merge($_->transformed_bounding_box) for @{$self->volumes};
412 return $bb;
413 }
414
415 sub bed_bounding_box {
416 my ($self) = @_;
417
418 my $bb = Slic3r::Geometry::BoundingBoxf3->new;
419 if ($self->bed_shape) {
420 $bb->merge_point(Slic3r::Pointf3->new(@$_, 0)) for @{$self->bed_shape};
421 }
422 return $bb;
423 }
424
425 sub max_bounding_box {
426 my ($self) = @_;
427
428 my $bb = $self->bed_bounding_box;
429 $bb->merge($self->volumes_bounding_box);
430 return $bb;
431 }
432
433 sub set_auto_bed_shape {
434 my ($self, $bed_shape) = @_;
435
436 # draw a default square bed around object center
437 my $max_size = max(@{ $self->volumes_bounding_box->size });
438 my $center = $self->volumes_bounding_box->center;
439 $self->set_bed_shape([
440 [ $center->x - $max_size, $center->y - $max_size ], #--
441 [ $center->x + $max_size, $center->y - $max_size ], #--
442 [ $center->x + $max_size, $center->y + $max_size ], #++
443 [ $center->x - $max_size, $center->y + $max_size ], #++
444 ]);
445 $self->origin(Slic3r::Pointf->new(@$center[X,Y]));
446 }
447
448 sub set_bed_shape {
449 my ($self, $bed_shape) = @_;
450
451 $self->bed_shape($bed_shape);
452
453 # triangulate bed
454 my $expolygon = Slic3r::ExPolygon->new([ map [map scale($_), @$_], @$bed_shape ]);
455 my $bed_bb = $expolygon->bounding_box;
456
457 {
458 my @points = ();
459 foreach my $triangle (@{ $expolygon->triangulate }) {
460 push @points, map {+ unscale($_->x), unscale($_->y), GROUND_Z } @$triangle; #))
461 }
462 $self->bed_triangles(OpenGL::Array->new_list(GL_FLOAT, @points));
463 }
464
465 {
466 my @polylines = ();
467 for (my $x = $bed_bb->x_min; $x <= $bed_bb->x_max; $x += scale 10) {
468 push @polylines, Slic3r::Polyline->new([$x,$bed_bb->y_min], [$x,$bed_bb->y_max]);
469 }
470 for (my $y = $bed_bb->y_min; $y <= $bed_bb->y_max; $y += scale 10) {
471 push @polylines, Slic3r::Polyline->new([$bed_bb->x_min,$y], [$bed_bb->x_max,$y]);
472 }
473 # clip with a slightly grown expolygon because our lines lay on the contours and
474 # may get erroneously clipped
475 my @lines = map Slic3r::Line->new(@$_[0,-1]),
476 @{intersection_pl(\@polylines, [ @{$expolygon->offset(+scaled_epsilon)} ])};
477
478 # append bed contours
479 push @lines, map @{$_->lines}, @$expolygon;
480
481 my @points = ();
482 foreach my $line (@lines) {
483 push @points, map {+ unscale($_->x), unscale($_->y), GROUND_Z } @$line; #))
484 }
485 $self->bed_grid_lines(OpenGL::Array->new_list(GL_FLOAT, @points));
486 }
487
488 $self->origin(Slic3r::Pointf->new(0,0));
489 }
490
491 sub deselect_volumes {
492 my ($self) = @_;
493 $_->selected(0) for @{$self->volumes};
494 }
495
496 sub select_volume {
497 my ($self, $volume_idx) = @_;
498
499 $self->volumes->[$volume_idx]->selected(1)
500 if $volume_idx != -1;
501 }
502
503 sub SetCuttingPlane {
504 my ($self, $z, $expolygons) = @_;
505
506 $self->cutting_plane_z($z);
507
508 # grow slices in order to display them better
509 $expolygons = offset_ex([ map @$_, @$expolygons ], scale 0.1);
510
511 my @verts = ();
512 foreach my $line (map @{$_->lines}, map @$_, @$expolygons) {
513 push @verts, (
514 unscale($line->a->x), unscale($line->a->y), $z, #))
515 unscale($line->b->x), unscale($line->b->y), $z, #))
516 );
517 }
518 $self->cut_lines_vertices(OpenGL::Array->new_list(GL_FLOAT, @verts));
519 }
520
521 # Given an axis and angle, compute quaternion.
522 sub axis_to_quat {
523 my ($ax, $phi) = @_;
524
525 my $lena = sqrt(reduce { $a + $b } (map { $_ * $_ } @$ax));
526 my @q = map { $_ * (1 / $lena) } @$ax;
527 @q = map { $_ * sin($phi / 2.0) } @q;
528 $q[$#q + 1] = cos($phi / 2.0);
529 return @q;
530 }
531
532 # Project a point on the virtual trackball.
533 # If it is inside the sphere, map it to the sphere, if it outside map it
534 # to a hyperbola.
535 sub project_to_sphere {
536 my ($r, $x, $y) = @_;
537
538 my $d = sqrt($x * $x + $y * $y);
539 if ($d < $r * 0.70710678118654752440) { # Inside sphere
540 return sqrt($r * $r - $d * $d);
541 } else { # On hyperbola
542 my $t = $r / 1.41421356237309504880;
543 return $t * $t / $d;
544 }
545 }
546
547 sub cross {
548 my ($v1, $v2) = @_;
549
550 return (@$v1[1] * @$v2[2] - @$v1[2] * @$v2[1],
551 @$v1[2] * @$v2[0] - @$v1[0] * @$v2[2],
552 @$v1[0] * @$v2[1] - @$v1[1] * @$v2[0]);
553 }
554
555 # Simulate a track-ball. Project the points onto the virtual trackball,
556 # then figure out the axis of rotation, which is the cross product of
557 # P1 P2 and O P1 (O is the center of the ball, 0,0,0) Note: This is a
558 # deformed trackball-- is a trackball in the center, but is deformed
559 # into a hyperbolic sheet of rotation away from the center.
560 # It is assumed that the arguments to this routine are in the range
561 # (-1.0 ... 1.0).
562 sub trackball {
563 my ($p1x, $p1y, $p2x, $p2y) = @_;
564
565 if ($p1x == $p2x && $p1y == $p2y) {
566 # zero rotation
567 return (0.0, 0.0, 0.0, 1.0);
568 }
569
570 # First, figure out z-coordinates for projection of P1 and P2 to
571 # deformed sphere
572 my @p1 = ($p1x, $p1y, project_to_sphere(TRACKBALLSIZE, $p1x, $p1y));
573 my @p2 = ($p2x, $p2y, project_to_sphere(TRACKBALLSIZE, $p2x, $p2y));
574
575 # axis of rotation (cross product of P1 and P2)
576 my @a = cross(\@p2, \@p1);
577
578 # Figure out how much to rotate around that axis.
579 my @d = map { $_ * $_ } (map { $p1[$_] - $p2[$_] } 0 .. $#p1);
580 my $t = sqrt(reduce { $a + $b } @d) / (2.0 * TRACKBALLSIZE);
581
582 # Avoid problems with out-of-control values...
583 $t = 1.0 if ($t > 1.0);
584 $t = -1.0 if ($t < -1.0);
585 my $phi = 2.0 * asin($t);
586
587 return axis_to_quat(\@a, $phi);
588 }
589
590 # Build a rotation matrix, given a quaternion rotation.
591 sub quat_to_rotmatrix {
592 my ($q) = @_;
593
594 my @m = ();
595
596 $m[0] = 1.0 - 2.0 * (@$q[1] * @$q[1] + @$q[2] * @$q[2]);
597 $m[1] = 2.0 * (@$q[0] * @$q[1] - @$q[2] * @$q[3]);
598 $m[2] = 2.0 * (@$q[2] * @$q[0] + @$q[1] * @$q[3]);
599 $m[3] = 0.0;
600
601 $m[4] = 2.0 * (@$q[0] * @$q[1] + @$q[2] * @$q[3]);
602 $m[5] = 1.0 - 2.0 * (@$q[2] * @$q[2] + @$q[0] * @$q[0]);
603 $m[6] = 2.0 * (@$q[1] * @$q[2] - @$q[0] * @$q[3]);
604 $m[7] = 0.0;
605
606 $m[8] = 2.0 * (@$q[2] * @$q[0] - @$q[1] * @$q[3]);
607 $m[9] = 2.0 * (@$q[1] * @$q[2] + @$q[0] * @$q[3]);
608 $m[10] = 1.0 - 2.0 * (@$q[1] * @$q[1] + @$q[0] * @$q[0]);
609 $m[11] = 0.0;
610
611 $m[12] = 0.0;
612 $m[13] = 0.0;
613 $m[14] = 0.0;
614 $m[15] = 1.0;
615
616 return @m;
617 }
618
619 sub mulquats {
620 my ($q1, $rq) = @_;
621
622 return (@$q1[3] * @$rq[0] + @$q1[0] * @$rq[3] + @$q1[1] * @$rq[2] - @$q1[2] * @$rq[1],
623 @$q1[3] * @$rq[1] + @$q1[1] * @$rq[3] + @$q1[2] * @$rq[0] - @$q1[0] * @$rq[2],
624 @$q1[3] * @$rq[2] + @$q1[2] * @$rq[3] + @$q1[0] * @$rq[1] - @$q1[1] * @$rq[0],
625 @$q1[3] * @$rq[3] - @$q1[0] * @$rq[0] - @$q1[1] * @$rq[1] - @$q1[2] * @$rq[2])
626 }
627
628 sub mouse_to_3d {
629 my ($self, $x, $y, $z) = @_;
630
631 my @viewport = glGetIntegerv_p(GL_VIEWPORT); # 4 items
632 my @mview = glGetDoublev_p(GL_MODELVIEW_MATRIX); # 16 items
633 my @proj = glGetDoublev_p(GL_PROJECTION_MATRIX); # 16 items
634
635 $y = $viewport[3] - $y;
636 $z //= glReadPixels_p($x, $y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT);
637 my @projected = gluUnProject_p($x, $y, $z, @mview, @proj, @viewport);
638 return Slic3r::Pointf3->new(@projected);
639 }
640
641 sub mouse_ray {
642 my ($self, $x, $y) = @_;
643
644 return Slic3r::Linef3->new(
645 $self->mouse_to_3d($x, $y, 0),
646 $self->mouse_to_3d($x, $y, 1),
647 );
648 }
649
650 sub GetContext {
651 my ($self) = @_;
652
653 if (Wx::wxVERSION >= 2.009) {
654 return $self->{context} ||= Wx::GLContext->new($self);
655 } else {
656 return $self->SUPER::GetContext;
657 }
658 }
659
660 sub SetCurrent {
661 my ($self, $context) = @_;
662
663 if (Wx::wxVERSION >= 2.009) {
664 return $self->SUPER::SetCurrent($context);
665 } else {
666 return $self->SUPER::SetCurrent;
667 }
668 }
669
670 sub Resize {
671 my ($self, $x, $y) = @_;
672
673 return unless $self->GetContext;
674 $self->_dirty(0);
675
676 $self->SetCurrent($self->GetContext);
677 glViewport(0, 0, $x, $y);
678
679 $x /= $self->_zoom;
680 $y /= $self->_zoom;
681
682 glMatrixMode(GL_PROJECTION);
683 glLoadIdentity();
684 if ($self->_camera_type eq 'ortho') {
685 #FIXME setting the size of the box 10x larger than necessary
686 # is only a workaround for an incorrectly set camera.
687 # This workaround harms Z-buffer accuracy!
688 # my $depth = 1.05 * $self->max_bounding_box->radius();
689 my $depth = 10.0 * $self->max_bounding_box->radius();
690 glOrtho(
691 -$x/2, $x/2, -$y/2, $y/2,
692 -$depth, $depth,
693 );
694 } else {
695 die "Invalid camera type: ", $self->_camera_type, "\n" if ($self->_camera_type ne 'perspective');
696 my $bbox_r = $self->max_bounding_box->radius();
697 my $fov = PI * 45. / 180.;
698 my $fov_tan = tan(0.5 * $fov);
699 my $cam_distance = 0.5 * $bbox_r / $fov_tan;
700 $self->_camera_distance($cam_distance);
701 my $nr = $cam_distance - $bbox_r * 1.1;
702 my $fr = $cam_distance + $bbox_r * 1.1;
703 $nr = 1 if ($nr < 1);
704 $fr = $nr + 1 if ($fr < $nr + 1);
705 my $h2 = $fov_tan * $nr;
706 my $w2 = $h2 * $x / $y;
707 glFrustum(-$w2, $w2, -$h2, $h2, $nr, $fr);
708 }
709
710 glMatrixMode(GL_MODELVIEW);
711 }
712
713 sub InitGL {
714 my $self = shift;
715
716 return if $self->init;
717 return unless $self->GetContext;
718 $self->init(1);
719
720 glClearColor(0, 0, 0, 1);
721 glColor3f(1, 0, 0);
722 glEnable(GL_DEPTH_TEST);
723 glClearDepth(1.0);
724 glDepthFunc(GL_LEQUAL);
725 glEnable(GL_CULL_FACE);
726 glEnable(GL_BLEND);
727 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
728
729 # Set antialiasing/multisampling
730 glDisable(GL_LINE_SMOOTH);
731 glDisable(GL_POLYGON_SMOOTH);
732 glEnable(GL_MULTISAMPLE);
733 # glHint(GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST);
734
735 # ambient lighting
736 glLightModelfv_p(GL_LIGHT_MODEL_AMBIENT, 0.3, 0.3, 0.3, 1);
737
738 glEnable(GL_LIGHTING);
739 glEnable(GL_LIGHT0);
740 glEnable(GL_LIGHT1);
741
742 # light from camera
743 glLightfv_p(GL_LIGHT1, GL_POSITION, 1, 0, 1, 0);
744 glLightfv_p(GL_LIGHT1, GL_SPECULAR, 0.3, 0.3, 0.3, 1);
745 glLightfv_p(GL_LIGHT1, GL_DIFFUSE, 0.2, 0.2, 0.2, 1);
746
747 # Enables Smooth Color Shading; try GL_FLAT for (lack of) fun.
748 glShadeModel(GL_SMOOTH);
749
750 glMaterialfv_p(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 0.5, 0.3, 0.3, 1);
751 glMaterialfv_p(GL_FRONT_AND_BACK, GL_SPECULAR, 1, 1, 1, 1);
752 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50);
753 glMaterialfv_p(GL_FRONT_AND_BACK, GL_EMISSION, 0.1, 0, 0, 0.9);
754
755 # A handy trick -- have surface material mirror the color.
756 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
757 glEnable(GL_COLOR_MATERIAL);
758 glEnable(GL_MULTISAMPLE);
759 }
760
761 sub Render {
762 my ($self, $dc) = @_;
763
764 # prevent calling SetCurrent() when window is not shown yet
765 return unless $self->IsShownOnScreen;
766 return unless my $context = $self->GetContext;
767 $self->SetCurrent($context);
768 $self->InitGL;
769
770 glClearColor(1, 1, 1, 1);
771 glClearDepth(1);
772 glDepthFunc(GL_LESS);
773 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
774
775 glMatrixMode(GL_MODELVIEW);
776 glLoadIdentity();
777
778 {
779 # Shift the perspective camera.
780 my $camera_pos = Slic3r::Pointf3->new(0,0,-$self->_camera_distance);
781 glTranslatef(@$camera_pos);
782 }
783
784 if (TURNTABLE_MODE) {
785 glRotatef(-$self->_stheta, 1, 0, 0); # pitch
786 glRotatef($self->_sphi, 0, 0, 1); # yaw
787 } else {
788 my @rotmat = quat_to_rotmatrix($self->quat);
789 glMultMatrixd_p(@rotmat[0..15]);
790 }
791 glTranslatef(@{ $self->_camera_target->negative });
792
793 # light from above
794 glLightfv_p(GL_LIGHT0, GL_POSITION, -0.5, -0.5, 1, 0);
795 glLightfv_p(GL_LIGHT0, GL_SPECULAR, 0.2, 0.2, 0.2, 1);
796 glLightfv_p(GL_LIGHT0, GL_DIFFUSE, 0.5, 0.5, 0.5, 1);
797
798 if ($self->enable_picking) {
799 # Render the object for picking.
800 # FIXME This cannot possibly work in a multi-sampled context as the color gets mangled by the anti-aliasing.
801 # Better to use software ray-casting on a bounding-box hierarchy.
802 glDisable(GL_LIGHTING);
803 $self->draw_volumes(1);
804 glFlush();
805 glFinish();
806
807 if (my $pos = $self->_mouse_pos) {
808 my $col = [ glReadPixels_p($pos->x, $self->GetSize->GetHeight - $pos->y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE) ];
809 my $volume_idx = $col->[0] + $col->[1]*256 + $col->[2]*256*256;
810 $self->_hover_volume_idx(undef);
811 $_->hover(0) for @{$self->volumes};
812 if ($volume_idx <= $#{$self->volumes}) {
813 $self->_hover_volume_idx($volume_idx);
814
815 $self->volumes->[$volume_idx]->hover(1);
816 my $group_id = $self->volumes->[$volume_idx]->select_group_id;
817 if ($group_id != -1) {
818 $_->hover(1) for grep { $_->select_group_id == $group_id } @{$self->volumes};
819 }
820
821 $self->on_hover->($volume_idx) if $self->on_hover;
822 }
823 }
824 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
825 glFlush();
826 glFinish();
827 glEnable(GL_LIGHTING);
828 }
829
830 # draw fixed background
831 if ($self->background) {
832 glDisable(GL_LIGHTING);
833 glPushMatrix();
834 glLoadIdentity();
835
836 glMatrixMode(GL_PROJECTION);
837 glPushMatrix();
838 glLoadIdentity();
839
840 # Draws a bluish bottom to top gradient over the complete screen.
841 glDisable(GL_DEPTH_TEST);
842 glBegin(GL_QUADS);
843 glColor3f(0.0,0.0,0.0);
844 glVertex3f(-1.0,-1.0, 1.0);
845 glVertex3f( 1.0,-1.0, 1.0);
846 glColor3f(10/255,98/255,144/255);
847 glVertex3f( 1.0, 1.0, 1.0);
848 glVertex3f(-1.0, 1.0, 1.0);
849 glEnd();
850 glPopMatrix();
851 glEnable(GL_DEPTH_TEST);
852
853 glMatrixMode(GL_MODELVIEW);
854 glPopMatrix();
855 glEnable(GL_LIGHTING);
856 }
857
858 # draw ground and axes
859 glDisable(GL_LIGHTING);
860
861 # draw ground
862 my $ground_z = GROUND_Z;
863 if ($self->bed_triangles) {
864 glDisable(GL_DEPTH_TEST);
865
866 glEnable(GL_BLEND);
867 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
868
869 glEnableClientState(GL_VERTEX_ARRAY);
870 glColor4f(0.8, 0.6, 0.5, 0.4);
871 glNormal3d(0,0,1);
872 glVertexPointer_p(3, $self->bed_triangles);
873 glDrawArrays(GL_TRIANGLES, 0, $self->bed_triangles->elements / 3);
874 glDisableClientState(GL_VERTEX_ARRAY);
875
876 # we need depth test for grid, otherwise it would disappear when looking
877 # the object from below
878 glEnable(GL_DEPTH_TEST);
879
880 # draw grid
881 glLineWidth(3);
882 glColor4f(0.2, 0.2, 0.2, 0.4);
883 glEnableClientState(GL_VERTEX_ARRAY);
884 glVertexPointer_p(3, $self->bed_grid_lines);
885 glDrawArrays(GL_LINES, 0, $self->bed_grid_lines->elements / 3);
886 glDisableClientState(GL_VERTEX_ARRAY);
887
888 glDisable(GL_BLEND);
889 }
890
891 my $volumes_bb = $self->volumes_bounding_box;
892
893 {
894 # draw axes
895 # disable depth testing so that axes are not covered by ground
896 glDisable(GL_DEPTH_TEST);
897 my $origin = $self->origin;
898 my $axis_len = max(
899 0.3 * max(@{ $self->bed_bounding_box->size }),
900 2 * max(@{ $volumes_bb->size }),
901 );
902 glLineWidth(2);
903 glBegin(GL_LINES);
904 # draw line for x axis
905 glColor3f(1, 0, 0);
906 glVertex3f(@$origin, $ground_z);
907 glVertex3f($origin->x + $axis_len, $origin->y, $ground_z); #,,
908 # draw line for y axis
909 glColor3f(0, 1, 0);
910 glVertex3f(@$origin, $ground_z);
911 glVertex3f($origin->x, $origin->y + $axis_len, $ground_z); #++
912 glEnd();
913 # draw line for Z axis
914 # (re-enable depth test so that axis is correctly shown when objects are behind it)
915 glEnable(GL_DEPTH_TEST);
916 glBegin(GL_LINES);
917 glColor3f(0, 0, 1);
918 glVertex3f(@$origin, $ground_z);
919 glVertex3f(@$origin, $ground_z+$axis_len);
920 glEnd();
921 }
922
923 glEnable(GL_LIGHTING);
924
925 # draw objects
926 $self->draw_volumes;
927
928 # draw cutting plane
929 if (defined $self->cutting_plane_z) {
930 my $plane_z = $self->cutting_plane_z;
931 my $bb = $volumes_bb;
932 glDisable(GL_CULL_FACE);
933 glDisable(GL_LIGHTING);
934 glEnable(GL_BLEND);
935 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
936 glBegin(GL_QUADS);
937 glColor4f(0.8, 0.8, 0.8, 0.5);
938 glVertex3f($bb->x_min-20, $bb->y_min-20, $plane_z);
939 glVertex3f($bb->x_max+20, $bb->y_min-20, $plane_z);
940 glVertex3f($bb->x_max+20, $bb->y_max+20, $plane_z);
941 glVertex3f($bb->x_min-20, $bb->y_max+20, $plane_z);
942 glEnd();
943 glEnable(GL_CULL_FACE);
944 glDisable(GL_BLEND);
945 }
946
947 glFlush();
948
949 $self->SwapBuffers();
950 }
951
952 sub draw_volumes {
953 # $fakecolor is a boolean indicating, that the objects shall be rendered in a color coding the object index for picking.
954 my ($self, $fakecolor) = @_;
955
956 glEnable(GL_BLEND);
957 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
958
959 glEnableClientState(GL_VERTEX_ARRAY);
960 glEnableClientState(GL_NORMAL_ARRAY);
961
962 foreach my $volume_idx (0..$#{$self->volumes}) {
963 my $volume = $self->volumes->[$volume_idx];
964
965 if ($fakecolor) {
966 # Object picking mode. Render the object with a color encoding the object index.
967 my $r = ($volume_idx & 0x000000FF) >> 0;
968 my $g = ($volume_idx & 0x0000FF00) >> 8;
969 my $b = ($volume_idx & 0x00FF0000) >> 16;
970 glColor4f($r/255.0, $g/255.0, $b/255.0, 1);
971 } elsif ($volume->selected) {
972 glColor4f(@{ &SELECTED_COLOR });
973 } elsif ($volume->hover) {
974 glColor4f(@{ &HOVER_COLOR });
975 } else {
976 glColor4f(@{ $volume->color });
977 }
978
979 my $qverts_begin = 0;
980 my $qverts_end = defined($volume->qverts) ? $volume->qverts->size() : 0;
981 my $tverts_begin = 0;
982 my $tverts_end = defined($volume->tverts) ? $volume->tverts->size() : 0;
983 my $n_offsets = ($volume->range && $volume->offsets) ? scalar(@{$volume->offsets}) : 0;
984 if ($n_offsets) {
985 # The Z layer range is specified.
986 # First test whether the Z span of this object is not out of ($min_z, $max_z) completely.
987 my ($min_z, $max_z) = @{$volume->range};
988 next if ($volume->offsets->[0] > $max_z || $volume->offsets->[-3] < $min_z);
989 # Then find the lowest layer to be displayed.
990 my $i = 0;
991 while ($i < $n_offsets && $volume->offsets->[$i] < $min_z) {
992 $i += 3;
993 }
994 # This shall not happen.
995 next if ($i == $n_offsets);
996 # Remember start of the layer.
997 $qverts_begin = $volume->offsets->[$i+1];
998 $tverts_begin = $volume->offsets->[$i+2];
999 # Some layers are above $min_z. Which?
1000 while ($i < $n_offsets && $volume->offsets->[$i] <= $max_z) {
1001 $i += 3;
1002 }
1003 if ($i < $n_offsets) {
1004 $qverts_end = $volume->offsets->[$i+1];
1005 $tverts_end = $volume->offsets->[$i+2];
1006 }
1007 }
1008
1009 glPushMatrix();
1010 glTranslatef(@{$volume->origin});
1011
1012 glCullFace(GL_BACK);
1013 if ($qverts_begin < $qverts_end) {
1014 glVertexPointer_c(3, GL_FLOAT, 0, $volume->qverts->verts_ptr);
1015 glNormalPointer_c(GL_FLOAT, 0, $volume->qverts->norms_ptr);
1016 glDrawArrays(GL_QUADS, $qverts_begin / 3, ($qverts_end-$qverts_begin) / 3);
1017 }
1018
1019 if ($tverts_begin < $tverts_end) {
1020 glVertexPointer_c(3, GL_FLOAT, 0, $volume->tverts->verts_ptr);
1021 glNormalPointer_c(GL_FLOAT, 0, $volume->tverts->norms_ptr);
1022 glDrawArrays(GL_TRIANGLES, $tverts_begin / 3, ($tverts_end-$tverts_begin) / 3);
1023 }
1024
1025 glPopMatrix();
1026 }
1027 glDisableClientState(GL_NORMAL_ARRAY);
1028 glDisable(GL_BLEND);
1029
1030 if (defined $self->cutting_plane_z) {
1031 glLineWidth(2);
1032 glColor3f(0, 0, 0);
1033 glVertexPointer_p(3, $self->cut_lines_vertices);
1034 glDrawArrays(GL_LINES, 0, $self->cut_lines_vertices->elements / 3);
1035 }
1036 glDisableClientState(GL_VERTEX_ARRAY);
1037 }
1038
1039 sub _report_opengl_state
1040 {
1041 my ($self, $comment) = @_;
1042 my $err = glGetError();
1043 return 0 if ($err == 0);
1044
1045 # gluErrorString() hangs. Don't use it.
1046 # my $errorstr = gluErrorString();
1047 my $errorstr = '';
1048 if ($err == 0x0500) {
1049 $errorstr = 'GL_INVALID_ENUM';
1050 } elsif ($err == GL_INVALID_VALUE) {
1051 $errorstr = 'GL_INVALID_VALUE';
1052 } elsif ($err == GL_INVALID_OPERATION) {
1053 $errorstr = 'GL_INVALID_OPERATION';
1054 } elsif ($err == GL_STACK_OVERFLOW) {
1055 $errorstr = 'GL_STACK_OVERFLOW';
1056 } elsif ($err == GL_OUT_OF_MEMORY) {
1057 $errorstr = 'GL_OUT_OF_MEMORY';
1058 } else {
1059 $errorstr = 'unknown';
1060 }
1061 if (defined($comment)) {
1062 printf("OpenGL error at %s, nr %d (0x%x): %s\n", $comment, $err, $err, $errorstr);
1063 } else {
1064 printf("OpenGL error nr %d (0x%x): %s\n", $err, $err, $errorstr);
1065 }
1066 }
1067
1068 # Container for object geometry and selection status.
1069 package Slic3r::GUI::3DScene::Volume;
1070 use Moo;
1071
1072 has 'bounding_box' => (is => 'ro', required => 1);
1073 has 'origin' => (is => 'rw', default => sub { Slic3r::Pointf3->new(0,0,0) });
1074 has 'color' => (is => 'ro', required => 1);
1075 # An ID for group selection. It may be the same for all meshes of all object instances, or for just a single object instance.
1076 has 'select_group_id' => (is => 'rw', default => sub { -1 });
1077 # An ID for group dragging. It may be the same for all meshes of all object instances, or for just a single object instance.
1078 has 'drag_group_id' => (is => 'rw', default => sub { -1 });
1079 # Boolean: Is this object selected?
1080 has 'selected' => (is => 'rw', default => sub { 0 });
1081 # Boolean: Is mouse over this object?
1082 has 'hover' => (is => 'rw', default => sub { 0 });
1083 # Vector of two values: a span in the Z axis. Meaningful for a display of layers.
1084 has 'range' => (is => 'rw');
1085
1086 # Geometric data.
1087 # Quads: GLVertexArray object: C++ class maintaining an std::vector<float> for coords and normals.
1088 has 'qverts' => (is => 'rw');
1089 # Triangles: GLVertexArray object
1090 has 'tverts' => (is => 'rw');
1091 # If the qverts or tverts contain thick extrusions, then offsets keeps pointers of the starts
1092 # of the extrusions per layer.
1093 # The offsets stores tripples of (z_top, qverts_idx, tverts_idx) in a linear array.
1094 has 'offsets' => (is => 'rw');
1095
1096 sub transformed_bounding_box {
1097 my ($self) = @_;
1098
1099 my $bb = $self->bounding_box;
1100 $bb->translate(@{$self->origin});
1101 return $bb;
1102 }
1103
1104
1105 # The 3D canvas to display objects and tool paths.
1106 package Slic3r::GUI::3DScene;
1107 use base qw(Slic3r::GUI::3DScene::Base);
1108
1109 use OpenGL qw(:glconstants :gluconstants :glufunctions);
1110 use List::Util qw(first min max);
1111 use Slic3r::Geometry qw(scale unscale epsilon);
1112 use Slic3r::Print::State ':steps';
1113
1114 # Perimeter: yellow, Infill: redish, Suport: greenish, last: blueish,
1115 use constant COLORS => [ [1,1,0,1], [1,0.5,0.5,1], [0.5,1,0.5,1], [0.5,0.5,1,1] ];
1116
1117 __PACKAGE__->mk_accessors(qw(
1118 color_by
1119 select_by
1120 drag_by
1121 volumes_by_object
1122 _objects_by_volumes
1123 ));
1124
1125 sub new {
1126 my $class = shift;
1127
1128 my $self = $class->SUPER::new(@_);
1129 $self->color_by('volume'); # object | volume
1130 $self->select_by('object'); # object | volume | instance
1131 $self->drag_by('instance'); # object | instance
1132 $self->volumes_by_object({}); # obj_idx => [ volume_idx, volume_idx ... ]
1133 $self->_objects_by_volumes({}); # volume_idx => [ obj_idx, instance_idx ]
1134
1135 return $self;
1136 }
1137
1138 sub load_object {
1139 my ($self, $model, $obj_idx, $instance_idxs) = @_;
1140
1141 my $model_object;
1142 if ($model->isa('Slic3r::Model::Object')) {
1143 $model_object = $model;
1144 $model = $model_object->model;
1145 $obj_idx = 0;
1146 } else {
1147 $model_object = $model->get_object($obj_idx);
1148 }
1149
1150 $instance_idxs ||= [0..$#{$model_object->instances}];
1151
1152 my @volumes_idx = ();
1153 foreach my $volume_idx (0..$#{$model_object->volumes}) {
1154 my $volume = $model_object->volumes->[$volume_idx];
1155 foreach my $instance_idx (@$instance_idxs) {
1156 my $instance = $model_object->instances->[$instance_idx];
1157 my $mesh = $volume->mesh->clone;
1158 $instance->transform_mesh($mesh);
1159
1160 my $color_idx;
1161 if ($self->color_by eq 'volume') {
1162 $color_idx = $volume_idx;
1163 } elsif ($self->color_by eq 'object') {
1164 $color_idx = $obj_idx;
1165 }
1166
1167 # Using the colors 'yellowish', 'greenish', 'blueish' for both the extrusion paths
1168 # and the volumes of a single multi-color object.
1169 #FIXME so for 4 or more color print, there will be only 3 colors displayed, which will
1170 # not correspond to the color of the filament.
1171 my $color = [ @{COLORS->[ $color_idx % scalar(@{&COLORS}) ]} ];
1172 $color->[3] = $volume->modifier ? 0.5 : 1;
1173 push @{$self->volumes}, my $v = Slic3r::GUI::3DScene::Volume->new(
1174 bounding_box => $mesh->bounding_box,
1175 color => $color,
1176 );
1177 if ($self->select_by eq 'object') {
1178 $v->select_group_id($obj_idx*1000000);
1179 } elsif ($self->select_by eq 'volume') {
1180 $v->select_group_id($obj_idx*1000000 + $volume_idx*1000);
1181 } elsif ($self->select_by eq 'instance') {
1182 $v->select_group_id($obj_idx*1000000 + $volume_idx*1000 + $instance_idx);
1183 }
1184 if ($self->drag_by eq 'object') {
1185 $v->drag_group_id($obj_idx*1000);
1186 } elsif ($self->drag_by eq 'instance') {
1187 $v->drag_group_id($obj_idx*1000 + $instance_idx);
1188 }
1189 push @volumes_idx, my $scene_volume_idx = $#{$self->volumes};
1190 $self->_objects_by_volumes->{$scene_volume_idx} = [ $obj_idx, $volume_idx, $instance_idx ];
1191
1192 my $verts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1193 $verts->load_mesh($mesh);
1194 $v->tverts($verts);
1195 }
1196 }
1197
1198 $self->volumes_by_object->{$obj_idx} = [@volumes_idx];
1199 return @volumes_idx;
1200 }
1201
1202 # Called possibly by utils/view-toolpaths.pl, likely broken.
1203 sub load_print_object_slices {
1204 my ($self, $object) = @_;
1205
1206 my @verts = ();
1207 my @norms = ();
1208 my @quad_verts = ();
1209 my @quad_norms = ();
1210 foreach my $layer (@{$object->layers}) {
1211 my $gap = 0;
1212 my $top_z = $layer->print_z;
1213 my $bottom_z = $layer->print_z - $layer->height + $gap;
1214
1215 foreach my $copy (@{ $object->_shifted_copies }) {
1216 {
1217 my @expolygons = map $_->clone, @{$layer->slices};
1218 $_->translate(@$copy) for @expolygons;
1219 $self->_expolygons_to_verts(\@expolygons, $layer->print_z, \@verts, \@norms);
1220 }
1221 foreach my $slice (@{$layer->slices}) {
1222 foreach my $polygon (@$slice) {
1223 foreach my $line (@{$polygon->lines}) {
1224 $line->translate(@$copy);
1225
1226 push @quad_norms, (0,0,-1), (0,0,-1);
1227 push @quad_verts, (map unscale($_), @{$line->a}), $bottom_z;
1228 push @quad_verts, (map unscale($_), @{$line->b}), $bottom_z;
1229 push @quad_norms, (0,0,1), (0,0,1);
1230 push @quad_verts, (map unscale($_), @{$line->b}), $top_z;
1231 push @quad_verts, (map unscale($_), @{$line->a}), $top_z;
1232
1233 # We'll use this for the middle normal when using 4 quads:
1234 #my $xy_normal = $line->normal;
1235 #$_xynormal->scale(1/$line->length);
1236 }
1237 }
1238 }
1239 }
1240 }
1241
1242 my $obb = $object->bounding_box;
1243 my $bb = Slic3r::Geometry::BoundingBoxf3->new;
1244 $bb->merge_point(Slic3r::Pointf3->new_unscale(@{$obb->min_point}, 0));
1245 $bb->merge_point(Slic3r::Pointf3->new_unscale(@{$obb->max_point}, $object->size->z));
1246
1247 push @{$self->volumes}, my $v = Slic3r::GUI::3DScene::Volume->new(
1248 bounding_box => $bb,
1249 color => COLORS->[0],
1250 verts => OpenGL::Array->new_list(GL_FLOAT, @verts),
1251 norms => OpenGL::Array->new_list(GL_FLOAT, @norms),
1252 quad_verts => OpenGL::Array->new_list(GL_FLOAT, @quad_verts),
1253 quad_norms => OpenGL::Array->new_list(GL_FLOAT, @quad_norms),
1254 );
1255 }
1256
1257 # Create 3D thick extrusion lines for a skirt and brim.
1258 # Adds a new Slic3r::GUI::3DScene::Volume to $self->volumes.
1259 sub load_print_toolpaths {
1260 my ($self, $print) = @_;
1261
1262 return if !$print->step_done(STEP_SKIRT);
1263 return if !$print->step_done(STEP_BRIM);
1264 return if !$print->has_skirt && $print->config->brim_width == 0;
1265
1266 my $qverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1267 my $tverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1268 my $offsets = []; # triples stored in a linear array, sorted by print_z: print_z, qverts, tverts
1269
1270 my $skirt_height = 0; # number of layers
1271 if ($print->has_infinite_skirt) {
1272 $skirt_height = $print->total_layer_count;
1273 } else {
1274 $skirt_height = min($print->config->skirt_height, $print->total_layer_count);
1275 }
1276 $skirt_height ||= 1 if $print->config->brim_width > 0;
1277
1278 # get first $skirt_height layers (maybe this should be moved to a PrintObject method?)
1279 my $object0 = $print->get_object(0);
1280 my @layers = ();
1281 push @layers, map $object0->get_layer($_-1), 1..min($skirt_height, $object0->layer_count);
1282 push @layers, map $object0->get_support_layer($_-1), 1..min($skirt_height, $object0->support_layer_count);
1283 @layers = sort { $a->print_z <=> $b->print_z } @layers;
1284 @layers = @layers[0..($skirt_height-1)];
1285
1286 foreach my $i (0..($skirt_height-1)) {
1287 my $top_z = $layers[$i]->print_z;
1288 push @$offsets, ($top_z, $qverts->size, $tverts->size);
1289
1290 if ($i == 0) {
1291 $self->_extrusionentity_to_verts($print->brim, $top_z, Slic3r::Point->new(0,0), $qverts, $tverts);
1292 }
1293
1294 $self->_extrusionentity_to_verts($print->skirt, $top_z, Slic3r::Point->new(0,0), $qverts, $tverts);
1295 }
1296
1297 my $bb = Slic3r::Geometry::BoundingBoxf3->new;
1298 {
1299 my $pbb = $print->bounding_box;
1300 $bb->merge_point(Slic3r::Pointf3->new_unscale(@{$pbb->min_point}));
1301 $bb->merge_point(Slic3r::Pointf3->new_unscale(@{$pbb->max_point}));
1302 }
1303 push @{$self->volumes}, Slic3r::GUI::3DScene::Volume->new(
1304 bounding_box => $bb,
1305 color => COLORS->[2],
1306 qverts => $qverts,
1307 tverts => $tverts,
1308 offsets => $offsets,
1309 );
1310 }
1311
1312 # Create 3D thick extrusion lines for object forming extrusions.
1313 # Adds a new Slic3r::GUI::3DScene::Volume to $self->volumes,
1314 # one for perimeters, one for infill and one for supports.
1315 sub load_print_object_toolpaths {
1316 my ($self, $object) = @_;
1317
1318 my $perim_qverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1319 my $perim_tverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1320 my $infill_qverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1321 my $infill_tverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1322 my $support_qverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1323 my $support_tverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1324
1325 my $perim_offsets = []; # triples of (print_z, qverts, tverts), stored linearly, sorted by print_z
1326 my $infill_offsets = [];
1327 my $support_offsets = [];
1328
1329 # order layers by print_z
1330 my @layers = sort { $a->print_z <=> $b->print_z }
1331 @{$object->layers}, @{$object->support_layers};
1332
1333 # Bounding box of the object and its copies.
1334 my $bb = Slic3r::Geometry::BoundingBoxf3->new;
1335 {
1336 my $obb = $object->bounding_box;
1337 foreach my $copy (@{ $object->_shifted_copies }) {
1338 my $cbb = $obb->clone;
1339 $cbb->translate(@$copy);
1340 $bb->merge_point(Slic3r::Pointf3->new_unscale(@{$cbb->min_point}, 0));
1341 $bb->merge_point(Slic3r::Pointf3->new_unscale(@{$cbb->max_point}, $object->size->z));
1342 }
1343 }
1344
1345 # Maximum size of an allocation block: 32MB / sizeof(float)
1346 my $alloc_size_max = 32 * 1048576 / 4;
1347
1348 foreach my $layer (@layers) {
1349 my $top_z = $layer->print_z;
1350
1351 push @$perim_offsets, ($top_z, $perim_qverts->size, $perim_tverts->size)
1352 if (!@$perim_offsets || $perim_offsets->[-3] != $top_z);
1353 push @$infill_offsets, ($top_z, $infill_qverts->size, $infill_tverts->size)
1354 if (!@$infill_offsets || $infill_offsets->[-3] != $top_z);
1355 push @$support_offsets, ($top_z, $support_qverts->size, $support_tverts->size)
1356 if (!@$support_offsets || $support_offsets->[-3] != $top_z);
1357
1358 foreach my $copy (@{ $object->_shifted_copies }) {
1359 foreach my $layerm (@{$layer->regions}) {
1360 if ($object->step_done(STEP_PERIMETERS)) {
1361 $self->_extrusionentity_to_verts($layerm->perimeters, $top_z, $copy,
1362 $perim_qverts, $perim_tverts);
1363 }
1364
1365 if ($object->step_done(STEP_INFILL)) {
1366 $self->_extrusionentity_to_verts($layerm->fills, $top_z, $copy,
1367 $infill_qverts, $infill_tverts);
1368 }
1369 }
1370
1371 if ($layer->isa('Slic3r::Layer::Support') && $object->step_done(STEP_SUPPORTMATERIAL)) {
1372 $self->_extrusionentity_to_verts($layer->support_fills, $top_z, $copy,
1373 $support_qverts, $support_tverts);
1374
1375 $self->_extrusionentity_to_verts($layer->support_interface_fills, $top_z, $copy,
1376 $support_qverts, $support_tverts);
1377 }
1378 }
1379
1380 if ($perim_qverts->size() > $alloc_size_max || $perim_tverts->size() > $alloc_size_max) {
1381 # Store the vertex arrays and restart their containers.
1382 push @{$self->volumes}, Slic3r::GUI::3DScene::Volume->new(
1383 bounding_box => $bb,
1384 color => COLORS->[0],
1385 qverts => $perim_qverts,
1386 tverts => $perim_tverts,
1387 offsets => $perim_offsets,
1388 );
1389 $perim_qverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1390 $perim_tverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1391 $perim_offsets = [];
1392 }
1393
1394 if ($infill_qverts->size() > $alloc_size_max || $infill_tverts->size() > $alloc_size_max) {
1395 # Store the vertex arrays and restart their containers.
1396 push @{$self->volumes}, Slic3r::GUI::3DScene::Volume->new(
1397 bounding_box => $bb,
1398 color => COLORS->[1],
1399 qverts => $infill_qverts,
1400 tverts => $infill_tverts,
1401 offsets => $infill_offsets,
1402 );
1403 $infill_qverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1404 $infill_tverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1405 $infill_offsets = [];
1406 }
1407
1408 if ($support_qverts->size() > $alloc_size_max || $support_tverts->size() > $alloc_size_max) {
1409 # Store the vertex arrays and restart their containers.
1410 push @{$self->volumes}, Slic3r::GUI::3DScene::Volume->new(
1411 bounding_box => $bb,
1412 color => COLORS->[2],
1413 qverts => $support_qverts,
1414 tverts => $support_tverts,
1415 offsets => $support_offsets,
1416 );
1417 $support_qverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1418 $support_tverts = Slic3r::GUI::_3DScene::GLVertexArray->new;
1419 $support_offsets = [];
1420 }
1421 }
1422
1423 if ($perim_qverts->size() > 0 || $perim_tverts->size() > 0) {
1424 push @{$self->volumes}, Slic3r::GUI::3DScene::Volume->new(
1425 bounding_box => $bb,
1426 color => COLORS->[0],
1427 qverts => $perim_qverts,
1428 tverts => $perim_tverts,
1429 offsets => $perim_offsets,
1430 );
1431 }
1432
1433 if ($infill_qverts->size() > 0 || $infill_tverts->size() > 0) {
1434 push @{$self->volumes}, Slic3r::GUI::3DScene::Volume->new(
1435 bounding_box => $bb,
1436 color => COLORS->[1],
1437 qverts => $infill_qverts,
1438 tverts => $infill_tverts,
1439 offsets => $infill_offsets,
1440 );
1441 }
1442
1443 if ($support_qverts->size() > 0 || $support_tverts->size() > 0) {
1444 push @{$self->volumes}, Slic3r::GUI::3DScene::Volume->new(
1445 bounding_box => $bb,
1446 color => COLORS->[2],
1447 qverts => $support_qverts,
1448 tverts => $support_tverts,
1449 offsets => $support_offsets,
1450 );
1451 }
1452 }
1453
1454 sub set_toolpaths_range {
1455 my ($self, $min_z, $max_z) = @_;
1456
1457 foreach my $volume (@{$self->volumes}) {
1458 $volume->range([ $min_z, $max_z ]);
1459 }
1460 }
1461
1462 # called by load_print_object_slices, probably not used.
1463 sub _expolygons_to_verts {
1464 my ($self, $expolygons, $z, $verts, $norms) = @_;
1465
1466 my $tess = gluNewTess();
1467 gluTessCallback($tess, GLU_TESS_BEGIN, 'DEFAULT');
1468 gluTessCallback($tess, GLU_TESS_END, 'DEFAULT');
1469 gluTessCallback($tess, GLU_TESS_VERTEX, sub {
1470 my ($x, $y, $z) = @_;
1471 push @$verts, $x, $y, $z;
1472 push @$norms, (0,0,1), (0,0,1), (0,0,1);
1473 });
1474 gluTessCallback($tess, GLU_TESS_COMBINE, 'DEFAULT');
1475 gluTessCallback($tess, GLU_TESS_ERROR, 'DEFAULT');
1476 gluTessCallback($tess, GLU_TESS_EDGE_FLAG, 'DEFAULT');
1477
1478 foreach my $expolygon (@$expolygons) {
1479 gluTessBeginPolygon($tess);
1480 foreach my $polygon (@$expolygon) {
1481 gluTessBeginContour($tess);
1482 gluTessVertex_p($tess, (map unscale($_), @$_), $z) for @$polygon;
1483 gluTessEndContour($tess);
1484 }
1485 gluTessEndPolygon($tess);
1486 }
1487
1488 gluDeleteTess($tess);
1489 }
1490
1491 # Fill in the $qverts and $tverts with quads and triangles
1492 # for the extrusion $entity.
1493 sub _extrusionentity_to_verts {
1494 my ($self, $entity, $top_z, $copy, $qverts, $tverts) = @_;
1495
1496 my ($lines, $widths, $heights, $closed);
1497 if ($entity->isa('Slic3r::ExtrusionPath::Collection')) {
1498 $self->_extrusionentity_to_verts($_, $top_z, $copy, $qverts, $tverts)
1499 for @$entity;
1500 return;
1501 } elsif ($entity->isa('Slic3r::ExtrusionPath')) {
1502 my $polyline = $entity->polyline->clone;
1503 $polyline->remove_duplicate_points;
1504 $polyline->translate(@$copy);
1505 $lines = $polyline->lines;
1506 $widths = [ map $entity->width, 0..$#$lines ];
1507 $heights = [ map $entity->height, 0..$#$lines ];
1508 $closed = 0;
1509 } else {
1510 $lines = [];
1511 $widths = [];
1512 $heights = [];
1513 $closed = 1;
1514 foreach my $path (@$entity) {
1515 my $polyline = $path->polyline->clone;
1516 $polyline->remove_duplicate_points;
1517 $polyline->translate(@$copy);
1518 my $path_lines = $polyline->lines;
1519 push @$lines, @$path_lines;
1520 push @$widths, map $path->width, 0..$#$path_lines;
1521 push @$heights, map $path->height, 0..$#$path_lines;
1522 }
1523 }
1524 # Calling the C++ implementation Slic3r::_3DScene::_extrusionentity_to_verts_do()
1525 # This adds new vertices to the $qverts and $tverts.
1526 Slic3r::GUI::_3DScene::_extrusionentity_to_verts_do($lines, $widths, $heights,
1527 $closed,
1528 # Top height of the extrusion.
1529 $top_z,
1530 # $copy is not used here.
1531 $copy,
1532 # GLVertexArray object: C++ class maintaining an std::vector<float> for coords and normals.
1533 $qverts,
1534 $tverts);
1535 }
1536
1537 sub object_idx {
1538 my ($self, $volume_idx) = @_;
1539 return $self->_objects_by_volumes->{$volume_idx}[0];
1540 }
1541
1542 sub volume_idx {
1543 my ($self, $volume_idx) = @_;
1544 return $self->_objects_by_volumes->{$volume_idx}[1];
1545 }
1546
1547 sub instance_idx {
1548 my ($self, $volume_idx) = @_;
1549 return $self->_objects_by_volumes->{$volume_idx}[2];
1550 }
1551
1552 1;
0 package Slic3r::GUI::AboutDialog;
1 use strict;
2 use warnings;
3 use utf8;
4
5 use Wx qw(:font :html :misc :dialog :sizer :systemsettings :frame :id);
6 use Wx::Event qw(EVT_HTML_LINK_CLICKED EVT_LEFT_DOWN EVT_BUTTON);
7 use Wx::Print;
8 use Wx::Html;
9 use base 'Wx::Dialog';
10
11 sub new {
12 my $class = shift;
13 my ($parent) = @_;
14 my $self = $class->SUPER::new($parent, -1, 'About Slic3r', wxDefaultPosition, [600, 340], wxCAPTION);
15
16 $self->SetBackgroundColour(Wx::wxWHITE);
17 my $hsizer = Wx::BoxSizer->new(wxHORIZONTAL);
18 $self->SetSizer($hsizer);
19
20 # logo
21 my $logo = Slic3r::GUI::AboutDialog::Logo->new($self, -1, wxDefaultPosition, wxDefaultSize);
22 $logo->SetBackgroundColour(Wx::wxWHITE);
23 $hsizer->Add($logo, 0, wxEXPAND | wxLEFT | wxRIGHT, 30);
24
25 my $vsizer = Wx::BoxSizer->new(wxVERTICAL);
26 $hsizer->Add($vsizer, 1, wxEXPAND, 0);
27
28 # title
29 my $title = Wx::StaticText->new($self, -1, $Slic3r::FORK_NAME, wxDefaultPosition, wxDefaultSize);
30 my $title_font = Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
31 $title_font->SetWeight(wxFONTWEIGHT_BOLD);
32 $title_font->SetFamily(wxFONTFAMILY_ROMAN);
33 $title_font->SetPointSize(24);
34 $title->SetFont($title_font);
35 $vsizer->Add($title, 0, wxALIGN_LEFT | wxTOP, 30);
36
37 # version
38 my $version = Wx::StaticText->new($self, -1, "Version $Slic3r::VERSION", wxDefaultPosition, wxDefaultSize);
39 my $version_font = Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
40 $version_font->SetPointSize(&Wx::wxMSW ? 9 : 11);
41 $version->SetFont($version_font);
42 $vsizer->Add($version, 0, wxALIGN_LEFT | wxBOTTOM, 10);
43
44 # text
45 my $text =
46 '<html>' .
47 '<body bgcolor="#ffffff" link="#808080">' .
48 '<font color="#808080">' .
49 'Copyright &copy; 2016 Vojtech Bubnik, Prusa Research. <br />' .
50 'Copyright &copy; 2011-2016 Alessandro Ranellucci. <br />' .
51 '<a href="http://slic3r.org/">Slic3r</a> is licensed under the ' .
52 '<a href="http://www.gnu.org/licenses/agpl-3.0.html">GNU Affero General Public License, version 3</a>.' .
53 '<br /><br /><br />' .
54 'Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Y. Sapir, Mike Sheldrake and numerous others. ' .
55 'Manual by Gary Hodgson. Inspired by the RepRap community. <br />' .
56 'Slic3r logo designed by Corey Daniels, <a href="http://www.famfamfam.com/lab/icons/silk/">Silk Icon Set</a> designed by Mark James. ' .
57 '</font>' .
58 '</body>' .
59 '</html>';
60 my $html = Wx::HtmlWindow->new($self, -1, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_NEVER);
61 my $font = Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
62 my $size = &Wx::wxMSW ? 8 : 10;
63 $html->SetFonts($font->GetFaceName, $font->GetFaceName, [$size, $size, $size, $size, $size, $size, $size]);
64 $html->SetBorders(2);
65 $html->SetPage($text);
66 $vsizer->Add($html, 1, wxEXPAND | wxALIGN_LEFT | wxRIGHT | wxBOTTOM, 20);
67 EVT_HTML_LINK_CLICKED($self, $html, \&link_clicked);
68
69 my $buttons = $self->CreateStdDialogButtonSizer(wxOK);
70 $self->SetEscapeId(wxID_CLOSE);
71 EVT_BUTTON($self, wxID_CLOSE, sub {
72 $self->EndModal(wxID_CLOSE);
73 $self->Close;
74 });
75 $vsizer->Add($buttons, 0, wxEXPAND | wxRIGHT | wxBOTTOM, 3);
76
77 EVT_LEFT_DOWN($self, sub { $self->Close });
78 EVT_LEFT_DOWN($logo, sub { $self->Close });
79
80 return $self;
81 }
82
83 sub link_clicked {
84 my ($self, $event) = @_;
85
86 Wx::LaunchDefaultBrowser($event->GetLinkInfo->GetHref);
87 $event->Skip(0);
88 }
89
90 package Slic3r::GUI::AboutDialog::Logo;
91 use Wx qw(:bitmap :dc);
92 use Wx::Event qw(EVT_PAINT);
93 use base 'Wx::Panel';
94
95 sub new {
96 my $class = shift;
97 my $self = $class->SUPER::new(@_);
98
99 $self->{logo} = Wx::Bitmap->new($Slic3r::var->("Slic3r_192px.png"), wxBITMAP_TYPE_PNG);
100 $self->SetMinSize(Wx::Size->new($self->{logo}->GetWidth, $self->{logo}->GetHeight));
101
102 EVT_PAINT($self, \&repaint);
103
104 return $self;
105 }
106
107 sub repaint {
108 my ($self, $event) = @_;
109
110 my $dc = Wx::PaintDC->new($self);
111 $dc->SetBackgroundMode(wxTRANSPARENT);
112
113 my $size = $self->GetSize;
114 my $logo_w = $self->{logo}->GetWidth;
115 my $logo_h = $self->{logo}->GetHeight;
116 $dc->DrawBitmap($self->{logo}, ($size->GetWidth - $logo_w) / 2, ($size->GetHeight - $logo_h) / 2, 1);
117
118 $event->Skip;
119 }
120
121 1;
0 # The bed shape dialog.
1 # The dialog opens from Print Settins tab -> Bed Shape: Set...
2
3 package Slic3r::GUI::BedShapeDialog;
4 use strict;
5 use warnings;
6 use utf8;
7
8 use List::Util qw(min max);
9 use Slic3r::Geometry qw(PI X Y unscale);
10 use Wx qw(:dialog :id :misc :sizer :choicebook wxTAB_TRAVERSAL);
11 use Wx::Event qw(EVT_CLOSE);
12 use base 'Wx::Dialog';
13
14 sub new {
15 my $class = shift;
16 my ($parent, $default) = @_;
17 my $self = $class->SUPER::new($parent, -1, "Bed Shape", wxDefaultPosition, [350,700], wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
18
19 $self->{panel} = my $panel = Slic3r::GUI::BedShapePanel->new($self, $default);
20
21 my $main_sizer = Wx::BoxSizer->new(wxVERTICAL);
22 $main_sizer->Add($panel, 1, wxEXPAND);
23 $main_sizer->Add($self->CreateButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND);
24
25 $self->SetSizer($main_sizer);
26 $self->SetMinSize($self->GetSize);
27 $main_sizer->SetSizeHints($self);
28
29 # needed to actually free memory
30 EVT_CLOSE($self, sub {
31 $self->EndModal(wxID_OK);
32 $self->Destroy;
33 });
34
35 return $self;
36 }
37
38 sub GetValue {
39 my ($self) = @_;
40 return $self->{panel}->GetValue;
41 }
42
43 package Slic3r::GUI::BedShapePanel;
44
45 use List::Util qw(min max sum first);
46 use Scalar::Util qw(looks_like_number);
47 use Slic3r::Geometry qw(PI X Y scale unscale scaled_epsilon deg2rad);
48 use Wx qw(:font :id :misc :sizer :choicebook :filedialog :pen :brush wxTAB_TRAVERSAL);
49 use Wx::Event qw(EVT_CLOSE EVT_CHOICEBOOK_PAGE_CHANGED EVT_BUTTON);
50 use base 'Wx::Panel';
51
52 use constant SHAPE_RECTANGULAR => 0;
53 use constant SHAPE_CIRCULAR => 1;
54 use constant SHAPE_CUSTOM => 2;
55
56 sub new {
57 my $class = shift;
58 my ($parent, $default) = @_;
59 my $self = $class->SUPER::new($parent, -1);
60
61 $self->on_change(undef);
62
63 my $box = Wx::StaticBox->new($self, -1, "Shape");
64 my $sbsizer = Wx::StaticBoxSizer->new($box, wxVERTICAL);
65
66 # shape options
67 $self->{shape_options_book} = Wx::Choicebook->new($self, -1, wxDefaultPosition, [300,-1], wxCHB_TOP);
68 $sbsizer->Add($self->{shape_options_book});
69
70 $self->{optgroups} = [];
71 {
72 my $optgroup = $self->_init_shape_options_page('Rectangular');
73 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
74 opt_id => 'rect_size',
75 type => 'point',
76 label => 'Size',
77 tooltip => 'Size in X and Y of the rectangular plate.',
78 default => [200,200],
79 ));
80 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
81 opt_id => 'rect_origin',
82 type => 'point',
83 label => 'Origin',
84 tooltip => 'Distance of the 0,0 G-code coordinate from the front left corner of the rectangle.',
85 default => [0,0],
86 ));
87 }
88 {
89 my $optgroup = $self->_init_shape_options_page('Circular');
90 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
91 opt_id => 'diameter',
92 type => 'f',
93 label => 'Diameter',
94 tooltip => 'Diameter of the print bed. It is assumed that origin (0,0) is located in the center.',
95 sidetext => 'mm',
96 default => 200,
97 ));
98 }
99 {
100 my $optgroup = $self->_init_shape_options_page('Custom');
101 $optgroup->append_line(Slic3r::GUI::OptionsGroup::Line->new(
102 full_width => 1,
103 widget => sub {
104 my ($parent) = @_;
105
106 my $btn = Wx::Button->new($parent, -1, "Load shape from STL...", wxDefaultPosition, wxDefaultSize);
107 EVT_BUTTON($self, $btn, sub { $self->_load_stl });
108 return $btn;
109 }
110 ));
111 }
112
113 EVT_CHOICEBOOK_PAGE_CHANGED($self, -1, sub {
114 $self->_update_shape;
115 });
116
117 # right pane with preview canvas
118 my $canvas = $self->{canvas} = Slic3r::GUI::2DBed->new($self);
119
120 # main sizer
121 my $top_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
122 $top_sizer->Add($sbsizer, 0, wxEXPAND | wxTOP | wxBOTTOM, 10);
123 $top_sizer->Add($canvas, 1, wxEXPAND | wxALL, 10) if $canvas;
124
125 $self->SetSizerAndFit($top_sizer);
126
127 $self->_set_shape($default);
128 $self->_update_preview;
129
130 return $self;
131 }
132
133 sub on_change {
134 my ($self, $cb) = @_;
135 $self->{on_change} = $cb // sub {};
136 }
137
138 # Called from the constructor.
139 # Set the initial bed shape from a list of points.
140 # Deduce the bed shape type (rect, circle, custom)
141 # This routine shall be smart enough if the user messes up
142 # with the list of points in the ini file directly.
143 sub _set_shape {
144 my ($self, $points) = @_;
145
146 # is this a rectangle?
147 if (@$points == 4) {
148 my $polygon = Slic3r::Polygon->new_scale(@$points);
149 my $lines = $polygon->lines;
150 if ($lines->[0]->parallel_to_line($lines->[2]) && $lines->[1]->parallel_to_line($lines->[3])) {
151 # okay, it's a rectangle
152
153 # find origin
154 # the || 0 hack prevents "-0" which might confuse the user
155 my $x_min = min(map $_->[X], @$points) || 0;
156 my $x_max = max(map $_->[X], @$points) || 0;
157 my $y_min = min(map $_->[Y], @$points) || 0;
158 my $y_max = max(map $_->[Y], @$points) || 0;
159 my $origin = [-$x_min, -$y_min];
160
161 $self->{shape_options_book}->SetSelection(SHAPE_RECTANGULAR);
162 my $optgroup = $self->{optgroups}[SHAPE_RECTANGULAR];
163 $optgroup->set_value('rect_size', [ $x_max-$x_min, $y_max-$y_min ]);
164 $optgroup->set_value('rect_origin', $origin);
165 $self->_update_shape;
166 return;
167 }
168 }
169
170 # is this a circle?
171 {
172 # Analyze the array of points. Do they reside on a circle?
173 my $polygon = Slic3r::Polygon->new_scale(@$points);
174 my $center = $polygon->bounding_box->center;
175 my @vertex_distances = map $center->distance_to($_), @$polygon;
176 my $avg_dist = sum(@vertex_distances)/@vertex_distances;
177 if (!defined first { abs($_ - $avg_dist) > 10*scaled_epsilon } @vertex_distances) {
178 # all vertices are equidistant to center
179 $self->{shape_options_book}->SetSelection(SHAPE_CIRCULAR);
180 my $optgroup = $self->{optgroups}[SHAPE_CIRCULAR];
181 $optgroup->set_value('diameter', sprintf("%.0f", unscale($avg_dist*2)));
182 $self->_update_shape;
183 return;
184 }
185 }
186
187 if (@$points < 3) {
188 # Invalid polygon. Revert to default bed dimensions.
189 $self->{shape_options_book}->SetSelection(SHAPE_RECTANGULAR);
190 my $optgroup = $self->{optgroups}[SHAPE_RECTANGULAR];
191 $optgroup->set_value('rect_size', [200, 200]);
192 $optgroup->set_value('rect_origin', [0, 0]);
193 $self->_update_shape;
194 return;
195 }
196
197 # This is a custom bed shape, use the polygon provided.
198 $self->{shape_options_book}->SetSelection(SHAPE_CUSTOM);
199 # Copy the polygon to the canvas, make a copy of the array.
200 $self->{canvas}->bed_shape([@$points]);
201 $self->_update_shape;
202 }
203
204 # Update the bed shape from the dialog fields.
205 sub _update_shape {
206 my ($self) = @_;
207
208 my $page_idx = $self->{shape_options_book}->GetSelection;
209 if ($page_idx == SHAPE_RECTANGULAR) {
210 my $rect_size = $self->{optgroups}[SHAPE_RECTANGULAR]->get_value('rect_size');
211 my $rect_origin = $self->{optgroups}[SHAPE_RECTANGULAR]->get_value('rect_origin');
212 my ($x, $y) = @$rect_size;
213 return if !looks_like_number($x) || !looks_like_number($y); # empty strings or '-' or other things
214 my ($x0, $y0) = (0,0);
215 my ($x1, $y1) = ($x,$y);
216 {
217 my ($dx, $dy) = @$rect_origin;
218 return if !looks_like_number($dx) || !looks_like_number($dy); # empty strings or '-' or other things
219 $x0 -= $dx;
220 $x1 -= $dx;
221 $y0 -= $dy;
222 $y1 -= $dy;
223 }
224 $self->{canvas}->bed_shape([
225 [$x0,$y0],
226 [$x1,$y0],
227 [$x1,$y1],
228 [$x0,$y1],
229 ]);
230 } elsif ($page_idx == SHAPE_CIRCULAR) {
231 my $diameter = $self->{optgroups}[SHAPE_CIRCULAR]->get_value('diameter');
232 return if !$diameter;
233 my $r = $diameter/2;
234 my $twopi = 2*PI;
235 my $edges = 60;
236 my $polygon = Slic3r::Polygon->new_scale(
237 map [ $r * cos $_, $r * sin $_ ],
238 map { $twopi/$edges*$_ } 1..$edges
239 );
240 $self->{canvas}->bed_shape([
241 map [ unscale($_->x), unscale($_->y) ], @$polygon #))
242 ]);
243 }
244
245 $self->{on_change}->();
246 $self->_update_preview;
247 }
248
249 sub _update_preview {
250 my ($self) = @_;
251 $self->{canvas}->Refresh if $self->{canvas};
252 $self->Refresh;
253 }
254
255 # Called from the constructor.
256 # Create a panel for a rectangular / circular / custom bed shape.
257 sub _init_shape_options_page {
258 my ($self, $title) = @_;
259
260 my $panel = Wx::Panel->new($self->{shape_options_book});
261 my $optgroup;
262 push @{$self->{optgroups}}, $optgroup = Slic3r::GUI::OptionsGroup->new(
263 parent => $panel,
264 title => 'Settings',
265 label_width => 100,
266 on_change => sub {
267 my ($opt_id) = @_;
268 #$self->{"_$opt_id"} = $optgroup->get_value($opt_id);
269 $self->_update_shape;
270 },
271 );
272 $panel->SetSizerAndFit($optgroup->sizer);
273 $self->{shape_options_book}->AddPage($panel, $title);
274
275 return $optgroup;
276 }
277
278 # Loads an stl file, projects it to the XY plane and calculates a polygon.
279 sub _load_stl {
280 my ($self) = @_;
281
282 my $dialog = Wx::FileDialog->new($self, 'Choose a file to import bed shape from (STL/OBJ/AMF):', "", "", &Slic3r::GUI::MODEL_WILDCARD, wxFD_OPEN | wxFD_FILE_MUST_EXIST);
283 if ($dialog->ShowModal != wxID_OK) {
284 $dialog->Destroy;
285 return;
286 }
287 my $input_file = Slic3r::decode_path($dialog->GetPaths);
288 $dialog->Destroy;
289
290 my $model = Slic3r::Model->read_from_file($input_file);
291 my $mesh = $model->raw_mesh;
292 my $expolygons = $mesh->horizontal_projection;
293
294 if (@$expolygons == 0) {
295 Slic3r::GUI::show_error($self, "The selected file contains no geometry.");
296 return;
297 }
298 if (@$expolygons > 1) {
299 Slic3r::GUI::show_error($self, "The selected file contains several disjoint areas. This is not supported.");
300 return;
301 }
302
303 my $polygon = $expolygons->[0]->contour;
304 $self->{canvas}->bed_shape([ map [ unscale($_->x), unscale($_->y) ], @$polygon ]);
305 $self->_update_preview();
306 }
307
308 # Returns the resulting bed shape polygon. This value will be stored to the ini file.
309 sub GetValue {
310 my ($self) = @_;
311 return $self->{canvas}->bed_shape;
312 }
313
314 1;
0 # A tiny dialog to select an OctoPrint device to print to.
1
2 package Slic3r::GUI::BonjourBrowser;
3 use strict;
4 use warnings;
5 use utf8;
6
7 use Wx qw(:dialog :id :misc :sizer :choicebook wxTAB_TRAVERSAL);
8 use Wx::Event qw(EVT_CLOSE);
9 use base 'Wx::Dialog';
10
11 sub new {
12 my $class = shift;
13 my ($parent, $devices) = @_;
14 my $self = $class->SUPER::new($parent, -1, "Device Browser", wxDefaultPosition, [350,700], wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
15
16 $self->{devices} = $devices;
17
18 # label
19 my $text = Wx::StaticText->new($self, -1, "Choose an OctoPrint device in your network:", wxDefaultPosition, wxDefaultSize);
20
21 # selector
22 $self->{choice} = my $choice = Wx::Choice->new($self, -1, wxDefaultPosition, wxDefaultSize,
23 [ map $_->name, @{$self->{devices}} ]);
24
25 my $main_sizer = Wx::BoxSizer->new(wxVERTICAL);
26 $main_sizer->Add($text, 1, wxEXPAND | wxALL, 10);
27 $main_sizer->Add($choice, 1, wxEXPAND | wxALL, 10);
28 $main_sizer->Add($self->CreateButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND);
29
30 $self->SetSizer($main_sizer);
31 $self->SetMinSize($self->GetSize);
32 $main_sizer->SetSizeHints($self);
33
34 # needed to actually free memory
35 EVT_CLOSE($self, sub {
36 $self->EndModal(wxID_OK);
37 $self->Destroy;
38 });
39
40 return $self;
41 }
42
43 sub GetValue {
44 my ($self) = @_;
45 return $self->{devices}[ $self->{choice}->GetSelection ]->address;
46 }
47 sub GetPort {
48 my ($self) = @_;
49 return $self->{devices}[ $self->{choice}->GetSelection ]->port;
50 }
51
52 1;
0 # The config wizard is executed when the Slic3r is first started.
1 # The wizard helps the user to specify the 3D printer properties.
2
3 package Slic3r::GUI::ConfigWizard;
4 use strict;
5 use warnings;
6 use utf8;
7
8 use Wx;
9 use base 'Wx::Wizard';
10 use Slic3r::Geometry qw(unscale);
11
12 # adhere to various human interface guidelines
13 our $wizard = 'Wizard';
14 $wizard = 'Assistant' if &Wx::wxMAC || &Wx::wxGTK;
15
16 sub new {
17 my $class = shift;
18 my ($parent) = @_;
19 my $self = $class->SUPER::new($parent, -1, "Configuration $wizard");
20
21 # initialize an empty repository
22 $self->{config} = Slic3r::Config->new;
23
24 $self->add_page(Slic3r::GUI::ConfigWizard::Page::Welcome->new($self));
25 $self->add_page(Slic3r::GUI::ConfigWizard::Page::Firmware->new($self));
26 $self->add_page(Slic3r::GUI::ConfigWizard::Page::Bed->new($self));
27 $self->add_page(Slic3r::GUI::ConfigWizard::Page::Nozzle->new($self));
28 $self->add_page(Slic3r::GUI::ConfigWizard::Page::Filament->new($self));
29 $self->add_page(Slic3r::GUI::ConfigWizard::Page::Temperature->new($self));
30 $self->add_page(Slic3r::GUI::ConfigWizard::Page::BedTemperature->new($self));
31 $self->add_page(Slic3r::GUI::ConfigWizard::Page::Finished->new($self));
32
33 $_->build_index for @{$self->{pages}};
34
35 return $self;
36 }
37
38 sub add_page {
39 my $self = shift;
40 my ($page) = @_;
41
42 my $n = push @{$self->{pages}}, $page;
43 # add first page to the page area sizer
44 $self->GetPageAreaSizer->Add($page) if $n == 1;
45 # link pages
46 $self->{pages}[$n-2]->set_next_page($page) if $n >= 2;
47 $page->set_previous_page($self->{pages}[$n-2]) if $n >= 2;
48 }
49
50 sub run {
51 my $self = shift;
52
53 if (Wx::Wizard::RunWizard($self, $self->{pages}[0])) {
54
55 # it would be cleaner to have these defined inside each page class,
56 # in some event getting called before leaving the page
57 {
58 # set first_layer_height + layer_height based on nozzle_diameter
59 my $nozzle = $self->{config}->nozzle_diameter;
60 $self->{config}->set('first_layer_height', $nozzle->[0]);
61 $self->{config}->set('layer_height', $nozzle->[0] - 0.1);
62
63 # set first_layer_temperature to temperature + 5
64 $self->{config}->set('first_layer_temperature', [$self->{config}->temperature->[0] + 5]);
65
66 # set first_layer_bed_temperature to temperature + 5
67 $self->{config}->set('first_layer_bed_temperature',
68 ($self->{config}->bed_temperature > 0) ? ($self->{config}->bed_temperature + 5) : 0);
69 }
70
71 $self->Destroy;
72 return $self->{config};
73 } else {
74 $self->Destroy;
75 return undef;
76 }
77 }
78
79 package Slic3r::GUI::ConfigWizard::Index;
80 use Wx qw(:bitmap :dc :font :misc :sizer :systemsettings :window);
81 use Wx::Event qw(EVT_ERASE_BACKGROUND EVT_PAINT);
82 use base 'Wx::Panel';
83
84 sub new {
85 my $class = shift;
86 my ($parent, $title) = @_;
87 my $self = $class->SUPER::new($parent);
88
89 push @{$self->{titles}}, $title;
90 $self->{own_index} = 0;
91
92 $self->{bullets}->{before} = Wx::Bitmap->new($Slic3r::var->("bullet_black.png"), wxBITMAP_TYPE_PNG);
93 $self->{bullets}->{own} = Wx::Bitmap->new($Slic3r::var->("bullet_blue.png"), wxBITMAP_TYPE_PNG);
94 $self->{bullets}->{after} = Wx::Bitmap->new($Slic3r::var->("bullet_white.png"), wxBITMAP_TYPE_PNG);
95
96 $self->{background} = Wx::Bitmap->new($Slic3r::var->("Slic3r_192px_transparent.png"), wxBITMAP_TYPE_PNG);
97 $self->SetMinSize(Wx::Size->new($self->{background}->GetWidth, $self->{background}->GetHeight));
98
99 EVT_PAINT($self, \&repaint);
100
101 return $self;
102 }
103
104 sub repaint {
105 my ($self, $event) = @_;
106 my $size = $self->GetClientSize;
107 my $gap = 5;
108
109 my $dc = Wx::PaintDC->new($self);
110 $dc->SetBackgroundMode(wxTRANSPARENT);
111 $dc->SetFont($self->GetFont);
112 $dc->SetTextForeground($self->GetForegroundColour);
113
114 my $background_h = $self->{background}->GetHeight;
115 my $background_w = $self->{background}->GetWidth;
116 $dc->DrawBitmap($self->{background}, ($size->GetWidth - $background_w) / 2, ($size->GetHeight - $background_h) / 2, 1);
117
118 my $label_h = $self->{bullets}->{own}->GetHeight;
119 $label_h = $dc->GetCharHeight if $dc->GetCharHeight > $label_h;
120 my $label_w = $size->GetWidth;
121
122 my $i = 0;
123 foreach (@{$self->{titles}}) {
124 my $bullet = $self->{bullets}->{own};
125 $bullet = $self->{bullets}->{before} if $i < $self->{own_index};
126 $bullet = $self->{bullets}->{after} if $i > $self->{own_index};
127
128 $dc->SetTextForeground(Wx::Colour->new(128, 128, 128)) if $i > $self->{own_index};
129 $dc->DrawLabel($_, $bullet, Wx::Rect->new(0, $i * ($label_h + $gap), $label_w, $label_h));
130 $i++;
131 }
132
133 $event->Skip;
134 }
135
136 sub prepend_title {
137 my $self = shift;
138 my ($title) = @_;
139
140 unshift @{$self->{titles}}, $title;
141 $self->{own_index}++;
142 $self->Refresh;
143 }
144
145 sub append_title {
146 my $self = shift;
147 my ($title) = @_;
148
149 push @{$self->{titles}}, $title;
150 $self->Refresh;
151 }
152
153 package Slic3r::GUI::ConfigWizard::Page;
154 use Wx qw(:font :misc :sizer :staticline :systemsettings);
155 use base 'Wx::WizardPage';
156
157 sub new {
158 my $class = shift;
159 my ($parent, $title, $short_title) = @_;
160 my $self = $class->SUPER::new($parent);
161
162 my $sizer = Wx::FlexGridSizer->new(0, 2, 10, 10);
163 $sizer->AddGrowableCol(1, 1);
164 $sizer->AddGrowableRow(1, 1);
165 $sizer->AddStretchSpacer(0);
166 $self->SetSizer($sizer);
167
168 # title
169 my $text = Wx::StaticText->new($self, -1, $title, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
170 my $bold_font = Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
171 $bold_font->SetWeight(wxFONTWEIGHT_BOLD);
172 $bold_font->SetPointSize(14);
173 $text->SetFont($bold_font);
174 $sizer->Add($text, 0, wxALIGN_LEFT, 0);
175
176 # index
177 $self->{short_title} = $short_title ? $short_title : $title;
178 $self->{index} = Slic3r::GUI::ConfigWizard::Index->new($self, $self->{short_title});
179 $sizer->Add($self->{index}, 1, wxEXPAND | wxTOP | wxRIGHT, 10);
180
181 # contents
182 $self->{width} = 430;
183 $self->{vsizer} = Wx::BoxSizer->new(wxVERTICAL);
184 $sizer->Add($self->{vsizer}, 1);
185
186 return $self;
187 }
188
189 sub append_text {
190 my $self = shift;
191 my ($text) = @_;
192
193 my $para = Wx::StaticText->new($self, -1, $text, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
194 $para->Wrap($self->{width});
195 $para->SetMinSize([$self->{width}, -1]);
196 $self->{vsizer}->Add($para, 0, wxALIGN_LEFT | wxTOP | wxBOTTOM, 10);
197 }
198
199 sub append_option {
200 my $self = shift;
201 my ($full_key) = @_;
202
203 # populate repository with the factory default
204 my ($opt_key, $opt_index) = split /#/, $full_key, 2;
205 $self->config->apply(Slic3r::Config->new_from_defaults($opt_key));
206
207 # draw the control
208 my $optgroup = Slic3r::GUI::ConfigOptionsGroup->new(
209 parent => $self,
210 title => '',
211 config => $self->config,
212 full_labels => 1,
213 );
214 $optgroup->append_single_option_line($opt_key, $opt_index);
215 $self->{vsizer}->Add($optgroup->sizer, 0, wxEXPAND | wxTOP | wxBOTTOM, 10);
216 }
217
218 sub append_panel {
219 my ($self, $panel) = @_;
220 $self->{vsizer}->Add($panel, 0, wxEXPAND | wxTOP | wxBOTTOM, 10);
221 }
222
223 sub set_previous_page {
224 my $self = shift;
225 my ($previous_page) = @_;
226 $self->{previous_page} = $previous_page;
227 }
228
229 sub GetPrev {
230 my $self = shift;
231 return $self->{previous_page};
232 }
233
234 sub set_next_page {
235 my $self = shift;
236 my ($next_page) = @_;
237 $self->{next_page} = $next_page;
238 }
239
240 sub GetNext {
241 my $self = shift;
242 return $self->{next_page};
243 }
244
245 sub get_short_title {
246 my $self = shift;
247 return $self->{short_title};
248 }
249
250 sub build_index {
251 my $self = shift;
252
253 my $page = $self;
254 $self->{index}->prepend_title($page->get_short_title) while ($page = $page->GetPrev);
255 $page = $self;
256 $self->{index}->append_title($page->get_short_title) while ($page = $page->GetNext);
257 }
258
259 sub config {
260 my ($self) = @_;
261 return $self->GetParent->{config};
262 }
263
264 package Slic3r::GUI::ConfigWizard::Page::Welcome;
265 use base 'Slic3r::GUI::ConfigWizard::Page';
266
267 sub new {
268 my $class = shift;
269 my ($parent) = @_;
270 my $self = $class->SUPER::new($parent, "Welcome to the Slic3r Configuration $wizard", 'Welcome');
271
272 $self->append_text('Hello, welcome to Slic3r! This '.lc($wizard).' helps you with the initial configuration; just a few settings and you will be ready to print.');
273 $self->append_text('To import an existing configuration instead, cancel this '.lc($wizard).' and use the Open Config menu item found in the File menu.');
274 $self->append_text('To continue, click Next.');
275
276 return $self;
277 }
278
279 package Slic3r::GUI::ConfigWizard::Page::Firmware;
280 use base 'Slic3r::GUI::ConfigWizard::Page';
281
282 sub new {
283 my $class = shift;
284 my ($parent) = @_;
285 my $self = $class->SUPER::new($parent, 'Firmware Type');
286
287 $self->append_text('Choose the type of firmware used by your printer, then click Next.');
288 $self->append_option('gcode_flavor');
289
290 return $self;
291 }
292
293 package Slic3r::GUI::ConfigWizard::Page::Bed;
294 use base 'Slic3r::GUI::ConfigWizard::Page';
295
296 sub new {
297 my $class = shift;
298 my ($parent) = @_;
299 my $self = $class->SUPER::new($parent, 'Bed Size');
300
301 $self->append_text('Set the shape of your printer\'s bed, then click Next.');
302
303 $self->config->apply(Slic3r::Config->new_from_defaults('bed_shape'));
304 $self->{bed_shape_panel} = my $panel = Slic3r::GUI::BedShapePanel->new($self, $self->config->bed_shape);
305 $self->{bed_shape_panel}->on_change(sub {
306 $self->config->set('bed_shape', $self->{bed_shape_panel}->GetValue);
307 });
308 $self->append_panel($self->{bed_shape_panel});
309 return $self;
310 }
311
312 package Slic3r::GUI::ConfigWizard::Page::Nozzle;
313 use base 'Slic3r::GUI::ConfigWizard::Page';
314
315 sub new {
316 my $class = shift;
317 my ($parent) = @_;
318 my $self = $class->SUPER::new($parent, 'Nozzle Diameter');
319
320 $self->append_text('Enter the diameter of your printer\'s hot end nozzle, then click Next.');
321 $self->append_option('nozzle_diameter#0');
322
323 return $self;
324 }
325
326 package Slic3r::GUI::ConfigWizard::Page::Filament;
327 use base 'Slic3r::GUI::ConfigWizard::Page';
328
329 sub new {
330 my $class = shift;
331 my ($parent) = @_;
332 my $self = $class->SUPER::new($parent, 'Filament Diameter');
333
334 $self->append_text('Enter the diameter of your filament, then click Next.');
335 $self->append_text('Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average.');
336 $self->append_option('filament_diameter#0');
337
338 return $self;
339 }
340
341 package Slic3r::GUI::ConfigWizard::Page::Temperature;
342 use base 'Slic3r::GUI::ConfigWizard::Page';
343
344 sub new {
345 my $class = shift;
346 my ($parent) = @_;
347 my $self = $class->SUPER::new($parent, 'Extrusion Temperature');
348
349 $self->append_text('Enter the temperature needed for extruding your filament, then click Next.');
350 $self->append_text('A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS.');
351 $self->append_option('temperature#0');
352
353 return $self;
354 }
355
356 package Slic3r::GUI::ConfigWizard::Page::BedTemperature;
357 use base 'Slic3r::GUI::ConfigWizard::Page';
358
359 sub new {
360 my $class = shift;
361 my ($parent) = @_;
362 my $self = $class->SUPER::new($parent, 'Bed Temperature');
363
364 $self->append_text('Enter the bed temperature needed for getting your filament to stick to your heated bed, then click Next.');
365 $self->append_text('A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed.');
366 $self->append_option('bed_temperature');
367
368 return $self;
369 }
370
371 package Slic3r::GUI::ConfigWizard::Page::Finished;
372 use base 'Slic3r::GUI::ConfigWizard::Page';
373
374 sub new {
375 my $class = shift;
376 my ($parent) = @_;
377 my $self = $class->SUPER::new($parent, 'Congratulations!', 'Finish');
378
379 $self->append_text("You have successfully completed the Slic3r Configuration $wizard. " .
380 'Slic3r is now configured for your printer and filament.');
381 $self->append_text('To close this '.lc($wizard).' and apply the newly created configuration, click Finish.');
382
383 return $self;
384 }
385
386 1;
0 # A printer "Controller" -> "ManualControlDialog" subtab, opened per 3D printer connected?
1
2 package Slic3r::GUI::Controller::ManualControlDialog;
3 use strict;
4 use warnings;
5 use utf8;
6
7 use Slic3r::Geometry qw(PI X Y unscale);
8 use Wx qw(:dialog :id :misc :sizer :choicebook :button :bitmap
9 wxBORDER_NONE wxTAB_TRAVERSAL);
10 use Wx::Event qw(EVT_CLOSE EVT_BUTTON);
11 use base qw(Wx::Dialog Class::Accessor);
12
13 __PACKAGE__->mk_accessors(qw(sender config2 x_homed y_homed));
14
15 sub new {
16 my ($class, $parent, $config, $sender) = @_;
17
18 my $self = $class->SUPER::new($parent, -1, "Manual Control", wxDefaultPosition,
19 [500,380], wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
20 $self->sender($sender);
21
22 $self->config2({
23 xy_travel_speed => 130,
24 z_travel_speed => 10,
25 });
26
27 my $bed_sizer = Wx::FlexGridSizer->new(2, 3, 1, 1);
28 $bed_sizer->AddGrowableCol(1, 1);
29 $bed_sizer->AddGrowableRow(0, 1);
30
31 my $move_button = sub {
32 my ($sizer, $label, $icon, $bold, $pos, $handler) = @_;
33
34 my $btn = Wx::Button->new($self, -1, $label, wxDefaultPosition, wxDefaultSize,
35 wxBU_LEFT | wxBU_EXACTFIT);
36 $btn->SetFont($bold ? $Slic3r::GUI::small_bold_font : $Slic3r::GUI::small_font);
37 if ($Slic3r::GUI::have_button_icons) {
38 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("$icon.png"), wxBITMAP_TYPE_PNG));
39 $btn->SetBitmapPosition($pos);
40 }
41 EVT_BUTTON($self, $btn, $handler);
42 $sizer->Add($btn, 1, wxEXPAND | wxALL, 0);
43 };
44
45 # Y buttons
46 {
47 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
48 for my $d (qw(+10 +1 +0.1)) {
49 $move_button->($sizer, $d, 'arrow_up', 0, wxLEFT, sub { $self->rel_move('Y', $d) });
50 }
51 $move_button->($sizer, 'Y', 'house', 1, wxLEFT, sub { $self->home('Y') });
52 for my $d (qw(-0.1 -1 -10)) {
53 $move_button->($sizer, $d, 'arrow_down', 0, wxLEFT, sub { $self->rel_move('Y', $d) });
54 };
55 $bed_sizer->Add($sizer, 1, wxEXPAND, 0);
56 }
57
58 # Bed canvas
59 {
60 my $bed_shape = $config->bed_shape;
61 $self->{canvas} = my $canvas = Slic3r::GUI::2DBed->new($self, $bed_shape);
62 $canvas->interactive(1);
63 $canvas->on_move(sub {
64 my ($pos) = @_;
65
66 if (!($self->x_homed && $self->y_homed)) {
67 Slic3r::GUI::show_error($self, "Please home both X and Y before moving.");
68 return ;
69 }
70
71 # delete any pending commands to get a smoother movement
72 $self->sender->purge_queue(1);
73 $self->abs_xy_move($pos);
74 });
75 $bed_sizer->Add($canvas, 0, wxEXPAND | wxRIGHT, 3);
76 }
77
78 # Z buttons
79 {
80 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
81 for my $d (qw(+10 +1 +0.1)) {
82 $move_button->($sizer, $d, 'arrow_up', 0, wxLEFT, sub { $self->rel_move('Z', $d) });
83 }
84 $move_button->($sizer, 'Z', 'house', 1, wxLEFT, sub { $self->home('Z') });
85 for my $d (qw(-0.1 -1 -10)) {
86 $move_button->($sizer, $d, 'arrow_down', 0, wxLEFT, sub { $self->rel_move('Z', $d) });
87 };
88 $bed_sizer->Add($sizer, 1, wxEXPAND, 0);
89 }
90
91 # XYZ home button
92 $move_button->($bed_sizer, 'XYZ', 'house', 1, wxTOP, sub { $self->home(undef) });
93
94 # X buttons
95 {
96 my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
97 for my $d (qw(-10 -1 -0.1)) {
98 $move_button->($sizer, $d, 'arrow_left', 0, wxTOP, sub { $self->rel_move('X', $d) });
99 }
100 $move_button->($sizer, 'X', 'house', 1, wxTOP, sub { $self->home('X') });
101 for my $d (qw(+0.1 +1 +10)) {
102 $move_button->($sizer, $d, 'arrow_right', 0, wxTOP, sub { $self->rel_move('X', $d) });
103 }
104 $bed_sizer->Add($sizer, 1, wxEXPAND, 0);
105 }
106
107 my $optgroup = Slic3r::GUI::OptionsGroup->new(
108 parent => $self,
109 title => 'Settings',
110 on_change => sub {
111 my ($opt_id, $value) = @_;
112 $self->config2->{$opt_id} = $value;
113 },
114 );
115 {
116 my $line = Slic3r::GUI::OptionsGroup::Line->new(
117 label => 'Speed (mm/s)',
118 );
119 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
120 opt_id => 'xy_travel_speed',
121 type => 'f',
122 label => 'X/Y',
123 tooltip => '',
124 default => $self->config2->{xy_travel_speed},
125 ));
126 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
127 opt_id => 'z_travel_speed',
128 type => 'f',
129 label => 'Z',
130 tooltip => '',
131 default => $self->config2->{z_travel_speed},
132 ));
133 $optgroup->append_line($line);
134 }
135
136 my $main_sizer = Wx::BoxSizer->new(wxVERTICAL);
137 $main_sizer->Add($bed_sizer, 1, wxEXPAND | wxALL, 10);
138 $main_sizer->Add($optgroup->sizer, 0, wxEXPAND | wxALL, 10);
139 #$main_sizer->Add($self->CreateButtonSizer(wxCLOSE), 0, wxEXPAND);
140 #EVT_BUTTON($self, wxID_CLOSE, sub { $self->Close });
141
142 $self->SetSizer($main_sizer);
143 $self->SetMinSize($self->GetSize);
144 #$main_sizer->SetSizeHints($self);
145 $self->Layout;
146
147 # needed to actually free memory
148 EVT_CLOSE($self, sub {
149 $self->EndModal(wxID_OK);
150 $self->Destroy;
151 });
152
153 return $self;
154 }
155
156 sub abs_xy_move {
157 my ($self, $pos) = @_;
158
159 $self->sender->send("G90", 1); # set absolute positioning
160 $self->sender->send(sprintf("G1 X%.1f Y%.1f F%d", @$pos, $self->config2->{xy_travel_speed}*60), 1);
161 $self->{canvas}->set_pos($pos);
162 }
163
164 sub rel_move {
165 my ($self, $axis, $distance) = @_;
166
167 my $speed = ($axis eq 'Z') ? $self->config2->{z_travel_speed} : $self->config2->{xy_travel_speed};
168 $self->sender->send("G91", 1); # set relative positioning
169 $self->sender->send(sprintf("G1 %s%.1f F%d", $axis, $distance, $speed*60), 1);
170 $self->sender->send("G90", 1); # set absolute positioning
171
172 if (my $pos = $self->{canvas}->pos) {
173 if ($axis eq 'X') {
174 $pos->translate($distance, 0);
175 } elsif ($axis eq 'Y') {
176 $pos->translate(0, $distance);
177 }
178 $self->{canvas}->set_pos($pos);
179 }
180 }
181
182 sub home {
183 my ($self, $axis) = @_;
184
185 $axis //= '';
186 $self->sender->send(sprintf("G28 %s", $axis), 1);
187 $self->{canvas}->set_pos(undef);
188 $self->x_homed(1) if $axis eq 'X';
189 $self->y_homed(1) if $axis eq 'Y';
190 }
191
192 1;
0 package Slic3r::GUI::Controller::PrinterPanel;
1 use strict;
2 use warnings;
3 use utf8;
4
5 use Wx qw(wxTheApp :panel :id :misc :sizer :button :bitmap :window :gauge :timer
6 :textctrl :font :systemsettings);
7 use Wx::Event qw(EVT_BUTTON EVT_MOUSEWHEEL EVT_TIMER EVT_SCROLLWIN);
8 use base qw(Wx::Panel Class::Accessor);
9
10 __PACKAGE__->mk_accessors(qw(printer_name config sender jobs
11 printing status_timer temp_timer));
12
13 use constant CONNECTION_TIMEOUT => 3; # seconds
14 use constant STATUS_TIMER_INTERVAL => 1000; # milliseconds
15 use constant TEMP_TIMER_INTERVAL => 5000; # milliseconds
16
17 sub new {
18 my ($class, $parent, $printer_name, $config) = @_;
19 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, [500, 250]);
20
21 $self->printer_name($printer_name || 'Printer');
22 $self->config($config);
23 $self->jobs([]);
24
25 # set up the timer that polls for updates
26 {
27 my $timer_id = &Wx::NewId();
28 $self->status_timer(Wx::Timer->new($self, $timer_id));
29 EVT_TIMER($self, $timer_id, sub {
30 my ($self, $event) = @_;
31
32 if ($self->printing) {
33 my $queue_size = $self->sender->queue_size;
34 $self->{gauge}->SetValue($self->{gauge}->GetRange - $queue_size);
35 if ($queue_size == 0) {
36 $self->print_completed;
37 }
38 }
39 $self->{log_textctrl}->AppendText("$_\n") for @{$self->sender->purge_log};
40 {
41 my $temp = $self->sender->getT;
42 if ($temp eq '') {
43 $self->{temp_panel}->Hide;
44 } else {
45 if (!$self->{temp_panel}->IsShown) {
46 $self->{temp_panel}->Show;
47 $self->Layout;
48 }
49 $self->{temp_text}->SetLabel($temp . "°C");
50
51 $temp = $self->sender->getB;
52 if ($temp eq '') {
53 $self->{bed_temp_text}->SetLabel('n.a.');
54 } else {
55 $self->{bed_temp_text}->SetLabel($temp . "°C");
56 }
57 }
58 }
59 });
60 }
61
62 # set up the timer that sends temperature requests
63 # (responses are handled by status_timer)
64 {
65 my $timer_id = &Wx::NewId();
66 $self->temp_timer(Wx::Timer->new($self, $timer_id));
67 EVT_TIMER($self, $timer_id, sub {
68 my ($self, $event) = @_;
69 $self->sender->send("M105", 1); # send it through priority queue
70 });
71 }
72
73 my $box = Wx::StaticBox->new($self, -1, "");
74 my $sizer = Wx::StaticBoxSizer->new($box, wxHORIZONTAL);
75 my $left_sizer = Wx::BoxSizer->new(wxVERTICAL);
76
77 # printer name
78 {
79 my $text = Wx::StaticText->new($box, -1, $self->printer_name, wxDefaultPosition, [220,-1]);
80 my $font = $text->GetFont;
81 $font->SetPointSize(20);
82 $text->SetFont($font);
83 $left_sizer->Add($text, 0, wxEXPAND, 0);
84 }
85
86 # connection info
87 {
88 my $conn_sizer = Wx::FlexGridSizer->new(2, 2, 1, 0);
89 $conn_sizer->SetFlexibleDirection(wxHORIZONTAL);
90 $conn_sizer->AddGrowableCol(1, 1);
91 $left_sizer->Add($conn_sizer, 0, wxEXPAND | wxTOP, 5);
92 {
93 my $text = Wx::StaticText->new($box, -1, "Port:", wxDefaultPosition, wxDefaultSize);
94 $text->SetFont($Slic3r::GUI::small_font);
95 $conn_sizer->Add($text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
96 }
97 my $serial_port_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
98 {
99 $self->{serial_port_combobox} = Wx::ComboBox->new($box, -1, $config->serial_port, wxDefaultPosition, wxDefaultSize, []);
100 $self->{serial_port_combobox}->SetFont($Slic3r::GUI::small_font);
101 $self->update_serial_ports;
102 $serial_port_sizer->Add($self->{serial_port_combobox}, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 1);
103 }
104 {
105 $self->{btn_rescan_serial} = my $btn = Wx::BitmapButton->new($box, -1, Wx::Bitmap->new($Slic3r::var->("arrow_rotate_clockwise.png"), wxBITMAP_TYPE_PNG),
106 wxDefaultPosition, wxDefaultSize, &Wx::wxBORDER_NONE);
107 $btn->SetToolTipString("Rescan serial ports")
108 if $btn->can('SetToolTipString');
109 $serial_port_sizer->Add($btn, 0, wxALIGN_CENTER_VERTICAL, 0);
110 EVT_BUTTON($self, $btn, sub { $self->update_serial_ports });
111 }
112 $conn_sizer->Add($serial_port_sizer, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
113
114 {
115 my $text = Wx::StaticText->new($box, -1, "Speed:", wxDefaultPosition, wxDefaultSize);
116 $text->SetFont($Slic3r::GUI::small_font);
117 $conn_sizer->Add($text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
118 }
119 my $serial_speed_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
120 {
121 $self->{serial_speed_combobox} = Wx::ComboBox->new($box, -1, $config->serial_speed, wxDefaultPosition, wxDefaultSize,
122 ["115200", "250000"]);
123 $self->{serial_speed_combobox}->SetFont($Slic3r::GUI::small_font);
124 $serial_speed_sizer->Add($self->{serial_speed_combobox}, 0, wxALIGN_CENTER_VERTICAL, 0);
125 }
126 {
127 $self->{btn_disconnect} = my $btn = Wx::Button->new($box, -1, "Disconnect", wxDefaultPosition, wxDefaultSize);
128 $btn->SetFont($Slic3r::GUI::small_font);
129 if ($Slic3r::GUI::have_button_icons) {
130 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("delete.png"), wxBITMAP_TYPE_PNG));
131 }
132 $serial_speed_sizer->Add($btn, 0, wxLEFT, 5);
133 EVT_BUTTON($self, $btn, \&disconnect);
134 }
135 $conn_sizer->Add($serial_speed_sizer, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
136 }
137
138 # buttons
139 {
140 $self->{btn_connect} = my $btn = Wx::Button->new($box, -1, "Connect to printer", wxDefaultPosition, [-1, 40]);
141 my $font = $btn->GetFont;
142 $font->SetPointSize($font->GetPointSize + 2);
143 $btn->SetFont($font);
144 if ($Slic3r::GUI::have_button_icons) {
145 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("arrow_up.png"), wxBITMAP_TYPE_PNG));
146 }
147 $left_sizer->Add($btn, 0, wxTOP, 15);
148 EVT_BUTTON($self, $btn, \&connect);
149 }
150
151 # print progress bar
152 {
153 my $gauge = $self->{gauge} = Wx::Gauge->new($self, wxGA_HORIZONTAL, 100, wxDefaultPosition, wxDefaultSize);
154 $left_sizer->Add($self->{gauge}, 0, wxEXPAND | wxTOP, 15);
155 $gauge->Hide;
156 }
157
158 # status
159 $self->{status_text} = Wx::StaticText->new($box, -1, "", wxDefaultPosition, [200,-1]);
160 $left_sizer->Add($self->{status_text}, 1, wxEXPAND | wxTOP, 15);
161
162 # manual control
163 {
164 $self->{btn_manual_control} = my $btn = Wx::Button->new($box, -1, "Manual control", wxDefaultPosition, wxDefaultSize);
165 $btn->SetFont($Slic3r::GUI::small_font);
166 if ($Slic3r::GUI::have_button_icons) {
167 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("cog.png"), wxBITMAP_TYPE_PNG));
168 }
169 $btn->Hide;
170 $left_sizer->Add($btn, 0, wxTOP, 15);
171 EVT_BUTTON($self, $btn, sub {
172 my $dlg = Slic3r::GUI::Controller::ManualControlDialog->new
173 ($self, $self->config, $self->sender);
174 $dlg->ShowModal;
175 });
176 }
177
178 # temperature
179 {
180 my $temp_panel = $self->{temp_panel} = Wx::Panel->new($box, -1);
181 my $temp_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
182
183 my $temp_font = Wx::Font->new($Slic3r::GUI::small_font);
184 $temp_font->SetWeight(wxFONTWEIGHT_BOLD);
185 {
186 my $text = Wx::StaticText->new($temp_panel, -1, "Temperature:", wxDefaultPosition, wxDefaultSize);
187 $text->SetFont($Slic3r::GUI::small_font);
188 $temp_sizer->Add($text, 0, wxALIGN_CENTER_VERTICAL);
189
190 $self->{temp_text} = Wx::StaticText->new($temp_panel, -1, "", wxDefaultPosition, wxDefaultSize);
191 $self->{temp_text}->SetFont($temp_font);
192 $self->{temp_text}->SetForegroundColour(Wx::wxRED);
193 $temp_sizer->Add($self->{temp_text}, 1, wxALIGN_CENTER_VERTICAL);
194 }
195 {
196 my $text = Wx::StaticText->new($temp_panel, -1, "Bed:", wxDefaultPosition, wxDefaultSize);
197 $text->SetFont($Slic3r::GUI::small_font);
198 $temp_sizer->Add($text, 0, wxALIGN_CENTER_VERTICAL);
199
200 $self->{bed_temp_text} = Wx::StaticText->new($temp_panel, -1, "", wxDefaultPosition, wxDefaultSize);
201 $self->{bed_temp_text}->SetFont($temp_font);
202 $self->{bed_temp_text}->SetForegroundColour(Wx::wxRED);
203 $temp_sizer->Add($self->{bed_temp_text}, 1, wxALIGN_CENTER_VERTICAL);
204 }
205 $temp_panel->SetSizer($temp_sizer);
206 $temp_panel->Hide;
207 $left_sizer->Add($temp_panel, 0, wxEXPAND | wxTOP | wxBOTTOM, 4);
208 }
209
210 # print jobs panel
211 $self->{print_jobs_sizer} = my $print_jobs_sizer = Wx::BoxSizer->new(wxVERTICAL);
212 {
213 my $text = Wx::StaticText->new($box, -1, "Queue:", wxDefaultPosition, wxDefaultSize);
214 $text->SetFont($Slic3r::GUI::small_font);
215 $print_jobs_sizer->Add($text, 0, wxEXPAND, 0);
216
217 $self->{jobs_panel} = Wx::ScrolledWindow->new($box, -1, wxDefaultPosition, wxDefaultSize,
218 wxVSCROLL | wxBORDER_NONE);
219 $self->{jobs_panel}->SetScrollbars(0, 1, 0, 1);
220 $self->{jobs_panel_sizer} = Wx::BoxSizer->new(wxVERTICAL);
221 $self->{jobs_panel}->SetSizer($self->{jobs_panel_sizer});
222 $print_jobs_sizer->Add($self->{jobs_panel}, 1, wxEXPAND, 0);
223
224 # TODO: fix this. We're trying to pass the scroll event to the parent but it
225 # doesn't work.
226 EVT_SCROLLWIN($self->{jobs_panel}, sub {
227 my ($panel, $event) = @_;
228
229 my $controller = $self->GetParent;
230 my $new_event = Wx::ScrollWinEvent->new(
231 $event->GetEventType,
232 $event->GetPosition,
233 $event->GetOrientation,
234 );
235 $controller->ProcessEvent($new_event);
236 }) if 0;
237 }
238
239 my $log_sizer = Wx::BoxSizer->new(wxVERTICAL);
240 {
241 my $text = Wx::StaticText->new($box, -1, "Log:", wxDefaultPosition, wxDefaultSize);
242 $text->SetFont($Slic3r::GUI::small_font);
243 $log_sizer->Add($text, 0, wxEXPAND, 0);
244
245 my $log = $self->{log_textctrl} = Wx::TextCtrl->new($box, -1, "", wxDefaultPosition, wxDefaultSize,
246 wxTE_MULTILINE | wxBORDER_NONE);
247 $log->SetBackgroundColour($box->GetBackgroundColour);
248 $log->SetFont($Slic3r::GUI::small_font);
249 $log->SetEditable(0);
250 $log_sizer->Add($self->{log_textctrl}, 1, wxEXPAND, 0);
251 }
252
253 $sizer->Add($left_sizer, 0, wxEXPAND | wxALL, 0);
254 $sizer->Add($print_jobs_sizer, 2, wxEXPAND | wxALL, 0);
255 $sizer->Add($log_sizer, 1, wxEXPAND | wxLEFT, 15);
256
257 $self->SetSizer($sizer);
258 $self->SetMinSize($self->GetSize);
259
260 $self->_update_connection_controls;
261
262 return $self;
263 }
264
265 sub is_connected {
266 my ($self) = @_;
267 return $self->sender && $self->sender->is_connected;
268 }
269
270 sub _update_connection_controls {
271 my ($self) = @_;
272
273 $self->{btn_connect}->Show;
274 $self->{btn_disconnect}->Hide;
275 $self->{serial_port_combobox}->Enable;
276 $self->{serial_speed_combobox}->Enable;
277 $self->{btn_rescan_serial}->Enable;
278 $self->{btn_manual_control}->Hide;
279 $self->{btn_manual_control}->Disable;
280
281 if ($self->is_connected) {
282 $self->{btn_connect}->Hide;
283 $self->{btn_manual_control}->Show;
284 if (!$self->printing || $self->printing->paused) {
285 $self->{btn_disconnect}->Show;
286 $self->{btn_manual_control}->Enable;
287 }
288 $self->{serial_port_combobox}->Disable;
289 $self->{serial_speed_combobox}->Disable;
290 $self->{btn_rescan_serial}->Disable;
291 }
292
293 $self->Layout;
294 }
295
296 sub set_status {
297 my ($self, $status) = @_;
298 $self->{status_text}->SetLabel($status);
299 $self->{status_text}->Wrap($self->{status_text}->GetSize->GetWidth);
300 $self->{status_text}->Refresh;
301 $self->Layout;
302 }
303
304 sub connect {
305 my ($self) = @_;
306
307 return if $self->is_connected;
308
309 $self->set_status("Connecting...");
310 $self->sender(Slic3r::GCode::Sender->new);
311 my $res = $self->sender->connect(
312 $self->{serial_port_combobox}->GetValue,
313 $self->{serial_speed_combobox}->GetValue,
314 );
315 if (!$res) {
316 $self->set_status("Connection failed. Check serial port and speed.");
317 } else {
318 if ($self->sender->wait_connected) {
319 $self->set_status("Printer is online. You can now start printing from the queue on the right.");
320 $self->status_timer->Start(STATUS_TIMER_INTERVAL, wxTIMER_CONTINUOUS);
321 $self->temp_timer->Start(TEMP_TIMER_INTERVAL, wxTIMER_CONTINUOUS);
322
323 # request temperature now, without waiting for the timer
324 $self->sender->send("M105", 1);
325 } else {
326 $self->set_status("Connection failed. Check serial port and speed.");
327 }
328 }
329 $self->_update_connection_controls;
330 $self->reload_jobs;
331 }
332
333 sub disconnect {
334 my ($self) = @_;
335
336 $self->status_timer->Stop;
337 $self->temp_timer->Stop;
338 return if !$self->is_connected;
339
340 $self->printing->printing(0) if $self->printing;
341 $self->printing(undef);
342 $self->{gauge}->Hide;
343 $self->{temp_panel}->Hide;
344 $self->sender->disconnect;
345 $self->set_status("");
346 $self->_update_connection_controls;
347 $self->reload_jobs;
348 }
349
350 sub update_serial_ports {
351 my ($self) = @_;
352
353 my $cb = $self->{serial_port_combobox};
354 my $current = $cb->GetValue;
355 $cb->Clear;
356 $cb->Append($_) for wxTheApp->scan_serial_ports;
357 $cb->SetValue($current);
358 }
359
360 sub load_print_job {
361 my ($self, $gcode_file, $filament_stats) = @_;
362
363 push @{$self->jobs}, my $job = Slic3r::GUI::Controller::PrinterPanel::PrintJob->new(
364 id => time() . $gcode_file . rand(1000),
365 gcode_file => $gcode_file,
366 filament_stats => $filament_stats,
367 );
368 $self->reload_jobs;
369 return $job;
370 }
371
372 sub delete_job {
373 my ($self, $job) = @_;
374
375 $self->jobs([ grep $_->id ne $job->id, @{$self->jobs} ]);
376 $self->reload_jobs;
377 }
378
379 sub print_job {
380 my ($self, $job) = @_;
381
382 $self->printing($job);
383 $job->printing(1);
384 $self->reload_jobs;
385
386 open my $fh, '<', $job->gcode_file;
387 my $line_count = 0;
388 while (my $row = <$fh>) {
389 $self->sender->send($row);
390 $line_count++;
391 }
392 close $fh;
393
394 $self->_update_connection_controls;
395 $self->{gauge}->SetRange($line_count);
396 $self->{gauge}->SetValue(0);
397 $self->{gauge}->Enable;
398 $self->{gauge}->Show;
399 $self->Layout;
400
401 $self->set_status('Printing...');
402 $self->{log_textctrl}->AppendText(sprintf "=====\n");
403 $self->{log_textctrl}->AppendText(sprintf "Printing %s\n", $job->name);
404 $self->{log_textctrl}->AppendText(sprintf "Print started at %s\n", $self->_timestamp);
405 }
406
407 sub print_completed {
408 my ($self) = @_;
409
410 my $job = $self->printing;
411 $self->printing(undef);
412 $job->printing(0);
413 $job->printed(1);
414 $self->_update_connection_controls;
415 $self->{gauge}->Hide;
416 $self->Layout;
417
418 $self->set_status('Print completed.');
419 $self->{log_textctrl}->AppendText(sprintf "Print completed at %s\n", $self->_timestamp);
420
421 $self->reload_jobs;
422 }
423
424 sub reload_jobs {
425 my ($self) = @_;
426
427 # reorder jobs
428 @{$self->jobs} = sort { ($a->printed <=> $b->printed) || ($a->timestamp <=> $b->timestamp) }
429 @{$self->jobs};
430
431 # remove all panels
432 foreach my $child ($self->{jobs_panel_sizer}->GetChildren) {
433 my $window = $child->GetWindow;
434 $self->{jobs_panel_sizer}->Detach($window);
435 # now $child does not exist anymore
436 $window->Destroy;
437 }
438
439 # re-add all panels
440 foreach my $job (@{$self->jobs}) {
441 my $panel = Slic3r::GUI::Controller::PrinterPanel::PrintJobPanel->new($self->{jobs_panel}, $job);
442 $self->{jobs_panel_sizer}->Add($panel, 0, wxEXPAND | wxBOTTOM, 5);
443
444 $panel->on_delete_job(sub {
445 my ($job) = @_;
446 $self->delete_job($job);
447 });
448 $panel->on_print_job(sub {
449 my ($job) = @_;
450 $self->print_job($job);
451 });
452 $panel->on_pause_print(sub {
453 my ($job) = @_;
454 $self->sender->pause_queue;
455 $job->paused(1);
456 $self->reload_jobs;
457 $self->_update_connection_controls;
458 $self->{gauge}->Disable;
459 $self->set_status('Print is paused. Click on Resume to continue.');
460 });
461 $panel->on_abort_print(sub {
462 my ($job) = @_;
463 $self->sender->purge_queue;
464 $self->printing(undef);
465 $job->printing(0);
466 $job->paused(0);
467 $self->reload_jobs;
468 $self->_update_connection_controls;
469 $self->{gauge}->Disable;
470 $self->{gauge}->Hide;
471 $self->set_status('Print was aborted.');
472 $self->{log_textctrl}->AppendText(sprintf "Print aborted at %s\n", $self->_timestamp);
473 });
474 $panel->on_resume_print(sub {
475 my ($job) = @_;
476 $self->sender->resume_queue;
477 $job->paused(0);
478 $self->reload_jobs;
479 $self->_update_connection_controls;
480 $self->{gauge}->Enable;
481 $self->set_status('Printing...');
482 });
483 $panel->enable_print if $self->is_connected && !$self->printing;
484
485 EVT_MOUSEWHEEL($panel, sub {
486 my (undef, $event) = @_;
487 Wx::PostEvent($self->{jobs_panel}, $event);
488 $event->Skip;
489 });
490 }
491
492 $self->{jobs_panel}->Layout;
493 $self->{print_jobs_sizer}->Layout;
494 }
495
496 sub _timestamp {
497 my ($self) = @_;
498
499 my @time = localtime(time);
500 return sprintf '%02d:%02d:%02d', @time[2,1,0];
501 }
502
503 package Slic3r::GUI::Controller::PrinterPanel::PrintJob;
504 use Moo;
505
506 use File::Basename qw(basename);
507
508 has 'id' => (is => 'ro', required => 1);
509 has 'timestamp' => (is => 'ro', default => sub { time });
510 has 'gcode_file' => (is => 'ro', required => 1);
511 has 'filament_stats' => (is => 'rw');
512 has 'printing' => (is => 'rw', default => sub { 0 });
513 has 'paused' => (is => 'rw', default => sub { 0 });
514 has 'printed' => (is => 'rw', default => sub { 0 });
515
516 sub name {
517 my ($self) = @_;
518 return basename($self->gcode_file);
519 }
520
521 package Slic3r::GUI::Controller::PrinterPanel::PrintJobPanel;
522 use strict;
523 use warnings;
524 use utf8;
525
526 use Wx qw(wxTheApp :panel :id :misc :sizer :button :bitmap :font :dialog :icon :timer
527 :colour :brush :pen);
528 use Wx::Event qw(EVT_BUTTON EVT_TIMER EVT_ERASE_BACKGROUND);
529 use base qw(Wx::Panel Class::Accessor);
530
531 __PACKAGE__->mk_accessors(qw(job on_delete_job on_print_job on_pause_print on_resume_print
532 on_abort_print blink_timer));
533
534 sub new {
535 my ($class, $parent, $job) = @_;
536 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize);
537
538 $self->job($job);
539 $self->SetBackgroundColour(wxWHITE);
540
541 {
542 my $white_brush = Wx::Brush->new(wxWHITE, wxSOLID);
543 my $pen = Wx::Pen->new(Wx::Colour->new(200,200,200), 1, wxSOLID);
544 EVT_ERASE_BACKGROUND($self, sub {
545 my ($self, $event) = @_;
546 my $dc = $event->GetDC;
547 my $size = $self->GetSize;
548 $dc->SetBrush($white_brush);
549 $dc->SetPen($pen);
550 $dc->DrawRoundedRectangle(0, 0, $size->GetWidth,$size->GetHeight, 6);
551 });
552 }
553
554 my $left_sizer = Wx::BoxSizer->new(wxVERTICAL);
555 {
556 $self->{job_name_textctrl} = my $text = Wx::StaticText->new($self, -1, $job->name, wxDefaultPosition, wxDefaultSize);
557 my $font = $text->GetFont;
558 $font->SetWeight(wxFONTWEIGHT_BOLD);
559 $text->SetFont($font);
560 if ($job->printed) {
561 $text->SetForegroundColour($Slic3r::GUI::grey);
562 }
563 $left_sizer->Add($text, 0, wxEXPAND, 0);
564 }
565 {
566 my $filament_stats = join "\n",
567 map "$_ (" . sprintf("%.2f", $job->filament_stats->{$_}/1000) . "m)",
568 sort keys %{$job->filament_stats};
569 my $text = Wx::StaticText->new($self, -1, $filament_stats, wxDefaultPosition, wxDefaultSize);
570 $text->SetFont($Slic3r::GUI::small_font);
571 if ($job->printed && !$job->printing) {
572 $text->SetForegroundColour($Slic3r::GUI::grey);
573 }
574 $left_sizer->Add($text, 0, wxEXPAND | wxTOP, 6);
575 }
576
577 my $buttons_sizer = Wx::BoxSizer->new(wxVERTICAL);
578 my $button_style = Wx::wxBORDER_NONE | wxBU_EXACTFIT;
579 {
580 my $btn = $self->{btn_delete} = Wx::Button->new($self, -1, 'Delete',
581 wxDefaultPosition, wxDefaultSize, $button_style);
582 $btn->SetToolTipString("Delete this job from print queue")
583 if $btn->can('SetToolTipString');
584 $btn->SetFont($Slic3r::GUI::small_font);
585 if ($Slic3r::GUI::have_button_icons) {
586 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("delete.png"), wxBITMAP_TYPE_PNG));
587 }
588 if ($job->printing) {
589 $btn->Hide;
590 }
591 $buttons_sizer->Add($btn, 0, wxBOTTOM, 2);
592
593 EVT_BUTTON($self, $btn, sub {
594 my $res = Wx::MessageDialog->new($self, "Are you sure you want to delete this print job?", 'Delete Job', wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION)->ShowModal;
595 return unless $res == wxID_YES;
596
597 wxTheApp->CallAfter(sub {
598 $self->on_delete_job->($job);
599 });
600 });
601 }
602 {
603 my $label = $job->printed ? 'Print Again' : 'Print This';
604 my $btn = $self->{btn_print} = Wx::Button->new($self, -1, $label, wxDefaultPosition, wxDefaultSize,
605 $button_style);
606 $btn->SetFont($Slic3r::GUI::small_bold_font);
607 if ($Slic3r::GUI::have_button_icons) {
608 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("control_play.png"), wxBITMAP_TYPE_PNG));
609 $btn->SetBitmapCurrent(Wx::Bitmap->new($Slic3r::var->("control_play_blue.png"), wxBITMAP_TYPE_PNG));
610 #$btn->SetBitmapPosition(wxRIGHT);
611 }
612 $btn->Hide;
613 $buttons_sizer->Add($btn, 0, wxBOTTOM, 2);
614
615 EVT_BUTTON($self, $btn, sub {
616 wxTheApp->CallAfter(sub {
617 $self->on_print_job->($job);
618 });
619 });
620 }
621 {
622 my $btn = $self->{btn_pause} = Wx::Button->new($self, -1, "Pause", wxDefaultPosition, wxDefaultSize,
623 $button_style);
624 $btn->SetFont($Slic3r::GUI::small_font);
625 if (!$job->printing || $job->paused) {
626 $btn->Hide;
627 }
628 if ($Slic3r::GUI::have_button_icons) {
629 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("control_pause.png"), wxBITMAP_TYPE_PNG));
630 $btn->SetBitmapCurrent(Wx::Bitmap->new($Slic3r::var->("control_pause_blue.png"), wxBITMAP_TYPE_PNG));
631 }
632 $buttons_sizer->Add($btn, 0, wxBOTTOM, 2);
633
634 EVT_BUTTON($self, $btn, sub {
635 wxTheApp->CallAfter(sub {
636 $self->on_pause_print->($job);
637 });
638 });
639 }
640 {
641 my $btn = $self->{btn_resume} = Wx::Button->new($self, -1, "Resume", wxDefaultPosition, wxDefaultSize,
642 $button_style);
643 $btn->SetFont($Slic3r::GUI::small_font);
644 if (!$job->printing || !$job->paused) {
645 $btn->Hide;
646 }
647 if ($Slic3r::GUI::have_button_icons) {
648 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("control_play.png"), wxBITMAP_TYPE_PNG));
649 $btn->SetBitmapCurrent(Wx::Bitmap->new($Slic3r::var->("control_play_blue.png"), wxBITMAP_TYPE_PNG));
650 }
651 $buttons_sizer->Add($btn, 0, wxBOTTOM, 2);
652
653 EVT_BUTTON($self, $btn, sub {
654 wxTheApp->CallAfter(sub {
655 $self->on_resume_print->($job);
656 });
657 });
658 }
659 {
660 my $btn = $self->{btn_abort} = Wx::Button->new($self, -1, "Abort", wxDefaultPosition, wxDefaultSize,
661 $button_style);
662 $btn->SetFont($Slic3r::GUI::small_font);
663 if (!$job->printing) {
664 $btn->Hide;
665 }
666 if ($Slic3r::GUI::have_button_icons) {
667 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("control_stop.png"), wxBITMAP_TYPE_PNG));
668 $btn->SetBitmapCurrent(Wx::Bitmap->new($Slic3r::var->("control_stop_blue.png"), wxBITMAP_TYPE_PNG));
669 }
670 $buttons_sizer->Add($btn, 0, wxBOTTOM, 2);
671
672 EVT_BUTTON($self, $btn, sub {
673 wxTheApp->CallAfter(sub {
674 $self->on_abort_print->($job);
675 });
676 });
677 }
678
679 my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
680 $sizer->Add($left_sizer, 1, wxEXPAND | wxALL, 6);
681 $sizer->Add($buttons_sizer, 0, wxEXPAND | wxALL, 6);
682 $self->SetSizer($sizer);
683
684 # set-up the timer that changes the job name color while printing
685 if ($self->job->printing && !$self->job->paused) {
686 my $timer_id = &Wx::NewId();
687 $self->blink_timer(Wx::Timer->new($self, $timer_id));
688 my $blink = 0; # closure
689 my $colour = Wx::Colour->new(0, 190, 0);
690 EVT_TIMER($self, $timer_id, sub {
691 my ($self, $event) = @_;
692
693 $self->{job_name_textctrl}->SetForegroundColour($blink ? Wx::wxBLACK : $colour);
694 $blink = !$blink;
695 });
696 $self->blink_timer->Start(1000, wxTIMER_CONTINUOUS);
697 }
698
699 return $self;
700 }
701
702 sub enable_print {
703 my ($self) = @_;
704
705 if (!$self->job->printing) {
706 $self->{btn_print}->Show;
707 }
708 $self->Layout;
709 }
710
711 sub Destroy {
712 my ($self) = @_;
713
714 # There's a gap between the time Perl destroys the wxPanel object and
715 # the blink_timer member, so the wxTimer might still fire an event which
716 # isn't handled properly, causing a crash. So we ensure that blink_timer
717 # is stopped before we destroy the wxPanel.
718 $self->blink_timer->Stop if $self->blink_timer;
719 return $self->SUPER::Destroy;
720 }
721
722 1;
0 # The "Controller" tab to control the printer using serial / USB.
1 # This feature is rarely used. Much more often, the firmware reads the G-codes from a SD card.
2 # May there be multiple subtabs per each printer connected?
3
4 package Slic3r::GUI::Controller;
5 use strict;
6 use warnings;
7 use utf8;
8
9 use Wx qw(wxTheApp :frame :id :misc :sizer :bitmap :button :icon :dialog);
10 use Wx::Event qw(EVT_CLOSE EVT_LEFT_DOWN EVT_MENU);
11 use base qw(Wx::ScrolledWindow Class::Accessor);
12
13 __PACKAGE__->mk_accessors(qw(_selected_printer_preset));
14
15 our @ConfigOptions = qw(bed_shape serial_port serial_speed);
16
17 sub new {
18 my ($class, $parent) = @_;
19 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, [600,350]);
20
21 $self->SetScrollbars(0, 1, 0, 1);
22 $self->{sizer} = my $sizer = Wx::BoxSizer->new(wxVERTICAL);
23
24 # warning to show when there are no printers configured
25 {
26 $self->{text_no_printers} = Wx::StaticText->new($self, -1,
27 "No printers were configured for USB/serial control.",
28 wxDefaultPosition, wxDefaultSize);
29 $self->{sizer}->Add($self->{text_no_printers}, 0, wxTOP | wxLEFT, 30);
30 }
31
32 # button for adding new printer panels
33 {
34 my $btn = $self->{btn_add} = Wx::BitmapButton->new($self, -1, Wx::Bitmap->new($Slic3r::var->("add.png"), wxBITMAP_TYPE_PNG),
35 wxDefaultPosition, wxDefaultSize, Wx::wxBORDER_NONE);
36 $btn->SetToolTipString("Add printer…")
37 if $btn->can('SetToolTipString');
38
39 EVT_LEFT_DOWN($btn, sub {
40 my $menu = Wx::Menu->new;
41 my %presets = wxTheApp->presets('printer');
42
43 # remove printers that already exist
44 my @panels = $self->print_panels;
45 delete $presets{$_} for map $_->printer_name, @panels;
46
47 foreach my $preset_name (sort keys %presets) {
48 my $config = Slic3r::Config->load($presets{$preset_name});
49 next if !$config->serial_port;
50
51 my $id = &Wx::NewId();
52 $menu->Append($id, $preset_name);
53 EVT_MENU($menu, $id, sub {
54 $self->add_printer($preset_name, $config);
55 });
56 }
57 $self->PopupMenu($menu, $btn->GetPosition);
58 $menu->Destroy;
59 });
60 $self->{sizer}->Add($btn, 0, wxTOP | wxLEFT, 10);
61 }
62
63 $self->SetSizer($sizer);
64 $self->SetMinSize($self->GetSize);
65 #$sizer->SetSizeHints($self);
66
67 EVT_CLOSE($self, sub {
68 my (undef, $event) = @_;
69
70 if ($event->CanVeto) {
71 foreach my $panel ($self->print_panels) {
72 if ($panel->printing) {
73 my $confirm = Wx::MessageDialog->new(
74 $self, "Printer '" . $panel->printer_name . "' is printing.\n\nDo you want to stop printing?",
75 'Unfinished Print', wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION,
76 );
77 if ($confirm->ShowModal == wxID_NO) {
78 $event->Veto;
79 return;
80 }
81 }
82 }
83 }
84 foreach my $panel ($self->print_panels) {
85 $panel->disconnect;
86 }
87
88 $event->Skip;
89 });
90
91 $self->Layout;
92
93 return $self;
94 }
95
96 sub OnActivate {
97 my ($self) = @_;
98
99 # get all available presets
100 my %presets = ();
101 {
102 my %all = wxTheApp->presets('printer');
103 my %configs = map { my $name = $_; $name => Slic3r::Config->load($all{$name}) } keys %all;
104 %presets = map { $_ => $configs{$_} } grep $configs{$_}->serial_port, keys %all;
105 }
106
107 # decide which ones we want to keep
108 my %active = ();
109
110 # keep the ones that are currently connected or have jobs in queue
111 $active{$_} = 1 for map $_->printer_name,
112 grep { $_->is_connected || @{$_->jobs} > 0 }
113 $self->print_panels;
114
115 if (%presets) {
116 # if there are no active panels, use sensible defaults
117 if (!%active && keys %presets <= 2) {
118 # if only one or two presets exist, load them
119 $active{$_} = 1 for keys %presets;
120 }
121 if (!%active) {
122 # enable printers whose port is available
123 my %ports = map { $_ => 1 } wxTheApp->scan_serial_ports;
124 $active{$_} = 1
125 for grep exists $ports{$presets{$_}->serial_port}, keys %presets;
126 }
127 if (!%active && $self->_selected_printer_preset) {
128 # enable currently selected printer if it is configured
129 $active{$self->_selected_printer_preset} = 1
130 if $presets{$self->_selected_printer_preset};
131 }
132 }
133
134 # apply changes
135 for my $panel ($self->print_panels) {
136 next if $active{$panel->printer_name};
137
138 $self->{sizer}->DetachWindow($panel);
139 $panel->Destroy;
140 }
141 $self->add_printer($_, $presets{$_}) for sort keys %active;
142
143 # show/hide the warning about no printers
144 $self->{text_no_printers}->Show(!%presets);
145
146 # show/hide the Add button
147 $self->{btn_add}->Show(keys %presets != keys %active);
148
149 $self->Layout;
150
151 # we need this in order to trigger the OnSize event of wxScrolledWindow which
152 # recalculates the virtual size
153 Wx::GetTopLevelParent($self)->SendSizeEvent;
154 }
155
156 sub add_printer {
157 my ($self, $printer_name, $config) = @_;
158
159 # check that printer doesn't exist already
160 foreach my $panel ($self->print_panels) {
161 if ($panel->printer_name eq $printer_name) {
162 return $panel;
163 }
164 }
165
166 my $printer_panel = Slic3r::GUI::Controller::PrinterPanel->new($self, $printer_name, $config);
167 $self->{sizer}->Prepend($printer_panel, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 10);
168 $self->Layout;
169
170 return $printer_panel;
171 }
172
173 sub print_panels {
174 my ($self) = @_;
175 return grep $_->isa('Slic3r::GUI::Controller::PrinterPanel'),
176 map $_->GetWindow, $self->{sizer}->GetChildren;
177 }
178
179 # Called by
180 # Slic3r::GUI::Tab::Print::_on_presets_changed
181 # Slic3r::GUI::Tab::Filament::_on_presets_changed
182 # Slic3r::GUI::Tab::Printer::_on_presets_changed
183 # when the presets are loaded or the user select another preset.
184 sub update_presets {
185 my $self = shift;
186 my ($group, $presets, $default_suppressed, $selected, $is_dirty) = @_;
187
188 # update configs of currently loaded print panels
189 foreach my $panel ($self->print_panels) {
190 foreach my $preset (@$presets) {
191 if ($panel->printer_name eq $preset->name) {
192 my $config = $preset->config(\@ConfigOptions);
193 $panel->config->apply($config);
194 }
195 }
196 }
197
198 $self->_selected_printer_preset($presets->[$selected]->name);
199 }
200
201 1;
0 # The main frame, the parent of all.
1
2 package Slic3r::GUI::MainFrame;
3 use strict;
4 use warnings;
5 use utf8;
6
7 use File::Basename qw(basename dirname);
8 use List::Util qw(min);
9 use Slic3r::Geometry qw(X Y Z);
10 use Wx qw(:frame :bitmap :id :misc :notebook :panel :sizer :menu :dialog :filedialog
11 :font :icon wxTheApp);
12 use Wx::Event qw(EVT_CLOSE EVT_MENU EVT_NOTEBOOK_PAGE_CHANGED);
13 use base 'Wx::Frame';
14
15 our $qs_last_input_file;
16 our $qs_last_output_file;
17 our $last_config;
18
19 sub new {
20 my ($class, %params) = @_;
21
22 my $self = $class->SUPER::new(undef, -1, $Slic3r::FORK_NAME . ' - ' . $Slic3r::VERSION, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE);
23 if ($^O eq 'MSWin32') {
24 $self->SetIcon(Wx::Icon->new($Slic3r::var->("Slic3r.ico"), wxBITMAP_TYPE_ICO));
25 } else {
26 $self->SetIcon(Wx::Icon->new($Slic3r::var->("Slic3r_128px.png"), wxBITMAP_TYPE_PNG));
27 }
28
29 # store input params
30 $self->{mode} = $params{mode};
31 $self->{mode} = 'expert' if $self->{mode} !~ /^(?:simple|expert)$/;
32 # If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden.
33 $self->{no_controller} = $params{no_controller};
34 $self->{no_plater} = $params{no_plater};
35 $self->{loaded} = 0;
36
37 # initialize tabpanel and menubar
38 $self->_init_tabpanel;
39 $self->_init_menubar;
40
41 # initialize status bar
42 $self->{statusbar} = Slic3r::GUI::ProgressStatusBar->new($self, -1);
43 $self->{statusbar}->SetStatusText("Version $Slic3r::VERSION - Remember to check for updates at http://github.com/prusa3d/slic3r/releases");
44 $self->SetStatusBar($self->{statusbar});
45
46 $self->{loaded} = 1;
47
48 # initialize layout
49 {
50 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
51 $sizer->Add($self->{tabpanel}, 1, wxEXPAND);
52 $sizer->SetSizeHints($self);
53 $self->SetSizer($sizer);
54 $self->Fit;
55 $self->SetMinSize([760, 490]);
56 if (defined $Slic3r::GUI::Settings->{_}{main_frame_size}) {
57 my $size = [ split ',', $Slic3r::GUI::Settings->{_}{main_frame_size}, 2 ];
58 $self->SetSize($size);
59
60 my $display = Wx::Display->new->GetClientArea();
61 my $pos = [ split ',', $Slic3r::GUI::Settings->{_}{main_frame_pos}, 2 ];
62 if (($pos->[X] + $size->[X]/2) < $display->GetRight && ($pos->[Y] + $size->[Y]/2) < $display->GetBottom) {
63 $self->Move($pos);
64 }
65 $self->Maximize(1) if $Slic3r::GUI::Settings->{_}{main_frame_maximized};
66 } else {
67 $self->SetSize($self->GetMinSize);
68 }
69 $self->Show;
70 $self->Layout;
71 }
72
73 # declare events
74 EVT_CLOSE($self, sub {
75 my (undef, $event) = @_;
76
77 if ($event->CanVeto && !$self->check_unsaved_changes) {
78 $event->Veto;
79 return;
80 }
81
82 # save window size
83 $Slic3r::GUI::Settings->{_}{main_frame_pos} = join ',', $self->GetScreenPositionXY;
84 $Slic3r::GUI::Settings->{_}{main_frame_size} = join ',', $self->GetSizeWH;
85 $Slic3r::GUI::Settings->{_}{main_frame_maximized} = $self->IsMaximized;
86 wxTheApp->save_settings;
87
88 # propagate event
89 $event->Skip;
90 });
91
92 $self->update_ui_from_settings;
93
94 return $self;
95 }
96
97 sub _init_tabpanel {
98 my ($self) = @_;
99
100 $self->{tabpanel} = my $panel = Wx::Notebook->new($self, -1, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL);
101 EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{tabpanel}, sub {
102 my $panel = $self->{tabpanel}->GetCurrentPage;
103 $panel->OnActivate if $panel->can('OnActivate');
104 });
105
106 if (!$self->{no_plater}) {
107 $panel->AddPage($self->{plater} = Slic3r::GUI::Plater->new($panel), "Plater");
108 if (!$self->{no_controller}) {
109 $panel->AddPage($self->{controller} = Slic3r::GUI::Controller->new($panel), "Controller");
110 }
111 }
112 $self->{options_tabs} = {};
113
114 my $simple_config;
115 if ($self->{mode} eq 'simple') {
116 $simple_config = Slic3r::Config->load("$Slic3r::GUI::datadir/simple.ini")
117 if -e Slic3r::encode_path("$Slic3r::GUI::datadir/simple.ini");
118 }
119
120 my $class_prefix = $self->{mode} eq 'simple' ? "Slic3r::GUI::SimpleTab::" : "Slic3r::GUI::Tab::";
121 for my $tab_name (qw(print filament printer)) {
122 my $tab;
123 $tab = $self->{options_tabs}{$tab_name} = ($class_prefix . ucfirst $tab_name)->new(
124 $panel,
125 no_controller => $self->{no_controller});
126 $tab->on_value_change(sub {
127 my ($opt_key, $value) = @_;
128
129 my $config = $tab->config;
130 if ($self->{plater}) {
131 $self->{plater}->on_config_change($config); # propagate config change events to the plater
132 $self->{plater}->on_extruders_change($value) if $opt_key eq 'extruders_count';
133 }
134 if ($self->{loaded}) { # don't save while loading for the first time
135 if ($self->{mode} eq 'simple') {
136 # save config
137 $self->config->save("$Slic3r::GUI::datadir/simple.ini");
138
139 # save a copy into each preset section
140 # so that user gets the config when switching to expert mode
141 $config->save(sprintf "$Slic3r::GUI::datadir/%s/%s.ini", $tab->name, 'Simple Mode');
142 $Slic3r::GUI::Settings->{presets}{$tab->name} = 'Simple Mode.ini';
143 wxTheApp->save_settings;
144 }
145 $self->config->save($Slic3r::GUI::autosave) if $Slic3r::GUI::autosave;
146 }
147 });
148 # Install a callback for the tab to update the platter and print controller presets, when
149 # a preset changes at Slic3r::GUI::Tab.
150 $tab->on_presets_changed(sub {
151 if ($self->{plater}) {
152 $self->{plater}->update_presets($tab_name, @_);
153 $self->{plater}->on_config_change($tab->config);
154 if ($self->{controller}) {
155 $self->{controller}->update_presets($tab_name, @_);
156 }
157 }
158 });
159 $tab->load_presets;
160 $panel->AddPage($tab, $tab->title);
161 $tab->load_config($simple_config) if $simple_config;
162 }
163
164 if ($self->{plater}) {
165 $self->{plater}->on_select_preset(sub {
166 my ($group, $i) = @_;
167 $self->{options_tabs}{$group}->select_preset($i);
168 });
169
170 # load initial config
171 $self->{plater}->on_config_change($self->config);
172 }
173 }
174
175 sub _init_menubar {
176 my ($self) = @_;
177
178 # File menu
179 my $fileMenu = Wx::Menu->new;
180 {
181 $self->_append_menu_item($fileMenu, "&Load Config…\tCtrl+L", 'Load exported configuration file', sub {
182 $self->load_config_file;
183 }, undef, 'plugin_add.png');
184 $self->_append_menu_item($fileMenu, "&Export Config…\tCtrl+E", 'Export current configuration to file', sub {
185 $self->export_config;
186 }, undef, 'plugin_go.png');
187 $self->_append_menu_item($fileMenu, "&Load Config Bundle…", 'Load presets from a bundle', sub {
188 $self->load_configbundle;
189 }, undef, 'lorry_add.png');
190 $self->_append_menu_item($fileMenu, "&Export Config Bundle…", 'Export all presets to file', sub {
191 $self->export_configbundle;
192 }, undef, 'lorry_go.png');
193 $fileMenu->AppendSeparator();
194 my $repeat;
195 $self->_append_menu_item($fileMenu, "Q&uick Slice…\tCtrl+U", 'Slice file', sub {
196 wxTheApp->CallAfter(sub {
197 $self->quick_slice;
198 $repeat->Enable(defined $Slic3r::GUI::MainFrame::last_input_file);
199 });
200 }, undef, 'cog_go.png');
201 $self->_append_menu_item($fileMenu, "Quick Slice and Save &As…\tCtrl+Alt+U", 'Slice file and save as', sub {
202 wxTheApp->CallAfter(sub {
203 $self->quick_slice(save_as => 1);
204 $repeat->Enable(defined $Slic3r::GUI::MainFrame::last_input_file);
205 });
206 }, undef, 'cog_go.png');
207 $repeat = $self->_append_menu_item($fileMenu, "&Repeat Last Quick Slice\tCtrl+Shift+U", 'Repeat last quick slice', sub {
208 wxTheApp->CallAfter(sub {
209 $self->quick_slice(reslice => 1);
210 });
211 }, undef, 'cog_go.png');
212 $repeat->Enable(0);
213 $fileMenu->AppendSeparator();
214 $self->_append_menu_item($fileMenu, "Slice to SV&G…\tCtrl+G", 'Slice file to SVG', sub {
215 $self->quick_slice(save_as => 1, export_svg => 1);
216 }, undef, 'shape_handles.png');
217 $self->{menu_item_reslice_now} = $self->_append_menu_item(
218 $fileMenu, "(&Re)Slice Now\tCtrl+S", 'Start new slicing process',
219 sub { $self->reslice_now; }, undef, 'shape_handles.png');
220 $fileMenu->AppendSeparator();
221 $self->_append_menu_item($fileMenu, "Repair STL file…", 'Automatically repair an STL file', sub {
222 $self->repair_stl;
223 }, undef, 'wrench.png');
224 $fileMenu->AppendSeparator();
225 # Cmd+, is standard on OS X - what about other operating systems?
226 $self->_append_menu_item($fileMenu, "Preferences…\tCtrl+,", 'Application preferences', sub {
227 Slic3r::GUI::Preferences->new($self)->ShowModal;
228 }, wxID_PREFERENCES);
229 $fileMenu->AppendSeparator();
230 $self->_append_menu_item($fileMenu, "&Quit", 'Quit Slic3r', sub {
231 $self->Close(0);
232 }, wxID_EXIT);
233 }
234
235 # Plater menu
236 unless ($self->{no_plater}) {
237 my $plater = $self->{plater};
238
239 $self->{plater_menu} = Wx::Menu->new;
240 $self->_append_menu_item($self->{plater_menu}, "Export G-code...", 'Export current plate as G-code', sub {
241 $plater->export_gcode;
242 }, undef, 'cog_go.png');
243 $self->_append_menu_item($self->{plater_menu}, "Export plate as STL...", 'Export current plate as STL', sub {
244 $plater->export_stl;
245 }, undef, 'brick_go.png');
246 $self->_append_menu_item($self->{plater_menu}, "Export plate as AMF...", 'Export current plate as AMF', sub {
247 $plater->export_amf;
248 }, undef, 'brick_go.png');
249 $self->_append_menu_item($self->{plater_menu}, "Open DLP Projector…\tCtrl+L", 'Open projector window for DLP printing', sub {
250 my $projector = Slic3r::GUI::Projector->new($self);
251
252 # this double invocation is needed for properly hiding the MainFrame
253 $projector->Show;
254 $projector->ShowModal;
255 }, undef, 'film.png');
256
257 $self->{object_menu} = $self->{plater}->object_menu;
258 $self->on_plater_selection_changed(0);
259 }
260
261 # Window menu
262 my $windowMenu = Wx::Menu->new;
263 {
264 my $tab_offset = 0;
265 if (!$self->{no_plater}) {
266 $self->_append_menu_item($windowMenu, "Select &Plater Tab\tCtrl+1", 'Show the plater', sub {
267 $self->select_tab(0);
268 }, undef, 'application_view_tile.png');
269 if (!$self->{no_controller}) {
270 $self->_append_menu_item($windowMenu, "Select &Controller Tab\tCtrl+T", 'Show the printer controller', sub {
271 $self->select_tab(1);
272 }, undef, 'printer_empty.png');
273 }
274 $windowMenu->AppendSeparator();
275 $tab_offset += 2;
276 }
277 $self->_append_menu_item($windowMenu, "Select P&rint Settings Tab\tCtrl+2", 'Show the print settings', sub {
278 $self->select_tab($tab_offset+0);
279 }, undef, 'cog.png');
280 $self->_append_menu_item($windowMenu, "Select &Filament Settings Tab\tCtrl+3", 'Show the filament settings', sub {
281 $self->select_tab($tab_offset+1);
282 }, undef, 'spool.png');
283 $self->_append_menu_item($windowMenu, "Select Print&er Settings Tab\tCtrl+4", 'Show the printer settings', sub {
284 $self->select_tab($tab_offset+2);
285 }, undef, 'printer_empty.png');
286 }
287
288 # View menu
289 if (!$self->{no_plater}) {
290 $self->{viewMenu} = Wx::Menu->new;
291 $self->_append_menu_item($self->{viewMenu}, "Default", 'Default View', sub { $self->select_view('default'); });
292 $self->_append_menu_item($self->{viewMenu}, "Top" , 'Top View' , sub { $self->select_view('top' ); });
293 $self->_append_menu_item($self->{viewMenu}, "Bottom" , 'Bottom View' , sub { $self->select_view('bottom' ); });
294 $self->_append_menu_item($self->{viewMenu}, "Front" , 'Front View' , sub { $self->select_view('front' ); });
295 $self->_append_menu_item($self->{viewMenu}, "Rear" , 'Rear View' , sub { $self->select_view('rear' ); });
296 $self->_append_menu_item($self->{viewMenu}, "Left" , 'Left View' , sub { $self->select_view('left' ); });
297 $self->_append_menu_item($self->{viewMenu}, "Right" , 'Right View' , sub { $self->select_view('right' ); });
298 }
299
300 # Help menu
301 my $helpMenu = Wx::Menu->new;
302 {
303 $self->_append_menu_item($helpMenu, "&Configuration $Slic3r::GUI::ConfigWizard::wizard…", "Run Configuration $Slic3r::GUI::ConfigWizard::wizard", sub {
304 $self->config_wizard;
305 });
306 $helpMenu->AppendSeparator();
307 $self->_append_menu_item($helpMenu, "Prusa 3D Drivers", 'Open the Prusa3D drivers download page in your browser', sub {
308 Wx::LaunchDefaultBrowser('http://www.prusa3d.com/drivers/');
309 });
310 $self->_append_menu_item($helpMenu, "Prusa Edition Releases", 'Open the Prusa Edition releases page in your browser', sub {
311 Wx::LaunchDefaultBrowser('http://github.com/prusa3d/slic3r/releases');
312 });
313 # my $versioncheck = $self->_append_menu_item($helpMenu, "Check for &Updates...", 'Check for new Slic3r versions', sub {
314 # wxTheApp->check_version(1);
315 # });
316 # $versioncheck->Enable(wxTheApp->have_version_check);
317 $self->_append_menu_item($helpMenu, "Slic3r &Website", 'Open the Slic3r website in your browser', sub {
318 Wx::LaunchDefaultBrowser('http://slic3r.org/');
319 });
320 $self->_append_menu_item($helpMenu, "Slic3r &Manual", 'Open the Slic3r manual in your browser', sub {
321 Wx::LaunchDefaultBrowser('http://manual.slic3r.org/');
322 });
323 $helpMenu->AppendSeparator();
324 $self->_append_menu_item($helpMenu, "&About Slic3r", 'Show about dialog', sub {
325 wxTheApp->about;
326 });
327 }
328
329 # menubar
330 # assign menubar to frame after appending items, otherwise special items
331 # will not be handled correctly
332 {
333 my $menubar = Wx::MenuBar->new;
334 $menubar->Append($fileMenu, "&File");
335 $menubar->Append($self->{plater_menu}, "&Plater") if $self->{plater_menu};
336 $menubar->Append($self->{object_menu}, "&Object") if $self->{object_menu};
337 $menubar->Append($windowMenu, "&Window");
338 $menubar->Append($self->{viewMenu}, "&View") if $self->{viewMenu};
339 $menubar->Append($helpMenu, "&Help");
340 $self->SetMenuBar($menubar);
341 }
342 }
343
344 sub is_loaded {
345 my ($self) = @_;
346 return $self->{loaded};
347 }
348
349 sub on_plater_selection_changed {
350 my ($self, $have_selection) = @_;
351
352 return if !defined $self->{object_menu};
353 $self->{object_menu}->Enable($_->GetId, $have_selection)
354 for $self->{object_menu}->GetMenuItems;
355 }
356
357 sub quick_slice {
358 my $self = shift;
359 my %params = @_;
360
361 my $progress_dialog;
362 eval {
363 # validate configuration
364 my $config = $self->config;
365 $config->validate;
366
367 # select input file
368 my $input_file;
369 my $dir = $Slic3r::GUI::Settings->{recent}{skein_directory} || $Slic3r::GUI::Settings->{recent}{config_directory} || '';
370 if (!$params{reslice}) {
371 my $dialog = Wx::FileDialog->new($self, 'Choose a file to slice (STL/OBJ/AMF):', $dir, "", &Slic3r::GUI::MODEL_WILDCARD, wxFD_OPEN | wxFD_FILE_MUST_EXIST);
372 if ($dialog->ShowModal != wxID_OK) {
373 $dialog->Destroy;
374 return;
375 }
376 $input_file = Slic3r::decode_path($dialog->GetPaths);
377 $dialog->Destroy;
378 $qs_last_input_file = $input_file unless $params{export_svg};
379 } else {
380 if (!defined $qs_last_input_file) {
381 Wx::MessageDialog->new($self, "No previously sliced file.",
382 'Error', wxICON_ERROR | wxOK)->ShowModal();
383 return;
384 }
385 if (! -e $qs_last_input_file) {
386 Wx::MessageDialog->new($self, "Previously sliced file ($qs_last_input_file) not found.",
387 'File Not Found', wxICON_ERROR | wxOK)->ShowModal();
388 return;
389 }
390 $input_file = $qs_last_input_file;
391 }
392 my $input_file_basename = basename($input_file);
393 $Slic3r::GUI::Settings->{recent}{skein_directory} = dirname($input_file);
394 wxTheApp->save_settings;
395
396 my $print_center;
397 {
398 my $bed_shape = Slic3r::Polygon->new_scale(@{$config->bed_shape});
399 $print_center = Slic3r::Pointf->new_unscale(@{$bed_shape->bounding_box->center});
400 }
401
402 my $sprint = Slic3r::Print::Simple->new(
403 print_center => $print_center,
404 status_cb => sub {
405 my ($percent, $message) = @_;
406 return if &Wx::wxVERSION_STRING !~ m" 2\.(8\.|9\.[2-9])";
407 $progress_dialog->Update($percent, "$message…");
408 },
409 );
410
411 # keep model around
412 my $model = Slic3r::Model->read_from_file($input_file);
413
414 $sprint->apply_config($config);
415 $sprint->set_model($model);
416
417 {
418 my $extra = $self->extra_variables;
419 $sprint->placeholder_parser->set($_, $extra->{$_}) for keys %$extra;
420 }
421
422 # select output file
423 my $output_file;
424 if ($params{reslice}) {
425 $output_file = $qs_last_output_file if defined $qs_last_output_file;
426 } elsif ($params{save_as}) {
427 $output_file = $sprint->expanded_output_filepath;
428 $output_file =~ s/\.gcode$/.svg/i if $params{export_svg};
429 my $dlg = Wx::FileDialog->new($self, 'Save ' . ($params{export_svg} ? 'SVG' : 'G-code') . ' file as:',
430 wxTheApp->output_path(dirname($output_file)),
431 basename($output_file), $params{export_svg} ? &Slic3r::GUI::FILE_WILDCARDS->{svg} : &Slic3r::GUI::FILE_WILDCARDS->{gcode}, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
432 if ($dlg->ShowModal != wxID_OK) {
433 $dlg->Destroy;
434 return;
435 }
436 $output_file = Slic3r::decode_path($dlg->GetPath);
437 $qs_last_output_file = $output_file unless $params{export_svg};
438 $Slic3r::GUI::Settings->{_}{last_output_path} = dirname($output_file);
439 wxTheApp->save_settings;
440 $dlg->Destroy;
441 }
442
443 # show processbar dialog
444 $progress_dialog = Wx::ProgressDialog->new('Slicing…', "Processing $input_file_basename…",
445 100, $self, 0);
446 $progress_dialog->Pulse;
447
448 {
449 my @warnings = ();
450 local $SIG{__WARN__} = sub { push @warnings, $_[0] };
451
452 $sprint->output_file($output_file);
453 if ($params{export_svg}) {
454 $sprint->export_svg;
455 } else {
456 $sprint->export_gcode;
457 }
458 $sprint->status_cb(undef);
459 Slic3r::GUI::warning_catcher($self)->($_) for @warnings;
460 }
461 $progress_dialog->Destroy;
462 undef $progress_dialog;
463
464 my $message = "$input_file_basename was successfully sliced.";
465 wxTheApp->notify($message);
466 Wx::MessageDialog->new($self, $message, 'Slicing Done!',
467 wxOK | wxICON_INFORMATION)->ShowModal;
468 };
469 Slic3r::GUI::catch_error($self, sub { $progress_dialog->Destroy if $progress_dialog });
470 }
471
472 sub reslice_now {
473 my ($self) = @_;
474 if ($self->{plater}) {
475 $self->{plater}->reslice;
476 }
477 }
478
479 sub repair_stl {
480 my $self = shift;
481
482 my $input_file;
483 {
484 my $dir = $Slic3r::GUI::Settings->{recent}{skein_directory} || $Slic3r::GUI::Settings->{recent}{config_directory} || '';
485 my $dialog = Wx::FileDialog->new($self, 'Select the STL file to repair:', $dir, "", &Slic3r::GUI::FILE_WILDCARDS->{stl}, wxFD_OPEN | wxFD_FILE_MUST_EXIST);
486 if ($dialog->ShowModal != wxID_OK) {
487 $dialog->Destroy;
488 return;
489 }
490 $input_file = Slic3r::decode_path($dialog->GetPaths);
491 $dialog->Destroy;
492 }
493
494 my $output_file = $input_file;
495 {
496 $output_file =~ s/\.stl$/_fixed.obj/i;
497 my $dlg = Wx::FileDialog->new($self, "Save OBJ file (less prone to coordinate errors than STL) as:", dirname($output_file),
498 basename($output_file), &Slic3r::GUI::FILE_WILDCARDS->{obj}, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
499 if ($dlg->ShowModal != wxID_OK) {
500 $dlg->Destroy;
501 return undef;
502 }
503 $output_file = Slic3r::decode_path($dlg->GetPath);
504 $dlg->Destroy;
505 }
506
507 my $tmesh = Slic3r::TriangleMesh->new;
508 $tmesh->ReadSTLFile(Slic3r::encode_path($input_file));
509 $tmesh->repair;
510 $tmesh->WriteOBJFile(Slic3r::encode_path($output_file));
511 Slic3r::GUI::show_info($self, "Your file was repaired.", "Repair");
512 }
513
514 sub extra_variables {
515 my $self = shift;
516
517 my %extra_variables = ();
518 if ($self->{mode} eq 'expert') {
519 $extra_variables{"${_}_preset"} = $self->{options_tabs}{$_}->get_current_preset->name
520 for qw(print filament printer);
521 }
522 return { %extra_variables };
523 }
524
525 sub export_config {
526 my $self = shift;
527
528 my $config = $self->config;
529 eval {
530 # validate configuration
531 $config->validate;
532 };
533 Slic3r::GUI::catch_error($self) and return;
534
535 my $dir = $last_config ? dirname($last_config) : $Slic3r::GUI::Settings->{recent}{config_directory} || $Slic3r::GUI::Settings->{recent}{skein_directory} || '';
536 my $filename = $last_config ? basename($last_config) : "config.ini";
537 my $dlg = Wx::FileDialog->new($self, 'Save configuration as:', $dir, $filename,
538 &Slic3r::GUI::FILE_WILDCARDS->{ini}, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
539 if ($dlg->ShowModal == wxID_OK) {
540 my $file = Slic3r::decode_path($dlg->GetPath);
541 $Slic3r::GUI::Settings->{recent}{config_directory} = dirname($file);
542 wxTheApp->save_settings;
543 $last_config = $file;
544 $config->save($file);
545 }
546 $dlg->Destroy;
547 }
548
549 sub load_config_file {
550 my $self = shift;
551 my ($file) = @_;
552
553 if (!$file) {
554 return unless $self->check_unsaved_changes;
555 my $dir = $last_config ? dirname($last_config) : $Slic3r::GUI::Settings->{recent}{config_directory} || $Slic3r::GUI::Settings->{recent}{skein_directory} || '';
556 my $dlg = Wx::FileDialog->new($self, 'Select configuration to load:', $dir, "config.ini",
557 &Slic3r::GUI::FILE_WILDCARDS->{ini}, wxFD_OPEN | wxFD_FILE_MUST_EXIST);
558 return unless $dlg->ShowModal == wxID_OK;
559 $file = Slic3r::decode_path($dlg->GetPaths);
560 $dlg->Destroy;
561 }
562 $Slic3r::GUI::Settings->{recent}{config_directory} = dirname($file);
563 wxTheApp->save_settings;
564 $last_config = $file;
565 for my $tab (values %{$self->{options_tabs}}) {
566 $tab->load_config_file($file);
567 }
568 }
569
570 sub export_configbundle {
571 my $self = shift;
572
573 eval {
574 # validate current configuration in case it's dirty
575 $self->config->validate;
576 };
577 Slic3r::GUI::catch_error($self) and return;
578
579 my $dir = $last_config ? dirname($last_config) : $Slic3r::GUI::Settings->{recent}{config_directory} || $Slic3r::GUI::Settings->{recent}{skein_directory} || '';
580 my $filename = "Slic3r_config_bundle.ini";
581 my $dlg = Wx::FileDialog->new($self, 'Save presets bundle as:', $dir, $filename,
582 &Slic3r::GUI::FILE_WILDCARDS->{ini}, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
583 if ($dlg->ShowModal == wxID_OK) {
584 my $file = Slic3r::decode_path($dlg->GetPath);
585 $Slic3r::GUI::Settings->{recent}{config_directory} = dirname($file);
586 wxTheApp->save_settings;
587
588 # leave default category empty to prevent the bundle from being parsed as a normal config file
589 my $ini = { _ => {} };
590 $ini->{settings}{$_} = $Slic3r::GUI::Settings->{_}{$_} for qw(autocenter mode);
591 $ini->{presets} = $Slic3r::GUI::Settings->{presets};
592 if (-e "$Slic3r::GUI::datadir/simple.ini") {
593 my $config = Slic3r::Config->load("$Slic3r::GUI::datadir/simple.ini");
594 $ini->{simple} = $config->as_ini->{_};
595 }
596
597 foreach my $section (qw(print filament printer)) {
598 my %presets = wxTheApp->presets($section);
599 foreach my $preset_name (keys %presets) {
600 my $config = Slic3r::Config->load($presets{$preset_name});
601 $ini->{"$section:$preset_name"} = $config->as_ini->{_};
602 }
603 }
604
605 Slic3r::Config->write_ini($file, $ini);
606 }
607 $dlg->Destroy;
608 }
609
610 sub load_configbundle {
611 my ($self, $file, $skip_no_id) = @_;
612
613 if (!$file) {
614 my $dir = $last_config ? dirname($last_config) : $Slic3r::GUI::Settings->{recent}{config_directory} || $Slic3r::GUI::Settings->{recent}{skein_directory} || '';
615 my $dlg = Wx::FileDialog->new($self, 'Select configuration to load:', $dir, "config.ini",
616 &Slic3r::GUI::FILE_WILDCARDS->{ini}, wxFD_OPEN | wxFD_FILE_MUST_EXIST);
617 return unless $dlg->ShowModal == wxID_OK;
618 $file = Slic3r::decode_path($dlg->GetPaths);
619 $dlg->Destroy;
620 }
621
622 $Slic3r::GUI::Settings->{recent}{config_directory} = dirname($file);
623 wxTheApp->save_settings;
624
625 # load .ini file
626 my $ini = Slic3r::Config->read_ini($file);
627
628 if ($ini->{settings}) {
629 $Slic3r::GUI::Settings->{_}{$_} = $ini->{settings}{$_} for keys %{$ini->{settings}};
630 wxTheApp->save_settings;
631 }
632 if ($ini->{presets}) {
633 $Slic3r::GUI::Settings->{presets} = $ini->{presets};
634 wxTheApp->save_settings;
635 }
636 if ($ini->{simple}) {
637 my $config = Slic3r::Config->load_ini_hash($ini->{simple});
638 $config->save("$Slic3r::GUI::datadir/simple.ini");
639 if ($self->{mode} eq 'simple') {
640 foreach my $tab (values %{$self->{options_tabs}}) {
641 $tab->load_config($config) for values %{$self->{options_tabs}};
642 }
643 }
644 }
645 my $imported = 0;
646 INI_BLOCK: foreach my $ini_category (sort keys %$ini) {
647 next unless $ini_category =~ /^(print|filament|printer):(.+)$/;
648 my ($section, $preset_name) = ($1, $2);
649 my $config = Slic3r::Config->load_ini_hash($ini->{$ini_category});
650 next if $skip_no_id && !$config->get($section . "_settings_id");
651
652 {
653 my %current_presets = Slic3r::GUI->presets($section);
654 my %current_ids = map { $_ => 1 }
655 grep $_,
656 map Slic3r::Config->load($_)->get($section . "_settings_id"),
657 values %current_presets;
658 next INI_BLOCK if exists $current_ids{$config->get($section . "_settings_id")};
659 }
660
661 $config->save(sprintf "$Slic3r::GUI::datadir/%s/%s.ini", $section, $preset_name);
662 Slic3r::debugf "Imported %s preset %s\n", $section, $preset_name;
663 $imported++;
664 }
665 if ($self->{mode} eq 'expert') {
666 foreach my $tab (values %{$self->{options_tabs}}) {
667 $tab->load_presets;
668 }
669 }
670
671 return if !$imported;
672
673 my $message = sprintf "%d presets successfully imported.", $imported;
674 if ($self->{mode} eq 'simple' && $Slic3r::GUI::Settings->{_}{mode} eq 'expert') {
675 Slic3r::GUI::show_info($self, "$message You need to restart Slic3r to make the changes effective.");
676 } else {
677 Slic3r::GUI::show_info($self, $message);
678 }
679 }
680
681 sub load_config {
682 my $self = shift;
683 my ($config) = @_;
684
685 foreach my $tab (values %{$self->{options_tabs}}) {
686 $tab->load_config($config);
687 }
688 if ($self->{plater}) {
689 $self->{plater}->on_config_change($config);
690 }
691 }
692
693 sub config_wizard {
694 my $self = shift;
695
696 return unless $self->check_unsaved_changes;
697 if (my $config = Slic3r::GUI::ConfigWizard->new($self)->run) {
698 if ($self->{mode} eq 'expert') {
699 for my $tab (values %{$self->{options_tabs}}) {
700 $tab->select_default_preset;
701 }
702 } else {
703 # TODO: select default settings in simple mode
704 }
705 $self->load_config($config);
706 if ($self->{mode} eq 'expert') {
707 for my $tab (values %{$self->{options_tabs}}) {
708 $tab->save_preset('My Settings');
709 }
710 }
711 }
712 }
713
714 =head2 config
715
716 This method collects all config values from the tabs and merges them into a single config object.
717
718 =cut
719
720 sub config {
721 my $self = shift;
722
723 return Slic3r::Config->new_from_defaults
724 if !exists $self->{options_tabs}{print}
725 || !exists $self->{options_tabs}{filament}
726 || !exists $self->{options_tabs}{printer};
727
728 # retrieve filament presets and build a single config object for them
729 my $filament_config;
730 if (!$self->{plater} || $self->{plater}->filament_presets == 1 || $self->{mode} eq 'simple') {
731 $filament_config = $self->{options_tabs}{filament}->config;
732 } else {
733 my $i = -1;
734 foreach my $preset_idx ($self->{plater}->filament_presets) {
735 $i++;
736 my $config;
737 if ($preset_idx == $self->{options_tabs}{filament}->current_preset) {
738 # the selected preset for this extruder is the one in the tab
739 # use the tab's config instead of the preset in case it is dirty
740 # perhaps plater shouldn't expose dirty presets at all in multi-extruder environments.
741 $config = $self->{options_tabs}{filament}->config;
742 } else {
743 my $preset = $self->{options_tabs}{filament}->get_preset($preset_idx);
744 $config = $self->{options_tabs}{filament}->get_preset_config($preset);
745 }
746 if (!$filament_config) {
747 $filament_config = $config->clone;
748 next;
749 }
750 foreach my $opt_key (@{$config->get_keys}) {
751 my $value = $filament_config->get($opt_key);
752 next unless ref $value eq 'ARRAY';
753 $value->[$i] = $config->get($opt_key)->[0];
754 $filament_config->set($opt_key, $value);
755 }
756 }
757 }
758
759 my $config = Slic3r::Config->merge(
760 Slic3r::Config->new_from_defaults,
761 $self->{options_tabs}{print}->config,
762 $self->{options_tabs}{printer}->config,
763 $filament_config,
764 );
765
766 if ($self->{mode} eq 'simple') {
767 # set some sensible defaults
768 $config->set('first_layer_height', $config->nozzle_diameter->[0]);
769 $config->set('avoid_crossing_perimeters', 1);
770 $config->set('infill_every_layers', 10);
771 } else {
772 my $extruders_count = $self->{options_tabs}{printer}{extruders_count};
773 $config->set("${_}_extruder", min($config->get("${_}_extruder"), $extruders_count))
774 for qw(perimeter infill solid_infill support_material support_material_interface);
775 }
776
777 return $config;
778 }
779
780 sub filament_preset_names {
781 my ($self) = @_;
782
783 if ($self->{mode} eq 'simple') {
784 return '';
785 }
786
787 return map $self->{options_tabs}{filament}->get_preset($_)->name,
788 $self->{plater}->filament_presets;
789 }
790
791 sub check_unsaved_changes {
792 my $self = shift;
793
794 my @dirty = ();
795 foreach my $tab (values %{$self->{options_tabs}}) {
796 push @dirty, $tab->title if $tab->is_dirty;
797 }
798
799 if (@dirty) {
800 my $titles = join ', ', @dirty;
801 my $confirm = Wx::MessageDialog->new($self, "You have unsaved changes ($titles). Discard changes and continue anyway?",
802 'Unsaved Presets', wxICON_QUESTION | wxYES_NO | wxNO_DEFAULT);
803 return ($confirm->ShowModal == wxID_YES);
804 }
805
806 return 1;
807 }
808
809 sub select_tab {
810 my ($self, $tab) = @_;
811 $self->{tabpanel}->SetSelection($tab);
812 }
813
814 # Set a camera direction, zoom to all objects.
815 sub select_view {
816 my ($self, $direction) = @_;
817 if (! $self->{no_plater}) {
818 $self->{plater}->select_view($direction);
819 }
820 }
821
822 sub _append_menu_item {
823 my ($self, $menu, $string, $description, $cb, $id, $icon) = @_;
824
825 $id //= &Wx::NewId();
826 my $item = $menu->Append($id, $string, $description);
827 $self->_set_menu_item_icon($item, $icon);
828
829 EVT_MENU($self, $id, $cb);
830 return $item;
831 }
832
833 sub _set_menu_item_icon {
834 my ($self, $menuItem, $icon) = @_;
835
836 # SetBitmap was not available on OS X before Wx 0.9927
837 if ($icon && $menuItem->can('SetBitmap')) {
838 $menuItem->SetBitmap(Wx::Bitmap->new($Slic3r::var->($icon), wxBITMAP_TYPE_PNG));
839 }
840 }
841
842 # Called after the Preferences dialog is closed and the program settings are saved.
843 # Update the UI based on the current preferences.
844 sub update_ui_from_settings {
845 my ($self) = @_;
846 $self->{menu_item_reslice_now}->Enable(! $Slic3r::GUI::Settings->{_}{background_processing});
847 $self->{plater}->update_ui_from_settings if ($self->{plater});
848 }
849
850 1;
0 # Notify about the end of slicing.
1 # The notifications are sent out using the Growl protocol if installed, and using DBus XWindow protocol.
2
3 package Slic3r::GUI::Notifier;
4 use Moo;
5
6 has 'growler' => (is => 'rw');
7
8 my $icon = $Slic3r::var->("Slic3r.png");
9
10 sub BUILD {
11 my ($self) = @_;
12
13 if (eval 'use Growl::GNTP; 1') {
14 # register with growl
15 eval {
16 $self->growler(Growl::GNTP->new(AppName => 'Slic3r', AppIcon => $icon));
17 $self->growler->register([{Name => 'SKEIN_DONE', DisplayName => 'Slicing Done'}]);
18 };
19 # if register() fails (for example because of a timeout), disable growler at all
20 $self->growler(undef) if $@;
21 }
22 }
23
24 sub notify {
25 my ($self, $message) = @_;
26 my $title = 'Slicing Done!';
27
28 eval {
29 $self->growler->notify(Event => 'SKEIN_DONE', Title => $title, Message => $message)
30 if $self->growler;
31 };
32 # Net::DBus is broken in multithreaded environment
33 if (0 && eval 'use Net::DBus; 1') {
34 eval {
35 my $session = Net::DBus->session;
36 my $serv = $session->get_service('org.freedesktop.Notifications');
37 my $notifier = $serv->get_object('/org/freedesktop/Notifications',
38 'org.freedesktop.Notifications');
39 $notifier->Notify('Slic3r', 0, $icon, $title, $message, [], {}, -1);
40 undef $Net::DBus::bus_session;
41 };
42 }
43 }
44
45 1;
0 package Slic3r::GUI::OptionsGroup::Field;
1 use Moo;
2
3 # This is a base class for option fields.
4
5 has 'parent' => (is => 'ro', required => 1);
6 has 'option' => (is => 'ro', required => 1); # Slic3r::GUI::OptionsGroup::Option
7 has 'on_change' => (is => 'rw', default => sub { sub {} });
8 has 'on_kill_focus' => (is => 'rw', default => sub { sub {} });
9 has 'disable_change_event' => (is => 'rw', default => sub { 0 });
10
11 # This method should not fire the on_change event
12 sub set_value {
13 my ($self, $value) = @_;
14 die "Method not implemented";
15 }
16
17 sub get_value {
18 my ($self) = @_;
19 die "Method not implemented";
20 }
21
22 sub set_tooltip {
23 my ($self, $tooltip) = @_;
24
25 $self->SetToolTipString($tooltip)
26 if $tooltip && $self->can('SetToolTipString');
27 }
28
29 sub toggle {
30 my ($self, $enable) = @_;
31 $enable ? $self->enable : $self->disable;
32 }
33
34 sub _on_change {
35 my ($self, $opt_id) = @_;
36
37 $self->on_change->($opt_id, $self->get_value)
38 unless $self->disable_change_event;
39 }
40
41 sub _on_kill_focus {
42 my ($self, $opt_id, $s, $event) = @_;
43
44 # Without this, there will be nasty focus bugs on Windows.
45 # Also, docs for wxEvent::Skip() say "In general, it is recommended to skip all
46 # non-command events to allow the default handling to take place."
47 $event->Skip(1);
48
49 $self->on_kill_focus->($opt_id);
50 }
51
52
53 package Slic3r::GUI::OptionsGroup::Field::wxWindow;
54 use Moo;
55 extends 'Slic3r::GUI::OptionsGroup::Field';
56
57 has 'wxWindow' => (is => 'rw', trigger => 1); # wxWindow object
58
59 sub _default_size {
60 my ($self) = @_;
61
62 # default width on Windows is too large
63 return Wx::Size->new($self->option->width || 60, $self->option->height || -1);
64 }
65
66 sub _trigger_wxWindow {
67 my ($self) = @_;
68
69 $self->wxWindow->SetToolTipString($self->option->tooltip)
70 if $self->option->tooltip && $self->wxWindow->can('SetToolTipString');
71 }
72
73 sub set_value {
74 my ($self, $value) = @_;
75
76 $self->disable_change_event(1);
77 $self->wxWindow->SetValue($value);
78 $self->disable_change_event(0);
79 }
80
81 sub get_value {
82 my ($self) = @_;
83 return $self->wxWindow->GetValue;
84 }
85
86 sub enable {
87 my ($self) = @_;
88
89 $self->wxWindow->Enable;
90 $self->wxWindow->Refresh;
91 }
92
93 sub disable {
94 my ($self) = @_;
95
96 $self->wxWindow->Disable;
97 $self->wxWindow->Refresh;
98 }
99
100
101 package Slic3r::GUI::OptionsGroup::Field::Checkbox;
102 use Moo;
103 extends 'Slic3r::GUI::OptionsGroup::Field::wxWindow';
104
105 use Wx qw(:misc);
106 use Wx::Event qw(EVT_CHECKBOX);
107
108 sub BUILD {
109 my ($self) = @_;
110
111 my $field = Wx::CheckBox->new($self->parent, -1, "");
112 $self->wxWindow($field);
113 $field->SetValue($self->option->default);
114 $field->Disable if $self->option->readonly;
115
116 EVT_CHECKBOX($self->parent, $field, sub {
117 $self->_on_change($self->option->opt_id);
118 });
119 }
120
121
122 package Slic3r::GUI::OptionsGroup::Field::SpinCtrl;
123 use Moo;
124 extends 'Slic3r::GUI::OptionsGroup::Field::wxWindow';
125
126 use Wx qw(:misc);
127 use Wx::Event qw(EVT_SPINCTRL EVT_TEXT EVT_KILL_FOCUS);
128
129 has 'tmp_value' => (is => 'rw');
130
131 sub BUILD {
132 my ($self) = @_;
133
134 my $field = Wx::SpinCtrl->new($self->parent, -1, $self->option->default, wxDefaultPosition, $self->_default_size,
135 0, $self->option->min || 0, $self->option->max || 2147483647, $self->option->default);
136 $self->wxWindow($field);
137
138 EVT_SPINCTRL($self->parent, $field, sub {
139 $self->tmp_value(undef);
140 $self->_on_change($self->option->opt_id);
141 });
142 EVT_TEXT($self->parent, $field, sub {
143 my ($s, $event) = @_;
144
145 # On OSX/Cocoa, wxSpinCtrl::GetValue() doesn't return the new value
146 # when it was changed from the text control, so the on_change callback
147 # gets the old one, and on_kill_focus resets the control to the old value.
148 # As a workaround, we get the new value from $event->GetString and store
149 # here temporarily so that we can return it from $self->get_value
150 $self->tmp_value($event->GetString) if $event->GetString =~ /^\d+$/;
151 $self->_on_change($self->option->opt_id);
152 # We don't reset tmp_value here because _on_change might put callbacks
153 # in the CallAfter queue, and we want the tmp value to be available from
154 # them as well.
155 });
156 EVT_KILL_FOCUS($field, sub {
157 $self->tmp_value(undef);
158 $self->_on_kill_focus($self->option->opt_id, @_);
159 });
160 }
161
162 sub get_value {
163 my ($self) = @_;
164 return $self->tmp_value // $self->wxWindow->GetValue;
165 }
166
167
168 package Slic3r::GUI::OptionsGroup::Field::TextCtrl;
169 use Moo;
170 extends 'Slic3r::GUI::OptionsGroup::Field::wxWindow';
171
172 use Wx qw(:misc :textctrl);
173 use Wx::Event qw(EVT_TEXT EVT_KILL_FOCUS);
174
175 sub BUILD {
176 my ($self) = @_;
177
178 my $style = 0;
179 $style = wxTE_MULTILINE if $self->option->multiline;
180 my $field = Wx::TextCtrl->new($self->parent, -1, $self->option->default, wxDefaultPosition,
181 $self->_default_size, $style);
182 $self->wxWindow($field);
183
184 # TODO: test loading a config that has empty string for multi-value options like 'wipe'
185
186 EVT_TEXT($self->parent, $field, sub {
187 $self->_on_change($self->option->opt_id);
188 });
189 EVT_KILL_FOCUS($field, sub {
190 $self->_on_kill_focus($self->option->opt_id, @_);
191 });
192 }
193
194 sub enable {
195 my ($self) = @_;
196
197 $self->wxWindow->Enable;
198 $self->wxWindow->SetEditable(1);
199 }
200
201 sub disable {
202 my ($self) = @_;
203
204 $self->wxWindow->Disable;
205 $self->wxWindow->SetEditable(0);
206 }
207
208
209 package Slic3r::GUI::OptionsGroup::Field::Choice;
210 use Moo;
211 extends 'Slic3r::GUI::OptionsGroup::Field::wxWindow';
212
213 use List::Util qw(first);
214 use Wx qw(:misc :combobox);
215 use Wx::Event qw(EVT_COMBOBOX EVT_TEXT);
216
217 sub BUILD {
218 my ($self) = @_;
219
220 my $style = 0;
221 $style |= wxCB_READONLY if defined $self->option->gui_type && $self->option->gui_type ne 'select_open';
222 my $field = Wx::ComboBox->new($self->parent, -1, "", wxDefaultPosition, $self->_default_size,
223 $self->option->labels || $self->option->values || [], $style);
224 $self->wxWindow($field);
225
226 $self->set_value($self->option->default);
227
228 EVT_COMBOBOX($self->parent, $field, sub {
229 $self->_on_change($self->option->opt_id);
230 });
231 EVT_TEXT($self->parent, $field, sub {
232 $self->_on_change($self->option->opt_id);
233 });
234 }
235
236 sub set_value {
237 my ($self, $value) = @_;
238
239 $self->disable_change_event(1);
240
241 my $idx;
242 if ($self->option->values) {
243 $idx = first { $self->option->values->[$_] eq $value } 0..$#{$self->option->values};
244 # if value is not among indexes values we use SetValue()
245 }
246
247 if (defined $idx) {
248 $self->wxWindow->SetSelection($idx);
249 } else {
250 $self->wxWindow->SetValue($value);
251 }
252
253 $self->disable_change_event(0);
254 }
255
256 sub set_values {
257 my ($self, $values) = @_;
258
259 $self->disable_change_event(1);
260
261 # it looks that Clear() also clears the text field in recent wxWidgets versions,
262 # but we want to preserve it
263 my $ww = $self->wxWindow;
264 my $value = $ww->GetValue;
265 $ww->Clear;
266 $ww->Append($_) for @$values;
267 $ww->SetValue($value);
268
269 $self->disable_change_event(0);
270 }
271
272 sub get_value {
273 my ($self) = @_;
274
275 if ($self->option->values) {
276 my $idx = $self->wxWindow->GetSelection;
277 if ($idx != &Wx::wxNOT_FOUND) {
278 return $self->option->values->[$idx];
279 }
280 }
281 return $self->wxWindow->GetValue;
282 }
283
284 package Slic3r::GUI::OptionsGroup::Field::NumericChoice;
285 use Moo;
286 extends 'Slic3r::GUI::OptionsGroup::Field::wxWindow';
287
288 use List::Util qw(first);
289 use Wx qw(wxTheApp :misc :combobox);
290 use Wx::Event qw(EVT_COMBOBOX EVT_TEXT);
291
292 # if option has no 'values', indices are values
293 # if option has no 'labels', values are labels
294
295 sub BUILD {
296 my ($self) = @_;
297
298 my $field = Wx::ComboBox->new($self->parent, -1, $self->option->default, wxDefaultPosition, $self->_default_size,
299 $self->option->labels || $self->option->values);
300 $self->wxWindow($field);
301
302 $self->set_value($self->option->default);
303
304 EVT_COMBOBOX($self->parent, $field, sub {
305 my $disable_change_event = $self->disable_change_event;
306 $self->disable_change_event(1);
307
308 my $idx = $field->GetSelection; # get index of selected value
309 my $label;
310
311 if ($self->option->labels && $idx <= $#{$self->option->labels}) {
312 $label = $self->option->labels->[$idx];
313 } elsif ($self->option->values && $idx <= $#{$self->option->values}) {
314 $label = $self->option->values->[$idx];
315 } else {
316 $label = $idx;
317 }
318
319 # The MSW implementation of wxComboBox will leave the field blank if we call
320 # SetValue() in the EVT_COMBOBOX event handler, so we postpone the call.
321 wxTheApp->CallAfter(sub {
322 my $dce = $self->disable_change_event;
323 $self->disable_change_event(1);
324
325 # ChangeValue() is not exported in wxPerl
326 $field->SetValue($label);
327
328 $self->disable_change_event($dce);
329 });
330
331 $self->disable_change_event($disable_change_event);
332 $self->_on_change($self->option->opt_id);
333 });
334 EVT_TEXT($self->parent, $field, sub {
335 $self->_on_change($self->option->opt_id);
336 });
337 }
338
339 sub set_value {
340 my ($self, $value) = @_;
341
342 $self->disable_change_event(1);
343
344 my $field = $self->wxWindow;
345 if ($self->option->gui_flags =~ /\bshow_value\b/) {
346 $field->SetValue($value);
347 } else {
348 if ($self->option->values) {
349 # check whether we have a value index
350 my $value_idx = first { $self->option->values->[$_] eq $value } 0..$#{$self->option->values};
351 if (defined $value_idx) {
352 $field->SetSelection($value_idx);
353 $self->disable_change_event(0);
354 return;
355 }
356 } elsif ($self->option->labels && $value <= $#{$self->option->labels}) {
357 # if we have no values, we expect value to be an index
358 $field->SetValue($self->option->labels->[$value]);
359 $self->disable_change_event(0);
360 return;
361 }
362 $field->SetValue($value);
363 }
364
365 $self->disable_change_event(0);
366 }
367
368 sub get_value {
369 my ($self) = @_;
370
371 my $label = $self->wxWindow->GetValue;
372 if ($self->option->labels) {
373 my $value_idx = first { $self->option->labels->[$_] eq $label } 0..$#{$self->option->labels};
374 if (defined $value_idx) {
375 if ($self->option->values) {
376 return $self->option->values->[$value_idx];
377 }
378 return $value_idx;
379 }
380 }
381 return $label;
382 }
383
384
385 package Slic3r::GUI::OptionsGroup::Field::ColourPicker;
386 use Moo;
387 extends 'Slic3r::GUI::OptionsGroup::Field::wxWindow';
388
389 use Wx qw(:misc :colour);
390 use Wx::Event qw(EVT_COLOURPICKER_CHANGED);
391
392 sub BUILD {
393 my ($self) = @_;
394
395 my $field = Wx::ColourPickerCtrl->new($self->parent, -1,
396 $self->_string_to_colour($self->option->default), wxDefaultPosition,
397 $self->_default_size);
398 $self->wxWindow($field);
399
400 EVT_COLOURPICKER_CHANGED($self->parent, $field, sub {
401 $self->_on_change($self->option->opt_id);
402 });
403 }
404
405 sub set_value {
406 my ($self, $value) = @_;
407
408 $self->disable_change_event(1);
409 $self->wxWindow->SetColour($self->_string_to_colour($value));
410 $self->disable_change_event(0);
411 }
412
413 sub get_value {
414 my ($self) = @_;
415 return $self->wxWindow->GetColour->GetAsString(wxC2S_HTML_SYNTAX);
416 }
417
418 sub _string_to_colour {
419 my ($self, $string) = @_;
420
421 $string =~ s/^#//;
422 return Wx::Colour->new(unpack 'C*', pack 'H*', $string);
423 }
424
425
426 package Slic3r::GUI::OptionsGroup::Field::wxSizer;
427 use Moo;
428 extends 'Slic3r::GUI::OptionsGroup::Field';
429
430 has 'wxSizer' => (is => 'rw'); # wxSizer object
431
432
433 package Slic3r::GUI::OptionsGroup::Field::Point;
434 use Moo;
435 extends 'Slic3r::GUI::OptionsGroup::Field::wxSizer';
436
437 has 'x_textctrl' => (is => 'rw');
438 has 'y_textctrl' => (is => 'rw');
439
440 use Slic3r::Geometry qw(X Y);
441 use Wx qw(:misc :sizer);
442 use Wx::Event qw(EVT_TEXT);
443
444 sub BUILD {
445 my ($self) = @_;
446
447 my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
448 $self->wxSizer($sizer);
449
450 my $field_size = Wx::Size->new(40, -1);
451
452 $self->x_textctrl(Wx::TextCtrl->new($self->parent, -1, $self->option->default->[X], wxDefaultPosition, $field_size));
453 $self->y_textctrl(Wx::TextCtrl->new($self->parent, -1, $self->option->default->[Y], wxDefaultPosition, $field_size));
454
455 my @items = (
456 Wx::StaticText->new($self->parent, -1, "x:"),
457 $self->x_textctrl,
458 Wx::StaticText->new($self->parent, -1, " y:"),
459 $self->y_textctrl,
460 );
461 $sizer->Add($_, 0, wxALIGN_CENTER_VERTICAL, 0) for @items;
462
463 if ($self->option->tooltip) {
464 foreach my $item (@items) {
465 $item->SetToolTipString($self->option->tooltip)
466 if $item->can('SetToolTipString');
467 }
468 }
469
470 EVT_TEXT($self->parent, $_, sub {
471 $self->_on_change($self->option->opt_id);
472 }) for $self->x_textctrl, $self->y_textctrl;
473 }
474
475 sub set_value {
476 my ($self, $value) = @_;
477
478 $self->disable_change_event(1);
479 $self->x_textctrl->SetValue($value->[X]);
480 $self->y_textctrl->SetValue($value->[Y]);
481 $self->disable_change_event(0);
482 }
483
484 sub get_value {
485 my ($self) = @_;
486
487 return [
488 $self->x_textctrl->GetValue,
489 $self->y_textctrl->GetValue,
490 ];
491 }
492
493 sub enable {
494 my ($self) = @_;
495
496 $self->x_textctrl->Enable;
497 $self->y_textctrl->Enable;
498 }
499
500 sub disable {
501 my ($self) = @_;
502
503 $self->x_textctrl->Disable;
504 $self->y_textctrl->Disable;
505 }
506
507
508 package Slic3r::GUI::OptionsGroup::Field::Slider;
509 use Moo;
510 extends 'Slic3r::GUI::OptionsGroup::Field::wxSizer';
511
512 has 'scale' => (is => 'rw', default => sub { 10 });
513 has 'slider' => (is => 'rw');
514 has 'textctrl' => (is => 'rw');
515
516 use Slic3r::Geometry qw(X Y);
517 use Wx qw(:misc :sizer);
518 use Wx::Event qw(EVT_SLIDER EVT_TEXT EVT_KILL_FOCUS);
519
520 sub BUILD {
521 my ($self) = @_;
522
523 my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
524 $self->wxSizer($sizer);
525
526 my $slider = Wx::Slider->new(
527 $self->parent, -1,
528 ($self->option->default // $self->option->min) * $self->scale,
529 ($self->option->min // 0) * $self->scale,
530 ($self->option->max // 100) * $self->scale,
531 wxDefaultPosition,
532 [ $self->option->width // -1, $self->option->height // -1 ],
533 );
534 $self->slider($slider);
535
536 my $textctrl = Wx::TextCtrl->new($self->parent, -1, $slider->GetValue/$self->scale,
537 wxDefaultPosition, [50,-1]);
538 $self->textctrl($textctrl);
539
540 $sizer->Add($slider, 1, wxALIGN_CENTER_VERTICAL, 0);
541 $sizer->Add($textctrl, 0, wxALIGN_CENTER_VERTICAL, 0);
542
543 EVT_SLIDER($self->parent, $slider, sub {
544 $self->_update_textctrl;
545 $self->_on_change($self->option->opt_id);
546 });
547 EVT_TEXT($self->parent, $textctrl, sub {
548 my $value = $textctrl->GetValue;
549 if ($value =~ /^-?\d+(\.\d*)?$/) {
550 $self->set_value($value);
551 $self->_on_change($self->option->opt_id);
552 }
553 });
554 EVT_KILL_FOCUS($textctrl, sub {
555 $self->_on_kill_focus($self->option->opt_id, @_);
556 });
557 }
558
559 sub set_value {
560 my ($self, $value) = @_;
561
562 $self->disable_change_event(1);
563 $self->slider->SetValue($value*$self->scale);
564 $self->_update_textctrl;
565 $self->disable_change_event(0);
566 }
567
568 sub get_value {
569 my ($self) = @_;
570 return $self->slider->GetValue/$self->scale;
571 }
572
573 sub _update_textctrl {
574 my ($self) = @_;
575 $self->textctrl->SetLabel($self->get_value);
576 }
577
578 sub enable {
579 my ($self) = @_;
580
581 $self->slider->Enable;
582 $self->textctrl->Enable;
583 $self->textctrl->SetEditable(1);
584 }
585
586 sub disable {
587 my ($self) = @_;
588
589 $self->slider->Disable;
590 $self->textctrl->Disable;
591 $self->textctrl->SetEditable(0);
592 }
593
594 1;
0 # A dialog group object. Used by the Tab, SimpleTab, Preferences dialog, ManualControlDialog etc.
1
2 package Slic3r::GUI::OptionsGroup;
3 use Moo;
4
5 use List::Util qw(first);
6 use Wx qw(:combobox :font :misc :sizer :systemsettings :textctrl wxTheApp);
7 use Wx::Event qw(EVT_CHECKBOX EVT_COMBOBOX EVT_SPINCTRL EVT_TEXT EVT_KILL_FOCUS EVT_SLIDER);
8
9 has 'parent' => (is => 'ro', required => 1);
10 has 'title' => (is => 'ro', required => 1);
11 has 'on_change' => (is => 'rw', default => sub { sub {} });
12 has 'staticbox' => (is => 'ro', default => sub { 1 });
13 has 'label_width' => (is => 'rw', default => sub { 180 });
14 has 'extra_column' => (is => 'rw', default => sub { undef });
15 has 'label_font' => (is => 'rw');
16 has 'sidetext_font' => (is => 'rw', default => sub { Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) });
17 has 'sizer' => (is => 'rw');
18 has '_disabled' => (is => 'rw', default => sub { 0 });
19 has '_grid_sizer' => (is => 'rw');
20 has '_options' => (is => 'ro', default => sub { {} });
21 has '_fields' => (is => 'ro', default => sub { {} });
22
23 sub BUILD {
24 my $self = shift;
25
26 if ($self->staticbox) {
27 my $box = Wx::StaticBox->new($self->parent, -1, $self->title);
28 $self->sizer(Wx::StaticBoxSizer->new($box, wxVERTICAL));
29 } else {
30 $self->sizer(Wx::BoxSizer->new(wxVERTICAL));
31 }
32
33 my $num_columns = 1;
34 ++$num_columns if $self->label_width != 0;
35 ++$num_columns if $self->extra_column;
36 $self->_grid_sizer(Wx::FlexGridSizer->new(0, $num_columns, 0, 0));
37 $self->_grid_sizer->SetFlexibleDirection(wxHORIZONTAL);
38 $self->_grid_sizer->AddGrowableCol($self->label_width != 0);
39
40 # TODO: border size may be related to wxWidgets 2.8.x vs. 2.9.x instead of wxMAC specific
41 $self->sizer->Add($self->_grid_sizer, 0, wxEXPAND | wxALL, &Wx::wxMAC ? 0 : 5);
42 }
43
44 # this method accepts a Slic3r::GUI::OptionsGroup::Line object
45 sub append_line {
46 my ($self, $line) = @_;
47
48 if ($line->sizer || ($line->widget && $line->full_width)) {
49 # full-width widgets are appended *after* the grid sizer, so after all the non-full-width lines
50 my $sizer = $line->sizer // $line->widget->($self->parent);
51 $self->sizer->Add($sizer, 0, wxEXPAND | wxALL, &Wx::wxMAC ? 0 : 15);
52 return;
53 }
54
55 my $grid_sizer = $self->_grid_sizer;
56
57 # if we have an extra column, build it
58 if ($self->extra_column) {
59 if (defined (my $item = $self->extra_column->($line))) {
60 $grid_sizer->Add($item, 0, wxALIGN_CENTER_VERTICAL, 0);
61 } else {
62 # if the callback provides no sizer for the extra cell, put a spacer
63 $grid_sizer->AddSpacer(1);
64 }
65 }
66
67 # build label if we have it
68 my $label;
69 if ($self->label_width != 0) {
70 $label = Wx::StaticText->new($self->parent, -1, $line->label ? $line->label . ":" : "", wxDefaultPosition, [$self->label_width, -1]);
71 $label->SetFont($self->label_font) if $self->label_font;
72 $label->Wrap($self->label_width) ; # needed to avoid Linux/GTK bug
73 $grid_sizer->Add($label, 0, wxALIGN_CENTER_VERTICAL, 0);
74 $label->SetToolTipString($line->label_tooltip) if $line->label_tooltip;
75 }
76
77 # if we have a widget, add it to the sizer
78 if ($line->widget) {
79 my $widget_sizer = $line->widget->($self->parent);
80 $grid_sizer->Add($widget_sizer, 0, wxEXPAND | wxALL, &Wx::wxMAC ? 0 : 15);
81 return;
82 }
83
84 # if we have a single option with no sidetext just add it directly to the grid sizer
85 my @options = @{$line->get_options};
86 $self->_options->{$_->opt_id} = $_ for @options;
87 if (@options == 1 && !$options[0]->sidetext && !$options[0]->side_widget && !@{$line->get_extra_widgets}) {
88 my $option = $options[0];
89 my $field = $self->_build_field($option);
90 $grid_sizer->Add($field, 0, ($option->full_width ? wxEXPAND : 0) | wxALIGN_CENTER_VERTICAL, 0);
91 return;
92 }
93
94 # if we're here, we have more than one option or a single option with sidetext
95 # so we need a horizontal sizer to arrange these things
96 my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
97 $grid_sizer->Add($sizer, 0, 0, 0);
98
99 foreach my $i (0..$#options) {
100 my $option = $options[$i];
101
102 # add label if any
103 if ($option->label) {
104 my $field_label = Wx::StaticText->new($self->parent, -1, $option->label . ":", wxDefaultPosition, wxDefaultSize);
105 $field_label->SetFont($self->sidetext_font);
106 $sizer->Add($field_label, 0, wxALIGN_CENTER_VERTICAL, 0);
107 }
108
109 # add field
110 my $field = $self->_build_field($option);
111 $sizer->Add($field, 0, wxALIGN_CENTER_VERTICAL, 0);
112
113 # add sidetext if any
114 if ($option->sidetext) {
115 my $sidetext = Wx::StaticText->new($self->parent, -1, $option->sidetext, wxDefaultPosition, wxDefaultSize);
116 $sidetext->SetFont($self->sidetext_font);
117 $sizer->Add($sidetext, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4);
118 }
119
120 # add side widget if any
121 if ($option->side_widget) {
122 $sizer->Add($option->side_widget->($self->parent), 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 1);
123 }
124
125 if ($option != $#options) {
126 $sizer->AddSpacer(4);
127 }
128 }
129
130 # add extra sizers if any
131 foreach my $extra_widget (@{$line->get_extra_widgets}) {
132 $sizer->Add($extra_widget->($self->parent), 0, wxLEFT | wxALIGN_CENTER_VERTICAL , 4);
133 }
134 }
135
136 sub create_single_option_line {
137 my ($self, $option) = @_;
138
139 my $line = Slic3r::GUI::OptionsGroup::Line->new(
140 label => $option->label,
141 label_tooltip => $option->tooltip,
142 );
143 $option->label("");
144 $line->append_option($option);
145
146 return $line;
147 }
148
149 sub append_single_option_line {
150 my ($self, $option) = @_;
151 return $self->append_line($self->create_single_option_line($option));
152 }
153
154 sub _build_field {
155 my $self = shift;
156 my ($opt) = @_;
157
158 my $opt_id = $opt->opt_id;
159 my $on_change = sub {
160 my ($opt_id, $value) = @_;
161 $self->_on_change($opt_id, $value)
162 unless $self->_disabled;
163 };
164 my $on_kill_focus = sub {
165 my ($opt_id) = @_;
166 $self->_on_kill_focus($opt_id);
167 };
168
169 my $type = $opt->{gui_type} || $opt->{type};
170
171 my $field;
172 if ($type eq 'bool') {
173 $field = Slic3r::GUI::OptionsGroup::Field::Checkbox->new(
174 parent => $self->parent,
175 option => $opt,
176 );
177 } elsif ($type eq 'i') {
178 $field = Slic3r::GUI::OptionsGroup::Field::SpinCtrl->new(
179 parent => $self->parent,
180 option => $opt,
181 );
182 } elsif ($type eq 'color') {
183 $field = Slic3r::GUI::OptionsGroup::Field::ColourPicker->new(
184 parent => $self->parent,
185 option => $opt,
186 );
187 } elsif ($type =~ /^(f|s|s@|percent)$/) {
188 $field = Slic3r::GUI::OptionsGroup::Field::TextCtrl->new(
189 parent => $self->parent,
190 option => $opt,
191 );
192 } elsif ($type eq 'select' || $type eq 'select_open') {
193 $field = Slic3r::GUI::OptionsGroup::Field::Choice->new(
194 parent => $self->parent,
195 option => $opt,
196 );
197 } elsif ($type eq 'f_enum_open' || $type eq 'i_enum_open' || $type eq 'i_enum_closed') {
198 $field = Slic3r::GUI::OptionsGroup::Field::NumericChoice->new(
199 parent => $self->parent,
200 option => $opt,
201 );
202 } elsif ($type eq 'point') {
203 $field = Slic3r::GUI::OptionsGroup::Field::Point->new(
204 parent => $self->parent,
205 option => $opt,
206 );
207 } elsif ($type eq 'slider') {
208 $field = Slic3r::GUI::OptionsGroup::Field::Slider->new(
209 parent => $self->parent,
210 option => $opt,
211 );
212 }
213 return undef if !$field;
214
215 $field->on_change($on_change);
216 $field->on_kill_focus($on_kill_focus);
217 $self->_fields->{$opt_id} = $field;
218
219 return $field->isa('Slic3r::GUI::OptionsGroup::Field::wxWindow')
220 ? $field->wxWindow
221 : $field->wxSizer;
222 }
223
224 sub get_option {
225 my ($self, $opt_id) = @_;
226 return undef if !exists $self->_options->{$opt_id};
227 return $self->_options->{$opt_id};
228 }
229
230 sub get_field {
231 my ($self, $opt_id) = @_;
232 return undef if !exists $self->_fields->{$opt_id};
233 return $self->_fields->{$opt_id};
234 }
235
236 sub get_value {
237 my ($self, $opt_id) = @_;
238
239 return if !exists $self->_fields->{$opt_id};
240 return $self->_fields->{$opt_id}->get_value;
241 }
242
243 sub set_value {
244 my ($self, $opt_id, $value) = @_;
245
246 return if !exists $self->_fields->{$opt_id};
247 $self->_fields->{$opt_id}->set_value($value);
248 }
249
250 sub _on_change {
251 my ($self, $opt_id, $value) = @_;
252 $self->on_change->($opt_id, $value);
253 }
254
255 sub enable {
256 my ($self) = @_;
257
258 $_->enable for values %{$self->_fields};
259 }
260
261 sub disable {
262 my ($self) = @_;
263
264 $_->disable for values %{$self->_fields};
265 }
266
267 sub _on_kill_focus {
268 my ($self, $opt_id) = @_;
269 # nothing
270 }
271
272
273 package Slic3r::GUI::OptionsGroup::Line;
274 use Moo;
275
276 has 'label' => (is => 'rw', default => sub { "" });
277 has 'full_width' => (is => 'rw', default => sub { 0 });
278 has 'label_tooltip' => (is => 'rw', default => sub { "" });
279 has 'sizer' => (is => 'rw');
280 has 'widget' => (is => 'rw');
281 has '_options' => (is => 'ro', default => sub { [] });
282 has '_extra_widgets' => (is => 'ro', default => sub { [] });
283
284 # this method accepts a Slic3r::GUI::OptionsGroup::Option object
285 sub append_option {
286 my ($self, $option) = @_;
287 push @{$self->_options}, $option;
288 }
289
290 sub append_widget {
291 my ($self, $widget) = @_;
292 push @{$self->_extra_widgets}, $widget;
293 }
294
295 sub get_options {
296 my ($self) = @_;
297 return [ @{$self->_options} ];
298 }
299
300 sub get_extra_widgets {
301 my ($self) = @_;
302 return [ @{$self->_extra_widgets} ];
303 }
304
305
306 package Slic3r::GUI::OptionsGroup::Option;
307 use Moo;
308
309 has 'opt_id' => (is => 'rw', required => 1);
310 has 'type' => (is => 'rw', required => 1);
311 has 'default' => (is => 'rw', required => 1);
312 has 'gui_type' => (is => 'rw', default => sub { undef });
313 has 'gui_flags' => (is => 'rw', default => sub { "" });
314 has 'label' => (is => 'rw', default => sub { "" });
315 has 'sidetext' => (is => 'rw', default => sub { "" });
316 has 'tooltip' => (is => 'rw', default => sub { "" });
317 has 'multiline' => (is => 'rw', default => sub { 0 });
318 has 'full_width' => (is => 'rw', default => sub { 0 });
319 has 'width' => (is => 'rw', default => sub { undef });
320 has 'height' => (is => 'rw', default => sub { undef });
321 has 'min' => (is => 'rw', default => sub { undef });
322 has 'max' => (is => 'rw', default => sub { undef });
323 has 'labels' => (is => 'rw', default => sub { [] });
324 has 'values' => (is => 'rw', default => sub { [] });
325 has 'readonly' => (is => 'rw', default => sub { 0 });
326 has 'side_widget' => (is => 'rw', default => sub { undef });
327
328
329 package Slic3r::GUI::ConfigOptionsGroup;
330 use Moo;
331
332 use List::Util qw(first);
333
334 extends 'Slic3r::GUI::OptionsGroup';
335 has 'config' => (is => 'ro', required => 1);
336 has 'full_labels' => (is => 'ro', default => sub { 0 });
337 has '_opt_map' => (is => 'ro', default => sub { {} });
338
339 sub get_option {
340 my ($self, $opt_key, $opt_index) = @_;
341
342 $opt_index //= -1;
343
344 if (!$self->config->has($opt_key)) {
345 die "No $opt_key in ConfigOptionsGroup config";
346 }
347
348 my $opt_id = ($opt_index == -1 ? $opt_key : "${opt_key}#${opt_index}");
349 $self->_opt_map->{$opt_id} = [ $opt_key, $opt_index ];
350
351 my $optdef = $Slic3r::Config::Options->{$opt_key}; # we should access this from $self->config
352 my $default_value = $self->_get_config_value($opt_key, $opt_index, $optdef->{gui_flags} =~ /\bserialized\b/);
353
354 return Slic3r::GUI::OptionsGroup::Option->new(
355 opt_id => $opt_id,
356 type => $optdef->{type},
357 default => $default_value,
358 gui_type => $optdef->{gui_type},
359 gui_flags => $optdef->{gui_flags},
360 label => ($self->full_labels && defined $optdef->{full_label}) ? $optdef->{full_label} : $optdef->{label},
361 sidetext => $optdef->{sidetext},
362 # calling serialize() ensures we get a stringified value
363 tooltip => $optdef->{tooltip} . " (default: " . $self->config->serialize($opt_key) . ")",
364 multiline => $optdef->{multiline},
365 width => $optdef->{width},
366 min => $optdef->{min},
367 max => $optdef->{max},
368 labels => $optdef->{labels},
369 values => $optdef->{values},
370 readonly => $optdef->{readonly},
371 );
372 }
373
374 sub create_single_option_line {
375 my ($self, $opt_key, $opt_index) = @_;
376
377 my $option;
378 if (ref($opt_key)) {
379 $option = $opt_key;
380 } else {
381 $option = $self->get_option($opt_key, $opt_index);
382 }
383 return $self->SUPER::create_single_option_line($option);
384 }
385
386 sub append_single_option_line {
387 my ($self, $option, $opt_index) = @_;
388 return $self->append_line($self->create_single_option_line($option, $opt_index));
389 }
390
391 sub reload_config {
392 my ($self) = @_;
393
394 foreach my $opt_id (keys %{ $self->_opt_map }) {
395 my ($opt_key, $opt_index) = @{ $self->_opt_map->{$opt_id} };
396 my $option = $self->_options->{$opt_id};
397 $self->set_value($opt_id, $self->_get_config_value($opt_key, $opt_index, $option->gui_flags =~ /\bserialized\b/));
398 }
399 }
400
401 sub get_fieldc {
402 my ($self, $opt_key, $opt_index) = @_;
403
404 $opt_index //= -1;
405 my $opt_id = first { $self->_opt_map->{$_}[0] eq $opt_key && $self->_opt_map->{$_}[1] == $opt_index }
406 keys %{$self->_opt_map};
407 return defined($opt_id) ? $self->get_field($opt_id) : undef;
408 }
409
410 sub _get_config_value {
411 my ($self, $opt_key, $opt_index, $deserialize) = @_;
412
413 if ($deserialize) {
414 die "Can't deserialize option indexed value" if $opt_index != -1;
415 return $self->config->serialize($opt_key);
416 } else {
417 return $opt_index == -1
418 ? $self->config->get($opt_key)
419 : $self->config->get_at($opt_key, $opt_index);
420 }
421 }
422
423 sub _on_change {
424 my ($self, $opt_id, $value) = @_;
425
426 if (exists $self->_opt_map->{$opt_id}) {
427 my ($opt_key, $opt_index) = @{ $self->_opt_map->{$opt_id} };
428 my $option = $self->_options->{$opt_id};
429
430 # get value
431 my $field_value = $self->get_value($opt_id);
432 if ($option->gui_flags =~ /\bserialized\b/) {
433 die "Can't set serialized option indexed value" if $opt_index != -1;
434 $self->config->set_deserialize($opt_key, $field_value);
435 } else {
436 if ($opt_index == -1) {
437 $self->config->set($opt_key, $field_value);
438 } else {
439 my $value = $self->config->get($opt_key);
440 $value->[$opt_index] = $field_value;
441 $self->config->set($opt_key, $value);
442 }
443 }
444 }
445
446 $self->SUPER::_on_change($opt_id, $value);
447 }
448
449 sub _on_kill_focus {
450 my ($self, $opt_id) = @_;
451
452 # when a field loses focus, reapply the config value to it
453 # (thus discarding any invalid input and reverting to the last
454 # accepted value)
455 $self->reload_config;
456 }
457
458 package Slic3r::GUI::OptionsGroup::StaticText;
459 use Wx qw(:misc :systemsettings);
460 use base 'Wx::StaticText';
461
462 sub new {
463 my ($class, $parent) = @_;
464
465 my $self = $class->SUPER::new($parent, -1, "", wxDefaultPosition, wxDefaultSize);
466 my $font = Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
467 $self->SetFont($font);
468 return $self;
469 }
470
471 sub SetText {
472 my ($self, $value) = @_;
473
474 $self->SetLabel($value);
475 $self->Wrap(400);
476 $self->GetParent->Layout;
477 }
478
479 1;
0 # 2D preview on the platter.
1 # 3D objects are visualized by their convex hulls.
2
3 package Slic3r::GUI::Plater::2D;
4 use strict;
5 use warnings;
6 use utf8;
7
8 use List::Util qw(min max first);
9 use Slic3r::Geometry qw(X Y scale unscale convex_hull);
10 use Slic3r::Geometry::Clipper qw(offset JT_ROUND intersection_pl);
11 use Wx qw(:misc :pen :brush :sizer :font :cursor wxTAB_TRAVERSAL);
12 use Wx::Event qw(EVT_MOUSE_EVENTS EVT_PAINT EVT_ERASE_BACKGROUND EVT_SIZE);
13 use base 'Wx::Panel';
14
15 use constant CANVAS_TEXT => join('-', +(localtime)[3,4]) eq '13-8'
16 ? 'What do you want to print today? ™' # Sept. 13, 2006. The first part ever printed by a RepRap to make another RepRap.
17 : 'Drag your objects here';
18
19 sub new {
20 my $class = shift;
21 my ($parent, $size, $objects, $model, $config) = @_;
22
23 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, $size, wxTAB_TRAVERSAL);
24 # This has only effect on MacOS. On Windows and Linux/GTK, the background is painted by $self->repaint().
25 $self->SetBackgroundColour(Wx::wxWHITE);
26
27 $self->{objects} = $objects;
28 $self->{model} = $model;
29 $self->{config} = $config;
30 $self->{on_select_object} = sub {};
31 $self->{on_double_click} = sub {};
32 $self->{on_right_click} = sub {};
33 $self->{on_instances_moved} = sub {};
34
35 $self->{objects_brush} = Wx::Brush->new(Wx::Colour->new(210,210,210), wxSOLID);
36 $self->{selected_brush} = Wx::Brush->new(Wx::Colour->new(255,128,128), wxSOLID);
37 $self->{dragged_brush} = Wx::Brush->new(Wx::Colour->new(128,128,255), wxSOLID);
38 $self->{transparent_brush} = Wx::Brush->new(Wx::Colour->new(0,0,0), wxTRANSPARENT);
39 $self->{grid_pen} = Wx::Pen->new(Wx::Colour->new(230,230,230), 1, wxSOLID);
40 $self->{print_center_pen} = Wx::Pen->new(Wx::Colour->new(200,200,200), 1, wxSOLID);
41 $self->{clearance_pen} = Wx::Pen->new(Wx::Colour->new(0,0,200), 1, wxSOLID);
42 $self->{skirt_pen} = Wx::Pen->new(Wx::Colour->new(150,150,150), 1, wxSOLID);
43
44 $self->{user_drawn_background} = $^O ne 'darwin';
45
46 EVT_PAINT($self, \&repaint);
47 EVT_ERASE_BACKGROUND($self, sub {}) if $self->{user_drawn_background};
48 EVT_MOUSE_EVENTS($self, \&mouse_event);
49 EVT_SIZE($self, sub {
50 $self->update_bed_size;
51 $self->Refresh;
52 });
53
54 return $self;
55 }
56
57 sub on_select_object {
58 my ($self, $cb) = @_;
59 $self->{on_select_object} = $cb;
60 }
61
62 sub on_double_click {
63 my ($self, $cb) = @_;
64 $self->{on_double_click} = $cb;
65 }
66
67 sub on_right_click {
68 my ($self, $cb) = @_;
69 $self->{on_right_click} = $cb;
70 }
71
72 sub on_instances_moved {
73 my ($self, $cb) = @_;
74 $self->{on_instances_moved} = $cb;
75 }
76
77 sub repaint {
78 my ($self, $event) = @_;
79
80 my $dc = Wx::AutoBufferedPaintDC->new($self);
81 my $size = $self->GetSize;
82 my @size = ($size->GetWidth, $size->GetHeight);
83
84 if ($self->{user_drawn_background}) {
85 # On all systems the AutoBufferedPaintDC() achieves double buffering.
86 # On MacOS the background is erased, on Windows the background is not erased
87 # and on Linux/GTK the background is erased to gray color.
88 # Fill DC with the background on Windows & Linux/GTK.
89 my $brush_background = Wx::Brush->new(Wx::wxWHITE, wxSOLID);
90 $dc->SetPen(wxWHITE_PEN);
91 $dc->SetBrush($brush_background);
92 my $rect = $self->GetUpdateRegion()->GetBox();
93 $dc->DrawRectangle($rect->GetLeft(), $rect->GetTop(), $rect->GetWidth(), $rect->GetHeight());
94 }
95
96 # draw grid
97 $dc->SetPen($self->{grid_pen});
98 $dc->DrawLine(map @$_, @$_) for @{$self->{grid}};
99
100 # draw bed
101 {
102 $dc->SetPen($self->{print_center_pen});
103 $dc->SetBrush($self->{transparent_brush});
104 $dc->DrawPolygon($self->scaled_points_to_pixel($self->{bed_polygon}, 1), 0, 0);
105 }
106
107 # draw print center
108 if (@{$self->{objects}} && $Slic3r::GUI::Settings->{_}{autocenter}) {
109 my $center = $self->unscaled_point_to_pixel($self->{print_center});
110 $dc->SetPen($self->{print_center_pen});
111 $dc->DrawLine($center->[X], 0, $center->[X], $size[Y]);
112 $dc->DrawLine(0, $center->[Y], $size[X], $center->[Y]);
113 $dc->SetTextForeground(Wx::Colour->new(0,0,0));
114 $dc->SetFont(Wx::Font->new(10, wxDEFAULT, wxNORMAL, wxNORMAL));
115 $dc->DrawLabel("X = " . sprintf('%.0f', $self->{print_center}->[X]), Wx::Rect->new(0, 0, $center->[X]*2, $self->GetSize->GetHeight), wxALIGN_CENTER_HORIZONTAL | wxALIGN_BOTTOM);
116 $dc->DrawRotatedText("Y = " . sprintf('%.0f', $self->{print_center}->[Y]), 0, $center->[Y]+15, 90);
117 }
118
119 # draw frame
120 if (0) {
121 $dc->SetPen(wxBLACK_PEN);
122 $dc->SetBrush($self->{transparent_brush});
123 $dc->DrawRectangle(0, 0, @size);
124 }
125
126 # draw text if plate is empty
127 if (!@{$self->{objects}}) {
128 $dc->SetTextForeground(Wx::Colour->new(150,50,50));
129 $dc->SetFont(Wx::Font->new(14, wxDEFAULT, wxNORMAL, wxNORMAL));
130 $dc->DrawLabel(CANVAS_TEXT, Wx::Rect->new(0, 0, $self->GetSize->GetWidth, $self->GetSize->GetHeight), wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL);
131 }
132
133 # draw thumbnails
134 $dc->SetPen(wxBLACK_PEN);
135 $self->clean_instance_thumbnails;
136 for my $obj_idx (0 .. $#{$self->{objects}}) {
137 my $object = $self->{objects}[$obj_idx];
138 my $model_object = $self->{model}->objects->[$obj_idx];
139 next unless defined $object->thumbnail;
140 for my $instance_idx (0 .. $#{$model_object->instances}) {
141 my $instance = $model_object->instances->[$instance_idx];
142 next if !defined $object->transformed_thumbnail;
143
144 my $thumbnail = $object->transformed_thumbnail->clone; # in scaled model coordinates
145 $thumbnail->translate(map scale($_), @{$instance->offset});
146
147 $object->instance_thumbnails->[$instance_idx] = $thumbnail;
148
149 if (defined $self->{drag_object} && $self->{drag_object}[0] == $obj_idx && $self->{drag_object}[1] == $instance_idx) {
150 $dc->SetBrush($self->{dragged_brush});
151 } elsif ($object->selected) {
152 $dc->SetBrush($self->{selected_brush});
153 } else {
154 $dc->SetBrush($self->{objects_brush});
155 }
156 foreach my $expolygon (@$thumbnail) {
157 foreach my $points (@{$expolygon->pp}) {
158 $dc->DrawPolygon($self->scaled_points_to_pixel($points, 1), 0, 0);
159 }
160 }
161
162 if (0) {
163 # draw bounding box for debugging purposes
164 my $bb = $model_object->instance_bounding_box($instance_idx);
165 $bb->scale($self->{scaling_factor});
166 # no need to translate by instance offset because instance_bounding_box() does that
167 my $points = $bb->polygon->pp;
168 $dc->SetPen($self->{clearance_pen});
169 $dc->SetBrush($self->{transparent_brush});
170 $dc->DrawPolygon($self->_y($points), 0, 0);
171 }
172
173 # if sequential printing is enabled and we have more than one object, draw clearance area
174 if ($self->{config}->complete_objects && (map @{$_->instances}, @{$self->{model}->objects}) > 1) {
175 my ($clearance) = @{offset([$thumbnail->convex_hull], (scale($self->{config}->extruder_clearance_radius) / 2), 1, JT_ROUND, scale(0.1))};
176 $dc->SetPen($self->{clearance_pen});
177 $dc->SetBrush($self->{transparent_brush});
178 $dc->DrawPolygon($self->scaled_points_to_pixel($clearance, 1), 0, 0);
179 }
180 }
181 }
182
183 # draw skirt
184 if (@{$self->{objects}} && $self->{config}->skirts) {
185 my @points = map @{$_->contour}, map @$_, map @{$_->instance_thumbnails}, @{$self->{objects}};
186 if (@points >= 3) {
187 my ($convex_hull) = @{offset([convex_hull(\@points)], scale max($self->{config}->brim_width + $self->{config}->skirt_distance), 1, JT_ROUND, scale(0.1))};
188 $dc->SetPen($self->{skirt_pen});
189 $dc->SetBrush($self->{transparent_brush});
190 $dc->DrawPolygon($self->scaled_points_to_pixel($convex_hull, 1), 0, 0);
191 }
192 }
193
194 $event->Skip;
195 }
196
197 sub mouse_event {
198 my ($self, $event) = @_;
199
200 my $pos = $event->GetPosition;
201 my $point = $self->point_to_model_units([ $pos->x, $pos->y ]); #]]
202 if ($event->ButtonDown) {
203 $self->{on_select_object}->(undef);
204 # traverse objects and instances in reverse order, so that if they're overlapping
205 # we get the one that gets drawn last, thus on top (as user expects that to move)
206 OBJECTS: for my $obj_idx (reverse 0 .. $#{$self->{objects}}) {
207 my $object = $self->{objects}->[$obj_idx];
208 for my $instance_idx (reverse 0 .. $#{ $object->instance_thumbnails }) {
209 my $thumbnail = $object->instance_thumbnails->[$instance_idx];
210 if (defined first { $_->contour->contains_point($point) } @$thumbnail) {
211 $self->{on_select_object}->($obj_idx);
212
213 if ($event->LeftDown) {
214 # start dragging
215 my $instance = $self->{model}->objects->[$obj_idx]->instances->[$instance_idx];
216 my $instance_origin = [ map scale($_), @{$instance->offset} ];
217 $self->{drag_start_pos} = [ # displacement between the click and the instance origin in scaled model units
218 $point->x - $instance_origin->[X],
219 $point->y - $instance_origin->[Y], #-
220 ];
221 $self->{drag_object} = [ $obj_idx, $instance_idx ];
222 } elsif ($event->RightDown) {
223 $self->{on_right_click}->($pos);
224 }
225
226 last OBJECTS;
227 }
228 }
229 }
230 $self->Refresh;
231 } elsif ($event->LeftUp) {
232 $self->{on_instances_moved}->()
233 if $self->{drag_object};
234 $self->{drag_start_pos} = undef;
235 $self->{drag_object} = undef;
236 $self->SetCursor(wxSTANDARD_CURSOR);
237 } elsif ($event->LeftDClick) {
238 $self->{on_double_click}->();
239 } elsif ($event->Dragging) {
240 return if !$self->{drag_start_pos}; # concurrency problems
241 my ($obj_idx, $instance_idx) = @{ $self->{drag_object} };
242 my $model_object = $self->{model}->objects->[$obj_idx];
243 $model_object->instances->[$instance_idx]->set_offset(
244 Slic3r::Pointf->new(
245 unscale($point->[X] - $self->{drag_start_pos}[X]),
246 unscale($point->[Y] - $self->{drag_start_pos}[Y]),
247 ));
248 $model_object->update_bounding_box;
249 $self->Refresh;
250 } elsif ($event->Moving) {
251 my $cursor = wxSTANDARD_CURSOR;
252 if (defined first { $_->contour->contains_point($point) } map @$_, map @{$_->instance_thumbnails}, @{ $self->{objects} }) {
253 $cursor = Wx::Cursor->new(wxCURSOR_HAND);
254 }
255 $self->SetCursor($cursor);
256 }
257 }
258
259 sub update_bed_size {
260 my $self = shift;
261
262 # when the canvas is not rendered yet, its GetSize() method returns 0,0
263 my $canvas_size = $self->GetSize;
264 my ($canvas_w, $canvas_h) = ($canvas_size->GetWidth, $canvas_size->GetHeight);
265 return if $canvas_w == 0;
266
267 # get bed shape polygon
268 $self->{bed_polygon} = my $polygon = Slic3r::Polygon->new_scale(@{$self->{config}->bed_shape});
269 my $bb = $polygon->bounding_box;
270 my $size = $bb->size;
271
272 # calculate the scaling factor needed for constraining print bed area inside preview
273 # scaling_factor is expressed in pixel / mm
274 $self->{scaling_factor} = min($canvas_w / unscale($size->x), $canvas_h / unscale($size->y)); #)
275
276 # calculate the displacement needed to center bed
277 $self->{bed_origin} = [
278 $canvas_w/2 - (unscale($bb->x_max + $bb->x_min)/2 * $self->{scaling_factor}),
279 $canvas_h - ($canvas_h/2 - (unscale($bb->y_max + $bb->y_min)/2 * $self->{scaling_factor})),
280 ];
281
282 # calculate print center
283 my $center = $bb->center;
284 $self->{print_center} = [ unscale($center->x), unscale($center->y) ]; #))
285
286 # cache bed contours and grid
287 {
288 my $step = scale 10; # 1cm grid
289 my @polylines = ();
290 for (my $x = $bb->x_min - ($bb->x_min % $step) + $step; $x < $bb->x_max; $x += $step) {
291 push @polylines, Slic3r::Polyline->new([$x, $bb->y_min], [$x, $bb->y_max]);
292 }
293 for (my $y = $bb->y_min - ($bb->y_min % $step) + $step; $y < $bb->y_max; $y += $step) {
294 push @polylines, Slic3r::Polyline->new([$bb->x_min, $y], [$bb->x_max, $y]);
295 }
296 @polylines = @{intersection_pl(\@polylines, [$polygon])};
297 $self->{grid} = [ map $self->scaled_points_to_pixel([ @$_[0,-1] ], 1), @polylines ];
298 }
299 }
300
301 sub clean_instance_thumbnails {
302 my ($self) = @_;
303
304 foreach my $object (@{ $self->{objects} }) {
305 @{ $object->instance_thumbnails } = ();
306 }
307 }
308
309 # convert a model coordinate into a pixel coordinate
310 sub unscaled_point_to_pixel {
311 my ($self, $point) = @_;
312
313 my $canvas_height = $self->GetSize->GetHeight;
314 my $zero = $self->{bed_origin};
315 return [
316 $point->[X] * $self->{scaling_factor} + $zero->[X],
317 $canvas_height - $point->[Y] * $self->{scaling_factor} + ($zero->[Y] - $canvas_height),
318 ];
319 }
320
321 sub scaled_points_to_pixel {
322 my ($self, $points, $unscale) = @_;
323
324 my $result = [];
325 foreach my $point (@$points) {
326 $point = [ map unscale($_), @$point ] if $unscale;
327 push @$result, $self->unscaled_point_to_pixel($point);
328 }
329 return $result;
330 }
331
332 sub point_to_model_units {
333 my ($self, $point) = @_;
334
335 my $zero = $self->{bed_origin};
336 return Slic3r::Point->new(
337 scale ($point->[X] - $zero->[X]) / $self->{scaling_factor},
338 scale ($zero->[Y] - $point->[Y]) / $self->{scaling_factor},
339 );
340 }
341
342 1;
0 # 2D preview of the tool paths of a single layer, using a thin line.
1 # OpenGL is used to render the paths.
2 # Vojtech also added a 2D simulation of under/over extrusion in a single layer.
3
4 package Slic3r::GUI::Plater::2DToolpaths;
5 use strict;
6 use warnings;
7 use utf8;
8
9 use Slic3r::Print::State ':steps';
10 use Wx qw(:misc :sizer :slider :statictext :keycode wxWHITE wxWANTS_CHARS);
11 use Wx::Event qw(EVT_SLIDER EVT_KEY_DOWN);
12 use base qw(Wx::Panel Class::Accessor);
13
14 __PACKAGE__->mk_accessors(qw(print enabled));
15
16 sub new {
17 my $class = shift;
18 my ($parent, $print) = @_;
19
20 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS);
21 $self->SetBackgroundColour(wxWHITE);
22
23 # init GUI elements
24 my $canvas = $self->{canvas} = Slic3r::GUI::Plater::2DToolpaths::Canvas->new($self, $print);
25 my $slider = $self->{slider} = Wx::Slider->new(
26 $self, -1,
27 0, # default
28 0, # min
29 # we set max to a bogus non-zero value because the MSW implementation of wxSlider
30 # will skip drawing the slider if max <= min:
31 1, # max
32 wxDefaultPosition,
33 wxDefaultSize,
34 wxVERTICAL | wxSL_INVERSE,
35 );
36 my $z_label = $self->{z_label} = Wx::StaticText->new($self, -1, "", wxDefaultPosition,
37 [40,-1], wxALIGN_CENTRE_HORIZONTAL);
38 $z_label->SetFont($Slic3r::GUI::small_font);
39
40 my $vsizer = Wx::BoxSizer->new(wxVERTICAL);
41 $vsizer->Add($slider, 1, wxALL | wxEXPAND | wxALIGN_CENTER, 3);
42 $vsizer->Add($z_label, 0, wxALL | wxEXPAND | wxALIGN_CENTER, 3);
43
44 my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
45 $sizer->Add($canvas, 1, wxALL | wxEXPAND, 0);
46 $sizer->Add($vsizer, 0, wxTOP | wxBOTTOM | wxEXPAND, 5);
47
48 EVT_SLIDER($self, $slider, sub {
49 $self->set_z($self->{layers_z}[$slider->GetValue])
50 if $self->enabled;
51 });
52 EVT_KEY_DOWN($canvas, sub {
53 my ($s, $event) = @_;
54 my $key = $event->GetKeyCode;
55 if ($key == ord('D') || $key == WXK_LEFT) {
56 # Keys: 'D' or WXK_LEFT
57 $slider->SetValue($slider->GetValue - 1);
58 $self->set_z($self->{layers_z}[$slider->GetValue]);
59 } elsif ($key == ord('U') || $key == WXK_RIGHT) {
60 # Keys: 'U' or WXK_RIGHT
61 $slider->SetValue($slider->GetValue + 1);
62 $self->set_z($self->{layers_z}[$slider->GetValue]);
63 } elsif ($key >= ord('1') && $key <= ord('3')) {
64 # Keys: '1' to '3'
65 $canvas->set_simulation_mode($key - ord('1'));
66 }
67 });
68
69 $self->SetSizer($sizer);
70 $self->SetMinSize($self->GetSize);
71 $sizer->SetSizeHints($self);
72
73 # init print
74 $self->{print} = $print;
75 $self->reload_print;
76
77 return $self;
78 }
79
80 sub reload_print {
81 my ($self) = @_;
82
83 # we require that there's at least one object and the posSlice step
84 # is performed on all of them (this ensures that _shifted_copies was
85 # populated and we know the number of layers)
86 if (!$self->print->object_step_done(STEP_SLICE)) {
87 $self->enabled(0);
88 $self->{slider}->Hide;
89 $self->{canvas}->Refresh; # clears canvas
90 return;
91 }
92
93 $self->{canvas}->bb($self->print->total_bounding_box);
94 $self->{canvas}->_dirty(1);
95
96 my %z = (); # z => 1
97 foreach my $object (@{$self->{print}->objects}) {
98 foreach my $layer (@{$object->layers}, @{$object->support_layers}) {
99 $z{$layer->print_z} = 1;
100 }
101 }
102 $self->enabled(1);
103 $self->{layers_z} = [ sort { $a <=> $b } keys %z ];
104 $self->{slider}->SetRange(0, scalar(@{$self->{layers_z}})-1);
105 if ((my $z_idx = $self->{slider}->GetValue) <= $#{$self->{layers_z}}) {
106 $self->set_z($self->{layers_z}[$z_idx]);
107 } else {
108 $self->{slider}->SetValue(0);
109 $self->set_z($self->{layers_z}[0]) if @{$self->{layers_z}};
110 }
111 $self->{slider}->Show;
112 $self->Layout;
113 }
114
115 sub set_z {
116 my ($self, $z) = @_;
117
118 return if !$self->enabled;
119 $self->{z_label}->SetLabel(sprintf '%.2f', $z);
120 $self->{canvas}->set_z($z);
121 }
122
123
124 package Slic3r::GUI::Plater::2DToolpaths::Canvas;
125
126 use Wx::Event qw(EVT_PAINT EVT_SIZE EVT_IDLE EVT_MOUSEWHEEL EVT_MOUSE_EVENTS);
127 use OpenGL qw(:glconstants :glfunctions :glufunctions :gluconstants);
128 use base qw(Wx::GLCanvas Class::Accessor);
129 use Wx::GLCanvas qw(:all);
130 use List::Util qw(min max first);
131 use Slic3r::Geometry qw(scale unscale epsilon X Y);
132 use Slic3r::Print::State ':steps';
133
134 __PACKAGE__->mk_accessors(qw(
135 print z layers color init
136 bb
137 _camera_bb
138 _dirty
139 _zoom
140 _camera_target
141 _drag_start_xy
142 _texture_name
143 _texture_size
144 _extrusion_simulator
145 _simulation_mode
146 ));
147
148 # make OpenGL::Array thread-safe
149 {
150 no warnings 'redefine';
151 *OpenGL::Array::CLONE_SKIP = sub { 1 };
152 }
153
154 sub new {
155 my ($class, $parent, $print) = @_;
156
157 my $self = (Wx::wxVERSION >= 3.000003) ?
158 # The wxWidgets 3.0.3-beta have a bug, they crash with NULL attribute list.
159 $class->SUPER::new($parent, -1, Wx::wxDefaultPosition, Wx::wxDefaultSize, 0, "",
160 [WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 24, 0]) :
161 $class->SUPER::new($parent);
162 # Immediatelly force creation of the OpenGL context to consume the static variable s_wglContextAttribs.
163 $self->GetContext();
164 $self->print($print);
165 $self->_zoom(1);
166
167 # 2D point in model space
168 $self->_camera_target(Slic3r::Pointf->new(0,0));
169
170 # Texture for the extrusion simulator. The texture will be allocated / reallocated on Resize.
171 $self->_texture_name(0);
172 $self->_texture_size(Slic3r::Point->new(0,0));
173 $self->_extrusion_simulator(Slic3r::ExtrusionSimulator->new());
174 $self->_simulation_mode(0);
175
176 EVT_PAINT($self, sub {
177 my $dc = Wx::PaintDC->new($self);
178 $self->Render($dc);
179 });
180 EVT_SIZE($self, sub { $self->_dirty(1) });
181 EVT_IDLE($self, sub {
182 return unless $self->_dirty;
183 return if !$self->IsShownOnScreen;
184 $self->Resize;
185 $self->Refresh;
186 });
187 EVT_MOUSEWHEEL($self, sub {
188 my ($self, $e) = @_;
189
190 return if !$self->GetParent->enabled;
191
192 my $old_zoom = $self->_zoom;
193
194 # Calculate the zoom delta and apply it to the current zoom factor
195 my $zoom = $e->GetWheelRotation() / $e->GetWheelDelta();
196 $zoom = max(min($zoom, 4), -4);
197 $zoom /= 10;
198 $self->_zoom($self->_zoom / (1-$zoom));
199 $self->_zoom(1) if $self->_zoom > 1; # prevent from zooming out too much
200
201 {
202 # In order to zoom around the mouse point we need to translate
203 # the camera target. This math is almost there but not perfect yet...
204 my $camera_bb_size = $self->_camera_bb->size;
205 my $size = Slic3r::Pointf->new($self->GetSizeWH);
206 my $pos = Slic3r::Pointf->new($e->GetPositionXY);
207
208 # calculate the zooming center in pixel coordinates relative to the viewport center
209 my $vec = Slic3r::Pointf->new($pos->x - $size->x/2, $pos->y - $size->y/2); #-
210
211 # calculate where this point will end up after applying the new zoom
212 my $vec2 = $vec->clone;
213 $vec2->scale($old_zoom / $self->_zoom);
214
215 # move the camera target by the difference of the two positions
216 $self->_camera_target->translate(
217 -($vec->x - $vec2->x) * $camera_bb_size->x / $size->x,
218 ($vec->y - $vec2->y) * $camera_bb_size->y / $size->y, #//
219 );
220 }
221
222 $self->_dirty(1);
223 $self->Refresh;
224 });
225 EVT_MOUSE_EVENTS($self, \&mouse_event);
226
227 return $self;
228 }
229
230 sub Destroy {
231 my ($self) = @_;
232
233 # Deallocate the OpenGL resources.
234 my $context = $self->GetContext;
235 if ($context and $self->texture_id) {
236 $self->SetCurrent($context);
237 glDeleteTextures(1, ($self->texture_id));
238 $self->SetCurrent(0);
239 $self->texture_id(0);
240 $self->texture_size(new Slic3r::Point(0, 0));
241 }
242 return $self->SUPER::Destroy;
243 }
244
245 sub mouse_event {
246 my ($self, $e) = @_;
247
248 return if !$self->GetParent->enabled;
249
250 my $pos = Slic3r::Pointf->new($e->GetPositionXY);
251 if ($e->Entering && &Wx::wxMSW) {
252 # wxMSW needs focus in order to catch mouse wheel events
253 $self->SetFocus;
254 } elsif ($e->Dragging) {
255 if ($e->LeftIsDown || $e->MiddleIsDown || $e->RightIsDown) {
256 # if dragging, translate view
257
258 if (defined $self->_drag_start_xy) {
259 my $move = $self->_drag_start_xy->vector_to($pos); # in pixels
260
261 # get viewport and camera size in order to convert pixel to model units
262 my ($x, $y) = $self->GetSizeWH;
263 my $camera_bb_size = $self->_camera_bb->size;
264
265 # compute translation in model units
266 $self->_camera_target->translate(
267 -$move->x * $camera_bb_size->x / $x,
268 $move->y * $camera_bb_size->y / $y, # /**
269 );
270
271 $self->_dirty(1);
272 $self->Refresh;
273 }
274 $self->_drag_start_xy($pos);
275 }
276 } elsif ($e->LeftUp || $e->MiddleUp || $e->RightUp) {
277 $self->_drag_start_xy(undef);
278 } else {
279 $e->Skip();
280 }
281 }
282
283 sub set_z {
284 my ($self, $z) = @_;
285
286 my $print = $self->print;
287
288 # can we have interlaced layers?
289 my $interlaced = (defined first { $_->config->support_material } @{$print->objects})
290 || (defined first { $_->config->infill_every_layers > 1 } @{$print->regions});
291
292 my $max_layer_height = $print->max_allowed_layer_height;
293
294 my @layers = ();
295 foreach my $object (@{$print->objects}) {
296 foreach my $layer (@{$object->layers}, @{$object->support_layers}) {
297 if ($interlaced) {
298 push @layers, $layer
299 if $z > ($layer->print_z - $max_layer_height - epsilon)
300 && $z <= $layer->print_z + epsilon;
301 } else {
302 push @layers, $layer if abs($layer->print_z - $z) < epsilon;
303 }
304 }
305 }
306
307 # reverse layers so that we draw the lowermost (i.e. current) on top
308 $self->z($z);
309 $self->layers([ reverse @layers ]);
310 $self->Refresh;
311 }
312
313 sub set_simulation_mode
314 {
315 my ($self, $mode) = @_;
316 $self->_simulation_mode($mode);
317 $self->_dirty(1);
318 $self->Refresh;
319 }
320
321 sub Render {
322 my ($self, $dc) = @_;
323
324 # prevent calling SetCurrent() when window is not shown yet
325 return unless $self->IsShownOnScreen;
326 return unless my $context = $self->GetContext;
327 $self->SetCurrent($context);
328 $self->InitGL;
329
330 glClearColor(1, 1, 1, 0);
331 glClear(GL_COLOR_BUFFER_BIT);
332
333 if (!$self->GetParent->enabled || !$self->layers) {
334 glFlush();
335 $self->SwapBuffers;
336 return;
337 }
338
339 glDisable(GL_DEPTH_TEST);
340 glMatrixMode(GL_MODELVIEW);
341 glLoadIdentity();
342
343 if ($self->_simulation_mode and $self->_texture_name and $self->_texture_size->x() > 0 and $self->_texture_size->y() > 0) {
344 $self->_simulate_extrusion();
345 my ($x, $y) = $self->GetSizeWH;
346 glEnable(GL_TEXTURE_2D);
347 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);
348 glBindTexture(GL_TEXTURE_2D, $self->_texture_name);
349 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
350 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
351 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
352 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
353 glTexImage2D_c(GL_TEXTURE_2D,
354 0, # level (0 normal, heighr is form mip-mapping)
355 GL_RGBA, # internal format
356 $self->_texture_size->x(), $self->_texture_size->y(),
357 0, # border
358 GL_RGBA, # format RGBA color data
359 GL_UNSIGNED_BYTE, # unsigned byte data
360 $self->_extrusion_simulator->image_ptr()); # ptr to texture data
361 glMatrixMode(GL_PROJECTION);
362 glPushMatrix();
363 glLoadIdentity();
364 glOrtho(0, 1, 0, 1, 0, 1);
365 glBegin(GL_QUADS);
366 glTexCoord2f(0, 0);
367 glVertex2f(0, 0);
368 glTexCoord2f($x/$self->_texture_size->x(), 0);
369 glVertex2f(1, 0);
370 glTexCoord2f($x/$self->_texture_size->x(), $y/$self->_texture_size->y());
371 glVertex2f(1, 1);
372 glTexCoord2f(0, $y/$self->_texture_size->y());
373 glVertex2f(0, 1);
374 glEnd();
375 glPopMatrix();
376 glBindTexture(GL_TEXTURE_2D, 0);
377 }
378
379 # anti-alias
380 if (0) {
381 glEnable(GL_LINE_SMOOTH);
382 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
383 glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
384 glHint(GL_POLYGON_SMOOTH_HINT, GL_DONT_CARE);
385 }
386
387 # Tesselator triangulates polygons with holes on the fly for the rendering purposes only.
388 my $tess;
389 if ($self->_simulation_mode() == 0 and !(&Wx::wxMSW && $OpenGL::VERSION < 0.6704)) {
390 # We can't use the GLU tesselator on MSW with older OpenGL versions
391 # because of an upstream bug:
392 # http://sourceforge.net/p/pogl/bugs/16/
393 $tess = gluNewTess();
394 gluTessCallback($tess, GLU_TESS_BEGIN, 'DEFAULT');
395 gluTessCallback($tess, GLU_TESS_END, 'DEFAULT');
396 gluTessCallback($tess, GLU_TESS_VERTEX, 'DEFAULT');
397 gluTessCallback($tess, GLU_TESS_COMBINE, 'DEFAULT');
398 gluTessCallback($tess, GLU_TESS_ERROR, 'DEFAULT');
399 gluTessCallback($tess, GLU_TESS_EDGE_FLAG, 'DEFAULT');
400 }
401
402 foreach my $layer (@{$self->layers}) {
403 my $object = $layer->object;
404
405 # only draw the slice for the current layer
406 next unless abs($layer->print_z - $self->z) < epsilon;
407
408 # draw slice contour
409 glLineWidth(1);
410 foreach my $copy (@{ $object->_shifted_copies }) {
411 glPushMatrix();
412 glTranslatef(@$copy, 0);
413
414 foreach my $slice (@{$layer->slices}) {
415 glColor3f(0.95, 0.95, 0.95);
416
417 if ($tess) {
418 gluTessBeginPolygon($tess);
419 foreach my $polygon (@$slice) {
420 gluTessBeginContour($tess);
421 gluTessVertex_p($tess, @$_, 0) for @$polygon;
422 gluTessEndContour($tess);
423 }
424 gluTessEndPolygon($tess);
425 }
426
427 glColor3f(0.9, 0.9, 0.9);
428 foreach my $polygon (@$slice) {
429 foreach my $line (@{$polygon->lines}) {
430 glBegin(GL_LINES);
431 glVertex2f(@{$line->a});
432 glVertex2f(@{$line->b});
433 glEnd();
434 }
435 }
436 }
437 glPopMatrix();
438 }
439 }
440
441 my $skirt_drawn = 0;
442 my $brim_drawn = 0;
443 foreach my $layer (@{$self->layers}) {
444 my $object = $layer->object;
445 my $print_z = $layer->print_z;
446
447 # draw brim
448 if ($self->print->step_done(STEP_BRIM) && $layer->id == 0 && !$brim_drawn) {
449 $self->color([0, 0, 0]);
450 $self->_draw(undef, $print_z, $_) for @{$self->print->brim};
451 $brim_drawn = 1;
452 }
453 if ($self->print->step_done(STEP_SKIRT)
454 && ($self->print->has_infinite_skirt() || $self->print->config->skirt_height > $layer->id)
455 && !$skirt_drawn) {
456 $self->color([0, 0, 0]);
457 $self->_draw(undef, $print_z, $_) for @{$self->print->skirt};
458 $skirt_drawn = 1;
459 }
460
461 foreach my $layerm (@{$layer->regions}) {
462 if ($object->step_done(STEP_PERIMETERS)) {
463 $self->color([0.7, 0, 0]);
464 $self->_draw($object, $print_z, $_) for map @$_, @{$layerm->perimeters};
465 }
466
467 if ($object->step_done(STEP_INFILL)) {
468 $self->color([0, 0, 0.7]);
469 $self->_draw($object, $print_z, $_) for map @$_, @{$layerm->fills};
470 }
471 }
472
473 if ($object->step_done(STEP_SUPPORTMATERIAL)) {
474 if ($layer->isa('Slic3r::Layer::Support')) {
475 $self->color([0, 0, 0]);
476 $self->_draw($object, $print_z, $_) for @{$layer->support_fills};
477 $self->_draw($object, $print_z, $_) for @{$layer->support_interface_fills};
478 }
479 }
480 }
481
482 gluDeleteTess($tess) if $tess;
483 glFlush();
484 $self->SwapBuffers;
485 }
486
487 sub _draw {
488 my ($self, $object, $print_z, $path) = @_;
489
490 my @paths = $path->isa('Slic3r::ExtrusionLoop')
491 ? @$path
492 : ($path);
493
494 $self->_draw_path($object, $print_z, $_) for @paths;
495 }
496
497 sub _draw_path {
498 my ($self, $object, $print_z, $path) = @_;
499
500 return if $print_z - $path->height > $self->z - epsilon;
501
502 if (abs($print_z - $self->z) < epsilon) {
503 glColor3f(@{$self->color});
504 } else {
505 glColor3f(0.8, 0.8, 0.8);
506 }
507
508 glLineWidth(1);
509
510 if (defined $object) {
511 foreach my $copy (@{ $object->_shifted_copies }) {
512 glPushMatrix();
513 glTranslatef(@$copy, 0);
514 foreach my $line (@{$path->polyline->lines}) {
515 glBegin(GL_LINES);
516 glVertex2f(@{$line->a});
517 glVertex2f(@{$line->b});
518 glEnd();
519 }
520 glPopMatrix();
521 }
522 } else {
523 foreach my $line (@{$path->polyline->lines}) {
524 glBegin(GL_LINES);
525 glVertex2f(@{$line->a});
526 glVertex2f(@{$line->b});
527 glEnd();
528 }
529 }
530 }
531
532 sub _simulate_extrusion {
533 my ($self) = @_;
534 $self->_extrusion_simulator->reset_accumulator();
535 foreach my $layer (@{$self->layers}) {
536 if (abs($layer->print_z - $self->z) < epsilon) {
537 my $object = $layer->object;
538 my @shifts = (defined $object) ? @{$object->_shifted_copies} : (Slic3r::Point->new(0, 0));
539 foreach my $layerm (@{$layer->regions}) {
540 my @extrusions = ();
541 if ($object->step_done(STEP_PERIMETERS)) {
542 push @extrusions, @$_ for @{$layerm->perimeters};
543 }
544 if ($object->step_done(STEP_INFILL)) {
545 push @extrusions, @$_ for @{$layerm->fills};
546 }
547 foreach my $extrusion_entity (@extrusions) {
548 my @paths = $extrusion_entity->isa('Slic3r::ExtrusionLoop')
549 ? @$extrusion_entity
550 : ($extrusion_entity);
551 foreach my $path (@paths) {
552 print "width: ", $path->width,
553 " height: ", $path->height,
554 " mm3_per_mm: ", $path->mm3_per_mm,
555 " height2: ", $path->mm3_per_mm / $path->height,
556 "\n";
557 $self->_extrusion_simulator->extrude_to_accumulator($path, $_, $self->_simulation_mode()) for @shifts;
558 }
559 }
560 }
561 }
562 }
563 $self->_extrusion_simulator->evaluate_accumulator($self->_simulation_mode());
564 }
565
566 sub InitGL {
567 my $self = shift;
568
569 return if $self->init;
570 return unless $self->GetContext;
571
572 my $texture_id = 0;
573 ($texture_id) = glGenTextures_p(1);
574 $self->_texture_name($texture_id);
575 $self->init(1);
576 }
577
578 sub GetContext {
579 my ($self) = @_;
580
581 if (Wx::wxVERSION >= 2.009) {
582 return $self->{context} ||= Wx::GLContext->new($self);
583 } else {
584 return $self->SUPER::GetContext;
585 }
586 }
587
588 sub SetCurrent {
589 my ($self, $context) = @_;
590
591 if (Wx::wxVERSION >= 2.009) {
592 return $self->SUPER::SetCurrent($context);
593 } else {
594 return $self->SUPER::SetCurrent;
595 }
596 }
597
598 sub Resize {
599 my ($self) = @_;
600
601 return unless $self->GetContext;
602 return unless $self->bb;
603 $self->_dirty(0);
604
605 $self->SetCurrent($self->GetContext);
606 my ($x, $y) = $self->GetSizeWH;
607
608 if ($self->_texture_size->x() < $x or $self->_texture_size->y() < $y) {
609 # Allocate a large enough OpenGL texture with power of 2 dimensions.
610 $self->_texture_size->set_x(1) if ($self->_texture_size->x() == 0);
611 $self->_texture_size->set_y(1) if ($self->_texture_size->y() == 0);
612 $self->_texture_size->set_x($self->_texture_size->x() * 2) while ($self->_texture_size->x() < $x);
613 $self->_texture_size->set_y($self->_texture_size->y() * 2) while ($self->_texture_size->y() < $y);
614 #print "screen size ", $x, "x", $y;
615 #print "texture size ", $self->_texture_size->x(), "x", $self->_texture_size->y();
616 # Initialize an empty texture.
617 glBindTexture(GL_TEXTURE_2D, $self->_texture_name);
618 if (1) {
619 glTexImage2D_c(GL_TEXTURE_2D,
620 0, # level (0 normal, heighr is form mip-mapping)
621 GL_RGBA, # internal format
622 $self->_texture_size->x(), $self->_texture_size->y(),
623 0, # border
624 GL_RGBA, # format RGBA color data
625 GL_UNSIGNED_BYTE, # unsigned byte data
626 0); # ptr to texture data
627 }
628 glBindTexture(GL_TEXTURE_2D, 0);
629 $self->_extrusion_simulator->set_image_size($self->_texture_size);
630 }
631 $self->_extrusion_simulator->set_viewport(Slic3r::Geometry::BoundingBox->new_from_points(
632 [Slic3r::Point->new(0, 0), Slic3r::Point->new($x, $y)]));
633
634 glViewport(0, 0, $x, $y);
635
636 glMatrixMode(GL_PROJECTION);
637 glLoadIdentity();
638
639 my $bb = $self->bb->clone;
640
641 # center bounding box around origin before scaling it
642 my $bb_center = $bb->center;
643 $bb->translate(@{$bb_center->negative});
644
645 # scale bounding box according to zoom factor
646 $bb->scale($self->_zoom);
647
648 # reposition bounding box around original center
649 $bb->translate(@{$bb_center});
650
651 # translate camera
652 $bb->translate(@{$self->_camera_target});
653
654 # keep camera_bb within total bb
655 # (i.e. prevent user from panning outside the bounding box)
656 {
657 my @translate = (0,0);
658 if ($bb->x_min < $self->bb->x_min) {
659 $translate[X] += $self->bb->x_min - $bb->x_min;
660 }
661 if ($bb->y_min < $self->bb->y_min) {
662 $translate[Y] += $self->bb->y_min - $bb->y_min;
663 }
664 if ($bb->x_max > $self->bb->x_max) {
665 $translate[X] -= $bb->x_max - $self->bb->x_max;
666 }
667 if ($bb->y_max > $self->bb->y_max) {
668 $translate[Y] -= $bb->y_max - $self->bb->y_max;
669 }
670 $self->_camera_target->translate(@translate);
671 $bb->translate(@translate);
672 }
673
674 # save camera
675 $self->_camera_bb($bb);
676
677 my ($x1, $y1, $x2, $y2) = ($bb->x_min, $bb->y_min, $bb->x_max, $bb->y_max);
678 if (($x2 - $x1)/($y2 - $y1) > $x/$y) {
679 # adjust Y
680 my $new_y = $y * ($x2 - $x1) / $x;
681 $y1 = ($y2 + $y1)/2 - $new_y/2;
682 $y2 = $y1 + $new_y;
683 } else {
684 my $new_x = $x * ($y2 - $y1) / $y;
685 $x1 = ($x2 + $x1)/2 - $new_x/2;
686 $x2 = $x1 + $new_x;
687 }
688 glOrtho($x1, $x2, $y1, $y2, 0, 1);
689
690 # Set the adjusted bounding box at the extrusion simulator.
691 #print "Scene bbox ", $bb->x_min, ",", $bb->y_min, " ", $bb->x_max, ",", $bb->y_max, "\n";
692 #print "Setting simulator bbox ", $x1, ",", $y1, " ", $x2, ",", $y2, "\n";
693 $self->_extrusion_simulator->set_bounding_box(
694 Slic3r::Geometry::BoundingBox->new_from_points(
695 [Slic3r::Point->new($x1, $y1), Slic3r::Point->new($x2, $y2)]));
696
697 glMatrixMode(GL_MODELVIEW);
698 }
699
700 # Thick line drawing is not used anywhere. Probably not tested?
701 sub line {
702 my (
703 $x1, $y1, $x2, $y2, # coordinates of the line
704 $w, # width/thickness of the line in pixel
705 $Cr, $Cg, $Cb, # RGB color components
706 $Br, $Bg, $Bb, # color of background when alphablend=false
707 # Br=alpha of color when alphablend=true
708 $alphablend, # use alpha blend or not
709 ) = @_;
710
711 my $t;
712 my $R;
713 my $f = $w - int($w);
714 my $A;
715
716 if ($alphablend) {
717 $A = $Br;
718 } else {
719 $A = 1;
720 }
721
722 # determine parameters t,R
723 if ($w >= 0 && $w < 1) {
724 $t = 0.05; $R = 0.48 + 0.32 * $f;
725 if (!$alphablend) {
726 $Cr += 0.88 * (1-$f);
727 $Cg += 0.88 * (1-$f);
728 $Cb += 0.88 * (1-$f);
729 $Cr = 1.0 if ($Cr > 1.0);
730 $Cg = 1.0 if ($Cg > 1.0);
731 $Cb = 1.0 if ($Cb > 1.0);
732 } else {
733 $A *= $f;
734 }
735 } elsif ($w >= 1.0 && $w < 2.0) {
736 $t = 0.05 + $f*0.33; $R = 0.768 + 0.312*$f;
737 } elsif ($w >= 2.0 && $w < 3.0) {
738 $t = 0.38 + $f*0.58; $R = 1.08;
739 } elsif ($w >= 3.0 && $w < 4.0) {
740 $t = 0.96 + $f*0.48; $R = 1.08;
741 } elsif ($w >= 4.0 && $w < 5.0) {
742 $t= 1.44 + $f*0.46; $R = 1.08;
743 } elsif ($w >= 5.0 && $w < 6.0) {
744 $t= 1.9 + $f*0.6; $R = 1.08;
745 } elsif ($w >= 6.0) {
746 my $ff = $w - 6.0;
747 $t = 2.5 + $ff*0.50; $R = 1.08;
748 }
749 #printf( "w=%f, f=%f, C=%.4f\n", $w, $f, $C);
750
751 # determine angle of the line to horizontal
752 my $tx = 0; my $ty = 0; # core thinkness of a line
753 my $Rx = 0; my $Ry = 0; # fading edge of a line
754 my $cx = 0; my $cy = 0; # cap of a line
755 my $ALW = 0.01;
756 my $dx = $x2 - $x1;
757 my $dy = $y2 - $y1;
758 if (abs($dx) < $ALW) {
759 # vertical
760 $tx = $t; $ty = 0;
761 $Rx = $R; $Ry = 0;
762 if ($w > 0.0 && $w < 1.0) {
763 $tx *= 8;
764 } elsif ($w == 1.0) {
765 $tx *= 10;
766 }
767 } elsif (abs($dy) < $ALW) {
768 #horizontal
769 $tx = 0; $ty = $t;
770 $Rx = 0; $Ry = $R;
771 if ($w > 0.0 && $w < 1.0) {
772 $ty *= 8;
773 } elsif ($w == 1.0) {
774 $ty *= 10;
775 }
776 } else {
777 if ($w < 3) { # approximate to make things even faster
778 my $m = $dy/$dx;
779 # and calculate tx,ty,Rx,Ry
780 if ($m > -0.4142 && $m <= 0.4142) {
781 # -22.5 < $angle <= 22.5, approximate to 0 (degree)
782 $tx = $t * 0.1; $ty = $t;
783 $Rx = $R * 0.6; $Ry = $R;
784 } elsif ($m > 0.4142 && $m <= 2.4142) {
785 # 22.5 < $angle <= 67.5, approximate to 45 (degree)
786 $tx = $t * -0.7071; $ty = $t * 0.7071;
787 $Rx = $R * -0.7071; $Ry = $R * 0.7071;
788 } elsif ($m > 2.4142 || $m <= -2.4142) {
789 # 67.5 < $angle <= 112.5, approximate to 90 (degree)
790 $tx = $t; $ty = $t*0.1;
791 $Rx = $R; $Ry = $R*0.6;
792 } elsif ($m > -2.4142 && $m < -0.4142) {
793 # 112.5 < angle < 157.5, approximate to 135 (degree)
794 $tx = $t * 0.7071; $ty = $t * 0.7071;
795 $Rx = $R * 0.7071; $Ry = $R * 0.7071;
796 } else {
797 # error in determining angle
798 printf("error in determining angle: m=%.4f\n", $m);
799 }
800 } else { # calculate to exact
801 $dx= $y1 - $y2;
802 $dy= $x2 - $x1;
803 my $L = sqrt($dx*$dx + $dy*$dy);
804 $dx /= $L;
805 $dy /= $L;
806 $cx = -0.6*$dy; $cy=0.6*$dx;
807 $tx = $t*$dx; $ty = $t*$dy;
808 $Rx = $R*$dx; $Ry = $R*$dy;
809 }
810 }
811
812 # draw the line by triangle strip
813 glBegin(GL_TRIANGLE_STRIP);
814 if (!$alphablend) {
815 glColor3f($Br, $Bg, $Bb);
816 } else {
817 glColor4f($Cr, $Cg, $Cb, 0);
818 }
819 glVertex2f($x1 - $tx - $Rx, $y1 - $ty - $Ry); # fading edge
820 glVertex2f($x2 - $tx - $Rx, $y2 - $ty - $Ry);
821
822 if (!$alphablend) {
823 glColor3f($Cr, $Cg, $Cb);
824 } else {
825 glColor4f($Cr, $Cg, $Cb, $A);
826 }
827 glVertex2f($x1 - $tx, $y1 - $ty); # core
828 glVertex2f($x2 - $tx, $y2 - $ty);
829 glVertex2f($x1 + $tx, $y1 + $ty);
830 glVertex2f($x2 + $tx, $y2 + $ty);
831
832 if ((abs($dx) < $ALW || abs($dy) < $ALW) && $w <= 1.0) {
833 # printf("skipped one fading edge\n");
834 } else {
835 if (!$alphablend) {
836 glColor3f($Br, $Bg, $Bb);
837 } else {
838 glColor4f($Cr, $Cg, $Cb, 0);
839 }
840 glVertex2f($x1 + $tx+ $Rx, $y1 + $ty + $Ry); # fading edge
841 glVertex2f($x2 + $tx+ $Rx, $y2 + $ty + $Ry);
842 }
843 glEnd();
844
845 # cap
846 if ($w < 3) {
847 # do not draw cap
848 } else {
849 # draw cap
850 glBegin(GL_TRIANGLE_STRIP);
851 if (!$alphablend) {
852 glColor3f($Br, $Bg, $Bb);
853 } else {
854 glColor4f($Cr, $Cg, $Cb, 0);
855 }
856 glVertex2f($x1 - $Rx + $cx, $y1 - $Ry + $cy);
857 glVertex2f($x1 + $Rx + $cx, $y1 + $Ry + $cy);
858 glColor3f($Cr, $Cg, $Cb);
859 glVertex2f($x1 - $tx - $Rx, $y1 - $ty - $Ry);
860 glVertex2f($x1 + $tx + $Rx, $y1 + $ty + $Ry);
861 glEnd();
862 glBegin(GL_TRIANGLE_STRIP);
863 if (!$alphablend) {
864 glColor3f($Br, $Bg, $Bb);
865 } else {
866 glColor4f($Cr, $Cg, $Cb, 0);
867 }
868 glVertex2f($x2 - $Rx - $cx, $y2 - $Ry - $cy);
869 glVertex2f($x2 + $Rx - $cx, $y2 + $Ry - $cy);
870 glColor3f($Cr, $Cg, $Cb);
871 glVertex2f($x2 - $tx - $Rx, $y2 - $ty - $Ry);
872 glVertex2f($x2 + $tx + $Rx, $y2 + $ty + $Ry);
873 glEnd();
874 }
875 }
876
877
878 package Slic3r::GUI::Plater::2DToolpaths::Dialog;
879
880 use Wx qw(:dialog :id :misc :sizer);
881 use Wx::Event qw(EVT_CLOSE);
882 use base 'Wx::Dialog';
883
884 sub new {
885 my $class = shift;
886 my ($parent, $print) = @_;
887 my $self = $class->SUPER::new($parent, -1, "Toolpaths", wxDefaultPosition, [500,500], wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
888
889 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
890 $sizer->Add(Slic3r::GUI::Plater::2DToolpaths->new($self, $print), 1, wxEXPAND, 0);
891 $self->SetSizer($sizer);
892 $self->SetMinSize($self->GetSize);
893
894 # needed to actually free memory
895 EVT_CLOSE($self, sub {
896 $self->EndModal(wxID_OK);
897 $self->Destroy;
898 });
899
900 return $self;
901 }
902
903 1;
0 package Slic3r::GUI::Plater::3D;
1 use strict;
2 use warnings;
3 use utf8;
4
5 use List::Util qw();
6 use Slic3r::Geometry qw();
7 use Slic3r::Geometry::Clipper qw();
8 use Wx qw(:misc :pen :brush :sizer :font :cursor wxTAB_TRAVERSAL);
9 use Wx::Event qw();
10 use base qw(Slic3r::GUI::3DScene Class::Accessor);
11
12 sub new {
13 my $class = shift;
14 my ($parent, $objects, $model, $config) = @_;
15
16 my $self = $class->SUPER::new($parent);
17 $self->enable_picking(1);
18 $self->enable_moving(1);
19 $self->select_by('object');
20 $self->drag_by('instance');
21
22 $self->{objects} = $objects;
23 $self->{model} = $model;
24 $self->{config} = $config;
25 $self->{on_select_object} = sub {};
26 $self->{on_instances_moved} = sub {};
27
28 $self->on_select(sub {
29 my ($volume_idx) = @_;
30
31 my $obj_idx = undef;
32 if ($volume_idx != -1) {
33 $obj_idx = $self->object_idx($volume_idx);
34 }
35 $self->{on_select_object}->($obj_idx)
36 if $self->{on_select_object};
37 });
38 $self->on_move(sub {
39 my @volume_idxs = @_;
40
41 my %done = (); # prevent moving instances twice
42 foreach my $volume_idx (@volume_idxs) {
43 my $volume = $self->volumes->[$volume_idx];
44 my $obj_idx = $self->object_idx($volume_idx);
45 my $instance_idx = $self->instance_idx($volume_idx);
46 next if $done{"${obj_idx}_${instance_idx}"};
47 $done{"${obj_idx}_${instance_idx}"} = 1;
48
49 my $model_object = $self->{model}->get_object($obj_idx);
50 $model_object
51 ->instances->[$instance_idx]
52 ->offset
53 ->translate($volume->origin->x, $volume->origin->y); #))
54 $model_object->invalidate_bounding_box;
55 }
56
57 $self->{on_instances_moved}->()
58 if $self->{on_instances_moved};
59 });
60
61 return $self;
62 }
63
64 sub set_on_select_object {
65 my ($self, $cb) = @_;
66 $self->{on_select_object} = $cb;
67 }
68
69 sub set_on_double_click {
70 my ($self, $cb) = @_;
71 $self->on_double_click($cb);
72 }
73
74 sub set_on_right_click {
75 my ($self, $cb) = @_;
76 $self->on_right_click($cb);
77 }
78
79 sub set_on_instances_moved {
80 my ($self, $cb) = @_;
81 $self->{on_instances_moved} = $cb;
82 }
83
84 sub update {
85 my ($self) = @_;
86
87 $self->reset_objects;
88 $self->update_bed_size;
89
90 foreach my $obj_idx (0..$#{$self->{model}->objects}) {
91 my @volume_idxs = $self->load_object($self->{model}, $obj_idx);
92
93 if ($self->{objects}[$obj_idx]->selected) {
94 $self->select_volume($_) for @volume_idxs;
95 }
96 }
97 }
98
99 sub update_bed_size {
100 my ($self) = @_;
101 $self->set_bed_shape($self->{config}->bed_shape);
102 }
103
104 1;
0 package Slic3r::GUI::Plater::3DPreview;
1 use strict;
2 use warnings;
3 use utf8;
4
5 use Slic3r::Print::State ':steps';
6 use Wx qw(:misc :sizer :slider :statictext :keycode wxWHITE);
7 use Wx::Event qw(EVT_SLIDER EVT_KEY_DOWN EVT_CHECKBOX);
8 use base qw(Wx::Panel Class::Accessor);
9
10 __PACKAGE__->mk_accessors(qw(print enabled _loaded canvas slider_low slider_high single_layer));
11
12 sub new {
13 my $class = shift;
14 my ($parent, $print) = @_;
15
16 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition);
17
18 # init GUI elements
19 my $canvas = Slic3r::GUI::3DScene->new($self);
20 $self->canvas($canvas);
21 my $slider_low = Wx::Slider->new(
22 $self, -1,
23 0, # default
24 0, # min
25 # we set max to a bogus non-zero value because the MSW implementation of wxSlider
26 # will skip drawing the slider if max <= min:
27 1, # max
28 wxDefaultPosition,
29 wxDefaultSize,
30 wxVERTICAL | wxSL_INVERSE,
31 );
32 $self->slider_low($slider_low);
33 my $slider_high = Wx::Slider->new(
34 $self, -1,
35 0, # default
36 0, # min
37 # we set max to a bogus non-zero value because the MSW implementation of wxSlider
38 # will skip drawing the slider if max <= min:
39 1, # max
40 wxDefaultPosition,
41 wxDefaultSize,
42 wxVERTICAL | wxSL_INVERSE,
43 );
44 $self->slider_high($slider_high);
45
46 my $z_label_low = $self->{z_label_low} = Wx::StaticText->new($self, -1, "", wxDefaultPosition,
47 [40,-1], wxALIGN_CENTRE_HORIZONTAL);
48 $z_label_low->SetFont($Slic3r::GUI::small_font);
49 my $z_label_high = $self->{z_label_high} = Wx::StaticText->new($self, -1, "", wxDefaultPosition,
50 [40,-1], wxALIGN_CENTRE_HORIZONTAL);
51 $z_label_high->SetFont($Slic3r::GUI::small_font);
52
53 $self->single_layer(0);
54 my $checkbox_singlelayer = $self->{checkbox_singlelayer} = Wx::CheckBox->new($self, -1, "1 Layer");
55
56 my $hsizer = Wx::BoxSizer->new(wxHORIZONTAL);
57 my $vsizer = Wx::BoxSizer->new(wxVERTICAL);
58 my $vsizer_outer = Wx::BoxSizer->new(wxVERTICAL);
59 $vsizer->Add($slider_low, 3, 0, 0);
60 $vsizer->Add($z_label_low, 0, 0, 0);
61 $hsizer->Add($vsizer, 0, wxEXPAND, 0);
62 $vsizer = Wx::BoxSizer->new(wxVERTICAL);
63 $vsizer->Add($slider_high, 3, 0, 0);
64 $vsizer->Add($z_label_high, 0, 0, 0);
65 $hsizer->Add($vsizer, 0, wxEXPAND, 0);
66 $vsizer_outer->Add($hsizer, 3, wxALIGN_CENTER_HORIZONTAL, 0);
67 $vsizer_outer->Add($checkbox_singlelayer, 0, wxTOP | wxALIGN_CENTER_HORIZONTAL, 5);
68
69 my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
70 $sizer->Add($canvas, 1, wxALL | wxEXPAND, 0);
71 $sizer->Add($vsizer_outer, 0, wxTOP | wxBOTTOM | wxEXPAND, 5);
72
73 EVT_SLIDER($self, $slider_low, sub {
74 $slider_high->SetValue($slider_low->GetValue) if $self->single_layer;
75 $self->set_z_idx_low ($slider_low ->GetValue)
76 });
77 EVT_SLIDER($self, $slider_high, sub {
78 $slider_low->SetValue($slider_high->GetValue) if $self->single_layer;
79 $self->set_z_idx_high($slider_high->GetValue)
80 });
81 EVT_KEY_DOWN($canvas, sub {
82 my ($s, $event) = @_;
83 my $key = $event->GetKeyCode;
84 if ($key == ord('U') || $key == WXK_RIGHT) {
85 $slider_high->SetValue($slider_high->GetValue + 1);
86 $slider_low->SetValue($slider_high->GetValue) if ($event->ShiftDown());
87 $self->set_z_idx_high($slider_high->GetValue);
88 } elsif ($key == ord('D') || $key == WXK_LEFT) {
89 $slider_high->SetValue($slider_high->GetValue - 1);
90 $slider_low->SetValue($slider_high->GetValue) if ($event->ShiftDown());
91 $self->set_z_idx_high($slider_high->GetValue);
92 } elsif ($key == ord('S')) {
93 $checkbox_singlelayer->SetValue(! $checkbox_singlelayer->GetValue());
94 $self->single_layer($checkbox_singlelayer->GetValue());
95 if ($self->single_layer) {
96 $slider_low->SetValue($slider_high->GetValue);
97 $self->set_z_idx_high($slider_high->GetValue);
98 }
99 }
100 });
101 EVT_CHECKBOX($self, $checkbox_singlelayer, sub {
102 $self->single_layer($checkbox_singlelayer->GetValue());
103 if ($self->single_layer) {
104 $slider_low->SetValue($slider_high->GetValue);
105 $self->set_z_idx_high($slider_high->GetValue);
106 }
107 });
108
109 $self->SetSizer($sizer);
110 $self->SetMinSize($self->GetSize);
111 $sizer->SetSizeHints($self);
112
113 # init canvas
114 $self->print($print);
115 $self->reload_print;
116
117 return $self;
118 }
119
120 sub reload_print {
121 my ($self) = @_;
122
123 $self->canvas->reset_objects;
124 $self->_loaded(0);
125 $self->load_print;
126 }
127
128 sub load_print {
129 my ($self) = @_;
130
131 return if $self->_loaded;
132
133 # we require that there's at least one object and the posSlice step
134 # is performed on all of them (this ensures that _shifted_copies was
135 # populated and we know the number of layers)
136 my $n_layers = 0;
137 if ($self->print->object_step_done(STEP_SLICE)) {
138 my %z = (); # z => 1
139 foreach my $object (@{$self->{print}->objects}) {
140 foreach my $layer (@{$object->layers}, @{$object->support_layers}) {
141 $z{$layer->print_z} = 1;
142 }
143 }
144 $self->{layers_z} = [ sort { $a <=> $b } keys %z ];
145 $n_layers = scalar(@{$self->{layers_z}});
146 }
147
148 if ($n_layers == 0) {
149 $self->enabled(0);
150 $self->set_z_range(0,0);
151 $self->slider_low->Hide;
152 $self->slider_high->Hide;
153 $self->canvas->Refresh; # clears canvas
154 return;
155 }
156
157 my $z_idx_low = $self->slider_low->GetValue;
158 my $z_idx_high = $self->slider_high->GetValue;
159 $self->enabled(1);
160 $self->slider_low->SetRange(0, $n_layers - 1);
161 $self->slider_high->SetRange(0, $n_layers - 1);
162 if ($z_idx_high < $n_layers && ($self->single_layer || $z_idx_high != 0)) {
163 # use $z_idx
164 } else {
165 # Out of range. Disable 'single layer' view.
166 $self->single_layer(0);
167 $self->{checkbox_singlelayer}->SetValue(0);
168 $z_idx_low = 0;
169 $z_idx_high = $n_layers - 1;
170 }
171 if ($self->single_layer) {
172 $z_idx_low = $z_idx_high;
173 } elsif ($z_idx_low > $z_idx_high) {
174 $z_idx_low = 0;
175 }
176 $self->slider_low->SetValue($z_idx_low);
177 $self->slider_high->SetValue($z_idx_high);
178 $self->slider_low->Show;
179 $self->slider_high->Show;
180 $self->Layout;
181
182 if ($self->IsShown) {
183 # load skirt and brim
184 $self->canvas->load_print_toolpaths($self->print);
185
186 foreach my $object (@{$self->print->objects}) {
187 $self->canvas->load_print_object_toolpaths($object);
188
189 # Show the objects in very transparent color.
190 #my @volume_ids = $self->canvas->load_object($object->model_object);
191 #$self->canvas->volumes->[$_]->color->[3] = 0.2 for @volume_ids;
192 }
193 $self->canvas->zoom_to_volumes;
194 $self->_loaded(1);
195 }
196
197 $self->set_z_range($self->{layers_z}[$z_idx_low], $self->{layers_z}[$z_idx_high]);
198 }
199
200 sub set_z_range
201 {
202 my ($self, $z_low, $z_high) = @_;
203
204 return if !$self->enabled;
205 $self->{z_label_low}->SetLabel(sprintf '%.2f', $z_low);
206 $self->{z_label_high}->SetLabel(sprintf '%.2f', $z_high);
207 $self->canvas->set_toolpaths_range($z_low - 1e-6, $z_high + 1e-6);
208 $self->canvas->Refresh if $self->IsShown;
209 }
210
211 sub set_z_idx_low
212 {
213 my ($self, $idx_low) = @_;
214 if ($self->enabled) {
215 my $idx_high = $self->slider_high->GetValue;
216 if ($idx_low >= $idx_high) {
217 $idx_high = $idx_low;
218 $self->slider_high->SetValue($idx_high);
219 }
220 $self->set_z_range($self->{layers_z}[$idx_low], $self->{layers_z}[$idx_high]);
221 }
222 }
223
224 sub set_z_idx_high
225 {
226 my ($self, $idx_high) = @_;
227 if ($self->enabled) {
228 my $idx_low = $self->slider_low->GetValue;
229 if ($idx_low > $idx_high) {
230 $idx_low = $idx_high;
231 $self->slider_low->SetValue($idx_low);
232 }
233 $self->set_z_range($self->{layers_z}[$idx_low], $self->{layers_z}[$idx_high]);
234 }
235 }
236
237 sub set_bed_shape {
238 my ($self, $bed_shape) = @_;
239 $self->canvas->set_bed_shape($bed_shape);
240 }
241
242 1;
0 package Slic3r::GUI::Plater::3DToolpaths;
1 use strict;
2 use warnings;
3 use utf8;
4
5 use Slic3r::Print::State ':steps';
6 use Wx qw(:misc :sizer :slider :statictext wxWHITE);
7 use Wx::Event qw(EVT_SLIDER EVT_KEY_DOWN);
8 use base qw(Wx::Panel Class::Accessor);
9
10 __PACKAGE__->mk_accessors(qw(print enabled _loaded canvas slider));
11
12 sub new {
13 my $class = shift;
14 my ($parent, $print) = @_;
15
16 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition);
17
18 # init GUI elements
19 my $canvas = Slic3r::GUI::3DScene->new($self);
20 $self->canvas($canvas);
21 my $slider = Wx::Slider->new(
22 $self, -1,
23 0, # default
24 0, # min
25 # we set max to a bogus non-zero value because the MSW implementation of wxSlider
26 # will skip drawing the slider if max <= min:
27 1, # max
28 wxDefaultPosition,
29 wxDefaultSize,
30 wxVERTICAL | wxSL_INVERSE,
31 );
32 $self->slider($slider);
33
34 my $z_label = $self->{z_label} = Wx::StaticText->new($self, -1, "", wxDefaultPosition,
35 [40,-1], wxALIGN_CENTRE_HORIZONTAL);
36 $z_label->SetFont($Slic3r::GUI::small_font);
37
38 my $vsizer = Wx::BoxSizer->new(wxVERTICAL);
39 $vsizer->Add($slider, 1, wxALL | wxEXPAND | wxALIGN_CENTER, 3);
40 $vsizer->Add($z_label, 0, wxALL | wxEXPAND | wxALIGN_CENTER, 3);
41
42 my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
43 $sizer->Add($canvas, 1, wxALL | wxEXPAND, 0);
44 $sizer->Add($vsizer, 0, wxTOP | wxBOTTOM | wxEXPAND, 5);
45
46 EVT_SLIDER($self, $slider, sub {
47 $self->set_z($self->{layers_z}[$slider->GetValue])
48 if $self->enabled;
49 });
50 EVT_KEY_DOWN($canvas, sub {
51 my ($s, $event) = @_;
52
53 my $key = $event->GetKeyCode;
54 if ($key == 85 || $key == 315) {
55 $slider->SetValue($slider->GetValue + 1);
56 $self->set_z($self->{layers_z}[$slider->GetValue]);
57 } elsif ($key == 68 || $key == 317) {
58 $slider->SetValue($slider->GetValue - 1);
59 $self->set_z($self->{layers_z}[$slider->GetValue]);
60 }
61 });
62
63 $self->SetSizer($sizer);
64 $self->SetMinSize($self->GetSize);
65 $sizer->SetSizeHints($self);
66
67 # init canvas
68 $self->print($print);
69 $self->reload_print;
70
71 return $self;
72 }
73
74 sub reload_print {
75 my ($self) = @_;
76
77 $self->canvas->reset_objects;
78 $self->_loaded(0);
79 $self->load_print;
80 }
81
82 sub load_print {
83 my ($self) = @_;
84
85 return if $self->_loaded;
86
87 # we require that there's at least one object and the posSlice step
88 # is performed on all of them (this ensures that _shifted_copies was
89 # populated and we know the number of layers)
90 if (!$self->print->object_step_done(STEP_SLICE)) {
91 $self->enabled(0);
92 $self->slider->Hide;
93 $self->canvas->Refresh; # clears canvas
94 return;
95 }
96
97 my $z_idx;
98 {
99 my %z = (); # z => 1
100 foreach my $object (@{$self->{print}->objects}) {
101 foreach my $layer (@{$object->layers}, @{$object->support_layers}) {
102 $z{$layer->print_z} = 1;
103 }
104 }
105 $self->enabled(1);
106 $self->{layers_z} = [ sort { $a <=> $b } keys %z ];
107 $self->slider->SetRange(0, scalar(@{$self->{layers_z}})-1);
108 if (($z_idx = $self->slider->GetValue) <= $#{$self->{layers_z}} && $self->slider->GetValue != 0) {
109 # use $z_idx
110 } else {
111 $self->slider->SetValue(scalar(@{$self->{layers_z}})-1);
112 $z_idx = @{$self->{layers_z}} ? -1 : undef;
113 }
114 $self->slider->Show;
115 $self->Layout;
116 }
117
118 if ($self->IsShown) {
119 # load skirt and brim
120 $self->canvas->load_print_toolpaths($self->print);
121
122 foreach my $object (@{$self->print->objects}) {
123 $self->canvas->load_print_object_toolpaths($object);
124
125 # Show the objects in very transparent color.
126 #my @volume_ids = $self->canvas->load_object($object->model_object);
127 #$self->canvas->volumes->[$_]->color->[3] = 0.2 for @volume_ids;
128 }
129 $self->canvas->zoom_to_volumes;
130 $self->_loaded(1);
131 }
132
133 $self->set_z($self->{layers_z}[$z_idx]);
134 }
135
136 sub set_z {
137 my ($self, $z) = @_;
138
139 return if !$self->enabled;
140 $self->{z_label}->SetLabel(sprintf '%.2f', $z);
141 $self->canvas->set_toolpaths_range(0, $z);
142 $self->canvas->Refresh if $self->IsShown;
143 }
144
145 sub set_bed_shape {
146 my ($self, $bed_shape) = @_;
147 $self->canvas->set_bed_shape($bed_shape);
148 }
149
150 1;
0 # Cut an object at a Z position, keep either the top or the bottom of the object.
1 # This dialog gets opened with the "Cut..." button above the platter.
2
3 package Slic3r::GUI::Plater::ObjectCutDialog;
4 use strict;
5 use warnings;
6 use utf8;
7
8 use Slic3r::Geometry qw(PI X);
9 use Wx qw(wxTheApp :dialog :id :misc :sizer wxTAB_TRAVERSAL);
10 use Wx::Event qw(EVT_CLOSE EVT_BUTTON);
11 use base 'Wx::Dialog';
12
13 sub new {
14 my $class = shift;
15 my ($parent, %params) = @_;
16 my $self = $class->SUPER::new($parent, -1, $params{object}->name, wxDefaultPosition, [500,500], wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
17 $self->{model_object_idx} = $params{model_object_idx};
18 $self->{model_object} = $params{model_object};
19 $self->{new_model_objects} = [];
20 # Mark whether the mesh cut is valid.
21 # If not, it needs to be recalculated by _update() on wxTheApp->CallAfter() or on exit of the dialog.
22 $self->{mesh_cut_valid} = 0;
23 # Note whether the window was already closed, so a pending update is not executed.
24 $self->{already_closed} = 0;
25
26 # cut options
27 $self->{cut_options} = {
28 z => 0,
29 keep_upper => 1,
30 keep_lower => 1,
31 rotate_lower => 1,
32 preview => 1,
33 };
34
35 my $optgroup;
36 $optgroup = $self->{optgroup} = Slic3r::GUI::OptionsGroup->new(
37 parent => $self,
38 title => 'Cut',
39 on_change => sub {
40 my ($opt_id) = @_;
41 # There seems to be an issue with wxWidgets 3.0.2/3.0.3, where the slider
42 # genates tens of events for a single value change.
43 # Only trigger the recalculation if the value changes
44 # or a live preview was activated and the mesh cut is not valid yet.
45 if ($self->{cut_options}{$opt_id} != $optgroup->get_value($opt_id) ||
46 ! $self->{mesh_cut_valid} && $self->_life_preview_active()) {
47 $self->{cut_options}{$opt_id} = $optgroup->get_value($opt_id);
48 $self->{mesh_cut_valid} = 0;
49 wxTheApp->CallAfter(sub {
50 $self->_update;
51 });
52 }
53 },
54 label_width => 120,
55 );
56 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
57 opt_id => 'z',
58 type => 'slider',
59 label => 'Z',
60 default => $self->{cut_options}{z},
61 min => 0,
62 max => $self->{model_object}->bounding_box->size->z,
63 full_width => 1,
64 ));
65 {
66 my $line = Slic3r::GUI::OptionsGroup::Line->new(
67 label => 'Keep',
68 );
69 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
70 opt_id => 'keep_upper',
71 type => 'bool',
72 label => 'Upper part',
73 default => $self->{cut_options}{keep_upper},
74 ));
75 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
76 opt_id => 'keep_lower',
77 type => 'bool',
78 label => 'Lower part',
79 default => $self->{cut_options}{keep_lower},
80 ));
81 $optgroup->append_line($line);
82 }
83 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
84 opt_id => 'rotate_lower',
85 label => 'Rotate lower part upwards',
86 type => 'bool',
87 tooltip => 'If enabled, the lower part will be rotated by 180° so that the flat cut surface lies on the print bed.',
88 default => $self->{cut_options}{rotate_lower},
89 ));
90 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
91 opt_id => 'preview',
92 label => 'Show preview',
93 type => 'bool',
94 tooltip => 'If enabled, object will be cut in real time.',
95 default => $self->{cut_options}{preview},
96 ));
97 {
98 my $cut_button_sizer = Wx::BoxSizer->new(wxVERTICAL);
99 $self->{btn_cut} = Wx::Button->new($self, -1, "Perform cut", wxDefaultPosition, wxDefaultSize);
100 $cut_button_sizer->Add($self->{btn_cut}, 0, wxALIGN_RIGHT | wxALL, 10);
101 $optgroup->append_line(Slic3r::GUI::OptionsGroup::Line->new(
102 sizer => $cut_button_sizer,
103 ));
104 }
105
106 # left pane with tree
107 my $left_sizer = Wx::BoxSizer->new(wxVERTICAL);
108 $left_sizer->Add($optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
109
110 # right pane with preview canvas
111 my $canvas;
112 if ($Slic3r::GUI::have_OpenGL) {
113 $canvas = $self->{canvas} = Slic3r::GUI::3DScene->new($self);
114 $canvas->load_object($self->{model_object}, undef, [0]);
115 $canvas->set_auto_bed_shape;
116 $canvas->SetSize([500,500]);
117 $canvas->SetMinSize($canvas->GetSize);
118 $canvas->zoom_to_volumes;
119 }
120
121 $self->{sizer} = Wx::BoxSizer->new(wxHORIZONTAL);
122 $self->{sizer}->Add($left_sizer, 0, wxEXPAND | wxTOP | wxBOTTOM, 10);
123 $self->{sizer}->Add($canvas, 1, wxEXPAND | wxALL, 0) if $canvas;
124
125 $self->SetSizer($self->{sizer});
126 $self->SetMinSize($self->GetSize);
127 $self->{sizer}->SetSizeHints($self);
128
129 EVT_BUTTON($self, $self->{btn_cut}, sub {
130 # Recalculate the cut if the preview was not active.
131 $self->_perform_cut() unless $self->{mesh_cut_valid};
132
133 # Adjust position / orientation of the split object halves.
134 if ($self->{new_model_objects}{lower}) {
135 if ($self->{cut_options}{rotate_lower}) {
136 $self->{new_model_objects}{lower}->rotate(PI, X);
137 $self->{new_model_objects}{lower}->center_around_origin; # align to Z = 0
138 }
139 }
140 if ($self->{new_model_objects}{upper}) {
141 $self->{new_model_objects}{upper}->center_around_origin; # align to Z = 0
142 }
143
144 # Note that the window was already closed, so a pending update will not be executed.
145 $self->{already_closed} = 1;
146 $self->EndModal(wxID_OK);
147 $self->Destroy();
148 });
149
150 EVT_CLOSE($self, sub {
151 # Note that the window was already closed, so a pending update will not be executed.
152 $self->{already_closed} = 1;
153 $self->EndModal(wxID_CANCEL);
154 $self->Destroy();
155 });
156
157 $self->_update;
158
159 return $self;
160 }
161
162 # scale Z down to original size since we're using the transformed mesh for 3D preview
163 # and cut dialog but ModelObject::cut() needs Z without any instance transformation
164 sub _mesh_slice_z_pos
165 {
166 my ($self) = @_;
167 return $self->{cut_options}{z} / $self->{model_object}->instances->[0]->scaling_factor;
168 }
169
170 # Only perform live preview if just a single part of the object shall survive.
171 sub _life_preview_active
172 {
173 my ($self) = @_;
174 return $self->{cut_options}{preview} && ($self->{cut_options}{keep_upper} != $self->{cut_options}{keep_lower});
175 }
176
177 # Slice the mesh, keep the top / bottom part.
178 sub _perform_cut
179 {
180 my ($self) = @_;
181
182 # Early exit. If the cut is valid, don't recalculate it.
183 return if $self->{mesh_cut_valid};
184
185 my $z = $self->_mesh_slice_z_pos();
186
187 my ($new_model) = $self->{model_object}->cut($z);
188 my ($upper_object, $lower_object) = @{$new_model->objects};
189 $self->{new_model} = $new_model;
190 $self->{new_model_objects} = {};
191 if ($self->{cut_options}{keep_upper} && $upper_object->volumes_count > 0) {
192 $self->{new_model_objects}{upper} = $upper_object;
193 }
194 if ($self->{cut_options}{keep_lower} && $lower_object->volumes_count > 0) {
195 $self->{new_model_objects}{lower} = $lower_object;
196 }
197
198 $self->{mesh_cut_valid} = 1;
199 }
200
201 sub _update {
202 my ($self) = @_;
203
204 # Don't update if the window was already closed.
205 # We are not sure whether the action planned by wxTheApp->CallAfter() may be triggered after the window is closed.
206 # Probably not, but better be safe than sorry, which is espetially true on multiple platforms.
207 return if $self->{already_closed};
208
209 # Only recalculate the cut, if the live cut preview is active.
210 my $life_preview_active = $self->_life_preview_active();
211 $self->_perform_cut() if $life_preview_active;
212
213 {
214 # scale Z down to original size since we're using the transformed mesh for 3D preview
215 # and cut dialog but ModelObject::cut() needs Z without any instance transformation
216 my $z = $self->_mesh_slice_z_pos();
217
218
219 # update canvas
220 if ($self->{canvas}) {
221 # get volumes to render
222 my @objects = ();
223 if ($life_preview_active) {
224 push @objects, values %{$self->{new_model_objects}};
225 } else {
226 push @objects, $self->{model_object};
227 }
228
229 # get section contour
230 my @expolygons = ();
231 foreach my $volume (@{$self->{model_object}->volumes}) {
232 next if !$volume->mesh;
233 next if $volume->modifier;
234 my $expp = $volume->mesh->slice([ $z + $volume->mesh->bounding_box->z_min ])->[0];
235 push @expolygons, @$expp;
236 }
237 foreach my $expolygon (@expolygons) {
238 $self->{model_object}->instances->[0]->transform_polygon($_)
239 for @$expolygon;
240 $expolygon->translate(map Slic3r::Geometry::scale($_), @{ $self->{model_object}->instances->[0]->offset });
241 }
242
243 $self->{canvas}->reset_objects;
244 $self->{canvas}->load_object($_, undef, [0]) for @objects;
245 $self->{canvas}->SetCuttingPlane(
246 $self->{cut_options}{z},
247 [@expolygons],
248 );
249 $self->{canvas}->Render;
250 }
251 }
252
253 # update controls
254 {
255 my $z = $self->{cut_options}{z};
256 my $optgroup = $self->{optgroup};
257 $optgroup->get_field('keep_upper')->toggle(my $have_upper = abs($z - $optgroup->get_option('z')->max) > 0.1);
258 $optgroup->get_field('keep_lower')->toggle(my $have_lower = $z > 0.1);
259 $optgroup->get_field('rotate_lower')->toggle($z > 0 && $self->{cut_options}{keep_lower});
260 $optgroup->get_field('preview')->toggle($self->{cut_options}{keep_upper} != $self->{cut_options}{keep_lower});
261
262 # update cut button
263 if (($self->{cut_options}{keep_upper} && $have_upper)
264 || ($self->{cut_options}{keep_lower} && $have_lower)) {
265 $self->{btn_cut}->Enable;
266 } else {
267 $self->{btn_cut}->Disable;
268 }
269 }
270 }
271
272 sub NewModelObjects {
273 my ($self) = @_;
274 return values %{ $self->{new_model_objects} };
275 }
276
277 1;
0 # Configuration of mesh modifiers and their parameters.
1 # This panel is inserted into ObjectSettingsDialog.
2
3 package Slic3r::GUI::Plater::ObjectPartsPanel;
4 use strict;
5 use warnings;
6 use utf8;
7
8 use File::Basename qw(basename);
9 use Wx qw(:misc :sizer :treectrl :button wxTAB_TRAVERSAL wxSUNKEN_BORDER wxBITMAP_TYPE_PNG
10 wxTheApp);
11 use Wx::Event qw(EVT_BUTTON EVT_TREE_ITEM_COLLAPSING EVT_TREE_SEL_CHANGED);
12 use base 'Wx::Panel';
13
14 use constant ICON_OBJECT => 0;
15 use constant ICON_SOLIDMESH => 1;
16 use constant ICON_MODIFIERMESH => 2;
17
18 sub new {
19 my $class = shift;
20 my ($parent, %params) = @_;
21 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
22
23 my $object = $self->{model_object} = $params{model_object};
24
25 # create TreeCtrl
26 my $tree = $self->{tree} = Wx::TreeCtrl->new($self, -1, wxDefaultPosition, [300, 100],
27 wxTR_NO_BUTTONS | wxSUNKEN_BORDER | wxTR_HAS_VARIABLE_ROW_HEIGHT
28 | wxTR_SINGLE | wxTR_NO_BUTTONS);
29 {
30 $self->{tree_icons} = Wx::ImageList->new(16, 16, 1);
31 $tree->AssignImageList($self->{tree_icons});
32 $self->{tree_icons}->Add(Wx::Bitmap->new($Slic3r::var->("brick.png"), wxBITMAP_TYPE_PNG)); # ICON_OBJECT
33 $self->{tree_icons}->Add(Wx::Bitmap->new($Slic3r::var->("package.png"), wxBITMAP_TYPE_PNG)); # ICON_SOLIDMESH
34 $self->{tree_icons}->Add(Wx::Bitmap->new($Slic3r::var->("plugin.png"), wxBITMAP_TYPE_PNG)); # ICON_MODIFIERMESH
35
36 my $rootId = $tree->AddRoot("Object", ICON_OBJECT);
37 $tree->SetPlData($rootId, { type => 'object' });
38 }
39
40 # buttons
41 $self->{btn_load_part} = Wx::Button->new($self, -1, "Load part…", wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
42 $self->{btn_load_modifier} = Wx::Button->new($self, -1, "Load modifier…", wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
43 $self->{btn_delete} = Wx::Button->new($self, -1, "Delete part", wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
44 if ($Slic3r::GUI::have_button_icons) {
45 $self->{btn_load_part}->SetBitmap(Wx::Bitmap->new($Slic3r::var->("brick_add.png"), wxBITMAP_TYPE_PNG));
46 $self->{btn_load_modifier}->SetBitmap(Wx::Bitmap->new($Slic3r::var->("brick_add.png"), wxBITMAP_TYPE_PNG));
47 $self->{btn_delete}->SetBitmap(Wx::Bitmap->new($Slic3r::var->("brick_delete.png"), wxBITMAP_TYPE_PNG));
48 }
49
50 # buttons sizer
51 my $buttons_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
52 $buttons_sizer->Add($self->{btn_load_part}, 0);
53 $buttons_sizer->Add($self->{btn_load_modifier}, 0);
54 $buttons_sizer->Add($self->{btn_delete}, 0);
55 $self->{btn_load_part}->SetFont($Slic3r::GUI::small_font);
56 $self->{btn_load_modifier}->SetFont($Slic3r::GUI::small_font);
57 $self->{btn_delete}->SetFont($Slic3r::GUI::small_font);
58
59 # part settings panel
60 $self->{settings_panel} = Slic3r::GUI::Plater::OverrideSettingsPanel->new($self, on_change => sub { $self->{part_settings_changed} = 1; });
61 my $settings_sizer = Wx::StaticBoxSizer->new($self->{staticbox} = Wx::StaticBox->new($self, -1, "Part Settings"), wxVERTICAL);
62 $settings_sizer->Add($self->{settings_panel}, 1, wxEXPAND | wxALL, 0);
63
64 # left pane with tree
65 my $left_sizer = Wx::BoxSizer->new(wxVERTICAL);
66 $left_sizer->Add($tree, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 10);
67 $left_sizer->Add($buttons_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 10);
68 $left_sizer->Add($settings_sizer, 1, wxEXPAND | wxALL, 0);
69
70 # right pane with preview canvas
71 my $canvas;
72 if ($Slic3r::GUI::have_OpenGL) {
73 $canvas = $self->{canvas} = Slic3r::GUI::3DScene->new($self);
74 $canvas->enable_picking(1);
75 $canvas->select_by('volume');
76
77 $canvas->on_select(sub {
78 my ($volume_idx) = @_;
79
80 # convert scene volume to model object volume
81 $self->reload_tree($canvas->volume_idx($volume_idx));
82 });
83
84 $canvas->load_object($self->{model_object}, undef, [0]);
85 $canvas->set_auto_bed_shape;
86 $canvas->SetSize([500,500]);
87 $canvas->zoom_to_volumes;
88 }
89
90 $self->{sizer} = Wx::BoxSizer->new(wxHORIZONTAL);
91 $self->{sizer}->Add($left_sizer, 0, wxEXPAND | wxALL, 0);
92 $self->{sizer}->Add($canvas, 1, wxEXPAND | wxALL, 0) if $canvas;
93
94 $self->SetSizer($self->{sizer});
95 $self->{sizer}->SetSizeHints($self);
96
97 # attach events
98 EVT_TREE_ITEM_COLLAPSING($self, $tree, sub {
99 my ($self, $event) = @_;
100 $event->Veto;
101 });
102 EVT_TREE_SEL_CHANGED($self, $tree, sub {
103 my ($self, $event) = @_;
104 return if $self->{disable_tree_sel_changed_event};
105 $self->selection_changed;
106 });
107 EVT_BUTTON($self, $self->{btn_load_part}, sub { $self->on_btn_load(0) });
108 EVT_BUTTON($self, $self->{btn_load_modifier}, sub { $self->on_btn_load(1) });
109 EVT_BUTTON($self, $self->{btn_delete}, \&on_btn_delete);
110
111 $self->reload_tree;
112
113 return $self;
114 }
115
116 sub reload_tree {
117 my ($self, $selected_volume_idx) = @_;
118
119 $selected_volume_idx //= -1;
120 my $object = $self->{model_object};
121 my $tree = $self->{tree};
122 my $rootId = $tree->GetRootItem;
123
124 # despite wxWidgets states that DeleteChildren "will not generate any events unlike Delete() method",
125 # the MSW implementation of DeleteChildren actually calls Delete() for each item, so
126 # EVT_TREE_SEL_CHANGED is being called, with bad effects (the event handler is called; this
127 # subroutine is never continued; an invisible EndModal is called on the dialog causing Plater
128 # to continue its logic and rescheduling the background process etc. GH #2774)
129 $self->{disable_tree_sel_changed_event} = 1;
130 $tree->DeleteChildren($rootId);
131 $self->{disable_tree_sel_changed_event} = 0;
132
133 my $selectedId = $rootId;
134 foreach my $volume_id (0..$#{$object->volumes}) {
135 my $volume = $object->volumes->[$volume_id];
136
137 my $icon = $volume->modifier ? ICON_MODIFIERMESH : ICON_SOLIDMESH;
138 my $itemId = $tree->AppendItem($rootId, $volume->name || $volume_id, $icon);
139 if ($volume_id == $selected_volume_idx) {
140 $selectedId = $itemId;
141 }
142 $tree->SetPlData($itemId, {
143 type => 'volume',
144 volume_id => $volume_id,
145 });
146 }
147 $tree->ExpandAll;
148
149 Slic3r::GUI->CallAfter(sub {
150 $self->{tree}->SelectItem($selectedId);
151
152 # SelectItem() should trigger EVT_TREE_SEL_CHANGED as per wxWidgets docs,
153 # but in fact it doesn't if the given item is already selected (this happens
154 # on first load)
155 $self->selection_changed;
156 });
157 }
158
159 sub get_selection {
160 my ($self) = @_;
161
162 my $nodeId = $self->{tree}->GetSelection;
163 if ($nodeId->IsOk) {
164 return $self->{tree}->GetPlData($nodeId);
165 }
166 return undef;
167 }
168
169 sub selection_changed {
170 my ($self) = @_;
171
172 # deselect all meshes
173 if ($self->{canvas}) {
174 $_->selected(0) for @{$self->{canvas}->volumes};
175 }
176
177 # disable things as if nothing is selected
178 $self->{btn_delete}->Disable;
179 $self->{settings_panel}->disable;
180 $self->{settings_panel}->set_config(undef);
181
182 if (my $itemData = $self->get_selection) {
183 my ($config, @opt_keys);
184 if ($itemData->{type} eq 'volume') {
185 # select volume in 3D preview
186 if ($self->{canvas}) {
187 $self->{canvas}->volumes->[ $itemData->{volume_id} ]{selected} = 1;
188 }
189 $self->{btn_delete}->Enable;
190
191 # attach volume config to settings panel
192 my $volume = $self->{model_object}->volumes->[ $itemData->{volume_id} ];
193 $config = $volume->config;
194 $self->{staticbox}->SetLabel('Part Settings');
195
196 # get default values
197 @opt_keys = @{Slic3r::Config::PrintRegion->new->get_keys};
198 } elsif ($itemData->{type} eq 'object') {
199 # select nothing in 3D preview
200
201 # attach object config to settings panel
202 $self->{staticbox}->SetLabel('Object Settings');
203 @opt_keys = (map @{$_->get_keys}, Slic3r::Config::PrintObject->new, Slic3r::Config::PrintRegion->new);
204 $config = $self->{model_object}->config;
205 }
206 # get default values
207 my $default_config = Slic3r::Config->new_from_defaults(@opt_keys);
208
209 # append default extruder
210 push @opt_keys, 'extruder';
211 $default_config->set('extruder', 0);
212 $config->set_ifndef('extruder', 0);
213 $self->{settings_panel}->set_default_config($default_config);
214 $self->{settings_panel}->set_config($config);
215 $self->{settings_panel}->set_opt_keys(\@opt_keys);
216 $self->{settings_panel}->set_fixed_options([qw(extruder)]);
217 $self->{settings_panel}->enable;
218 }
219
220 $self->{canvas}->Render if $self->{canvas};
221 }
222
223 sub on_btn_load {
224 my ($self, $is_modifier) = @_;
225
226 my @input_files = wxTheApp->open_model($self);
227 foreach my $input_file (@input_files) {
228 my $model = eval { Slic3r::Model->read_from_file($input_file) };
229 if ($@) {
230 Slic3r::GUI::show_error($self, $@);
231 next;
232 }
233
234 foreach my $object (@{$model->objects}) {
235 foreach my $volume (@{$object->volumes}) {
236 my $new_volume = $self->{model_object}->add_volume($volume);
237 $new_volume->set_modifier($is_modifier);
238 $new_volume->set_name(basename($input_file));
239
240 # apply the same translation we applied to the object
241 $new_volume->mesh->translate(@{$self->{model_object}->origin_translation});
242
243 # set a default extruder value, since user can't add it manually
244 $new_volume->config->set_ifndef('extruder', 0);
245
246 $self->{parts_changed} = 1;
247 }
248 }
249 }
250
251 $self->_parts_changed;
252 }
253
254 sub on_btn_delete {
255 my ($self) = @_;
256
257 my $itemData = $self->get_selection;
258 if ($itemData && $itemData->{type} eq 'volume') {
259 my $volume = $self->{model_object}->volumes->[$itemData->{volume_id}];
260
261 # if user is deleting the last solid part, throw error
262 if (!$volume->modifier && scalar(grep !$_->modifier, @{$self->{model_object}->volumes}) == 1) {
263 Slic3r::GUI::show_error($self, "You can't delete the last solid part from this object.");
264 return;
265 }
266
267 $self->{model_object}->delete_volume($itemData->{volume_id});
268 $self->{parts_changed} = 1;
269 }
270
271 $self->_parts_changed;
272 }
273
274 sub _parts_changed {
275 my ($self) = @_;
276
277 $self->reload_tree;
278 if ($self->{canvas}) {
279 $self->{canvas}->reset_objects;
280 $self->{canvas}->load_object($self->{model_object});
281 $self->{canvas}->zoom_to_volumes;
282 $self->{canvas}->Render;
283 }
284 }
285
286 sub CanClose {
287 my $self = shift;
288
289 return 1; # skip validation for now
290
291 # validate options before allowing user to dismiss the dialog
292 # the validate method only works on full configs so we have
293 # to merge our settings with the default ones
294 my $config = Slic3r::Config->merge($self->GetParent->GetParent->GetParent->GetParent->GetParent->config, $self->model_object->config);
295 eval {
296 $config->validate;
297 };
298 return 0 if Slic3r::GUI::catch_error($self);
299 return 1;
300 }
301
302 sub PartsChanged {
303 my ($self) = @_;
304 return $self->{parts_changed};
305 }
306
307 sub PartSettingsChanged {
308 my ($self) = @_;
309 return $self->{part_settings_changed};
310 }
311
312 1;
0 # This dialog opens up when double clicked on an object line in the list at the right side of the platter.
1 # One may load additional STLs and additional modifier STLs,
2 # one may change the properties of the print per each modifier mesh or a Z-span.
3
4 package Slic3r::GUI::Plater::ObjectSettingsDialog;
5 use strict;
6 use warnings;
7 use utf8;
8
9 use Wx qw(:dialog :id :misc :sizer :systemsettings :notebook wxTAB_TRAVERSAL);
10 use Wx::Event qw(EVT_BUTTON);
11 use base 'Wx::Dialog';
12
13 sub new {
14 my $class = shift;
15 my ($parent, %params) = @_;
16 my $self = $class->SUPER::new($parent, -1, "Settings for " . $params{object}->name, wxDefaultPosition, [700,500], wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
17 $self->{$_} = $params{$_} for keys %params;
18
19 $self->{tabpanel} = Wx::Notebook->new($self, -1, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL);
20 $self->{tabpanel}->AddPage($self->{parts} = Slic3r::GUI::Plater::ObjectPartsPanel->new($self->{tabpanel}, model_object => $params{model_object}), "Parts");
21 $self->{tabpanel}->AddPage($self->{layers} = Slic3r::GUI::Plater::ObjectDialog::LayersTab->new($self->{tabpanel}), "Layers");
22
23 my $buttons = $self->CreateStdDialogButtonSizer(wxOK);
24 EVT_BUTTON($self, wxID_OK, sub {
25 # validate user input
26 return if !$self->{parts}->CanClose;
27 return if !$self->{layers}->CanClose;
28
29 # notify tabs
30 $self->{layers}->Closing;
31
32 $self->EndModal(wxID_OK);
33 $self->Destroy;
34 });
35
36 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
37 $sizer->Add($self->{tabpanel}, 1, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 10);
38 $sizer->Add($buttons, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
39
40 $self->SetSizer($sizer);
41 $self->SetMinSize($self->GetSize);
42
43 return $self;
44 }
45
46 sub PartsChanged {
47 my ($self) = @_;
48 return $self->{parts}->PartsChanged;
49 }
50
51 sub PartSettingsChanged {
52 my ($self) = @_;
53 return $self->{parts}->PartSettingsChanged || $self->{layers}->LayersChanged;
54 }
55
56 package Slic3r::GUI::Plater::ObjectDialog::BaseTab;
57 use base 'Wx::Panel';
58
59 sub model_object {
60 my ($self) = @_;
61 return $self->GetParent->GetParent->{model_object};
62 }
63
64 package Slic3r::GUI::Plater::ObjectDialog::LayersTab;
65 use Wx qw(:dialog :id :misc :sizer :systemsettings);
66 use Wx::Grid;
67 use Wx::Event qw(EVT_GRID_CELL_CHANGED);
68 use base 'Slic3r::GUI::Plater::ObjectDialog::BaseTab';
69
70 sub new {
71 my $class = shift;
72 my ($parent, %params) = @_;
73 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize);
74
75 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
76
77 {
78 my $label = Wx::StaticText->new($self, -1, "You can use this section to override the default layer height for parts of this object. Set layer height to zero to skip portions of the input file.",
79 wxDefaultPosition, [-1, 40]);
80 $label->SetFont(Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
81 $sizer->Add($label, 0, wxEXPAND | wxALL, 10);
82 }
83
84 my $grid = $self->{grid} = Wx::Grid->new($self, -1, wxDefaultPosition, wxDefaultSize);
85 $sizer->Add($grid, 1, wxEXPAND | wxALL, 10);
86 $grid->CreateGrid(0, 3);
87 $grid->DisableDragRowSize;
88 $grid->HideRowLabels if &Wx::wxVERSION_STRING !~ / 2\.8\./;
89 $grid->SetColLabelValue(0, "Min Z (mm)");
90 $grid->SetColLabelValue(1, "Max Z (mm)");
91 $grid->SetColLabelValue(2, "Layer height (mm)");
92 $grid->SetColSize($_, 135) for 0..2;
93 $grid->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
94
95 # load data
96 foreach my $range (@{ $self->model_object->layer_height_ranges }) {
97 $grid->AppendRows(1);
98 my $i = $grid->GetNumberRows-1;
99 $grid->SetCellValue($i, $_, $range->[$_]) for 0..2;
100 }
101 $grid->AppendRows(1); # append one empty row
102
103 EVT_GRID_CELL_CHANGED($grid, sub {
104 my ($grid, $event) = @_;
105
106 # remove any non-numeric character
107 my $value = $grid->GetCellValue($event->GetRow, $event->GetCol);
108 $value =~ s/,/./g;
109 $value =~ s/[^0-9.]//g;
110 $grid->SetCellValue($event->GetRow, $event->GetCol, $value);
111
112 # if there's no empty row, let's append one
113 for my $i (0 .. $grid->GetNumberRows) {
114 if ($i == $grid->GetNumberRows) {
115 # if we're here then we found no empty row
116 $grid->AppendRows(1);
117 last;
118 }
119 if (!grep $grid->GetCellValue($i, $_), 0..2) {
120 # exit loop if this row is empty
121 last;
122 }
123 }
124
125 $self->{layers_changed} = 1;
126 });
127
128 $self->SetSizer($sizer);
129 $sizer->SetSizeHints($self);
130
131 return $self;
132 }
133
134 sub CanClose {
135 my $self = shift;
136
137 # validate ranges before allowing user to dismiss the dialog
138
139 foreach my $range ($self->_get_ranges) {
140 my ($min, $max, $height) = @$range;
141 if ($max <= $min) {
142 Slic3r::GUI::show_error($self, "Invalid Z range $min-$max.");
143 return 0;
144 }
145 if ($min < 0 || $max < 0) {
146 Slic3r::GUI::show_error($self, "Invalid Z range $min-$max.");
147 return 0;
148 }
149 if ($height < 0) {
150 Slic3r::GUI::show_error($self, "Invalid layer height $height.");
151 return 0;
152 }
153 # TODO: check for overlapping ranges
154 }
155
156 return 1;
157 }
158
159 sub Closing {
160 my $self = shift;
161
162 # save ranges into the plater object
163 $self->model_object->set_layer_height_ranges([ $self->_get_ranges ]);
164 }
165
166 sub _get_ranges {
167 my $self = shift;
168
169 my @ranges = ();
170 for my $i (0 .. $self->{grid}->GetNumberRows-1) {
171 my ($min, $max, $height) = map $self->{grid}->GetCellValue($i, $_), 0..2;
172 next if $min eq '' || $max eq '' || $height eq '';
173 push @ranges, [ $min, $max, $height ];
174 }
175 return sort { $a->[0] <=> $b->[0] } @ranges;
176 }
177
178 sub LayersChanged {
179 my ($self) = @_;
180 return $self->{layers_changed};
181 }
182
183 1;
0 # Included in ObjectSettingsDialog -> ObjectPartsPanel.
1 # Maintains, displays, adds and removes overrides of slicing parameters for an object and its modifier mesh.
2
3 package Slic3r::GUI::Plater::OverrideSettingsPanel;
4 use strict;
5 use warnings;
6 use utf8;
7
8 use List::Util qw(first);
9 use Wx qw(:misc :sizer :button wxTAB_TRAVERSAL wxSUNKEN_BORDER wxBITMAP_TYPE_PNG
10 wxTheApp);
11 use Wx::Event qw(EVT_BUTTON EVT_LEFT_DOWN EVT_MENU);
12 use base 'Wx::ScrolledWindow';
13
14 use constant ICON_MATERIAL => 0;
15 use constant ICON_SOLIDMESH => 1;
16 use constant ICON_MODIFIERMESH => 2;
17
18 sub new {
19 my $class = shift;
20 my ($parent, %params) = @_;
21 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
22 $self->{default_config} = Slic3r::Config->new;
23 $self->{config} = Slic3r::Config->new;
24 $self->{on_change} = $params{on_change};
25 $self->{fixed_options} = {};
26
27 $self->{sizer} = Wx::BoxSizer->new(wxVERTICAL);
28
29 $self->{options_sizer} = Wx::BoxSizer->new(wxVERTICAL);
30 $self->{sizer}->Add($self->{options_sizer}, 0, wxEXPAND | wxALL, 0);
31
32 # option selector
33 {
34 # create the button
35 my $btn = $self->{btn_add} = Wx::BitmapButton->new($self, -1, Wx::Bitmap->new($Slic3r::var->("add.png"), wxBITMAP_TYPE_PNG),
36 wxDefaultPosition, wxDefaultSize, Wx::wxBORDER_NONE);
37 EVT_LEFT_DOWN($btn, sub {
38 my $menu = Wx::Menu->new;
39 foreach my $opt_key (@{$self->{options}}) {
40 my $id = &Wx::NewId();
41 $menu->Append($id, $self->{option_labels}{$opt_key});
42 EVT_MENU($menu, $id, sub {
43 $self->{config}->set($opt_key, $self->{default_config}->get($opt_key));
44 $self->update_optgroup;
45 $self->{on_change}->() if $self->{on_change};
46 });
47 }
48 $self->PopupMenu($menu, $btn->GetPosition);
49 $menu->Destroy;
50 });
51
52 my $h_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
53 $h_sizer->Add($btn, 0, wxALL, 0);
54 $self->{sizer}->Add($h_sizer, 0, wxEXPAND | wxBOTTOM, 10);
55 }
56
57 $self->SetSizer($self->{sizer});
58 $self->SetScrollbars(0, 1, 0, 1);
59
60 $self->set_opt_keys($params{opt_keys}) if $params{opt_keys};
61 $self->update_optgroup;
62
63 return $self;
64 }
65
66 sub set_default_config {
67 my ($self, $config) = @_;
68 $self->{default_config} = $config;
69 }
70
71 sub set_config {
72 my ($self, $config) = @_;
73 $self->{config} = $config;
74 $self->update_optgroup;
75 }
76
77 sub set_opt_keys {
78 my ($self, $opt_keys) = @_;
79
80 # sort options by category+label
81 $self->{option_labels} = {
82 map { $_ => sprintf('%s > %s', $Slic3r::Config::Options->{$_}{category}, $Slic3r::Config::Options->{$_}{full_label} // $Slic3r::Config::Options->{$_}{label}) } @$opt_keys
83 };
84 $self->{options} = [ sort { $self->{option_labels}{$a} cmp $self->{option_labels}{$b} } @$opt_keys ];
85 }
86
87 sub set_fixed_options {
88 my ($self, $opt_keys) = @_;
89 $self->{fixed_options} = { map {$_ => 1} @$opt_keys };
90 $self->update_optgroup;
91 }
92
93 sub update_optgroup {
94 my $self = shift;
95
96 $self->{options_sizer}->Clear(1);
97 return if !defined $self->{config};
98
99 my %categories = ();
100 foreach my $opt_key (@{$self->{config}->get_keys}) {
101 my $category = $Slic3r::Config::Options->{$opt_key}{category};
102 $categories{$category} ||= [];
103 push @{$categories{$category}}, $opt_key;
104 }
105 foreach my $category (sort keys %categories) {
106 my $optgroup = Slic3r::GUI::ConfigOptionsGroup->new(
107 parent => $self,
108 title => $category,
109 config => $self->{config},
110 full_labels => 1,
111 label_font => $Slic3r::GUI::small_font,
112 sidetext_font => $Slic3r::GUI::small_font,
113 label_width => 120,
114 on_change => sub { $self->{on_change}->() if $self->{on_change} },
115 extra_column => sub {
116 my ($line) = @_;
117
118 my $opt_key = $line->get_options->[0]->opt_id; # we assume that we have one option per line
119
120 # disallow deleting fixed options
121 return undef if $self->{fixed_options}{$opt_key};
122
123 my $btn = Wx::BitmapButton->new($self, -1, Wx::Bitmap->new($Slic3r::var->("delete.png"), wxBITMAP_TYPE_PNG),
124 wxDefaultPosition, wxDefaultSize, Wx::wxBORDER_NONE);
125 EVT_BUTTON($self, $btn, sub {
126 $self->{config}->erase($opt_key);
127 $self->{on_change}->() if $self->{on_change};
128 wxTheApp->CallAfter(sub { $self->update_optgroup });
129 });
130 return $btn;
131 },
132 );
133 foreach my $opt_key (sort @{$categories{$category}}) {
134 $optgroup->append_single_option_line($opt_key);
135 }
136 $self->{options_sizer}->Add($optgroup->sizer, 0, wxEXPAND | wxBOTTOM, 0);
137 }
138 $self->GetParent->Layout; # we need this for showing scrollbars
139 }
140
141 # work around a wxMAC bug causing controls not being disabled when calling Disable() on a Window
142 sub enable {
143 my ($self) = @_;
144
145 $self->{btn_add}->Enable;
146 $self->Enable;
147 }
148
149 sub disable {
150 my ($self) = @_;
151
152 $self->{btn_add}->Disable;
153 $self->Disable;
154 }
155
156 1;
0 # The "Plater" tab. It contains the "3D", "2D", "Preview" and "Layers" subtabs.
1
2 package Slic3r::GUI::Plater;
3 use strict;
4 use warnings;
5 use utf8;
6
7 use File::Basename qw(basename dirname);
8 use List::Util qw(sum first max);
9 use Slic3r::Geometry qw(X Y Z MIN MAX scale unscale deg2rad);
10 use threads::shared qw(shared_clone);
11 use Wx qw(:button :cursor :dialog :filedialog :keycode :icon :font :id :listctrl :misc
12 :panel :sizer :toolbar :window wxTheApp :notebook :combobox);
13 use Wx::Event qw(EVT_BUTTON EVT_COMMAND EVT_KEY_DOWN EVT_LIST_ITEM_ACTIVATED
14 EVT_LIST_ITEM_DESELECTED EVT_LIST_ITEM_SELECTED EVT_MOUSE_EVENTS EVT_PAINT EVT_TOOL
15 EVT_CHOICE EVT_COMBOBOX EVT_TIMER EVT_NOTEBOOK_PAGE_CHANGED);
16 use base 'Wx::Panel';
17
18 use constant TB_ADD => &Wx::NewId;
19 use constant TB_REMOVE => &Wx::NewId;
20 use constant TB_RESET => &Wx::NewId;
21 use constant TB_ARRANGE => &Wx::NewId;
22 use constant TB_EXPORT_GCODE => &Wx::NewId;
23 use constant TB_EXPORT_STL => &Wx::NewId;
24 use constant TB_MORE => &Wx::NewId;
25 use constant TB_FEWER => &Wx::NewId;
26 use constant TB_45CW => &Wx::NewId;
27 use constant TB_45CCW => &Wx::NewId;
28 use constant TB_SCALE => &Wx::NewId;
29 use constant TB_SPLIT => &Wx::NewId;
30 use constant TB_CUT => &Wx::NewId;
31 use constant TB_SETTINGS => &Wx::NewId;
32
33 # package variables to avoid passing lexicals to threads
34 our $THUMBNAIL_DONE_EVENT : shared = Wx::NewEventType;
35 our $PROGRESS_BAR_EVENT : shared = Wx::NewEventType;
36 our $ERROR_EVENT : shared = Wx::NewEventType;
37 # Emitted from the worker thread when the G-code export is finished.
38 our $EXPORT_COMPLETED_EVENT : shared = Wx::NewEventType;
39 our $PROCESS_COMPLETED_EVENT : shared = Wx::NewEventType;
40
41 use constant FILAMENT_CHOOSERS_SPACING => 0;
42 use constant PROCESS_DELAY => 0.5 * 1000; # milliseconds
43
44 my $PreventListEvents = 0;
45
46 sub new {
47 my $class = shift;
48 my ($parent) = @_;
49 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
50 $self->{config} = Slic3r::Config->new_from_defaults(qw(
51 bed_shape complete_objects extruder_clearance_radius skirts skirt_distance brim_width
52 serial_port serial_speed octoprint_host octoprint_apikey
53 ));
54 $self->{model} = Slic3r::Model->new;
55 $self->{print} = Slic3r::Print->new;
56 # List of Perl objects Slic3r::GUI::Plater::Object, representing a 2D preview of the platter.
57 $self->{objects} = [];
58
59 $self->{print}->set_status_cb(sub {
60 my ($percent, $message) = @_;
61
62 if ($Slic3r::have_threads) {
63 Wx::PostEvent($self, Wx::PlThreadEvent->new(-1, $PROGRESS_BAR_EVENT, shared_clone([$percent, $message])));
64 } else {
65 $self->on_progress_event($percent, $message);
66 }
67 });
68
69 # Initialize preview notebook
70 $self->{preview_notebook} = Wx::Notebook->new($self, -1, wxDefaultPosition, [335,335], wxNB_BOTTOM);
71
72 # Initialize handlers for canvases
73 my $on_select_object = sub {
74 my ($obj_idx) = @_;
75 $self->select_object($obj_idx);
76 };
77 my $on_double_click = sub {
78 $self->object_settings_dialog if $self->selected_object;
79 };
80 my $on_right_click = sub {
81 my ($canvas, $click_pos) = @_;
82
83 my ($obj_idx, $object) = $self->selected_object;
84 return if !defined $obj_idx;
85
86 my $menu = $self->object_menu;
87 $canvas->PopupMenu($menu, $click_pos);
88 $menu->Destroy;
89 };
90 my $on_instances_moved = sub {
91 $self->update;
92 };
93
94 # Initialize 3D plater
95 if ($Slic3r::GUI::have_OpenGL) {
96 $self->{canvas3D} = Slic3r::GUI::Plater::3D->new($self->{preview_notebook}, $self->{objects}, $self->{model}, $self->{config});
97 $self->{preview_notebook}->AddPage($self->{canvas3D}, '3D');
98 $self->{canvas3D}->set_on_select_object($on_select_object);
99 $self->{canvas3D}->set_on_double_click($on_double_click);
100 $self->{canvas3D}->set_on_right_click(sub { $on_right_click->($self->{canvas3D}, @_); });
101 $self->{canvas3D}->set_on_instances_moved($on_instances_moved);
102 $self->{canvas3D}->on_viewport_changed(sub {
103 $self->{preview3D}->canvas->set_viewport_from_scene($self->{canvas3D});
104 });
105 }
106
107 # Initialize 2D preview canvas
108 $self->{canvas} = Slic3r::GUI::Plater::2D->new($self->{preview_notebook}, wxDefaultSize, $self->{objects}, $self->{model}, $self->{config});
109 $self->{preview_notebook}->AddPage($self->{canvas}, '2D');
110 $self->{canvas}->on_select_object($on_select_object);
111 $self->{canvas}->on_double_click($on_double_click);
112 $self->{canvas}->on_right_click(sub { $on_right_click->($self->{canvas}, @_); });
113 $self->{canvas}->on_instances_moved($on_instances_moved);
114
115 # Initialize 3D toolpaths preview
116 if ($Slic3r::GUI::have_OpenGL) {
117 $self->{preview3D} = Slic3r::GUI::Plater::3DPreview->new($self->{preview_notebook}, $self->{print});
118 $self->{preview3D}->canvas->on_viewport_changed(sub {
119 $self->{canvas3D}->set_viewport_from_scene($self->{preview3D}->canvas);
120 });
121 $self->{preview_notebook}->AddPage($self->{preview3D}, 'Preview');
122 $self->{preview3D_page_idx} = $self->{preview_notebook}->GetPageCount-1;
123 }
124
125 # Initialize toolpaths preview
126 if ($Slic3r::GUI::have_OpenGL) {
127 $self->{toolpaths2D} = Slic3r::GUI::Plater::2DToolpaths->new($self->{preview_notebook}, $self->{print});
128 $self->{preview_notebook}->AddPage($self->{toolpaths2D}, 'Layers');
129 }
130
131 EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{preview_notebook}, sub {
132 if ($self->{preview_notebook}->GetSelection == $self->{preview3D_page_idx}) {
133 $self->{preview3D}->load_print;
134 }
135 });
136
137 # toolbar for object manipulation
138 if (!&Wx::wxMSW) {
139 Wx::ToolTip::Enable(1);
140 $self->{htoolbar} = Wx::ToolBar->new($self, -1, wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL | wxTB_TEXT | wxBORDER_SIMPLE | wxTAB_TRAVERSAL);
141 $self->{htoolbar}->AddTool(TB_ADD, "Add…", Wx::Bitmap->new($Slic3r::var->("brick_add.png"), wxBITMAP_TYPE_PNG), '');
142 $self->{htoolbar}->AddTool(TB_REMOVE, "Delete", Wx::Bitmap->new($Slic3r::var->("brick_delete.png"), wxBITMAP_TYPE_PNG), '');
143 $self->{htoolbar}->AddTool(TB_RESET, "Delete All", Wx::Bitmap->new($Slic3r::var->("cross.png"), wxBITMAP_TYPE_PNG), '');
144 $self->{htoolbar}->AddTool(TB_ARRANGE, "Arrange", Wx::Bitmap->new($Slic3r::var->("bricks.png"), wxBITMAP_TYPE_PNG), '');
145 $self->{htoolbar}->AddSeparator;
146 $self->{htoolbar}->AddTool(TB_MORE, "More", Wx::Bitmap->new($Slic3r::var->("add.png"), wxBITMAP_TYPE_PNG), '');
147 $self->{htoolbar}->AddTool(TB_FEWER, "Fewer", Wx::Bitmap->new($Slic3r::var->("delete.png"), wxBITMAP_TYPE_PNG), '');
148 $self->{htoolbar}->AddSeparator;
149 $self->{htoolbar}->AddTool(TB_45CCW, "45° ccw", Wx::Bitmap->new($Slic3r::var->("arrow_rotate_anticlockwise.png"), wxBITMAP_TYPE_PNG), '');
150 $self->{htoolbar}->AddTool(TB_45CW, "45° cw", Wx::Bitmap->new($Slic3r::var->("arrow_rotate_clockwise.png"), wxBITMAP_TYPE_PNG), '');
151 $self->{htoolbar}->AddTool(TB_SCALE, "Scale…", Wx::Bitmap->new($Slic3r::var->("arrow_out.png"), wxBITMAP_TYPE_PNG), '');
152 $self->{htoolbar}->AddTool(TB_SPLIT, "Split", Wx::Bitmap->new($Slic3r::var->("shape_ungroup.png"), wxBITMAP_TYPE_PNG), '');
153 $self->{htoolbar}->AddTool(TB_CUT, "Cut…", Wx::Bitmap->new($Slic3r::var->("package.png"), wxBITMAP_TYPE_PNG), '');
154 $self->{htoolbar}->AddSeparator;
155 $self->{htoolbar}->AddTool(TB_SETTINGS, "Settings…", Wx::Bitmap->new($Slic3r::var->("cog.png"), wxBITMAP_TYPE_PNG), '');
156 } else {
157 my %tbar_buttons = (
158 add => "Add…",
159 remove => "Delete",
160 reset => "Delete All",
161 arrange => "Arrange",
162 increase => "",
163 decrease => "",
164 rotate45ccw => "",
165 rotate45cw => "",
166 changescale => "Scale…",
167 split => "Split",
168 cut => "Cut…",
169 settings => "Settings…",
170 );
171 $self->{btoolbar} = Wx::BoxSizer->new(wxHORIZONTAL);
172 for (qw(add remove reset arrange increase decrease rotate45ccw rotate45cw changescale split cut settings)) {
173 $self->{"btn_$_"} = Wx::Button->new($self, -1, $tbar_buttons{$_}, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
174 $self->{btoolbar}->Add($self->{"btn_$_"});
175 }
176 }
177
178 $self->{list} = Wx::ListView->new($self, -1, wxDefaultPosition, wxDefaultSize,
179 wxLC_SINGLE_SEL | wxLC_REPORT | wxBORDER_SUNKEN | wxTAB_TRAVERSAL | wxWANTS_CHARS );
180 $self->{list}->InsertColumn(0, "Name", wxLIST_FORMAT_LEFT, 145);
181 $self->{list}->InsertColumn(1, "Copies", wxLIST_FORMAT_CENTER, 45);
182 $self->{list}->InsertColumn(2, "Scale", wxLIST_FORMAT_CENTER, wxLIST_AUTOSIZE_USEHEADER);
183 EVT_LIST_ITEM_SELECTED($self, $self->{list}, \&list_item_selected);
184 EVT_LIST_ITEM_DESELECTED($self, $self->{list}, \&list_item_deselected);
185 EVT_LIST_ITEM_ACTIVATED($self, $self->{list}, \&list_item_activated);
186 EVT_KEY_DOWN($self->{list}, sub {
187 my ($list, $event) = @_;
188 if ($event->GetKeyCode == WXK_TAB) {
189 $list->Navigate($event->ShiftDown ? &Wx::wxNavigateBackward : &Wx::wxNavigateForward);
190 } else {
191 $event->Skip;
192 }
193 });
194
195 # right pane buttons
196 $self->{btn_export_gcode} = Wx::Button->new($self, -1, "Export G-code…", wxDefaultPosition, [-1, 30], wxBU_LEFT);
197 $self->{btn_reslice} = Wx::Button->new($self, -1, "Slice now", wxDefaultPosition, [-1, 30], wxBU_LEFT);
198 $self->{btn_print} = Wx::Button->new($self, -1, "Print…", wxDefaultPosition, [-1, 30], wxBU_LEFT);
199 $self->{btn_send_gcode} = Wx::Button->new($self, -1, "Send to printer", wxDefaultPosition, [-1, 30], wxBU_LEFT);
200 $self->{btn_export_stl} = Wx::Button->new($self, -1, "Export STL…", wxDefaultPosition, [-1, 30], wxBU_LEFT);
201 #$self->{btn_export_gcode}->SetFont($Slic3r::GUI::small_font);
202 #$self->{btn_export_stl}->SetFont($Slic3r::GUI::small_font);
203 $self->{btn_print}->Hide;
204 $self->{btn_send_gcode}->Hide;
205
206 if ($Slic3r::GUI::have_button_icons) {
207 my %icons = qw(
208 add brick_add.png
209 remove brick_delete.png
210 reset cross.png
211 arrange bricks.png
212 export_gcode cog_go.png
213 print arrow_up.png
214 send_gcode arrow_up.png
215 reslice reslice.png
216 export_stl brick_go.png
217
218 increase add.png
219 decrease delete.png
220 rotate45cw arrow_rotate_clockwise.png
221 rotate45ccw arrow_rotate_anticlockwise.png
222 changescale arrow_out.png
223 split shape_ungroup.png
224 cut package.png
225 settings cog.png
226 );
227 for (grep $self->{"btn_$_"}, keys %icons) {
228 $self->{"btn_$_"}->SetBitmap(Wx::Bitmap->new($Slic3r::var->($icons{$_}), wxBITMAP_TYPE_PNG));
229 }
230 }
231 $self->selection_changed(0);
232 $self->object_list_changed;
233 EVT_BUTTON($self, $self->{btn_export_gcode}, sub {
234 $self->export_gcode;
235 });
236 EVT_BUTTON($self, $self->{btn_print}, sub {
237 $self->{print_file} = $self->export_gcode(Wx::StandardPaths::Get->GetTempDir());
238 });
239 EVT_BUTTON($self, $self->{btn_send_gcode}, sub {
240 $self->{send_gcode_file} = $self->export_gcode(Wx::StandardPaths::Get->GetTempDir());
241 });
242 EVT_BUTTON($self, $self->{btn_reslice}, \&reslice);
243 EVT_BUTTON($self, $self->{btn_export_stl}, \&export_stl);
244
245 if ($self->{htoolbar}) {
246 EVT_TOOL($self, TB_ADD, sub { $self->add; });
247 EVT_TOOL($self, TB_REMOVE, sub { $self->remove() }); # explicitly pass no argument to remove
248 EVT_TOOL($self, TB_RESET, sub { $self->reset; });
249 EVT_TOOL($self, TB_ARRANGE, sub { $self->arrange; });
250 EVT_TOOL($self, TB_MORE, sub { $self->increase; });
251 EVT_TOOL($self, TB_FEWER, sub { $self->decrease; });
252 EVT_TOOL($self, TB_45CW, sub { $_[0]->rotate(-45) });
253 EVT_TOOL($self, TB_45CCW, sub { $_[0]->rotate(45) });
254 EVT_TOOL($self, TB_SCALE, sub { $self->changescale(undef); });
255 EVT_TOOL($self, TB_SPLIT, sub { $self->split_object; });
256 EVT_TOOL($self, TB_CUT, sub { $_[0]->object_cut_dialog });
257 EVT_TOOL($self, TB_SETTINGS, sub { $_[0]->object_settings_dialog });
258 } else {
259 EVT_BUTTON($self, $self->{btn_add}, sub { $self->add; });
260 EVT_BUTTON($self, $self->{btn_remove}, sub { $self->remove() }); # explicitly pass no argument to remove
261 EVT_BUTTON($self, $self->{btn_reset}, sub { $self->reset; });
262 EVT_BUTTON($self, $self->{btn_arrange}, sub { $self->arrange; });
263 EVT_BUTTON($self, $self->{btn_increase}, sub { $self->increase; });
264 EVT_BUTTON($self, $self->{btn_decrease}, sub { $self->decrease; });
265 EVT_BUTTON($self, $self->{btn_rotate45cw}, sub { $_[0]->rotate(-45) });
266 EVT_BUTTON($self, $self->{btn_rotate45ccw}, sub { $_[0]->rotate(45) });
267 EVT_BUTTON($self, $self->{btn_changescale}, sub { $self->changescale(undef); });
268 EVT_BUTTON($self, $self->{btn_split}, sub { $self->split_object; });
269 EVT_BUTTON($self, $self->{btn_cut}, sub { $_[0]->object_cut_dialog });
270 EVT_BUTTON($self, $self->{btn_settings}, sub { $_[0]->object_settings_dialog });
271 }
272
273 $_->SetDropTarget(Slic3r::GUI::Plater::DropTarget->new($self))
274 for grep defined($_),
275 $self, $self->{canvas}, $self->{canvas3D}, $self->{preview3D}, $self->{list};
276
277 EVT_COMMAND($self, -1, $THUMBNAIL_DONE_EVENT, sub {
278 my ($self, $event) = @_;
279 my ($obj_idx) = @{$event->GetData};
280 return if !$self->{objects}[$obj_idx]; # object was deleted before thumbnail generation completed
281
282 $self->on_thumbnail_made($obj_idx);
283 });
284
285 EVT_COMMAND($self, -1, $PROGRESS_BAR_EVENT, sub {
286 my ($self, $event) = @_;
287 my ($percent, $message) = @{$event->GetData};
288 $self->on_progress_event($percent, $message);
289 });
290
291 EVT_COMMAND($self, -1, $ERROR_EVENT, sub {
292 my ($self, $event) = @_;
293 Slic3r::GUI::show_error($self, @{$event->GetData});
294 });
295
296 EVT_COMMAND($self, -1, $EXPORT_COMPLETED_EVENT, sub {
297 my ($self, $event) = @_;
298 $self->on_export_completed($event->GetData);
299 });
300
301 EVT_COMMAND($self, -1, $PROCESS_COMPLETED_EVENT, sub {
302 my ($self, $event) = @_;
303 $self->on_process_completed($event->GetData);
304 });
305
306 if ($Slic3r::have_threads) {
307 my $timer_id = Wx::NewId();
308 $self->{apply_config_timer} = Wx::Timer->new($self, $timer_id);
309 EVT_TIMER($self, $timer_id, sub {
310 my ($self, $event) = @_;
311 $self->async_apply_config;
312 });
313 }
314
315 $self->{canvas}->update_bed_size;
316 if ($self->{canvas3D}) {
317 $self->{canvas3D}->update_bed_size;
318 $self->{canvas3D}->zoom_to_bed;
319 }
320 if ($self->{preview3D}) {
321 $self->{preview3D}->set_bed_shape($self->{config}->bed_shape);
322 }
323 $self->update;
324
325 {
326 my $presets;
327 if ($self->GetFrame->{mode} eq 'expert') {
328 $presets = $self->{presets_sizer} = Wx::FlexGridSizer->new(3, 2, 1, 2);
329 $presets->AddGrowableCol(1, 1);
330 $presets->SetFlexibleDirection(wxHORIZONTAL);
331 my %group_labels = (
332 print => 'Print settings',
333 filament => 'Filament',
334 printer => 'Printer',
335 );
336 # UI Combo boxes for a print, multiple filaments, and a printer.
337 # Initially a single filament combo box is created, but the number of combo boxes for the filament selection may increase,
338 # once a printer preset with multiple extruders is activated.
339 # $self->{preset_choosers}{$group}[$idx]
340 $self->{preset_choosers} = {};
341 # Boolean indicating whether the '- default -' preset is shown by the combo box.
342 $self->{preset_choosers_default_suppressed} = {};
343 for my $group (qw(print filament printer)) {
344 my $text = Wx::StaticText->new($self, -1, "$group_labels{$group}:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
345 $text->SetFont($Slic3r::GUI::small_font);
346 my $choice = Wx::BitmapComboBox->new($self, -1, "", wxDefaultPosition, wxDefaultSize, [], wxCB_READONLY);
347 $self->{preset_choosers}{$group} = [$choice];
348 $self->{preset_choosers_default_suppressed}{$group} = 0;
349 # setup the listener
350 EVT_COMBOBOX($choice, $choice, sub {
351 my ($choice) = @_;
352 wxTheApp->CallAfter(sub {
353 $self->_on_select_preset($group, $choice);
354 });
355 });
356 $presets->Add($text, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 4);
357 $presets->Add($choice, 1, wxALIGN_CENTER_VERTICAL | wxEXPAND | wxBOTTOM, 0);
358 }
359 }
360
361 my $object_info_sizer;
362 {
363 my $box = Wx::StaticBox->new($self, -1, "Info");
364 $object_info_sizer = Wx::StaticBoxSizer->new($box, wxVERTICAL);
365 $object_info_sizer->SetMinSize([350,-1]);
366 my $grid_sizer = Wx::FlexGridSizer->new(3, 4, 5, 5);
367 $grid_sizer->SetFlexibleDirection(wxHORIZONTAL);
368 $grid_sizer->AddGrowableCol(1, 1);
369 $grid_sizer->AddGrowableCol(3, 1);
370 $object_info_sizer->Add($grid_sizer, 0, wxEXPAND);
371
372 my @info = (
373 size => "Size",
374 volume => "Volume",
375 facets => "Facets",
376 materials => "Materials",
377 manifold => "Manifold",
378 );
379 while (my $field = shift @info) {
380 my $label = shift @info;
381 my $text = Wx::StaticText->new($self, -1, "$label:", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
382 $text->SetFont($Slic3r::GUI::small_font);
383 $grid_sizer->Add($text, 0);
384
385 $self->{"object_info_$field"} = Wx::StaticText->new($self, -1, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
386 $self->{"object_info_$field"}->SetFont($Slic3r::GUI::small_font);
387 if ($field eq 'manifold') {
388 $self->{object_info_manifold_warning_icon} = Wx::StaticBitmap->new($self, -1, Wx::Bitmap->new($Slic3r::var->("error.png"), wxBITMAP_TYPE_PNG));
389 $self->{object_info_manifold_warning_icon}->Hide;
390
391 my $h_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
392 $h_sizer->Add($self->{object_info_manifold_warning_icon}, 0);
393 $h_sizer->Add($self->{"object_info_$field"}, 0);
394 $grid_sizer->Add($h_sizer, 0, wxEXPAND);
395 } else {
396 $grid_sizer->Add($self->{"object_info_$field"}, 0);
397 }
398 }
399 }
400
401 my $buttons_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
402 $self->{buttons_sizer} = $buttons_sizer;
403 $buttons_sizer->AddStretchSpacer(1);
404 $buttons_sizer->Add($self->{btn_export_stl}, 0, wxALIGN_RIGHT, 0);
405 $buttons_sizer->Add($self->{btn_reslice}, 0, wxALIGN_RIGHT, 0);
406 $buttons_sizer->Add($self->{btn_print}, 0, wxALIGN_RIGHT, 0);
407 $buttons_sizer->Add($self->{btn_send_gcode}, 0, wxALIGN_RIGHT, 0);
408 $buttons_sizer->Add($self->{btn_export_gcode}, 0, wxALIGN_RIGHT, 0);
409
410 my $right_sizer = Wx::BoxSizer->new(wxVERTICAL);
411 $right_sizer->Add($presets, 0, wxEXPAND | wxTOP, 10) if defined $presets;
412 $right_sizer->Add($buttons_sizer, 0, wxEXPAND | wxBOTTOM, 5);
413 $right_sizer->Add($self->{list}, 1, wxEXPAND, 5);
414 $right_sizer->Add($object_info_sizer, 0, wxEXPAND, 0);
415
416 my $hsizer = Wx::BoxSizer->new(wxHORIZONTAL);
417 $hsizer->Add($self->{preview_notebook}, 1, wxEXPAND | wxTOP, 1);
418 $hsizer->Add($right_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, 3);
419
420 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
421 $sizer->Add($self->{htoolbar}, 0, wxEXPAND, 0) if $self->{htoolbar};
422 $sizer->Add($self->{btoolbar}, 0, wxEXPAND, 0) if $self->{btoolbar};
423 $sizer->Add($hsizer, 1, wxEXPAND, 0);
424
425 $sizer->SetSizeHints($self);
426 $self->SetSizer($sizer);
427 }
428
429 $self->update_ui_from_settings();
430
431 return $self;
432 }
433
434 # sets the callback
435 sub on_select_preset {
436 my ($self, $cb) = @_;
437 $self->{on_select_preset} = $cb;
438 }
439
440 sub _on_select_preset {
441 my $self = shift;
442 my ($group, $choice) = @_;
443
444 # If user changed a filament preset and the selected machine is equipped with multiple extruders,
445 # there are multiple filament selection combo boxes shown at the platter. In that case
446 # don't propagate the filament selection changes to the tab.
447 my $default_suppressed = $self->{preset_choosers_default_suppressed}{$group};
448 if ($group eq 'filament' && @{$self->{preset_choosers}{filament}} > 1) {
449 # Indices of the filaments selected.
450 my @filament_presets = $self->filament_presets;
451 $Slic3r::GUI::Settings->{presets}{filament} = $choice->GetString($filament_presets[0] - $default_suppressed) . ".ini";
452 $Slic3r::GUI::Settings->{presets}{"filament_${_}"} = $choice->GetString($filament_presets[$_] - $default_suppressed)
453 for 1 .. $#filament_presets;
454 wxTheApp->save_settings;
455 return;
456 }
457
458 # call GetSelection() in scalar context as it's context-aware
459 $self->{on_select_preset}->($group, scalar($choice->GetSelection) + $default_suppressed)
460 if $self->{on_select_preset};
461
462 # get new config and generate on_config_change() event for updating plater and other things
463 $self->on_config_change($self->GetFrame->config);
464 }
465
466 sub GetFrame {
467 my ($self) = @_;
468 return &Wx::GetTopLevelParent($self);
469 }
470
471 # Called after the Preferences dialog is closed and the program settings are saved.
472 # Update the UI based on the current preferences.
473 sub update_ui_from_settings
474 {
475 my ($self) = @_;
476 if (defined($self->{btn_reslice}) && $self->{buttons_sizer}->IsShown($self->{btn_reslice}) != (! $Slic3r::GUI::Settings->{_}{background_processing})) {
477 $self->{buttons_sizer}->Show($self->{btn_reslice}, ! $Slic3r::GUI::Settings->{_}{background_processing});
478 $self->{buttons_sizer}->Layout;
479 }
480 }
481
482 # Update presets (Print settings, Filament, Printer) from their respective tabs.
483 # Called by
484 # Slic3r::GUI::Tab::Print::_on_presets_changed
485 # Slic3r::GUI::Tab::Filament::_on_presets_changed
486 # Slic3r::GUI::Tab::Printer::_on_presets_changed
487 # when the presets are loaded or the user selects another preset.
488 # For Print settings and Printer, synchronize the selection index with their tabs.
489 # For Filament, synchronize the selection index for a single extruder printer only, otherwise keep the selection.
490 sub update_presets {
491 my $self = shift;
492 # $presets: one of qw(print filament printer)
493 # $selected: index of the selected preset in the array. This may not correspond
494 # with the index of selection in the UI element, where not all items are displayed.
495 my ($group, $presets, $default_suppressed, $selected, $is_dirty) = @_;
496
497 my @choosers = @{ $self->{preset_choosers}{$group} };
498 foreach my $choice (@choosers) {
499 if ($group eq 'filament' && @choosers > 1) {
500 # if we have more than one filament chooser, keep our selection
501 # instead of importing the one from the tab
502 $selected = $choice->GetSelection + $self->{preset_choosers_default_suppressed}{$group};
503 $is_dirty = 0;
504 }
505 $choice->Clear;
506 foreach my $preset (@$presets) {
507 next if ($preset->default && $default_suppressed);
508 my $bitmap;
509 if ($group eq 'filament') {
510 my $config = $preset->config(['filament_colour']);
511 my $rgb_hex = $config->filament_colour->[0];
512 if ($preset->default) {
513 $bitmap = Wx::Bitmap->new($Slic3r::var->("spool.png"), wxBITMAP_TYPE_PNG);
514 } else {
515 $rgb_hex =~ s/^#//;
516 my @rgb = unpack 'C*', pack 'H*', $rgb_hex;
517 my $image = Wx::Image->new(16,16);
518 $image->SetRGB(Wx::Rect->new(0,0,16,16), @rgb);
519 $bitmap = Wx::Bitmap->new($image);
520 }
521 } elsif ($group eq 'print') {
522 $bitmap = Wx::Bitmap->new($Slic3r::var->("cog.png"), wxBITMAP_TYPE_PNG);
523 } elsif ($group eq 'printer') {
524 $bitmap = Wx::Bitmap->new($Slic3r::var->("printer_empty.png"), wxBITMAP_TYPE_PNG);
525 }
526 $choice->AppendString($preset->name, $bitmap);
527 }
528
529 if ($selected <= $#$presets) {
530 my $idx = $selected - $default_suppressed;
531 if ($idx >= 0) {
532 if ($is_dirty) {
533 $choice->SetString($idx, $choice->GetString($idx) . " (modified)");
534 }
535 # call SetSelection() only after SetString() otherwise the new string
536 # won't be picked up as the visible string
537 $choice->SetSelection($idx);
538 }
539 }
540 }
541
542 $self->{preset_choosers_default_suppressed}{$group} = $default_suppressed;
543 }
544
545 # Return a vector of indices of filaments selected by the $self->{preset_choosers}{filament} combo boxes.
546 sub filament_presets {
547 my $self = shift;
548 # force scalar context for GetSelection() as it's context-aware
549 return map scalar($_->GetSelection) + $self->{preset_choosers_default_suppressed}{filament}, @{ $self->{preset_choosers}{filament} };
550 }
551
552 sub add {
553 my $self = shift;
554
555 my @input_files = wxTheApp->open_model($self);
556 $self->load_file($_) for @input_files;
557 }
558
559 sub load_file {
560 my $self = shift;
561 my ($input_file) = @_;
562
563 $Slic3r::GUI::Settings->{recent}{skein_directory} = dirname($input_file);
564 wxTheApp->save_settings;
565
566 my $process_dialog = Wx::ProgressDialog->new('Loading…', "Processing input file…", 100, $self, 0);
567 $process_dialog->Pulse;
568
569 local $SIG{__WARN__} = Slic3r::GUI::warning_catcher($self);
570
571 my $model = eval { Slic3r::Model->read_from_file($input_file) };
572 Slic3r::GUI::show_error($self, $@) if $@;
573
574 if (defined $model) {
575 if ($model->looks_like_multipart_object) {
576 my $dialog = Wx::MessageDialog->new($self,
577 "This file contains several objects positioned at multiple heights. "
578 . "Instead of considering them as multiple objects, should I consider\n"
579 . "this file as a single object having multiple parts?\n",
580 'Multi-part object detected', wxICON_WARNING | wxYES | wxNO);
581 if ($dialog->ShowModal() == wxID_YES) {
582 $model->convert_multipart_object;
583 }
584 }
585 $self->load_model_objects(@{$model->objects});
586 $self->statusbar->SetStatusText("Loaded " . basename($input_file));
587 }
588
589 $process_dialog->Destroy;
590 }
591
592 sub load_model_objects {
593 my ($self, @model_objects) = @_;
594
595 my $bed_centerf = $self->bed_centerf;
596 my $bed_shape = Slic3r::Polygon->new_scale(@{$self->{config}->bed_shape});
597 my $bed_size = $bed_shape->bounding_box->size;
598
599 my $need_arrange = 0;
600 my $scaled_down = 0;
601 my @obj_idx = ();
602 foreach my $model_object (@model_objects) {
603 my $o = $self->{model}->add_object($model_object);
604
605 push @{ $self->{objects} }, Slic3r::GUI::Plater::Object->new(
606 name => basename($model_object->input_file),
607 );
608 push @obj_idx, $#{ $self->{objects} };
609
610 if ($model_object->instances_count == 0) {
611 # if object has no defined position(s) we need to rearrange everything after loading
612 $need_arrange = 1;
613
614 # add a default instance and center object around origin
615 $o->center_around_origin; # also aligns object to Z = 0
616 $o->add_instance(offset => $bed_centerf);
617 }
618
619 {
620 # if the object is too large (more than 5 times the bed), scale it down
621 my $size = $o->bounding_box->size;
622 my $ratio = max(@$size[X,Y]) / unscale(max(@$bed_size[X,Y]));
623 if ($ratio > 5) {
624 $_->set_scaling_factor(1/$ratio) for @{$o->instances};
625 $scaled_down = 1;
626 }
627 }
628
629 $self->{print}->auto_assign_extruders($o);
630 $self->{print}->add_model_object($o);
631 }
632
633 # if user turned autocentering off, automatic arranging would disappoint them
634 if (!$Slic3r::GUI::Settings->{_}{autocenter}) {
635 $need_arrange = 0;
636 }
637
638 if ($scaled_down) {
639 Slic3r::GUI::show_info(
640 $self,
641 'Your object appears to be too large, so it was automatically scaled down to fit your print bed.',
642 'Object too large?',
643 );
644 }
645
646 foreach my $obj_idx (@obj_idx) {
647 my $object = $self->{objects}[$obj_idx];
648 my $model_object = $self->{model}->objects->[$obj_idx];
649 $self->{list}->InsertStringItem($obj_idx, $object->name);
650 $self->{list}->SetItemFont($obj_idx, Wx::Font->new(10, wxDEFAULT, wxNORMAL, wxNORMAL))
651 if $self->{list}->can('SetItemFont'); # legacy code for wxPerl < 0.9918 not supporting SetItemFont()
652
653 $self->{list}->SetItem($obj_idx, 1, $model_object->instances_count);
654 $self->{list}->SetItem($obj_idx, 2, ($model_object->instances->[0]->scaling_factor * 100) . "%");
655
656 $self->make_thumbnail($obj_idx);
657 }
658 $self->arrange if $need_arrange;
659 $self->update;
660
661 # zoom to objects
662 $self->{canvas3D}->zoom_to_volumes
663 if $self->{canvas3D};
664
665 $self->{list}->Update;
666 $self->{list}->Select($obj_idx[-1], 1);
667 $self->object_list_changed;
668
669 $self->schedule_background_process;
670 }
671
672 sub bed_centerf {
673 my ($self) = @_;
674
675 my $bed_shape = Slic3r::Polygon->new_scale(@{$self->{config}->bed_shape});
676 my $bed_center = $bed_shape->bounding_box->center;
677 return Slic3r::Pointf->new(unscale($bed_center->x), unscale($bed_center->y)); #)
678 }
679
680 sub remove {
681 my $self = shift;
682 my ($obj_idx) = @_;
683
684 $self->stop_background_process;
685
686 # Prevent toolpaths preview from rendering while we modify the Print object
687 $self->{toolpaths2D}->enabled(0) if $self->{toolpaths2D};
688 $self->{preview3D}->enabled(0) if $self->{preview3D};
689
690 # if no object index is supplied, remove the selected one
691 if (!defined $obj_idx) {
692 ($obj_idx, undef) = $self->selected_object;
693 }
694
695 splice @{$self->{objects}}, $obj_idx, 1;
696 $self->{model}->delete_object($obj_idx);
697 $self->{print}->delete_object($obj_idx);
698 $self->{list}->DeleteItem($obj_idx);
699 $self->object_list_changed;
700
701 $self->select_object(undef);
702 $self->update;
703 $self->schedule_background_process;
704 }
705
706 sub reset {
707 my $self = shift;
708
709 $self->stop_background_process;
710
711 # Prevent toolpaths preview from rendering while we modify the Print object
712 $self->{toolpaths2D}->enabled(0) if $self->{toolpaths2D};
713 $self->{preview3D}->enabled(0) if $self->{preview3D};
714
715 @{$self->{objects}} = ();
716 $self->{model}->clear_objects;
717 $self->{print}->clear_objects;
718 $self->{list}->DeleteAllItems;
719 $self->object_list_changed;
720
721 $self->select_object(undef);
722 $self->update;
723 }
724
725 sub increase {
726 my ($self, $copies) = @_;
727
728 $copies //= 1;
729 my ($obj_idx, $object) = $self->selected_object;
730 my $model_object = $self->{model}->objects->[$obj_idx];
731 my $instance = $model_object->instances->[-1];
732 for my $i (1..$copies) {
733 $instance = $model_object->add_instance(
734 offset => Slic3r::Pointf->new(map 10+$_, @{$instance->offset}),
735 scaling_factor => $instance->scaling_factor,
736 rotation => $instance->rotation,
737 );
738 $self->{print}->objects->[$obj_idx]->add_copy($instance->offset);
739 }
740 $self->{list}->SetItem($obj_idx, 1, $model_object->instances_count);
741
742 # only autoarrange if user has autocentering enabled
743 $self->stop_background_process;
744 if ($Slic3r::GUI::Settings->{_}{autocenter}) {
745 $self->arrange;
746 } else {
747 $self->update;
748 }
749 $self->schedule_background_process;
750 }
751
752 sub decrease {
753 my ($self, $copies) = @_;
754
755 $copies //= 1;
756 $self->stop_background_process;
757
758 my ($obj_idx, $object) = $self->selected_object;
759 my $model_object = $self->{model}->objects->[$obj_idx];
760 if ($model_object->instances_count > $copies) {
761 for my $i (1..$copies) {
762 $model_object->delete_last_instance;
763 $self->{print}->objects->[$obj_idx]->delete_last_copy;
764 }
765 $self->{list}->SetItem($obj_idx, 1, $model_object->instances_count);
766 } else {
767 $self->remove;
768 }
769
770 if ($self->{objects}[$obj_idx]) {
771 $self->{list}->Select($obj_idx, 0);
772 $self->{list}->Select($obj_idx, 1);
773 }
774 $self->update;
775 $self->schedule_background_process;
776 }
777
778 sub set_number_of_copies {
779 my ($self) = @_;
780
781 $self->pause_background_process;
782
783 # get current number of copies
784 my ($obj_idx, $object) = $self->selected_object;
785 my $model_object = $self->{model}->objects->[$obj_idx];
786
787 # prompt user
788 my $copies = Wx::GetNumberFromUser("", "Enter the number of copies of the selected object:", "Copies", $model_object->instances_count, 0, 1000, $self);
789 my $diff = $copies - $model_object->instances_count;
790 if ($diff == 0) {
791 # no variation
792 $self->resume_background_process;
793 } elsif ($diff > 0) {
794 $self->increase($diff);
795 } elsif ($diff < 0) {
796 $self->decrease(-$diff);
797 }
798 }
799
800 sub rotate {
801 my $self = shift;
802 my ($angle, $axis) = @_;
803
804 # angle is in degrees
805 $axis //= Z;
806
807 my ($obj_idx, $object) = $self->selected_object;
808 return if !defined $obj_idx;
809
810 my $model_object = $self->{model}->objects->[$obj_idx];
811 my $model_instance = $model_object->instances->[0];
812
813 # we need thumbnail to be computed before allowing rotation
814 return if !$object->thumbnail;
815
816 if (!defined $angle) {
817 my $axis_name = $axis == X ? 'X' : $axis == Y ? 'Y' : 'Z';
818 $angle = Wx::GetNumberFromUser("", "Enter the rotation angle:", "Rotate around $axis_name axis", $model_instance->rotation, -364, 364, $self);
819 return if !$angle || $angle == -1;
820 $angle = 0 - $angle; # rotate clockwise (be consistent with button icon)
821 }
822
823 $self->stop_background_process;
824
825 if ($axis == Z) {
826 my $new_angle = $model_instance->rotation + deg2rad($angle);
827 $_->set_rotation($new_angle) for @{ $model_object->instances };
828 $object->transform_thumbnail($self->{model}, $obj_idx);
829 } else {
830 # rotation around X and Y needs to be performed on mesh
831 # so we first apply any Z rotation
832 if ($model_instance->rotation != 0) {
833 $model_object->rotate($model_instance->rotation, Z);
834 $_->set_rotation(0) for @{ $model_object->instances };
835 }
836 $model_object->rotate(deg2rad($angle), $axis);
837
838 # realign object to Z = 0
839 $model_object->center_around_origin;
840 $self->make_thumbnail($obj_idx);
841 }
842
843 $model_object->update_bounding_box;
844 # update print and start background processing
845 $self->{print}->add_model_object($model_object, $obj_idx);
846
847 $self->selection_changed; # refresh info (size etc.)
848 $self->update;
849 $self->schedule_background_process;
850 }
851
852 sub mirror {
853 my ($self, $axis) = @_;
854
855 my ($obj_idx, $object) = $self->selected_object;
856 return if !defined $obj_idx;
857
858 my $model_object = $self->{model}->objects->[$obj_idx];
859 my $model_instance = $model_object->instances->[0];
860
861 # apply Z rotation before mirroring
862 if ($model_instance->rotation != 0) {
863 $model_object->rotate($model_instance->rotation, Z);
864 $_->set_rotation(0) for @{ $model_object->instances };
865 }
866
867 $model_object->mirror($axis);
868 $model_object->update_bounding_box;
869
870 # realign object to Z = 0
871 $model_object->center_around_origin;
872 $self->make_thumbnail($obj_idx);
873
874 # update print and start background processing
875 $self->stop_background_process;
876 $self->{print}->add_model_object($model_object, $obj_idx);
877
878 $self->selection_changed; # refresh info (size etc.)
879 $self->update;
880 $self->schedule_background_process;
881 }
882
883 sub changescale {
884 my ($self, $axis, $tosize) = @_;
885
886 my ($obj_idx, $object) = $self->selected_object;
887 return if !defined $obj_idx;
888
889 my $model_object = $self->{model}->objects->[$obj_idx];
890 my $model_instance = $model_object->instances->[0];
891
892 # we need thumbnail to be computed before allowing scaling
893 return if !$object->thumbnail;
894
895 my $object_size = $model_object->bounding_box->size;
896 my $bed_size = Slic3r::Polygon->new_scale(@{$self->{config}->bed_shape})->bounding_box->size;
897
898 if (defined $axis) {
899 my $axis_name = $axis == X ? 'X' : $axis == Y ? 'Y' : 'Z';
900 my $scale;
901 if ($tosize) {
902 my $cursize = $object_size->[$axis];
903 my $newsize = Wx::GetNumberFromUser("", "Enter the new size for the selected object:", "Scale along $axis_name",
904 $cursize, 0, $bed_size->[$axis], $self);
905 return if !$newsize || $newsize < 0;
906 $scale = $newsize / $cursize * 100;
907 } else {
908 $scale = Wx::GetNumberFromUser("", "Enter the scale % for the selected object:", "Scale along $axis_name",
909 100, 0, 100000, $self);
910 }
911 return if !$scale || $scale < 0;
912
913 # apply Z rotation before scaling
914 if ($model_instance->rotation != 0) {
915 $model_object->rotate($model_instance->rotation, Z);
916 $_->set_rotation(0) for @{ $model_object->instances };
917 }
918
919 my $versor = [1,1,1];
920 $versor->[$axis] = $scale/100;
921 $model_object->scale_xyz(Slic3r::Pointf3->new(@$versor));
922 # object was already aligned to Z = 0, so no need to realign it
923 $self->make_thumbnail($obj_idx);
924 } else {
925 my $scale;
926 if ($tosize) {
927 my $cursize = max(@$object_size);
928 my $newsize = Wx::GetNumberFromUser("", "Enter the new max size for the selected object:", "Scale",
929 $cursize, 0, max(@$bed_size), $self);
930 return if !$newsize || $newsize < 0;
931 $scale = $newsize / $cursize * 100;
932 } else {
933 # max scale factor should be above 2540 to allow importing files exported in inches
934 $scale = Wx::GetNumberFromUser("", "Enter the scale % for the selected object:", 'Scale',
935 $model_instance->scaling_factor*100, 0, 100000, $self);
936 }
937 return if !$scale || $scale < 0;
938
939 $self->{list}->SetItem($obj_idx, 2, "$scale%");
940 $scale /= 100; # turn percent into factor
941
942 my $variation = $scale / $model_instance->scaling_factor;
943 foreach my $range (@{ $model_object->layer_height_ranges }) {
944 $range->[0] *= $variation;
945 $range->[1] *= $variation;
946 }
947 $_->set_scaling_factor($scale) for @{ $model_object->instances };
948 $object->transform_thumbnail($self->{model}, $obj_idx);
949 }
950 $model_object->update_bounding_box;
951
952 # update print and start background processing
953 $self->stop_background_process;
954 $self->{print}->add_model_object($model_object, $obj_idx);
955
956 $self->selection_changed(1); # refresh info (size, volume etc.)
957 $self->update;
958 $self->schedule_background_process;
959 }
960
961 sub arrange {
962 my $self = shift;
963
964 $self->pause_background_process;
965
966 my $bb = Slic3r::Geometry::BoundingBoxf->new_from_points($self->{config}->bed_shape);
967 my $success = $self->{model}->arrange_objects($self->GetFrame->config->min_object_distance, $bb);
968 # ignore arrange failures on purpose: user has visual feedback and we don't need to warn him
969 # when parts don't fit in print bed
970
971 $self->update(1);
972 }
973
974 sub split_object {
975 my $self = shift;
976
977 my ($obj_idx, $current_object) = $self->selected_object;
978
979 # we clone model object because split_object() adds the split volumes
980 # into the same model object, thus causing duplicates when we call load_model_objects()
981 my $new_model = $self->{model}->clone; # store this before calling get_object()
982 my $current_model_object = $new_model->get_object($obj_idx);
983
984 if ($current_model_object->volumes_count > 1) {
985 Slic3r::GUI::warning_catcher($self)->("The selected object can't be split because it contains more than one volume/material.");
986 return;
987 }
988
989 $self->pause_background_process;
990
991 my @model_objects = @{$current_model_object->split_object};
992 if (@model_objects == 1) {
993 $self->resume_background_process;
994 Slic3r::GUI::warning_catcher($self)->("The selected object couldn't be split because it contains only one part.");
995 $self->resume_background_process;
996 return;
997 }
998
999 foreach my $object (@model_objects) {
1000 $object->instances->[$_]->offset->translate($_ * 10, $_ * 10)
1001 for 1..$#{ $object->instances };
1002
1003 # we need to center this single object around origin
1004 $object->center_around_origin;
1005 }
1006
1007 # remove the original object before spawning the object_loaded event, otherwise
1008 # we'll pass the wrong $obj_idx to it (which won't be recognized after the
1009 # thumbnail thread returns)
1010 $self->remove($obj_idx);
1011 $current_object = $obj_idx = undef;
1012
1013 # load all model objects at once, otherwise the plate would be rearranged after each one
1014 # causing original positions not to be kept
1015 $self->load_model_objects(@model_objects);
1016 }
1017
1018 sub schedule_background_process {
1019 my ($self) = @_;
1020
1021 if (defined $self->{apply_config_timer}) {
1022 $self->{apply_config_timer}->Start(PROCESS_DELAY, 1); # 1 = one shot
1023 }
1024 }
1025
1026 # Executed asynchronously by a timer every PROCESS_DELAY (0.5 second).
1027 # The timer is started by schedule_background_process(),
1028 sub async_apply_config {
1029 my ($self) = @_;
1030
1031 # reset preview canvases
1032 $self->{toolpaths2D}->reload_print if $self->{toolpaths2D};
1033 $self->{preview3D}->reload_print if $self->{preview3D};
1034
1035 # pause process thread before applying new config
1036 # since we don't want to touch data that is being used by the threads
1037 $self->pause_background_process;
1038
1039 # apply new config
1040 my $invalidated = $self->{print}->apply_config($self->GetFrame->config);
1041
1042 return if !$Slic3r::GUI::Settings->{_}{background_processing};
1043
1044 if ($invalidated) {
1045 # kill current thread if any
1046 $self->stop_background_process;
1047 } else {
1048 $self->resume_background_process;
1049 }
1050
1051 # schedule a new process thread in case it wasn't running
1052 $self->start_background_process;
1053 }
1054
1055 sub start_background_process {
1056 my ($self) = @_;
1057
1058 return if !$Slic3r::have_threads;
1059 return if !@{$self->{objects}};
1060 return if $self->{process_thread};
1061
1062 # It looks like declaring a local $SIG{__WARN__} prevents the ugly
1063 # "Attempt to free unreferenced scalar" warning...
1064 local $SIG{__WARN__} = Slic3r::GUI::warning_catcher($self);
1065
1066 # don't start process thread if config is not valid
1067 eval {
1068 # this will throw errors if config is not valid
1069 $self->GetFrame->config->validate;
1070 $self->{print}->validate;
1071 };
1072 if ($@) {
1073 $self->statusbar->SetStatusText($@);
1074 return;
1075 }
1076
1077 # apply extra variables
1078 {
1079 my $extra = $self->GetFrame->extra_variables;
1080 $self->{print}->placeholder_parser->set($_, $extra->{$_}) for keys %$extra;
1081 }
1082
1083 # start thread
1084 @_ = ();
1085 $self->{process_thread} = Slic3r::spawn_thread(sub {
1086 eval {
1087 $self->{print}->process;
1088 };
1089 if ($@) {
1090 Slic3r::debugf "Background process error: $@\n";
1091 Wx::PostEvent($self, Wx::PlThreadEvent->new(-1, $PROCESS_COMPLETED_EVENT, $@));
1092 } else {
1093 Wx::PostEvent($self, Wx::PlThreadEvent->new(-1, $PROCESS_COMPLETED_EVENT, undef));
1094 }
1095 Slic3r::thread_cleanup();
1096 });
1097 Slic3r::debugf "Background processing started.\n";
1098 }
1099
1100 sub stop_background_process {
1101 my ($self) = @_;
1102
1103 $self->{apply_config_timer}->Stop if defined $self->{apply_config_timer};
1104 $self->statusbar->SetCancelCallback(undef);
1105 $self->statusbar->StopBusy;
1106 $self->statusbar->SetStatusText("");
1107 $self->{toolpaths2D}->reload_print if $self->{toolpaths2D};
1108 $self->{preview3D}->reload_print if $self->{preview3D};
1109
1110 if ($self->{process_thread}) {
1111 Slic3r::debugf "Killing background process.\n";
1112 Slic3r::kill_all_threads();
1113 $self->{process_thread} = undef;
1114 } else {
1115 Slic3r::debugf "No background process running.\n";
1116 }
1117
1118 # if there's an export process, kill that one as well
1119 if ($self->{export_thread}) {
1120 Slic3r::debugf "Killing background export process.\n";
1121 Slic3r::kill_all_threads();
1122 $self->{export_thread} = undef;
1123 }
1124 }
1125
1126 sub pause_background_process {
1127 my ($self) = @_;
1128
1129 if ($self->{process_thread} || $self->{export_thread}) {
1130 Slic3r::pause_all_threads();
1131 return 1;
1132 } elsif (defined $self->{apply_config_timer} && $self->{apply_config_timer}->IsRunning) {
1133 $self->{apply_config_timer}->Stop;
1134 return 1;
1135 }
1136
1137 return 0;
1138 }
1139
1140 sub resume_background_process {
1141 my ($self) = @_;
1142
1143 if ($self->{process_thread} || $self->{export_thread}) {
1144 Slic3r::resume_all_threads();
1145 }
1146 }
1147
1148 sub reslice {
1149 # explicitly cancel a previous thread and start a new one.
1150 my ($self) = @_;
1151 # Don't reslice if export of G-code or sending to OctoPrint is running.
1152 if ($Slic3r::have_threads && ! defined($self->{export_gcode_output_file}) && ! defined($self->{send_gcode_file})) {
1153 $self->stop_background_process;
1154 $self->statusbar->SetCancelCallback(sub {
1155 $self->stop_background_process;
1156 $self->statusbar->SetStatusText("Slicing cancelled");
1157 # this updates buttons status
1158 $self->object_list_changed;
1159 });
1160 $self->start_background_process;
1161 }
1162 }
1163
1164 sub export_gcode {
1165 my ($self, $output_file) = @_;
1166
1167 return if !@{$self->{objects}};
1168
1169 if ($self->{export_gcode_output_file}) {
1170 Wx::MessageDialog->new($self, "Another export job is currently running.", 'Error', wxOK | wxICON_ERROR)->ShowModal;
1171 return;
1172 }
1173
1174 # if process is not running, validate config
1175 # (we assume that if it is running, config is valid)
1176 eval {
1177 # this will throw errors if config is not valid
1178 $self->GetFrame->config->validate;
1179 $self->{print}->validate;
1180 };
1181 Slic3r::GUI::catch_error($self) and return;
1182
1183
1184 # apply config and validate print
1185 my $config = $self->GetFrame->config;
1186 eval {
1187 # this will throw errors if config is not valid
1188 $config->validate;
1189 $self->{print}->apply_config($config);
1190 $self->{print}->validate;
1191 };
1192 if (!$Slic3r::have_threads) {
1193 Slic3r::GUI::catch_error($self) and return;
1194 }
1195
1196 # select output file
1197 if ($output_file) {
1198 $self->{export_gcode_output_file} = $self->{print}->expanded_output_filepath($output_file);
1199 } else {
1200 my $default_output_file = $self->{print}->expanded_output_filepath($main::opt{output});
1201 my $dlg = Wx::FileDialog->new($self, 'Save G-code file as:', wxTheApp->output_path(dirname($default_output_file)),
1202 basename($default_output_file), &Slic3r::GUI::FILE_WILDCARDS->{gcode}, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
1203 if ($dlg->ShowModal != wxID_OK) {
1204 $dlg->Destroy;
1205 return;
1206 }
1207 my $path = Slic3r::decode_path($dlg->GetPath);
1208 $Slic3r::GUI::Settings->{_}{last_output_path} = dirname($path);
1209 wxTheApp->save_settings;
1210 $self->{export_gcode_output_file} = $path;
1211 $dlg->Destroy;
1212 }
1213
1214 $self->statusbar->StartBusy;
1215
1216 if ($Slic3r::have_threads) {
1217 $self->statusbar->SetCancelCallback(sub {
1218 $self->stop_background_process;
1219 $self->statusbar->SetStatusText("Export cancelled");
1220 $self->{export_gcode_output_file} = undef;
1221 $self->{send_gcode_file} = undef;
1222
1223 # this updates buttons status
1224 $self->object_list_changed;
1225 });
1226
1227 # start background process, whose completion event handler
1228 # will detect $self->{export_gcode_output_file} and proceed with export
1229 $self->start_background_process;
1230 } else {
1231 eval {
1232 $self->{print}->process;
1233 $self->{print}->export_gcode(output_file => $self->{export_gcode_output_file});
1234 };
1235 my $result = !Slic3r::GUI::catch_error($self);
1236 $self->on_export_completed($result);
1237 }
1238
1239 # this updates buttons status
1240 $self->object_list_changed;
1241
1242 return $self->{export_gcode_output_file};
1243 }
1244
1245 # This gets called only if we have threads.
1246 sub on_process_completed {
1247 my ($self, $error) = @_;
1248
1249 $self->statusbar->SetCancelCallback(undef);
1250 $self->statusbar->StopBusy;
1251 $self->statusbar->SetStatusText($error // "");
1252
1253 Slic3r::debugf "Background processing completed.\n";
1254 $self->{process_thread}->detach if $self->{process_thread};
1255 $self->{process_thread} = undef;
1256
1257 # if we're supposed to perform an explicit export let's display the error in a dialog
1258 if ($error && $self->{export_gcode_output_file}) {
1259 $self->{export_gcode_output_file} = undef;
1260 Slic3r::GUI::show_error($self, $error);
1261 }
1262
1263 return if $error;
1264 $self->{toolpaths2D}->reload_print if $self->{toolpaths2D};
1265 $self->{preview3D}->reload_print if $self->{preview3D};
1266
1267 # if we have an export filename, start a new thread for exporting G-code
1268 if ($self->{export_gcode_output_file}) {
1269 @_ = ();
1270
1271 # workaround for "Attempt to free un referenced scalar..."
1272 our $_thread_self = $self;
1273
1274 $self->{export_thread} = Slic3r::spawn_thread(sub {
1275 eval {
1276 $_thread_self->{print}->export_gcode(output_file => $_thread_self->{export_gcode_output_file});
1277 };
1278 if ($@) {
1279 Wx::PostEvent($_thread_self, Wx::PlThreadEvent->new(-1, $ERROR_EVENT, shared_clone([ $@ ])));
1280 Wx::PostEvent($_thread_self, Wx::PlThreadEvent->new(-1, $EXPORT_COMPLETED_EVENT, 0));
1281 } else {
1282 Wx::PostEvent($_thread_self, Wx::PlThreadEvent->new(-1, $EXPORT_COMPLETED_EVENT, 1));
1283 }
1284 Slic3r::thread_cleanup();
1285 });
1286 Slic3r::debugf "Background G-code export started.\n";
1287 }
1288 }
1289
1290 # This gets called also if we have no threads.
1291 sub on_progress_event {
1292 my ($self, $percent, $message) = @_;
1293
1294 $self->statusbar->SetProgress($percent);
1295 $self->statusbar->SetStatusText("$message…");
1296 }
1297
1298 # Called when the G-code export finishes, either successfully or with an error.
1299 # This gets called also if we don't have threads.
1300 sub on_export_completed {
1301 my ($self, $result) = @_;
1302
1303 $self->statusbar->SetCancelCallback(undef);
1304 $self->statusbar->StopBusy;
1305 $self->statusbar->SetStatusText("");
1306
1307 Slic3r::debugf "Background export process completed.\n";
1308 $self->{export_thread}->detach if $self->{export_thread};
1309 $self->{export_thread} = undef;
1310
1311 my $message;
1312 my $send_gcode = 0;
1313 my $do_print = 0;
1314 if ($result) {
1315 # G-code file exported successfully.
1316 if ($self->{print_file}) {
1317 $message = "File added to print queue";
1318 $do_print = 1;
1319 } elsif ($self->{send_gcode_file}) {
1320 $message = "Sending G-code file to the OctoPrint server...";
1321 $send_gcode = 1;
1322 } else {
1323 $message = "G-code file exported to " . $self->{export_gcode_output_file};
1324 }
1325 } else {
1326 $message = "Export failed";
1327 }
1328 $self->{export_gcode_output_file} = undef;
1329 $self->statusbar->SetStatusText($message);
1330 wxTheApp->notify($message);
1331
1332 $self->do_print if $do_print;
1333 # Send $self->{send_gcode_file} to OctoPrint.
1334 $self->send_gcode if $send_gcode;
1335 $self->{print_file} = undef;
1336 $self->{send_gcode_file} = undef;
1337
1338 # this updates buttons status
1339 $self->object_list_changed;
1340 }
1341
1342 sub do_print {
1343 my ($self) = @_;
1344
1345 my $printer_tab = $self->GetFrame->{options_tabs}{printer};
1346 my $printer_name = $printer_tab->get_current_preset->name;
1347
1348 my $controller = $self->GetFrame->{controller};
1349 my $printer_panel = $controller->add_printer($printer_name, $printer_tab->config);
1350
1351 my $filament_stats = $self->{print}->filament_stats;
1352 my @filament_names = $self->GetFrame->filament_preset_names;
1353 $filament_stats = { map { $filament_names[$_] => $filament_stats->{$_} } keys %$filament_stats };
1354 $printer_panel->load_print_job($self->{print_file}, $filament_stats);
1355
1356 $self->GetFrame->select_tab(1);
1357 }
1358
1359 # Send $self->{send_gcode_file} to OctoPrint.
1360 #FIXME Currently this call blocks the UI. Make it asynchronous.
1361 sub send_gcode {
1362 my ($self) = @_;
1363
1364 $self->statusbar->StartBusy;
1365
1366 my $ua = LWP::UserAgent->new;
1367 $ua->timeout(180);
1368
1369 my $path = Slic3r::encode_path($self->{send_gcode_file});
1370 my $res = $ua->post(
1371 "http://" . $self->{config}->octoprint_host . "/api/files/local",
1372 Content_Type => 'form-data',
1373 'X-Api-Key' => $self->{config}->octoprint_apikey,
1374 Content => [
1375 # OctoPrint doesn't like Windows paths so we use basename()
1376 # Also, since we need to read from filesystem we process it through encode_path()
1377 file => [ $path, basename($path) ],
1378 ],
1379 );
1380
1381 $self->statusbar->StopBusy;
1382
1383 if ($res->is_success) {
1384 $self->statusbar->SetStatusText("G-code file successfully uploaded to the OctoPrint server");
1385 } else {
1386 my $message = "Error while uploading to the OctoPrint server: " . $res->status_line;
1387 Slic3r::GUI::show_error($self, $message);
1388 $self->statusbar->SetStatusText($message);
1389 }
1390 }
1391
1392 sub export_stl {
1393 my $self = shift;
1394
1395 return if !@{$self->{objects}};
1396
1397 my $output_file = $self->_get_export_file('STL') or return;
1398 Slic3r::Format::STL->write_file($output_file, $self->{model}, binary => 1);
1399 $self->statusbar->SetStatusText("STL file exported to $output_file");
1400 }
1401
1402 sub export_object_stl {
1403 my $self = shift;
1404
1405 my ($obj_idx, $object) = $self->selected_object;
1406 return if !defined $obj_idx;
1407
1408 my $model_object = $self->{model}->objects->[$obj_idx];
1409
1410 my $output_file = $self->_get_export_file('STL') or return;
1411 Slic3r::Format::STL->write_file($output_file, $model_object->mesh, binary => 1);
1412 $self->statusbar->SetStatusText("STL file exported to $output_file");
1413 }
1414
1415 sub export_amf {
1416 my $self = shift;
1417
1418 return if !@{$self->{objects}};
1419
1420 my $output_file = $self->_get_export_file('AMF') or return;
1421 Slic3r::Format::AMF->write_file($output_file, $self->{model});
1422 $self->statusbar->SetStatusText("AMF file exported to $output_file");
1423 }
1424
1425 sub _get_export_file {
1426 my $self = shift;
1427 my ($format) = @_;
1428
1429 my $suffix = $format eq 'STL' ? '.stl' : '.amf.xml';
1430
1431 my $output_file = $main::opt{output};
1432 {
1433 $output_file = $self->{print}->expanded_output_filepath($output_file);
1434 $output_file =~ s/\.gcode$/$suffix/i;
1435 my $dlg = Wx::FileDialog->new($self, "Save $format file as:", dirname($output_file),
1436 basename($output_file), &Slic3r::GUI::MODEL_WILDCARD, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
1437 if ($dlg->ShowModal != wxID_OK) {
1438 $dlg->Destroy;
1439 return undef;
1440 }
1441 $output_file = Slic3r::decode_path($dlg->GetPath);
1442 $dlg->Destroy;
1443 }
1444 return $output_file;
1445 }
1446
1447 sub make_thumbnail {
1448 my $self = shift;
1449 my ($obj_idx) = @_;
1450
1451 my $plater_object = $self->{objects}[$obj_idx];
1452 $plater_object->thumbnail(Slic3r::ExPolygon::Collection->new);
1453 my $cb = sub {
1454 $plater_object->make_thumbnail($self->{model}, $obj_idx);
1455
1456 if ($Slic3r::have_threads) {
1457 Wx::PostEvent($self, Wx::PlThreadEvent->new(-1, $THUMBNAIL_DONE_EVENT, shared_clone([ $obj_idx ])));
1458 Slic3r::thread_cleanup();
1459 threads->exit;
1460 } else {
1461 $self->on_thumbnail_made($obj_idx);
1462 }
1463 };
1464
1465 @_ = ();
1466 $Slic3r::have_threads
1467 ? threads->create(sub { $cb->(); Slic3r::thread_cleanup(); })->detach
1468 : $cb->();
1469 }
1470
1471 sub on_thumbnail_made {
1472 my $self = shift;
1473 my ($obj_idx) = @_;
1474
1475 $self->{objects}[$obj_idx]->transform_thumbnail($self->{model}, $obj_idx);
1476 $self->refresh_canvases;
1477 }
1478
1479 # this method gets called whenever print center is changed or the objects' bounding box changes
1480 # (i.e. when an object is added/removed/moved/rotated/scaled)
1481 sub update {
1482 my ($self, $force_autocenter) = @_;
1483
1484 if ($Slic3r::GUI::Settings->{_}{autocenter} || $force_autocenter) {
1485 $self->{model}->center_instances_around_point($self->bed_centerf);
1486 }
1487
1488 my $running = $self->pause_background_process;
1489 my $invalidated = $self->{print}->reload_model_instances();
1490
1491 # The mere fact that no steps were invalidated when reloading model instances
1492 # doesn't mean that all steps were done: for example, validation might have
1493 # failed upon previous instance move, so we have no running thread and no steps
1494 # are invalidated on this move, thus we need to schedule a new run.
1495 if ($invalidated || !$running) {
1496 $self->schedule_background_process;
1497 } else {
1498 $self->resume_background_process;
1499 }
1500
1501 $self->refresh_canvases;
1502 }
1503
1504 # When a number of extruders changes, the UI needs to be updated to show a single filament selection combo box per extruder.
1505 sub on_extruders_change {
1506 my ($self, $num_extruders) = @_;
1507
1508 my $choices = $self->{preset_choosers}{filament};
1509 while (@$choices < $num_extruders) {
1510 # copy strings from first choice
1511 my @presets = $choices->[0]->GetStrings;
1512
1513 # initialize new choice
1514 my $choice = Wx::BitmapComboBox->new($self, -1, "", wxDefaultPosition, wxDefaultSize, [@presets], wxCB_READONLY);
1515 push @$choices, $choice;
1516
1517 # copy icons from first choice
1518 $choice->SetItemBitmap($_, $choices->[0]->GetItemBitmap($_)) for 0..$#presets;
1519
1520 # insert new choice into sizer
1521 $self->{presets_sizer}->Insert(4 + ($#$choices-1)*2, 0, 0);
1522 $self->{presets_sizer}->Insert(5 + ($#$choices-1)*2, $choice, 0, wxEXPAND | wxBOTTOM, FILAMENT_CHOOSERS_SPACING);
1523
1524 # setup the listener
1525 EVT_COMBOBOX($choice, $choice, sub {
1526 my ($choice) = @_;
1527 wxTheApp->CallAfter(sub {
1528 $self->_on_select_preset('filament', $choice);
1529 });
1530 });
1531
1532 # initialize selection
1533 my $i = first { $choice->GetString($_) eq ($Slic3r::GUI::Settings->{presets}{"filament_" . $#$choices} || '') } 0 .. $#presets;
1534 $choice->SetSelection($i || 0);
1535 }
1536
1537 # remove unused choices if any
1538 while (@$choices > $num_extruders) {
1539 $self->{presets_sizer}->Remove(4 + ($#$choices-1)*2); # label
1540 $self->{presets_sizer}->Remove(4 + ($#$choices-1)*2); # wxChoice
1541 $choices->[-1]->Destroy;
1542 pop @$choices;
1543 }
1544 $self->Layout;
1545 }
1546
1547 sub on_config_change {
1548 my $self = shift;
1549 my ($config) = @_;
1550
1551 foreach my $opt_key (@{$self->{config}->diff($config)}) {
1552 $self->{config}->set($opt_key, $config->get($opt_key));
1553 if ($opt_key eq 'bed_shape') {
1554 $self->{canvas}->update_bed_size;
1555 $self->{canvas3D}->update_bed_size if $self->{canvas3D};
1556 $self->{preview3D}->set_bed_shape($self->{config}->bed_shape)
1557 if $self->{preview3D};
1558 $self->update;
1559 } elsif ($opt_key eq 'serial_port') {
1560 if ($config->get('serial_port')) {
1561 $self->{btn_print}->Show;
1562 } else {
1563 $self->{btn_print}->Hide;
1564 }
1565 $self->Layout;
1566 } elsif ($opt_key eq 'octoprint_host') {
1567 if ($config->get('octoprint_host')) {
1568 $self->{btn_send_gcode}->Show;
1569 } else {
1570 $self->{btn_send_gcode}->Hide;
1571 }
1572 $self->Layout;
1573 }
1574 }
1575
1576 return if !$self->GetFrame->is_loaded;
1577
1578 # (re)start timer
1579 $self->schedule_background_process;
1580 }
1581
1582 sub list_item_deselected {
1583 my ($self, $event) = @_;
1584 return if $PreventListEvents;
1585
1586 if ($self->{list}->GetFirstSelected == -1) {
1587 $self->select_object(undef);
1588 $self->refresh_canvases;
1589 }
1590 }
1591
1592 sub list_item_selected {
1593 my ($self, $event) = @_;
1594 return if $PreventListEvents;
1595
1596 my $obj_idx = $event->GetIndex;
1597 $self->select_object($obj_idx);
1598 $self->refresh_canvases;
1599 }
1600
1601 sub list_item_activated {
1602 my ($self, $event, $obj_idx) = @_;
1603
1604 $obj_idx //= $event->GetIndex;
1605 $self->object_settings_dialog($obj_idx);
1606 }
1607
1608 sub object_cut_dialog {
1609 my $self = shift;
1610 my ($obj_idx) = @_;
1611
1612 if (!defined $obj_idx) {
1613 ($obj_idx, undef) = $self->selected_object;
1614 }
1615
1616 if (!$Slic3r::GUI::have_OpenGL) {
1617 Slic3r::GUI::show_error($self, "Please install the OpenGL modules to use this feature (see build instructions).");
1618 return;
1619 }
1620
1621 my $dlg = Slic3r::GUI::Plater::ObjectCutDialog->new($self,
1622 object => $self->{objects}[$obj_idx],
1623 model_object => $self->{model}->objects->[$obj_idx],
1624 );
1625 return unless $dlg->ShowModal == wxID_OK;
1626
1627 if (my @new_objects = $dlg->NewModelObjects) {
1628 $self->remove($obj_idx);
1629 $self->load_model_objects(grep defined($_), @new_objects);
1630 $self->arrange;
1631 }
1632 }
1633
1634 sub object_settings_dialog {
1635 my $self = shift;
1636 my ($obj_idx) = @_;
1637
1638 if (!defined $obj_idx) {
1639 ($obj_idx, undef) = $self->selected_object;
1640 }
1641 my $model_object = $self->{model}->objects->[$obj_idx];
1642
1643 # validate config before opening the settings dialog because
1644 # that dialog can't be closed if validation fails, but user
1645 # can't fix any error which is outside that dialog
1646 return unless $self->validate_config;
1647
1648 my $dlg = Slic3r::GUI::Plater::ObjectSettingsDialog->new($self,
1649 object => $self->{objects}[$obj_idx],
1650 model_object => $model_object,
1651 );
1652 $self->pause_background_process;
1653 $dlg->ShowModal;
1654
1655 # update thumbnail since parts may have changed
1656 if ($dlg->PartsChanged) {
1657 # recenter and re-align to Z = 0
1658 $model_object->center_around_origin;
1659 $self->make_thumbnail($obj_idx);
1660 }
1661
1662 # update print
1663 if ($dlg->PartsChanged || $dlg->PartSettingsChanged) {
1664 $self->stop_background_process;
1665 $self->{print}->reload_object($obj_idx);
1666 $self->schedule_background_process;
1667 } else {
1668 $self->resume_background_process;
1669 }
1670 }
1671
1672 # Called to update various buttons depending on whether there are any objects or
1673 # whether background processing (export of a G-code, sending to Octoprint, forced background re-slicing) is active.
1674 sub object_list_changed {
1675 my $self = shift;
1676
1677 # Enable/disable buttons depending on whether there are any objects on the platter.
1678 my $have_objects = @{$self->{objects}} ? 1 : 0;
1679 my $method = $have_objects ? 'Enable' : 'Disable';
1680 $self->{"btn_$_"}->$method
1681 for grep $self->{"btn_$_"}, qw(reset arrange reslice export_gcode export_stl print send_gcode);
1682
1683 if ($self->{export_gcode_output_file} || $self->{send_gcode_file}) {
1684 $self->{btn_reslice}->Disable;
1685 $self->{btn_export_gcode}->Disable;
1686 $self->{btn_print}->Disable;
1687 $self->{btn_send_gcode}->Disable;
1688 }
1689
1690 if ($self->{htoolbar}) {
1691 $self->{htoolbar}->EnableTool($_, $have_objects)
1692 for (TB_RESET, TB_ARRANGE);
1693 }
1694 }
1695
1696 sub selection_changed {
1697 my $self = shift;
1698
1699 my ($obj_idx, $object) = $self->selected_object;
1700 my $have_sel = defined $obj_idx;
1701
1702 my $method = $have_sel ? 'Enable' : 'Disable';
1703 $self->{"btn_$_"}->$method
1704 for grep $self->{"btn_$_"}, qw(remove increase decrease rotate45cw rotate45ccw changescale split cut settings);
1705
1706 if ($self->{htoolbar}) {
1707 $self->{htoolbar}->EnableTool($_, $have_sel)
1708 for (TB_REMOVE, TB_MORE, TB_FEWER, TB_45CW, TB_45CCW, TB_SCALE, TB_SPLIT, TB_CUT, TB_SETTINGS);
1709 }
1710
1711 if ($self->{object_info_size}) { # have we already loaded the info pane?
1712 if ($have_sel) {
1713 my $model_object = $self->{model}->objects->[$obj_idx];
1714 my $model_instance = $model_object->instances->[0];
1715 $self->{object_info_size}->SetLabel(sprintf("%.2f x %.2f x %.2f", @{$model_object->instance_bounding_box(0)->size}));
1716 $self->{object_info_materials}->SetLabel($model_object->materials_count);
1717
1718 if (my $stats = $model_object->mesh_stats) {
1719 $self->{object_info_volume}->SetLabel(sprintf('%.2f', $stats->{volume} * ($model_instance->scaling_factor**3)));
1720 $self->{object_info_facets}->SetLabel(sprintf('%d (%d shells)', $model_object->facets_count, $stats->{number_of_parts}));
1721 if (my $errors = sum(@$stats{qw(degenerate_facets edges_fixed facets_removed facets_added facets_reversed backwards_edges)})) {
1722 $self->{object_info_manifold}->SetLabel(sprintf("Auto-repaired (%d errors)", $errors));
1723 $self->{object_info_manifold_warning_icon}->Show;
1724
1725 # we don't show normals_fixed because we never provide normals
1726 # to admesh, so it generates normals for all facets
1727 my $message = sprintf '%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges',
1728 @$stats{qw(degenerate_facets edges_fixed facets_removed facets_added facets_reversed backwards_edges)};
1729 $self->{object_info_manifold}->SetToolTipString($message);
1730 $self->{object_info_manifold_warning_icon}->SetToolTipString($message);
1731 } else {
1732 $self->{object_info_manifold}->SetLabel("Yes");
1733 }
1734 } else {
1735 $self->{object_info_facets}->SetLabel($object->facets);
1736 }
1737 } else {
1738 $self->{"object_info_$_"}->SetLabel("") for qw(size volume facets materials manifold);
1739 $self->{object_info_manifold_warning_icon}->Hide;
1740 $self->{object_info_manifold}->SetToolTipString("");
1741 }
1742 $self->Layout;
1743 }
1744
1745 # prepagate the event to the frame (a custom Wx event would be cleaner)
1746 $self->GetFrame->on_plater_selection_changed($have_sel);
1747 }
1748
1749 sub select_object {
1750 my ($self, $obj_idx) = @_;
1751
1752 $_->selected(0) for @{ $self->{objects} };
1753 if (defined $obj_idx) {
1754 $self->{objects}->[$obj_idx]->selected(1);
1755
1756 # We use this flag to avoid circular event handling
1757 # Select() happens to fire a wxEVT_LIST_ITEM_SELECTED on Windows,
1758 # whose event handler calls this method again and again and again
1759 $PreventListEvents = 1;
1760 $self->{list}->Select($obj_idx, 1);
1761 $PreventListEvents = 0;
1762 } else {
1763 # TODO: deselect all in list
1764 }
1765 $self->selection_changed(1);
1766 }
1767
1768 sub selected_object {
1769 my $self = shift;
1770
1771 my $obj_idx = first { $self->{objects}[$_]->selected } 0..$#{ $self->{objects} };
1772 return undef if !defined $obj_idx;
1773 return ($obj_idx, $self->{objects}[$obj_idx]),
1774 }
1775
1776 sub refresh_canvases {
1777 my ($self) = @_;
1778
1779 $self->{canvas}->Refresh;
1780 $self->{canvas3D}->update if $self->{canvas3D};
1781 $self->{preview3D}->reload_print if $self->{preview3D};
1782 }
1783
1784 sub validate_config {
1785 my $self = shift;
1786
1787 eval {
1788 $self->GetFrame->config->validate;
1789 };
1790 return 0 if Slic3r::GUI::catch_error($self);
1791 return 1;
1792 }
1793
1794 sub statusbar {
1795 my $self = shift;
1796 return $self->GetFrame->{statusbar};
1797 }
1798
1799 sub object_menu {
1800 my ($self) = @_;
1801
1802 my $frame = $self->GetFrame;
1803 my $menu = Wx::Menu->new;
1804 $frame->_append_menu_item($menu, "Delete\tCtrl+Del", 'Remove the selected object', sub {
1805 $self->remove;
1806 }, undef, 'brick_delete.png');
1807 $frame->_append_menu_item($menu, "Increase copies\tCtrl++", 'Place one more copy of the selected object', sub {
1808 $self->increase;
1809 }, undef, 'add.png');
1810 $frame->_append_menu_item($menu, "Decrease copies\tCtrl+-", 'Remove one copy of the selected object', sub {
1811 $self->decrease;
1812 }, undef, 'delete.png');
1813 $frame->_append_menu_item($menu, "Set number of copies…", 'Change the number of copies of the selected object', sub {
1814 $self->set_number_of_copies;
1815 }, undef, 'textfield.png');
1816 $menu->AppendSeparator();
1817 $frame->_append_menu_item($menu, "Rotate 45° clockwise", 'Rotate the selected object by 45° clockwise', sub {
1818 $self->rotate(-45);
1819 }, undef, 'arrow_rotate_clockwise.png');
1820 $frame->_append_menu_item($menu, "Rotate 45° counter-clockwise", 'Rotate the selected object by 45° counter-clockwise', sub {
1821 $self->rotate(+45);
1822 }, undef, 'arrow_rotate_anticlockwise.png');
1823
1824 my $rotateMenu = Wx::Menu->new;
1825 my $rotateMenuItem = $menu->AppendSubMenu($rotateMenu, "Rotate", 'Rotate the selected object by an arbitrary angle');
1826 $frame->_set_menu_item_icon($rotateMenuItem, 'textfield.png');
1827 $frame->_append_menu_item($rotateMenu, "Around X axis…", 'Rotate the selected object by an arbitrary angle around X axis', sub {
1828 $self->rotate(undef, X);
1829 }, undef, 'bullet_red.png');
1830 $frame->_append_menu_item($rotateMenu, "Around Y axis…", 'Rotate the selected object by an arbitrary angle around Y axis', sub {
1831 $self->rotate(undef, Y);
1832 }, undef, 'bullet_green.png');
1833 $frame->_append_menu_item($rotateMenu, "Around Z axis…", 'Rotate the selected object by an arbitrary angle around Z axis', sub {
1834 $self->rotate(undef, Z);
1835 }, undef, 'bullet_blue.png');
1836
1837 my $mirrorMenu = Wx::Menu->new;
1838 my $mirrorMenuItem = $menu->AppendSubMenu($mirrorMenu, "Mirror", 'Mirror the selected object');
1839 $frame->_set_menu_item_icon($mirrorMenuItem, 'shape_flip_horizontal.png');
1840 $frame->_append_menu_item($mirrorMenu, "Along X axis…", 'Mirror the selected object along the X axis', sub {
1841 $self->mirror(X);
1842 }, undef, 'bullet_red.png');
1843 $frame->_append_menu_item($mirrorMenu, "Along Y axis…", 'Mirror the selected object along the Y axis', sub {
1844 $self->mirror(Y);
1845 }, undef, 'bullet_green.png');
1846 $frame->_append_menu_item($mirrorMenu, "Along Z axis…", 'Mirror the selected object along the Z axis', sub {
1847 $self->mirror(Z);
1848 }, undef, 'bullet_blue.png');
1849
1850 my $scaleMenu = Wx::Menu->new;
1851 my $scaleMenuItem = $menu->AppendSubMenu($scaleMenu, "Scale", 'Scale the selected object along a single axis');
1852 $frame->_set_menu_item_icon($scaleMenuItem, 'arrow_out.png');
1853 $frame->_append_menu_item($scaleMenu, "Uniformly…", 'Scale the selected object along the XYZ axes', sub {
1854 $self->changescale(undef);
1855 });
1856 $frame->_append_menu_item($scaleMenu, "Along X axis…", 'Scale the selected object along the X axis', sub {
1857 $self->changescale(X);
1858 }, undef, 'bullet_red.png');
1859 $frame->_append_menu_item($scaleMenu, "Along Y axis…", 'Scale the selected object along the Y axis', sub {
1860 $self->changescale(Y);
1861 }, undef, 'bullet_green.png');
1862 $frame->_append_menu_item($scaleMenu, "Along Z axis…", 'Scale the selected object along the Z axis', sub {
1863 $self->changescale(Z);
1864 }, undef, 'bullet_blue.png');
1865
1866 my $scaleToSizeMenu = Wx::Menu->new;
1867 my $scaleToSizeMenuItem = $menu->AppendSubMenu($scaleToSizeMenu, "Scale to size", 'Scale the selected object along a single axis');
1868 $frame->_set_menu_item_icon($scaleToSizeMenuItem, 'arrow_out.png');
1869 $frame->_append_menu_item($scaleToSizeMenu, "Uniformly…", 'Scale the selected object along the XYZ axes', sub {
1870 $self->changescale(undef, 1);
1871 });
1872 $frame->_append_menu_item($scaleToSizeMenu, "Along X axis…", 'Scale the selected object along the X axis', sub {
1873 $self->changescale(X, 1);
1874 }, undef, 'bullet_red.png');
1875 $frame->_append_menu_item($scaleToSizeMenu, "Along Y axis…", 'Scale the selected object along the Y axis', sub {
1876 $self->changescale(Y, 1);
1877 }, undef, 'bullet_green.png');
1878 $frame->_append_menu_item($scaleToSizeMenu, "Along Z axis…", 'Scale the selected object along the Z axis', sub {
1879 $self->changescale(Z, 1);
1880 }, undef, 'bullet_blue.png');
1881
1882 $frame->_append_menu_item($menu, "Split", 'Split the selected object into individual parts', sub {
1883 $self->split_object;
1884 }, undef, 'shape_ungroup.png');
1885 $frame->_append_menu_item($menu, "Cut…", 'Open the 3D cutting tool', sub {
1886 $self->object_cut_dialog;
1887 }, undef, 'package.png');
1888 $menu->AppendSeparator();
1889 $frame->_append_menu_item($menu, "Settings…", 'Open the object editor dialog', sub {
1890 $self->object_settings_dialog;
1891 }, undef, 'cog.png');
1892 $menu->AppendSeparator();
1893 $frame->_append_menu_item($menu, "Export object as STL…", 'Export this single object as STL file', sub {
1894 $self->export_object_stl;
1895 }, undef, 'brick_go.png');
1896
1897 return $menu;
1898 }
1899
1900 # Set a camera direction, zoom to all objects.
1901 sub select_view {
1902 my ($self, $direction) = @_;
1903 my $idx_page = $self->{preview_notebook}->GetSelection;
1904 my $page = ($idx_page == &Wx::wxNOT_FOUND) ? '3D' : $self->{preview_notebook}->GetPageText($idx_page);
1905 if ($page eq 'Preview') {
1906 $self->{preview3D}->canvas->select_view($direction);
1907 $self->{canvas3D}->set_viewport_from_scene($self->{preview3D}->canvas);
1908 } else {
1909 $self->{canvas3D}->select_view($direction);
1910 $self->{preview3D}->canvas->set_viewport_from_scene($self->{canvas3D});
1911 }
1912 }
1913
1914 package Slic3r::GUI::Plater::DropTarget;
1915 use Wx::DND;
1916 use base 'Wx::FileDropTarget';
1917
1918 sub new {
1919 my $class = shift;
1920 my ($window) = @_;
1921 my $self = $class->SUPER::new;
1922 $self->{window} = $window;
1923 return $self;
1924 }
1925
1926 sub OnDropFiles {
1927 my $self = shift;
1928 my ($x, $y, $filenames) = @_;
1929
1930 # stop scalars leaking on older perl
1931 # https://rt.perl.org/rt3/Public/Bug/Display.html?id=70602
1932 @_ = ();
1933
1934 # only accept STL, OBJ and AMF files
1935 return 0 if grep !/\.(?:stl|obj|amf(?:\.xml)?)$/i, @$filenames;
1936
1937 $self->{window}->load_file($_) for @$filenames;
1938 }
1939
1940 # 2D preview of an object. Each object is previewed by its convex hull.
1941 package Slic3r::GUI::Plater::Object;
1942 use Moo;
1943
1944 use List::Util qw(first);
1945 use Slic3r::Geometry qw(X Y Z MIN MAX deg2rad);
1946
1947 has 'name' => (is => 'rw', required => 1);
1948 has 'thumbnail' => (is => 'rw'); # ExPolygon::Collection in scaled model units with no transforms
1949 has 'transformed_thumbnail' => (is => 'rw');
1950 has 'instance_thumbnails' => (is => 'ro', default => sub { [] }); # array of ExPolygon::Collection objects, each one representing the actual placed thumbnail of each instance in pixel units
1951 has 'selected' => (is => 'rw', default => sub { 0 });
1952
1953 sub make_thumbnail {
1954 my ($self, $model, $obj_idx) = @_;
1955
1956 # make method idempotent
1957 $self->thumbnail->clear;
1958
1959 my $mesh = $model->objects->[$obj_idx]->raw_mesh;
1960 if ($mesh->facets_count <= 5000) {
1961 # remove polygons with area <= 1mm
1962 my $area_threshold = Slic3r::Geometry::scale 1;
1963 $self->thumbnail->append(
1964 grep $_->area >= $area_threshold,
1965 @{ $mesh->horizontal_projection }, # horizontal_projection returns scaled expolygons
1966 );
1967 $self->thumbnail->simplify(0.5);
1968 } else {
1969 my $convex_hull = Slic3r::ExPolygon->new($mesh->convex_hull);
1970 $self->thumbnail->append($convex_hull);
1971 }
1972
1973 return $self->thumbnail;
1974 }
1975
1976 sub transform_thumbnail {
1977 my ($self, $model, $obj_idx) = @_;
1978
1979 return unless defined $self->thumbnail;
1980
1981 my $model_object = $model->objects->[$obj_idx];
1982 my $model_instance = $model_object->instances->[0];
1983
1984 # the order of these transformations MUST be the same everywhere, including
1985 # in Slic3r::Print->add_model_object()
1986 my $t = $self->thumbnail->clone;
1987 $t->rotate($model_instance->rotation, Slic3r::Point->new(0,0));
1988 $t->scale($model_instance->scaling_factor);
1989
1990 $self->transformed_thumbnail($t);
1991 }
1992
1993 1;
0 # Preferences dialog, opens from Menu: File->Preferences
1
2 package Slic3r::GUI::Preferences;
3 use Wx qw(:dialog :id :misc :sizer :systemsettings wxTheApp);
4 use Wx::Event qw(EVT_BUTTON EVT_TEXT_ENTER);
5 use base 'Wx::Dialog';
6
7 sub new {
8 my ($class, $parent) = @_;
9 my $self = $class->SUPER::new($parent, -1, "Preferences", wxDefaultPosition, wxDefaultSize);
10 $self->{values} = {};
11
12 my $optgroup;
13 $optgroup = Slic3r::GUI::OptionsGroup->new(
14 parent => $self,
15 title => 'General',
16 on_change => sub {
17 my ($opt_id) = @_;
18 $self->{values}{$opt_id} = $optgroup->get_value($opt_id);
19 },
20 label_width => 200,
21 );
22 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
23 opt_id => 'mode',
24 type => 'select',
25 label => 'Mode',
26 tooltip => 'Choose between a simpler, basic mode and an expert mode with more options and more complicated interface.',
27 labels => ['Simple','Expert'],
28 values => ['simple','expert'],
29 default => $Slic3r::GUI::Settings->{_}{mode},
30 width => 100,
31 ));
32 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
33 opt_id => 'version_check',
34 type => 'bool',
35 label => 'Check for updates',
36 tooltip => 'If this is enabled, Slic3r will check for updates daily and display a reminder if a newer version is available.',
37 default => $Slic3r::GUI::Settings->{_}{version_check} // 1,
38 readonly => !wxTheApp->have_version_check,
39 ));
40 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
41 opt_id => 'remember_output_path',
42 type => 'bool',
43 label => 'Remember output directory',
44 tooltip => 'If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input files.',
45 default => $Slic3r::GUI::Settings->{_}{remember_output_path},
46 ));
47 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
48 opt_id => 'autocenter',
49 type => 'bool',
50 label => 'Auto-center parts',
51 tooltip => 'If this is enabled, Slic3r will auto-center objects around the print bed center.',
52 default => $Slic3r::GUI::Settings->{_}{autocenter},
53 ));
54 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
55 opt_id => 'background_processing',
56 type => 'bool',
57 label => 'Background processing',
58 tooltip => 'If this is enabled, Slic3r will pre-process objects as soon as they\'re loaded in order to save time when exporting G-code.',
59 default => $Slic3r::GUI::Settings->{_}{background_processing},
60 readonly => !$Slic3r::have_threads,
61 ));
62 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
63 opt_id => 'no_controller',
64 type => 'bool',
65 label => 'Disable USB/serial connection',
66 tooltip => 'Disable communication with the printer over a serial / USB cable. This simplifies the user interface in case the printer is never attached to the computer.',
67 default => $Slic3r::GUI::Settings->{_}{no_controller},
68 ));
69 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
70 opt_id => 'no_defaults',
71 type => 'bool',
72 label => 'Suppress "- default -" presets',
73 tooltip => 'Suppress "- default -" presets in the Print / Filament / Printer selections once there are any other valid presets available.',
74 default => $Slic3r::GUI::Settings->{_}{no_defaults},
75 ));
76
77 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
78 $sizer->Add($optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
79
80 my $buttons = $self->CreateStdDialogButtonSizer(wxOK | wxCANCEL);
81 EVT_BUTTON($self, wxID_OK, sub { $self->_accept });
82 $sizer->Add($buttons, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
83
84 $self->SetSizer($sizer);
85 $sizer->SetSizeHints($self);
86
87 return $self;
88 }
89
90 sub _accept {
91 my $self = shift;
92
93 if ($self->{values}{mode} || defined($self->{values}{no_controller})) {
94 Slic3r::GUI::warning_catcher($self)->("You need to restart Slic3r to make the changes effective.");
95 }
96
97 $Slic3r::GUI::Settings->{_}{$_} = $self->{values}{$_} for keys %{$self->{values}};
98 wxTheApp->save_settings;
99
100 $self->EndModal(wxID_OK);
101 $self->Close; # needed on Linux
102
103 # Nothify the UI to update itself from the ini file.
104 wxTheApp->update_ui_from_settings;
105 }
106
107 1;
0 # Status bar at the bottom of the main screen.
1
2 package Slic3r::GUI::ProgressStatusBar;
3 use strict;
4 use warnings;
5
6 use Wx qw(:gauge :misc);
7 use base 'Wx::StatusBar';
8
9 sub new {
10 my $class = shift;
11 my $self = $class->SUPER::new(@_);
12
13 $self->{busy} = 0;
14 $self->{timer} = Wx::Timer->new($self);
15 $self->{prog} = Wx::Gauge->new($self, wxGA_HORIZONTAL, 100, wxDefaultPosition, wxDefaultSize);
16 $self->{prog}->Hide;
17 $self->{cancelbutton} = Wx::Button->new($self, -1, "Cancel", wxDefaultPosition, wxDefaultSize);
18 $self->{cancelbutton}->Hide;
19
20 $self->SetFieldsCount(3);
21 $self->SetStatusWidths(-1, 150, 155);
22
23 Wx::Event::EVT_TIMER($self, \&OnTimer, $self->{timer});
24 Wx::Event::EVT_SIZE($self, \&OnSize);
25 Wx::Event::EVT_BUTTON($self, $self->{cancelbutton}, sub {
26 $self->{cancel_cb}->();
27 $self->{cancelbutton}->Hide;
28 });
29
30 return $self;
31 }
32
33 sub DESTROY {
34 my $self = shift;
35 $self->{timer}->Stop if $self->{timer} && $self->{timer}->IsRunning;
36 }
37
38 sub OnSize {
39 my ($self, $event) = @_;
40
41 my %fields = (
42 # 0 is reserved for status text
43 1 => $self->{cancelbutton},
44 2 => $self->{prog},
45 );
46
47 foreach (keys %fields) {
48 my $rect = $self->GetFieldRect($_);
49 my $offset = &Wx::wxGTK ? 1 : 0; # add a cosmetic 1 pixel offset on wxGTK
50 my $pos = [$rect->GetX + $offset, $rect->GetY + $offset];
51 $fields{$_}->Move($pos);
52 $fields{$_}->SetSize($rect->GetWidth - $offset, $rect->GetHeight);
53 }
54
55 $event->Skip;
56 }
57
58 sub OnTimer {
59 my ($self, $event) = @_;
60
61 if ($self->{prog}->IsShown) {
62 $self->{timer}->Stop;
63 }
64 $self->{prog}->Pulse if $self->{_busy};
65 }
66
67 sub SetCancelCallback {
68 my $self = shift;
69 my ($cb) = @_;
70 $self->{cancel_cb} = $cb;
71 $cb ? $self->{cancelbutton}->Show : $self->{cancelbutton}->Hide;
72 }
73
74 sub Run {
75 my $self = shift;
76 my $rate = shift || 100;
77 if (!$self->{timer}->IsRunning) {
78 $self->{timer}->Start($rate);
79 }
80 }
81
82 sub GetProgress {
83 my $self = shift;
84 return $self->{prog}->GetValue;
85 }
86
87 sub SetProgress {
88 my $self = shift;
89 my ($val) = @_;
90 if (!$self->{prog}->IsShown) {
91 $self->ShowProgress(1);
92 }
93 if ($val == $self->{prog}->GetRange) {
94 $self->{prog}->SetValue(0);
95 $self->ShowProgress(0);
96 } else {
97 $self->{prog}->SetValue($val);
98 }
99 }
100
101 sub SetRange {
102 my $self = shift;
103 my ($val) = @_;
104
105 if ($val != $self->{prog}->GetRange) {
106 $self->{prog}->SetRange($val);
107 }
108 }
109
110 sub ShowProgress {
111 my $self = shift;
112 my ($show) = @_;
113
114 $self->{prog}->Show($show);
115 $self->{prog}->Pulse;
116 }
117
118 sub StartBusy {
119 my $self = shift;
120 my $rate = shift || 100;
121
122 $self->{_busy} = 1;
123 $self->ShowProgress(1);
124 if (!$self->{timer}->IsRunning) {
125 $self->{timer}->Start($rate);
126 }
127 }
128
129 sub StopBusy {
130 my $self = shift;
131
132 $self->{timer}->Stop;
133 $self->ShowProgress(0);
134 $self->{prog}->SetValue(0);
135 $self->{_busy} = 0;
136 }
137
138 sub IsBusy {
139 my $self = shift;
140 return $self->{_busy};
141 }
142
143 1;
0 # DLP Projector screen for the SLA (stereolitography) print process
1
2 package Slic3r::GUI::Projector;
3 use strict;
4 use warnings;
5 use Wx qw(:dialog :id :misc :sizer :systemsettings :bitmap :button :icon wxTheApp);
6 use Wx::Event qw(EVT_BUTTON EVT_TEXT_ENTER EVT_SPINCTRL EVT_SLIDER);
7 use base qw(Wx::Dialog Class::Accessor);
8 use utf8;
9
10 __PACKAGE__->mk_accessors(qw(config config2 screen controller _optgroups));
11
12 sub new {
13 my ($class, $parent) = @_;
14 my $self = $class->SUPER::new($parent, -1, "Projector for DLP", wxDefaultPosition, wxDefaultSize);
15 $self->config2({
16 display => 0,
17 show_bed => 1,
18 invert_y => 0,
19 zoom => 100,
20 exposure_time => 2,
21 bottom_exposure_time => 7,
22 settle_time => 1.5,
23 bottom_layers => 3,
24 z_lift => 5,
25 z_lift_speed => 8,
26 offset => [0,0],
27 });
28
29 my $ini = eval { Slic3r::Config->read_ini("$Slic3r::GUI::datadir/DLP.ini") };
30 if ($ini) {
31 foreach my $opt_id (keys %{$ini->{_}}) {
32 my $value = $ini->{_}{$opt_id};
33 if ($opt_id eq 'offset') {
34 $value = [ split /,/, $value ];
35 }
36 $self->config2->{$opt_id} = $value;
37 }
38 }
39
40 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
41
42 $self->config(Slic3r::Config->new_from_defaults(
43 qw(serial_port serial_speed bed_shape start_gcode end_gcode z_offset)
44 ));
45 $self->config->apply(wxTheApp->{mainframe}->config);
46
47 my @optgroups = ();
48 {
49 push @optgroups, my $optgroup = Slic3r::GUI::ConfigOptionsGroup->new(
50 parent => $self,
51 title => 'USB/Serial connection',
52 config => $self->config,
53 label_width => 200,
54 );
55 $sizer->Add($optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
56
57 {
58 my $line = Slic3r::GUI::OptionsGroup::Line->new(
59 label => 'Serial port',
60 );
61 my $serial_port = $optgroup->get_option('serial_port');
62 $serial_port->side_widget(sub {
63 my ($parent) = @_;
64
65 my $btn = Wx::BitmapButton->new($self, -1, Wx::Bitmap->new($Slic3r::var->("arrow_rotate_clockwise.png"), wxBITMAP_TYPE_PNG),
66 wxDefaultPosition, wxDefaultSize, &Wx::wxBORDER_NONE);
67 $btn->SetToolTipString("Rescan serial ports")
68 if $btn->can('SetToolTipString');
69 EVT_BUTTON($self, $btn, sub {
70 $optgroup->get_field('serial_port')->set_values([ wxTheApp->scan_serial_ports ]);
71 });
72
73 return $btn;
74 });
75 my $serial_test = sub {
76 my ($parent) = @_;
77
78 my $btn = $self->{serial_test_btn} = Wx::Button->new($parent, -1,
79 "Test", wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
80 $btn->SetFont($Slic3r::GUI::small_font);
81 if ($Slic3r::GUI::have_button_icons) {
82 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("wrench.png"), wxBITMAP_TYPE_PNG));
83 }
84
85 EVT_BUTTON($self, $btn, sub {
86 my $sender = Slic3r::GCode::Sender->new;
87 my $res = $sender->connect(
88 $self->{config}->serial_port,
89 $self->{config}->serial_speed,
90 );
91 if ($res && $sender->wait_connected) {
92 Slic3r::GUI::show_info($self, "Connection to printer works correctly.", "Success!");
93 } else {
94 Slic3r::GUI::show_error($self, "Connection failed.");
95 }
96 });
97 return $btn;
98 };
99 $line->append_option($serial_port);
100 $line->append_option($optgroup->get_option('serial_speed'));
101 $line->append_widget($serial_test);
102 $optgroup->append_line($line);
103 }
104 }
105
106 {
107 push @optgroups, my $optgroup = Slic3r::GUI::ConfigOptionsGroup->new(
108 parent => $self,
109 title => 'G-code',
110 config => $self->config,
111 label_width => 200,
112 );
113 $sizer->Add($optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
114
115 {
116 my $option = $optgroup->get_option('start_gcode');
117 $option->height(50);
118 $option->full_width(1);
119 $optgroup->append_single_option_line($option);
120 }
121 {
122 my $option = $optgroup->get_option('end_gcode');
123 $option->height(50);
124 $option->full_width(1);
125 $optgroup->append_single_option_line($option);
126 }
127 }
128
129 my $on_change = sub {
130 my ($opt_id, $value) = @_;
131
132 $self->config2->{$opt_id} = $value;
133 $self->screen->reposition;
134 $self->show_print_time;
135
136 my $serialized = {};
137 foreach my $opt_id (keys %{$self->config2}) {
138 my $value = $self->config2->{$opt_id};
139 if (ref($value) eq 'ARRAY') {
140 $value = join ',', @$value;
141 }
142 $serialized->{$opt_id} = $value;
143 }
144 Slic3r::Config->write_ini(
145 "$Slic3r::GUI::datadir/DLP.ini",
146 { _ => $serialized });
147 };
148
149 {
150 push @optgroups, my $optgroup = Slic3r::GUI::OptionsGroup->new(
151 parent => $self,
152 title => 'Projection',
153 on_change => $on_change,
154 label_width => 200,
155 );
156 $sizer->Add($optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
157
158 {
159 my $line = Slic3r::GUI::OptionsGroup::Line->new(
160 label => 'Display',
161 );
162
163 my @displays = 0 .. (Wx::Display::GetCount()-1);
164 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
165 opt_id => 'display',
166 type => 'select',
167 label => 'Display',
168 tooltip => '',
169 labels => [@displays],
170 values => [@displays],
171 default => $self->config2->{display},
172 ));
173 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
174 opt_id => 'zoom',
175 type => 'percent',
176 label => 'Zoom %',
177 tooltip => '',
178 default => $self->config2->{zoom},
179 min => 0.1,
180 max => 100,
181 ));
182 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
183 opt_id => 'offset',
184 type => 'point',
185 label => 'Offset',
186 tooltip => '',
187 default => $self->config2->{offset},
188 ));
189 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
190 opt_id => 'invert_y',
191 type => 'bool',
192 label => 'Invert Y',
193 tooltip => '',
194 default => $self->config2->{invert_y},
195 ));
196 $optgroup->append_line($line);
197 }
198
199 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
200 opt_id => 'show_bed',
201 type => 'bool',
202 label => 'Show bed',
203 tooltip => '',
204 default => $self->config2->{show_bed},
205 ));
206 }
207
208 {
209 push @optgroups, my $optgroup = Slic3r::GUI::OptionsGroup->new(
210 parent => $self,
211 title => 'Print',
212 on_change => $on_change,
213 label_width => 200,
214 );
215 $sizer->Add($optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
216
217 {
218 my $line = Slic3r::GUI::OptionsGroup::Line->new(
219 label => 'Time (seconds)',
220 );
221 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
222 opt_id => 'bottom_exposure_time',
223 type => 'f',
224 label => 'Bottom exposure',
225 tooltip => '',
226 default => $self->config2->{bottom_exposure_time},
227 ));
228 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
229 opt_id => 'exposure_time',
230 type => 'f',
231 label => 'Exposure',
232 tooltip => '',
233 default => $self->config2->{exposure_time},
234 ));
235 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
236 opt_id => 'settle_time',
237 type => 'f',
238 label => 'Settle',
239 tooltip => '',
240 default => $self->config2->{settle_time},
241 ));
242 $optgroup->append_line($line);
243 }
244
245 $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
246 opt_id => 'bottom_layers',
247 type => 'i',
248 label => 'Bottom layers',
249 tooltip => '',
250 default => $self->config2->{bottom_layers},
251 ));
252
253 {
254 my $line = Slic3r::GUI::OptionsGroup::Line->new(
255 label => 'Z Lift',
256 );
257 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
258 opt_id => 'z_lift',
259 type => 'f',
260 label => 'Distance',
261 sidetext => 'mm',
262 tooltip => '',
263 default => $self->config2->{z_lift},
264 ));
265 $line->append_option(Slic3r::GUI::OptionsGroup::Option->new(
266 opt_id => 'z_lift_speed',
267 type => 'f',
268 label => 'Speed',
269 sidetext => 'mm/s',
270 tooltip => '',
271 default => $self->config2->{z_lift_speed},
272 ));
273 $optgroup->append_line($line);
274 }
275 }
276
277 $self->_optgroups([@optgroups]);
278
279 {
280 my $sizer1 = Wx::BoxSizer->new(wxHORIZONTAL);
281 $sizer->Add($sizer1, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
282
283 {
284 my $btn = $self->{btn_manual_control} = Wx::Button->new($self, -1, 'Manual Control', wxDefaultPosition, wxDefaultSize);
285 if ($Slic3r::GUI::have_button_icons) {
286 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("cog.png"), wxBITMAP_TYPE_PNG));
287 }
288 $sizer1->Add($btn, 0);
289 EVT_BUTTON($self, $btn, sub {
290 my $sender = Slic3r::GCode::Sender->new;
291 my $res = $sender->connect(
292 $self->config->serial_port,
293 $self->config->serial_speed,
294 );
295 if (!$res || !$sender->wait_connected) {
296 Slic3r::GUI::show_error(undef, "Connection failed. Check serial port and speed.");
297 return;
298 }
299 my $dlg = Slic3r::GUI::Controller::ManualControlDialog->new
300 ($self, $self->config, $sender);
301 $dlg->ShowModal;
302 $sender->disconnect;
303 });
304
305
306 }
307 {
308 my $btn = $self->{btn_print} = Wx::Button->new($self, -1, 'Print', wxDefaultPosition, wxDefaultSize);
309 if ($Slic3r::GUI::have_button_icons) {
310 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("control_play.png"), wxBITMAP_TYPE_PNG));
311 }
312 $sizer1->Add($btn, 0);
313 EVT_BUTTON($self, $btn, sub {
314 $self->controller->start_print;
315 $self->_update_buttons;
316 $self->_set_status('');
317 });
318 }
319 {
320 my $btn = $self->{btn_stop} = Wx::Button->new($self, -1, 'Stop/Black', wxDefaultPosition, wxDefaultSize);
321 if ($Slic3r::GUI::have_button_icons) {
322 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("control_stop.png"), wxBITMAP_TYPE_PNG));
323 }
324 $sizer1->Add($btn, 0);
325 EVT_BUTTON($self, $btn, sub {
326 $self->controller->stop_print;
327 $self->_update_buttons;
328 $self->_set_status('');
329 });
330 }
331
332 {
333 {
334 my $text = Wx::StaticText->new($self, -1, "Layer:", wxDefaultPosition, wxDefaultSize);
335 $text->SetFont($Slic3r::GUI::small_font);
336 $sizer1->Add($text, 0, wxEXPAND | wxLEFT, 10);
337 }
338 {
339 my $spin = $self->{layers_spinctrl} = Wx::SpinCtrl->new($self, -1, 0, wxDefaultPosition, [60,-1],
340 0, 0, 300, 0);
341 $sizer1->Add($spin, 0);
342 EVT_SPINCTRL($self, $spin, sub {
343 my $value = $spin->GetValue;
344 $self->{layers_slider}->SetValue($value);
345 $self->controller->project_layer($value);
346 $self->_update_buttons;
347 });
348 }
349 {
350 my $slider = $self->{layers_slider} = Wx::Slider->new(
351 $self, -1,
352 0, # default
353 0, # min
354 300, # max
355 wxDefaultPosition,
356 wxDefaultSize,
357 );
358 $sizer1->Add($slider, 1);
359 EVT_SLIDER($self, $slider, sub {
360 my $value = $slider->GetValue;
361 $self->{layers_spinctrl}->SetValue($value);
362 $self->controller->project_layer($value);
363 $self->_update_buttons;
364 });
365 }
366 }
367
368 my $sizer2 = Wx::BoxSizer->new(wxHORIZONTAL);
369 $sizer->Add($sizer2, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
370
371 {
372 $self->{status_text} = Wx::StaticText->new($self, -1, "", wxDefaultPosition, wxDefaultSize);
373 $self->{status_text}->SetFont($Slic3r::GUI::small_font);
374 $sizer2->Add($self->{status_text}, 1 | wxEXPAND);
375 }
376 }
377
378 {
379 my $buttons = $self->CreateStdDialogButtonSizer(wxOK);
380 EVT_BUTTON($self, wxID_CLOSE, sub {
381 $self->_close;
382 });
383 $sizer->Add($buttons, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
384 }
385
386 $self->SetSizer($sizer);
387 $sizer->SetSizeHints($self);
388
389 # reuse existing screen if any
390 if ($Slic3r::GUI::DLP_projection_screen) {
391 $self->screen($Slic3r::GUI::DLP_projection_screen);
392 $self->screen->config($self->config);
393 $self->screen->config2($self->config2);
394 } else {
395 $self->screen(Slic3r::GUI::Projector::Screen->new($parent, $self->config, $self->config2));
396 $Slic3r::GUI::DLP_projection_screen = $self->screen;
397 }
398 $self->screen->reposition;
399 $self->screen->Show;
400 wxTheApp->{mainframe}->Hide;
401
402 # initialize controller
403 $self->controller(Slic3r::GUI::Projector::Controller->new(
404 config => $self->config,
405 config2 => $self->config2,
406 screen => $self->screen,
407 on_project_layer => sub {
408 my ($layer_num) = @_;
409
410 $self->{layers_spinctrl}->SetValue($layer_num);
411 $self->{layers_slider}->SetValue($layer_num);
412
413 my $duration = $self->controller->remaining_print_time;
414 $self->_set_status(sprintf "Printing layer %d/%d (z = %.2f); %d minutes and %d seconds left",
415 $layer_num, $self->controller->layer_count,
416 $self->controller->current_layer_height,
417 int($duration/60), ($duration - int($duration/60)*60)); # % truncates to integer
418 },
419 on_print_completed => sub {
420 $self->_update_buttons;
421 $self->_set_status('');
422 Wx::Bell();
423 },
424 ));
425 {
426 my $max = $self->controller->layer_count-1;
427 $self->{layers_spinctrl}->SetRange(0, $max);
428 $self->{layers_slider}->SetRange(0, $max);
429 }
430
431 $self->_update_buttons;
432 $self->show_print_time;
433
434 return $self;
435 }
436
437 sub _update_buttons {
438 my ($self) = @_;
439
440 my $is_printing = $self->controller->is_printing;
441 my $is_projecting = $self->controller->is_projecting;
442 $self->{btn_manual_control}->Show(!$is_printing);
443 $self->{btn_print}->Show(!$is_printing && !$is_projecting);
444 $self->{btn_stop}->Show($is_printing || $is_projecting);
445 $self->{layers_spinctrl}->Enable(!$is_printing);
446 $self->{layers_slider}->Enable(!$is_printing);
447 if ($is_printing) {
448 $_->disable for @{$self->_optgroups};
449 } else {
450 $_->enable for @{$self->_optgroups};
451 }
452 $self->Layout;
453 }
454
455 sub _set_status {
456 my ($self, $status) = @_;
457 $self->{status_text}->SetLabel($status // '');
458 $self->{status_text}->Wrap($self->{status_text}->GetSize->GetWidth);
459 $self->{status_text}->Refresh;
460 $self->Layout;
461 }
462
463 sub show_print_time {
464 my ($self) = @_;
465
466
467 my $duration = $self->controller->print_time;
468 $self->_set_status(sprintf "Estimated print time: %d minutes and %d seconds",
469 int($duration/60), ($duration - int($duration/60)*60)); # % truncates to integer
470 }
471
472 sub _close {
473 my $self = shift;
474
475 # if projection screen is not on the same display as our dialog,
476 # ask the user whether they want to keep it open
477 my $keep_screen = 0;
478 my $display_area = Wx::Display->new($self->config2->{display})->GetGeometry;
479 if (!$display_area->Contains($self->GetScreenPosition)) {
480 my $res = Wx::MessageDialog->new($self, "Do you want to keep the black screen open?", 'Black screen', wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION)->ShowModal;
481 $keep_screen = ($res == wxID_YES);
482 }
483
484 if ($keep_screen) {
485 $self->screen->config(undef);
486 $self->screen->config2(undef);
487 $self->screen->Refresh;
488 } else {
489 $self->screen->Destroy;
490 $self->screen(undef);
491 $Slic3r::GUI::DLP_projection_screen = undef;
492 }
493 wxTheApp->{mainframe}->Show;
494
495 my $printer_tab = wxTheApp->{mainframe}{options_tabs}{printer};
496 $printer_tab->load_config($self->config);
497
498 $self->EndModal(wxID_OK);
499 }
500
501 package Slic3r::GUI::Projector::Controller;
502 use Moo;
503 use Wx qw(wxTheApp :id :timer);
504 use Wx::Event qw(EVT_TIMER);
505 use Slic3r::Print::State ':steps';
506 use Time::HiRes qw(gettimeofday tv_interval);
507
508 has 'config' => (is => 'ro', required => 1);
509 has 'config2' => (is => 'ro', required => 1);
510 has 'screen' => (is => 'ro', required => 1);
511 has 'on_project_layer' => (is => 'rw');
512 has 'on_print_completed' => (is => 'rw');
513 has 'sender' => (is => 'rw');
514 has 'timer' => (is => 'rw');
515 has 'is_printing' => (is => 'rw', default => sub { 0 });
516 has '_print' => (is => 'rw');
517 has '_layers' => (is => 'rw');
518 has '_heights' => (is => 'rw');
519 has '_layer_num' => (is => 'rw');
520 has '_timer_cb' => (is => 'rw');
521
522 sub BUILD {
523 my ($self) = @_;
524
525 Slic3r::GUI::disable_screensaver();
526
527 $self->set_print(wxTheApp->{mainframe}->{plater}->{print});
528
529 # projection timer
530 my $timer_id = &Wx::NewId();
531 $self->timer(Wx::Timer->new($self->screen, $timer_id));
532 EVT_TIMER($self->screen, $timer_id, sub {
533 my $cb = $self->_timer_cb;
534 $self->_timer_cb(undef);
535 $cb->();
536 });
537 }
538
539 sub delay {
540 my ($self, $wait, $cb) = @_;
541
542 $self->_timer_cb($cb);
543 $self->timer->Start($wait * 1000, wxTIMER_ONE_SHOT);
544 }
545
546 sub set_print {
547 my ($self, $print) = @_;
548
549 # make sure layers were sliced
550 {
551 my $progress_dialog;
552 foreach my $object (@{$print->objects}) {
553 next if $object->step_done(STEP_SLICE);
554 $progress_dialog //= Wx::ProgressDialog->new('Slicing…', "Processing layers…", 100, undef, 0);
555 $progress_dialog->Pulse;
556 $object->slice;
557 }
558 $progress_dialog->Destroy if $progress_dialog;
559 }
560
561 $self->_print($print);
562
563 # sort layers by Z
564 my %layers = ();
565 foreach my $layer (map { @{$_->layers}, @{$_->support_layers} } @{$print->objects}) {
566 my $height = $layer->print_z;
567 $layers{$height} //= [];
568 push @{$layers{$height}}, $layer;
569 }
570 $self->_layers({ %layers });
571 $self->_heights([ sort { $a <=> $b } keys %layers ]);
572 }
573
574 sub layer_count {
575 my ($self) = @_;
576
577 return scalar @{$self->_heights};
578 }
579
580 sub current_layer_height {
581 my ($self) = @_;
582
583 return $self->_heights->[$self->_layer_num];
584 }
585
586 sub start_print {
587 my ($self) = @_;
588
589 {
590 $self->sender(Slic3r::GCode::Sender->new);
591 my $res = $self->sender->connect(
592 $self->config->serial_port,
593 $self->config->serial_speed,
594 );
595 if (!$res || !$self->sender->wait_connected) {
596 Slic3r::GUI::show_error(undef, "Connection failed. Check serial port and speed.");
597 return;
598 }
599 Slic3r::debugf "connected to " . $self->config->serial_port . "\n";
600
601 # send custom start G-code
602 $self->sender->send($_, 1) for grep !/^;/, split /\n/, $self->config->start_gcode;
603 }
604
605 $self->is_printing(1);
606
607 # TODO: block until the G1 command has been performed
608 # we could do this with M400 + M115 but maybe it's not portable
609 $self->delay(5, sub {
610 # start with black
611 Slic3r::debugf "starting black projection\n";
612 $self->_layer_num(-1);
613 $self->screen->project_layers(undef);
614 $self->delay($self->config2->{settle_time}, sub {
615 $self->project_next_layer;
616 });
617 });
618 }
619
620 sub stop_print {
621 my ($self) = @_;
622
623 if ($self->sender) {
624 $self->sender->disconnect;
625 }
626
627 $self->is_printing(0);
628 $self->timer->Stop;
629 $self->_timer_cb(undef);
630 $self->screen->project_layers(undef);
631 }
632
633 sub print_completed {
634 my ($self) = @_;
635
636 # send custom end G-code
637 if ($self->sender) {
638 $self->sender->send($_, 1) for grep !/^;/, split /\n/, $self->config->end_gcode;
639 }
640
641 # call this before the on_print_completed callback otherwise buttons
642 # won't be updated correctly
643 $self->stop_print;
644
645 $self->on_print_completed->()
646 if $self->is_printing && $self->on_print_completed;
647 }
648
649 sub is_projecting {
650 my ($self) = @_;
651
652 return defined $self->screen->layers;
653 }
654
655 sub project_layer {
656 my ($self, $layer_num) = @_;
657
658 if (!defined $layer_num || $layer_num >= $self->layer_count) {
659 $self->screen->project_layers(undef);
660 return;
661 }
662
663 my @layers = @{ $self->_layers->{ $self->_heights->[$layer_num] } };
664 $self->screen->project_layers([ @layers ]);
665 }
666
667 sub project_next_layer {
668 my ($self) = @_;
669
670 $self->_layer_num($self->_layer_num + 1);
671 Slic3r::debugf "projecting layer %d\n", $self->_layer_num;
672 if ($self->_layer_num >= $self->layer_count) {
673 $self->print_completed;
674 return;
675 }
676
677 $self->on_project_layer->($self->_layer_num) if $self->on_project_layer;
678
679 if ($self->sender) {
680 my $z = $self->current_layer_height + $self->config->z_offset;
681 my $F = $self->config2->{z_lift_speed} * 60;
682 if ($self->config2->{z_lift} != 0) {
683 $self->sender->send(sprintf("G1 Z%.5f F%d", $z + $self->config2->{z_lift}, $F), 1);
684 }
685 $self->sender->send(sprintf("G1 Z%.5f F%d", $z, $F), 1);
686 }
687
688 # TODO: we should block until G1 commands have been performed, see note below
689 $self->delay($self->config2->{settle_time}, sub {
690 $self->project_layer($self->_layer_num);
691
692 # get exposure time
693 my $time = $self->config2->{exposure_time};
694 if ($self->_layer_num < $self->config2->{bottom_layers}) {
695 $time = $self->config2->{bottom_exposure_time};
696 }
697
698 $self->delay($time, sub {
699 $self->screen->project_layers(undef);
700 $self->project_next_layer;
701 });
702 });
703 }
704
705 sub remaining_print_time {
706 my ($self) = @_;
707
708 my $remaining_layers = @{$self->_heights} - $self->_layer_num;
709 my $remaining_bottom_layers = $self->_layer_num >= $self->config2->{bottom_layers}
710 ? 0
711 : $self->config2->{bottom_layers} - $self->_layer_num;
712
713 return $remaining_bottom_layers * $self->config2->{bottom_exposure_time}
714 + ($remaining_layers - $remaining_bottom_layers) * $self->config2->{exposure_time}
715 + $remaining_layers * $self->config2->{settle_time};
716 }
717
718 sub print_time {
719 my ($self) = @_;
720
721 return $self->config2->{bottom_layers} * $self->config2->{bottom_exposure_time}
722 + (@{$self->_heights} - $self->config2->{bottom_layers}) * $self->config2->{exposure_time}
723 + @{$self->_heights} * $self->config2->{settle_time};
724 }
725
726 sub DESTROY {
727 my ($self) = @_;
728
729 $self->timer->Stop if $self->timer;
730 $self->sender->disconnect if $self->sender;
731 Slic3r::GUI::enable_screensaver();
732 }
733
734 package Slic3r::GUI::Projector::Screen;
735 use Wx qw(:dialog :id :misc :sizer :colour :pen :brush :font wxBG_STYLE_CUSTOM);
736 use Wx::Event qw(EVT_PAINT EVT_SIZE);
737 use base qw(Wx::Dialog Class::Accessor);
738
739 use List::Util qw(min);
740 use Slic3r::Geometry qw(X Y unscale scale);
741 use Slic3r::Geometry::Clipper qw(intersection_pl);
742
743 __PACKAGE__->mk_accessors(qw(config config2 scaling_factor bed_origin layers));
744
745 sub new {
746 my ($class, $parent, $config, $config2) = @_;
747 my $self = $class->SUPER::new($parent, -1, "Projector", wxDefaultPosition, wxDefaultSize, 0);
748
749 $self->config($config);
750 $self->config2($config2);
751 $self->SetBackgroundStyle(wxBG_STYLE_CUSTOM);
752 EVT_SIZE($self, \&_resize);
753 EVT_PAINT($self, \&_repaint);
754 $self->_resize;
755
756 return $self;
757 }
758
759 sub reposition {
760 my ($self) = @_;
761
762 my $display = Wx::Display->new($self->config2->{display});
763 my $area = $display->GetGeometry;
764 $self->Move($area->GetPosition);
765 # ShowFullScreen doesn't use the right screen
766 #$self->ShowFullScreen($self->config2->{fullscreen});
767 $self->SetSize($area->GetSize);
768 $self->_resize;
769 $self->Refresh;
770 }
771
772 sub _resize {
773 my ($self) = @_;
774
775 return if !$self->config;
776 my ($cw, $ch) = $self->GetSizeWH;
777
778 # get bed shape polygon
779 my $bed_polygon = Slic3r::Polygon->new_scale(@{$self->config->bed_shape});
780 my $bb = $bed_polygon->bounding_box;
781 my $size = $bb->size;
782 my $center = $bb->center;
783
784 # calculate the scaling factor needed for constraining print bed area inside preview
785 # scaling_factor is expressed in pixel / mm
786 $self->scaling_factor(min($cw / unscale($size->x), $ch / unscale($size->y))); #)
787
788 # apply zoom to scaling factor
789 if ($self->config2->{zoom} != 0) {
790 # TODO: make sure min and max in the option config are enforced
791 $self->scaling_factor($self->scaling_factor * ($self->config2->{zoom}/100));
792 }
793
794 # calculate the displacement needed for centering bed on screen
795 $self->bed_origin([
796 $cw/2 - (unscale($center->x) - $self->config2->{offset}->[X]) * $self->scaling_factor,
797 $ch/2 - (unscale($center->y) - $self->config2->{offset}->[Y]) * $self->scaling_factor, #))
798 ]);
799
800 $self->Refresh;
801 }
802
803 sub project_layers {
804 my ($self, $layers) = @_;
805
806 $self->layers($layers);
807 $self->Refresh;
808 }
809
810 sub _repaint {
811 my ($self) = @_;
812
813 my $dc = Wx::AutoBufferedPaintDC->new($self);
814 my ($cw, $ch) = $self->GetSizeWH;
815 return if $cw == 0; # when canvas is not rendered yet, size is 0,0
816
817 $dc->SetPen(Wx::Pen->new(wxBLACK, 1, wxSOLID));
818 $dc->SetBrush(Wx::Brush->new(wxBLACK, wxSOLID));
819 $dc->DrawRectangle(0, 0, $cw, $ch);
820
821 return if !$self->config;
822
823 # turn size into max visible coordinates
824 # TODO: or should we use ClientArea?
825 $cw--;
826 $ch--;
827
828 # draw bed
829 if ($self->config2->{show_bed}) {
830 $dc->SetPen(Wx::Pen->new(wxRED, 2, wxSOLID));
831 $dc->SetBrush(Wx::Brush->new(wxWHITE, wxTRANSPARENT));
832
833 # draw contour
834 my $bed_polygon = Slic3r::Polygon->new_scale(@{$self->config->bed_shape});
835 $dc->DrawPolygon($self->scaled_points_to_pixel($bed_polygon), 0, 0);
836
837 # draw grid
838 $dc->SetPen(Wx::Pen->new(wxRED, 1, wxSOLID));
839 {
840 my $bb = $bed_polygon->bounding_box;
841 my $step = scale 10; # 1cm grid
842 my @polylines = ();
843 for (my $x = $bb->x_min - ($bb->x_min % $step) + $step; $x < $bb->x_max; $x += $step) {
844 push @polylines, Slic3r::Polyline->new([$x, $bb->y_min], [$x, $bb->y_max]);
845 }
846 for (my $y = $bb->y_min - ($bb->y_min % $step) + $step; $y < $bb->y_max; $y += $step) {
847 push @polylines, Slic3r::Polyline->new([$bb->x_min, $y], [$bb->x_max, $y]);
848 }
849 $dc->DrawLine(map @$_, @$_)
850 for map $self->scaled_points_to_pixel([ @$_[0,-1] ]),
851 @{intersection_pl(\@polylines, [$bed_polygon])};
852 }
853
854 # draw axes orientation
855 $dc->SetPen(Wx::Pen->new(wxWHITE, 4, wxSOLID));
856 {
857 foreach my $endpoint ([10, 0], [0, 10]) {
858 $dc->DrawLine(
859 map @{$self->unscaled_point_to_pixel($_)}, [0,0], $endpoint
860 );
861 }
862
863 $dc->SetTextForeground(wxWHITE);
864 $dc->SetFont(Wx::Font->new(20, wxDEFAULT, wxNORMAL, wxNORMAL));
865 $dc->DrawText("X", @{$self->unscaled_point_to_pixel([10, -2])});
866 $dc->DrawText("Y", @{$self->unscaled_point_to_pixel([-2, 10])});
867 }
868 }
869
870 return if !defined $self->layers;
871
872 # get layers at this height
873 # draw layers
874 $dc->SetPen(Wx::Pen->new(wxWHITE, 1, wxSOLID));
875 foreach my $layer (@{$self->layers}) {
876 my @polygons = sort { $a->contains_point($b->first_point) ? -1 : 1 } map @$_, @{ $layer->slices };
877 foreach my $copy (@{$layer->object->_shifted_copies}) {
878 foreach my $polygon (@polygons) {
879 $polygon = $polygon->clone;
880 $polygon->translate(@$copy);
881
882 if ($polygon->is_counter_clockwise) {
883 $dc->SetBrush(Wx::Brush->new(wxWHITE, wxSOLID));
884 } else {
885 $dc->SetBrush(Wx::Brush->new(wxBLACK, wxSOLID));
886 }
887 $dc->DrawPolygon($self->scaled_points_to_pixel($polygon->pp), 0, 0);
888 }
889 }
890 }
891 }
892
893 # convert a model coordinate into a pixel coordinate
894 sub unscaled_point_to_pixel {
895 my ($self, $point) = @_;
896
897 my $zero = $self->bed_origin;
898 my $p = [
899 $point->[X] * $self->scaling_factor + $zero->[X],
900 $point->[Y] * $self->scaling_factor + $zero->[Y],
901 ];
902
903 if (!$self->config2->{invert_y}) {
904 my $ch = $self->GetSize->GetHeight;
905 $p->[Y] = $ch - $p->[Y];
906 }
907
908 return $p;
909 }
910
911 sub scaled_points_to_pixel {
912 my ($self, $points) = @_;
913
914 return [
915 map $self->unscaled_point_to_pixel($_),
916 map Slic3r::Pointf->new_unscale(@$_),
917 @$points
918 ];
919 }
920
921 1;
0 # The "Simple" Print Settings tab.
1 # The "Simple" mode is enabled by File->Preferences dialog.
2
3 package Slic3r::GUI::SimpleTab;
4 use strict;
5 use warnings;
6 use utf8;
7
8 use File::Basename qw(basename);
9 use List::Util qw(first);
10 use Wx qw(:bookctrl :dialog :keycode :icon :id :misc :panel :sizer :window :systemsettings);
11 use Wx::Event qw(EVT_BUTTON EVT_CHOICE EVT_KEY_DOWN);
12 use base 'Wx::ScrolledWindow';
13
14 sub new {
15 my $class = shift;
16 my ($parent, %params) = @_;
17 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL);
18
19 $self->SetScrollbars(1, 1, 1, 1);
20
21 $self->{config} = Slic3r::Config->new;
22 $self->{optgroups} = [];
23
24 $self->{vsizer} = Wx::BoxSizer->new(wxVERTICAL);
25 $self->SetSizer($self->{vsizer});
26 $self->build;
27 $self->_update;
28
29 {
30 my $label = Wx::StaticText->new($self, -1, "Want more options? Switch to the Expert Mode.", wxDefaultPosition, wxDefaultSize);
31 $label->SetFont(Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
32 $self->{vsizer}->Add($label, 0, wxEXPAND | wxALL, 10);
33 }
34
35 return $self;
36 }
37
38 sub init_config_options {
39 my ($self, @opt_keys) = @_;
40 $self->{config}->apply(Slic3r::Config->new_from_defaults(@opt_keys));
41 }
42
43 sub new_optgroup {
44 my ($self, $title, %params) = @_;
45
46 my $optgroup = Slic3r::GUI::ConfigOptionsGroup->new(
47 parent => $self,
48 title => $title,
49 config => $self->{config},
50 label_width => $params{label_width} // 200,
51 on_change => sub { $self->_on_value_change(@_) },
52 );
53
54 push @{$self->{optgroups}}, $optgroup;
55 $self->{vsizer}->Add($optgroup->sizer, 0, wxEXPAND | wxALL, 10);
56
57 return $optgroup;
58 }
59
60 sub load_config_file {
61 my $self = shift;
62 my ($file) = @_;
63
64 my $config = Slic3r::Config->load($file);
65 $self->load_config($config);
66 }
67
68 sub load_config {
69 my $self = shift;
70 my ($config) = @_;
71
72 foreach my $opt_key (@{$self->{config}->get_keys}) {
73 next unless $config->has($opt_key);
74 $self->{config}->set($opt_key, $config->get($opt_key));
75 }
76 $_->reload_config for @{$self->{optgroups}};
77 $self->_update;
78 }
79
80 sub load_presets {}
81
82 sub is_dirty { 0 }
83 sub config { $_[0]->{config}->clone }
84 sub _update {}
85
86 sub on_value_change {
87 my ($self, $cb) = @_;
88 $self->{on_value_change} = $cb;
89 }
90
91 sub on_presets_changed {}
92
93 # propagate event to the parent
94 sub _on_value_change {
95 my $self = shift;
96
97 $self->{on_value_change}->(@_) if $self->{on_value_change};
98 $self->_update;
99 }
100
101 sub get_field {
102 my ($self, $opt_key, $opt_index) = @_;
103
104 foreach my $optgroup (@{ $self->{optgroups} }) {
105 my $field = $optgroup->get_fieldc($opt_key, $opt_index);
106 return $field if defined $field;
107 }
108 return undef;
109 }
110
111 package Slic3r::GUI::SimpleTab::Print;
112 use base 'Slic3r::GUI::SimpleTab';
113
114 use Wx qw(:sizer);
115
116 sub name { 'print' }
117 sub title { 'Print Settings' }
118
119 sub build {
120 my $self = shift;
121
122 $self->init_config_options(qw(
123 layer_height perimeters top_solid_layers bottom_solid_layers
124 fill_density fill_pattern external_fill_pattern
125 support_material support_material_spacing raft_layers
126 support_material_contact_distance support_material_buildplate_only dont_support_bridges
127 perimeter_speed infill_speed travel_speed
128 brim_width
129 xy_size_compensation
130 ));
131
132 {
133 my $optgroup = $self->new_optgroup('General');
134 $optgroup->append_single_option_line('layer_height');
135 $optgroup->append_single_option_line('perimeters');
136
137 my $line = Slic3r::GUI::OptionsGroup::Line->new(
138 label => 'Solid layers',
139 );
140 $line->append_option($optgroup->get_option('top_solid_layers'));
141 $line->append_option($optgroup->get_option('bottom_solid_layers'));
142 $optgroup->append_line($line);
143 }
144
145 {
146 my $optgroup = $self->new_optgroup('Infill');
147 $optgroup->append_single_option_line('fill_density');
148 $optgroup->append_single_option_line('fill_pattern');
149 $optgroup->append_single_option_line('external_fill_pattern');
150 }
151
152 {
153 my $optgroup = $self->new_optgroup('Support material');
154 $optgroup->append_single_option_line('support_material');
155 $optgroup->append_single_option_line('support_material_spacing');
156 $optgroup->append_single_option_line('support_material_contact_distance');
157 $optgroup->append_single_option_line('support_material_buildplate_only');
158 $optgroup->append_single_option_line('dont_support_bridges');
159 $optgroup->append_single_option_line('raft_layers');
160 }
161
162 {
163 my $optgroup = $self->new_optgroup('Speed');
164 $optgroup->append_single_option_line('perimeter_speed');
165 $optgroup->append_single_option_line('infill_speed');
166 $optgroup->append_single_option_line('travel_speed');
167 }
168
169 {
170 my $optgroup = $self->new_optgroup('Brim');
171 $optgroup->append_single_option_line('brim_width');
172 }
173
174 {
175 my $optgroup = $self->new_optgroup('Other');
176 $optgroup->append_single_option_line('xy_size_compensation');
177 }
178 }
179
180 sub _update {
181 my ($self) = @_;
182
183 my $config = $self->{config};
184
185 my $have_perimeters = $config->perimeters > 0;
186 $self->get_field($_)->toggle($have_perimeters)
187 for qw(perimeter_speed);
188
189 my $have_infill = $config->fill_density > 0;
190 my $have_solid_infill = $config->top_solid_layers > 0 || $config->bottom_solid_layers > 0;
191 $self->get_field($_)->toggle($have_infill)
192 for qw(fill_pattern);
193 $self->get_field($_)->toggle($have_solid_infill)
194 for qw(external_fill_pattern);
195 $self->get_field($_)->toggle($have_infill || $have_solid_infill)
196 for qw(infill_speed);
197
198 my $have_support_material = $config->support_material || $config->raft_layers > 0;
199 $self->get_field($_)->toggle($have_support_material)
200 for qw(support_material_spacing dont_support_bridges
201 support_material_contact_distance);
202 }
203
204 package Slic3r::GUI::SimpleTab::Filament;
205 use base 'Slic3r::GUI::SimpleTab';
206
207 sub name { 'filament' }
208 sub title { 'Filament Settings' }
209
210 sub build {
211 my $self = shift;
212
213 $self->init_config_options(qw(
214 filament_diameter extrusion_multiplier
215 temperature first_layer_temperature bed_temperature first_layer_bed_temperature
216 ));
217
218 {
219 my $optgroup = $self->new_optgroup('Filament');
220 $optgroup->append_single_option_line('filament_diameter', 0);
221 $optgroup->append_single_option_line('extrusion_multiplier', 0);
222 }
223
224 {
225 my $optgroup = $self->new_optgroup('Temperature (°C)');
226
227 {
228 my $line = Slic3r::GUI::OptionsGroup::Line->new(
229 label => 'Extruder',
230 );
231 $line->append_option($optgroup->get_option('first_layer_temperature', 0));
232 $line->append_option($optgroup->get_option('temperature', 0));
233 $optgroup->append_line($line);
234 }
235
236 {
237 my $line = Slic3r::GUI::OptionsGroup::Line->new(
238 label => 'Bed',
239 );
240 $line->append_option($optgroup->get_option('first_layer_bed_temperature'));
241 $line->append_option($optgroup->get_option('bed_temperature'));
242 $optgroup->append_line($line);
243 }
244 }
245 }
246
247 package Slic3r::GUI::SimpleTab::Printer;
248 use base 'Slic3r::GUI::SimpleTab';
249 use Wx qw(:sizer :button :bitmap :misc :id);
250 use Wx::Event qw(EVT_BUTTON);
251
252 sub name { 'printer' }
253 sub title { 'Printer Settings' }
254
255 sub build {
256 my $self = shift;
257
258 $self->init_config_options(qw(
259 bed_shape
260 z_offset
261 gcode_flavor
262 nozzle_diameter
263 retract_length retract_lift wipe
264 start_gcode
265 end_gcode
266 ));
267
268 {
269 my $bed_shape_widget = sub {
270 my ($parent) = @_;
271
272 my $btn = Wx::Button->new($parent, -1, "Set…", wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
273 $btn->SetFont($Slic3r::GUI::small_font);
274 if ($Slic3r::GUI::have_button_icons) {
275 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("cog.png"), wxBITMAP_TYPE_PNG));
276 }
277
278 my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
279 $sizer->Add($btn);
280
281 EVT_BUTTON($self, $btn, sub {
282 my $dlg = Slic3r::GUI::BedShapeDialog->new($self, $self->{config}->bed_shape);
283 if ($dlg->ShowModal == wxID_OK) {
284 my $value = $dlg->GetValue;
285 $self->{config}->set('bed_shape', $value);
286 $self->_on_value_change('bed_shape', $value);
287 }
288 });
289
290 return $sizer;
291 };
292
293 my $optgroup = $self->new_optgroup('Size and coordinates');
294 my $line = Slic3r::GUI::OptionsGroup::Line->new(
295 label => 'Bed shape',
296 widget => $bed_shape_widget,
297 );
298 $optgroup->append_line($line);
299 $optgroup->append_single_option_line('z_offset');
300 }
301
302 {
303 my $optgroup = $self->new_optgroup('Firmware');
304 $optgroup->append_single_option_line('gcode_flavor');
305 }
306
307 {
308 my $optgroup = $self->new_optgroup('Extruder');
309 $optgroup->append_single_option_line('nozzle_diameter', 0);
310 }
311
312 {
313 my $optgroup = $self->new_optgroup('Retraction');
314 $optgroup->append_single_option_line('retract_length', 0);
315 $optgroup->append_single_option_line('retract_lift', 0);
316 $optgroup->append_single_option_line('wipe', 0);
317 }
318
319 {
320 my $optgroup = $self->new_optgroup('Start G-code',
321 label_width => 0,
322 );
323 my $option = $optgroup->get_option('start_gcode');
324 $option->full_width(1);
325 $option->height(150);
326 $optgroup->append_single_option_line($option);
327 }
328
329 {
330 my $optgroup = $self->new_optgroup('End G-code',
331 label_width => 0,
332 );
333 my $option = $optgroup->get_option('end_gcode');
334 $option->full_width(1);
335 $option->height(150);
336 $optgroup->append_single_option_line($option);
337 }
338 }
339
340 sub _update {
341 my ($self) = @_;
342
343 my $config = $self->{config};
344
345 my $have_retraction = $config->retract_length->[0] > 0;
346 $self->get_field($_, 0)->toggle($have_retraction)
347 for qw(retract_lift wipe);
348 }
349
350 1;
0 # The "Expert" tab at the right of the main tabbed window.
1 # The "Expert" is enabled by File->Preferences dialog.
2
3 # This file implements following packages:
4 # Slic3r::GUI::Tab;
5 # Slic3r::GUI::Tab::Print;
6 # Slic3r::GUI::Tab::Filament;
7 # Slic3r::GUI::Tab::Printer;
8 # Slic3r::GUI::Tab::Page
9 # - Option page: For example, the Slic3r::GUI::Tab::Print has option pages "Layers and perimeters", "Infill", "Skirt and brim" ...
10 # Slic3r::GUI::SavePresetWindow
11 # - Dialog to select a new preset name to store the configuration.
12 # Slic3r::GUI::Tab::Preset;
13 # - Single preset item: name, file is default or external.
14
15 package Slic3r::GUI::Tab;
16 use strict;
17 use warnings;
18 use utf8;
19
20 use File::Basename qw(basename);
21 use List::Util qw(first);
22 use Wx qw(:bookctrl :dialog :keycode :icon :id :misc :panel :sizer :treectrl :window
23 :button wxTheApp);
24 use Wx::Event qw(EVT_BUTTON EVT_CHOICE EVT_KEY_DOWN EVT_TREE_SEL_CHANGED);
25 use base qw(Wx::Panel Class::Accessor);
26
27 # Index of the currently active preset.
28 __PACKAGE__->mk_accessors(qw(current_preset));
29
30 sub new {
31 my $class = shift;
32 my ($parent, %params) = @_;
33 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL);
34
35 # horizontal sizer
36 $self->{sizer} = Wx::BoxSizer->new(wxHORIZONTAL);
37 $self->{sizer}->SetSizeHints($self);
38 $self->SetSizer($self->{sizer});
39
40 # left vertical sizer
41 my $left_sizer = Wx::BoxSizer->new(wxVERTICAL);
42 $self->{sizer}->Add($left_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 3);
43
44 my $left_col_width = 150;
45
46 # preset chooser
47 {
48
49 # choice menu
50 $self->{presets_choice} = Wx::Choice->new($self, -1, wxDefaultPosition, [$left_col_width, -1], []);
51 $self->{presets_choice}->SetFont($Slic3r::GUI::small_font);
52
53 # buttons
54 $self->{btn_save_preset} = Wx::BitmapButton->new($self, -1, Wx::Bitmap->new($Slic3r::var->("disk.png"), wxBITMAP_TYPE_PNG),
55 wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
56 $self->{btn_delete_preset} = Wx::BitmapButton->new($self, -1, Wx::Bitmap->new($Slic3r::var->("delete.png"), wxBITMAP_TYPE_PNG),
57 wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
58 $self->{btn_save_preset}->SetToolTipString("Save current " . lc($self->title));
59 $self->{btn_delete_preset}->SetToolTipString("Delete this preset");
60 $self->{btn_delete_preset}->Disable;
61
62 ### These cause GTK warnings:
63 ###my $box = Wx::StaticBox->new($self, -1, "Presets:", wxDefaultPosition, [$left_col_width, 50]);
64 ###my $hsizer = Wx::StaticBoxSizer->new($box, wxHORIZONTAL);
65
66 my $hsizer = Wx::BoxSizer->new(wxHORIZONTAL);
67
68 $left_sizer->Add($hsizer, 0, wxEXPAND | wxBOTTOM, 5);
69 $hsizer->Add($self->{presets_choice}, 1, wxRIGHT | wxALIGN_CENTER_VERTICAL, 3);
70 $hsizer->Add($self->{btn_save_preset}, 0, wxALIGN_CENTER_VERTICAL);
71 $hsizer->Add($self->{btn_delete_preset}, 0, wxALIGN_CENTER_VERTICAL);
72 }
73
74 # tree
75 $self->{treectrl} = Wx::TreeCtrl->new($self, -1, wxDefaultPosition, [$left_col_width, -1], wxTR_NO_BUTTONS | wxTR_HIDE_ROOT | wxTR_SINGLE | wxTR_NO_LINES | wxBORDER_SUNKEN | wxWANTS_CHARS);
76 $left_sizer->Add($self->{treectrl}, 1, wxEXPAND);
77 $self->{icons} = Wx::ImageList->new(16, 16, 1);
78 $self->{treectrl}->AssignImageList($self->{icons});
79 $self->{iconcount} = -1;
80 $self->{treectrl}->AddRoot("root");
81 $self->{pages} = [];
82 $self->{treectrl}->SetIndent(0);
83 $self->{disable_tree_sel_changed_event} = 0;
84 EVT_TREE_SEL_CHANGED($parent, $self->{treectrl}, sub {
85 return if $self->{disable_tree_sel_changed_event};
86 my $page = first { $_->{title} eq $self->{treectrl}->GetItemText($self->{treectrl}->GetSelection) } @{$self->{pages}}
87 or return;
88 $_->Hide for @{$self->{pages}};
89 $page->Show;
90 $self->{sizer}->Layout;
91 $self->Refresh;
92 });
93 EVT_KEY_DOWN($self->{treectrl}, sub {
94 my ($treectrl, $event) = @_;
95 if ($event->GetKeyCode == WXK_TAB) {
96 $treectrl->Navigate($event->ShiftDown ? &Wx::wxNavigateBackward : &Wx::wxNavigateForward);
97 } else {
98 $event->Skip;
99 }
100 });
101
102 EVT_CHOICE($parent, $self->{presets_choice}, sub {
103 $self->on_select_preset;
104 $self->_on_presets_changed;
105 });
106
107 EVT_BUTTON($self, $self->{btn_save_preset}, sub { $self->save_preset });
108
109 EVT_BUTTON($self, $self->{btn_delete_preset}, sub {
110 my $i = $self->current_preset;
111 # Don't let the user delete the '- default -' configuration.
112 # This shall not happen as the 'delete' button is disabled for the '- default -' entry,
113 # but better be safe than sorry.
114 return if ($i == 0 && $self->get_current_preset->{default});
115 my $res = Wx::MessageDialog->new($self, "Are you sure you want to delete the selected preset?", 'Delete Preset', wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION)->ShowModal;
116 return unless $res == wxID_YES;
117 # Delete the file.
118 my $path = Slic3r::encode_path($self->{presets}[$i]->file);
119 if (-e $path && ! unlink $path) {
120 # Cannot delete the file, therefore the item will not be removed from the selection.
121 Slic3r::GUI::show_error($self, "Cannot delete file $path : $!");
122 return;
123 }
124 # Delete the preset.
125 splice @{$self->{presets}}, $i, 1;
126 # Delete the item from the UI component.
127 $self->{presets_choice}->Delete($i - $self->{default_suppressed});
128 $self->current_preset(undef);
129 if ($self->{default_suppressed} && scalar(@{$self->{presets}}) == 1) {
130 # Empty selection. Add the '- default -' item into the drop down selection.
131 $self->{presets_choice}->Append($self->{presets}->[0]->name);
132 # and remember that the '- default -' is shown.
133 $self->{default_suppressed} = 0;
134 }
135 # Select the 0th item. If default is suppressed, select the first valid.
136 $self->select_preset($self->{default_suppressed});
137 $self->_on_presets_changed;
138 });
139
140 # C++ instance DynamicPrintConfig
141 $self->{config} = Slic3r::Config->new;
142 # Initialize the DynamicPrintConfig by default keys/values.
143 # Possible %params keys: no_controller
144 $self->build(%params);
145 $self->update_tree;
146 $self->_update;
147 if ($self->hidden_options) {
148 $self->{config}->apply(Slic3r::Config->new_from_defaults($self->hidden_options));
149 }
150
151 return $self;
152 }
153
154 # Are the '- default -' selections suppressed by the Slic3r GUI preferences?
155 sub no_defaults {
156 return $Slic3r::GUI::Settings->{_}{no_defaults} ? 1 : 0;
157 }
158
159 # Get a currently active preset (Perl class Slic3r::GUI::Tab::Preset).
160 sub get_current_preset {
161 my $self = shift;
162 return $self->get_preset($self->current_preset);
163 }
164
165 # Get a preset (Perl class Slic3r::GUI::Tab::Preset) with an index $i.
166 sub get_preset {
167 my ($self, $i) = @_;
168 return $self->{presets}[$i];
169 }
170
171 sub save_preset {
172 my ($self, $name) = @_;
173
174 # since buttons (and choices too) don't get focus on Mac, we set focus manually
175 # to the treectrl so that the EVT_* events are fired for the input field having
176 # focus currently. is there anything better than this?
177 $self->{treectrl}->SetFocus;
178
179 if (!defined $name) {
180 my $preset = $self->get_current_preset;
181 my $default_name = $preset->default ? 'Untitled' : $preset->name;
182 $default_name =~ s/\.ini$//i;
183
184 my $dlg = Slic3r::GUI::SavePresetWindow->new($self,
185 title => lc($self->title),
186 default => $default_name,
187 values => [ map $_->name, grep !$_->default && !$_->external, @{$self->{presets}} ],
188 );
189 return unless $dlg->ShowModal == wxID_OK;
190 $name = $dlg->get_name;
191 }
192
193 $self->config->save(sprintf "$Slic3r::GUI::datadir/%s/%s.ini", $self->name, $name);
194 $self->load_presets;
195 $self->select_preset_by_name($name);
196 $self->_on_presets_changed;
197 }
198
199 sub on_value_change {
200 my ($self, $cb) = @_;
201 $self->{on_value_change} = $cb;
202 }
203
204 sub on_presets_changed {
205 my ($self, $cb) = @_;
206 $self->{on_presets_changed} = $cb;
207 }
208
209 # This method is supposed to be called whenever new values are loaded
210 # or changed by user (so also when a preset is loaded).
211 # propagate event to the parent
212 sub _on_value_change {
213 my $self = shift;
214
215 $self->{on_value_change}->(@_) if $self->{on_value_change};
216 $self->_update;
217 }
218
219 sub _update {}
220
221 sub _on_presets_changed {
222 my $self = shift;
223
224 $self->{on_presets_changed}->(
225 $self->{presets},
226 $self->{default_suppressed},
227 scalar($self->{presets_choice}->GetSelection) + $self->{default_suppressed},
228 $self->is_dirty,
229 ) if $self->{on_presets_changed};
230 }
231
232 sub on_preset_loaded {}
233 sub hidden_options {}
234 sub config { $_[0]->{config}->clone }
235
236 sub select_default_preset {
237 my $self = shift;
238 $self->select_preset(0);
239 }
240
241 sub select_preset {
242 my ($self, $i) = @_;
243 if ($self->{default_suppressed} && $i == 0) {
244 # Selecting the '- default -'. Add it to the combo box.
245 $self->{default_suppressed} = 0;
246 $self->{presets_choice}->Insert($self->{presets}->[0]->name, 0);
247 } elsif ($self->no_defaults && ! $self->{default_suppressed} && $i > 0) {
248 # The user wants to hide the '- default -' items and a non-default item has been added to the presets.
249 # Hide the '- default -' item.
250 $self->{presets_choice}->Delete(0);
251 $self->{default_suppressed} = 1;
252 }
253 $self->{presets_choice}->SetSelection($i - $self->{default_suppressed});
254 $self->on_select_preset;
255 }
256
257 sub select_preset_by_name {
258 my ($self, $name) = @_;
259
260 $name = Unicode::Normalize::NFC($name);
261 $self->select_preset(first { $self->{presets}[$_]->name eq $name } 0 .. $#{$self->{presets}});
262 }
263
264 sub on_select_preset {
265 my $self = shift;
266
267 if ($self->is_dirty) {
268 # Display a dialog showing the dirty options in a human readable form.
269 my $old_preset = $self->get_current_preset;
270 my $name = $old_preset->default ? 'Default preset' : "Preset \"" . $old_preset->name . "\"";
271
272 my @option_names = ();
273 foreach my $opt_key (@{$self->dirty_options}) {
274 my $opt = $Slic3r::Config::Options->{$opt_key};
275 my $name = $opt->{full_label} // $opt->{label};
276 if ($opt->{category}) {
277 $name = $opt->{category} . " > $name";
278 }
279 push @option_names, $name;
280 }
281
282 my $changes = join "\n", map "- $_", @option_names;
283 my $confirm = Wx::MessageDialog->new($self, "$name has unsaved changes:\n$changes\n\nDiscard changes and continue anyway?",
284 'Unsaved Changes', wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION);
285 if ($confirm->ShowModal == wxID_NO) {
286 $self->{presets_choice}->SetSelection($self->current_preset - $self->{default_suppressed});
287
288 # trigger the on_presets_changed event so that we also restore the previous value
289 # in the plater selector
290 $self->_on_presets_changed;
291 return;
292 }
293 }
294
295 $self->current_preset($self->{presets_choice}->GetSelection + $self->{default_suppressed});
296 my $preset = $self->get_current_preset;
297 my $preset_config = $self->get_preset_config($preset);
298 eval {
299 local $SIG{__WARN__} = Slic3r::GUI::warning_catcher($self);
300 foreach my $opt_key (@{$self->{config}->get_keys}) {
301 $self->{config}->set($opt_key, $preset_config->get($opt_key))
302 if $preset_config->has($opt_key);
303 }
304 ($preset->default || $preset->external)
305 ? $self->{btn_delete_preset}->Disable
306 : $self->{btn_delete_preset}->Enable;
307
308 $self->_update;
309 $self->on_preset_loaded;
310 $self->reload_config;
311 $Slic3r::GUI::Settings->{presets}{$self->name} = $preset->file ? basename($preset->file) : '';
312 };
313 if ($@) {
314 $@ = "I was unable to load the selected config file: $@";
315 Slic3r::GUI::catch_error($self);
316 $self->select_default_preset;
317 }
318
319 # use CallAfter because some field triggers schedule on_change calls using CallAfter,
320 # and we don't want them to be called after this update_dirty() as they would mark the
321 # preset dirty again
322 # (not sure this is true anymore now that update_dirty is idempotent)
323 wxTheApp->CallAfter(sub {
324 $self->_on_presets_changed;
325 $self->update_dirty;
326 });
327
328 wxTheApp->save_settings;
329 }
330
331 sub init_config_options {
332 my ($self, @opt_keys) = @_;
333 $self->{config}->apply(Slic3r::Config->new_from_defaults(@opt_keys));
334 }
335
336 sub add_options_page {
337 my $self = shift;
338 my ($title, $icon, %params) = @_;
339
340 if ($icon) {
341 my $bitmap = Wx::Bitmap->new($Slic3r::var->($icon), wxBITMAP_TYPE_PNG);
342 $self->{icons}->Add($bitmap);
343 $self->{iconcount}++;
344 }
345
346 my $page = Slic3r::GUI::Tab::Page->new($self, $title, $self->{iconcount});
347 $page->Hide;
348 $self->{sizer}->Add($page, 1, wxEXPAND | wxLEFT, 5);
349 push @{$self->{pages}}, $page;
350 return $page;
351 }
352
353 sub reload_config {
354 my $self = shift;
355 $_->reload_config for @{$self->{pages}};
356 }
357
358 sub update_tree {
359 my ($self) = @_;
360
361 # get label of the currently selected item
362 my $selected = $self->{treectrl}->GetItemText($self->{treectrl}->GetSelection);
363
364 my $rootItem = $self->{treectrl}->GetRootItem;
365 $self->{treectrl}->DeleteChildren($rootItem);
366 my $have_selection = 0;
367 foreach my $page (@{$self->{pages}}) {
368 my $itemId = $self->{treectrl}->AppendItem($rootItem, $page->{title}, $page->{iconID});
369 if ($page->{title} eq $selected) {
370 $self->{disable_tree_sel_changed_event} = 1;
371 $self->{treectrl}->SelectItem($itemId);
372 $self->{disable_tree_sel_changed_event} = 0;
373 $have_selection = 1;
374 }
375 }
376
377 if (!$have_selection) {
378 # this is triggered on first load, so we don't disable the sel change event
379 $self->{treectrl}->SelectItem($self->{treectrl}->GetFirstChild($rootItem));
380 }
381 }
382
383 sub update_dirty {
384 my $self = shift;
385
386 foreach my $i ($self->{default_suppressed}..$#{$self->{presets}}) {
387 my $preset = $self->get_preset($i);
388 $self->{presets_choice}->SetString(
389 $i - $self->{default_suppressed},
390 ($i == $self->current_preset && $self->is_dirty) ? $preset->name . " (modified)" : $preset->name);
391 }
392 $self->{presets_choice}->SetSelection($self->current_preset - $self->{default_suppressed}); # http://trac.wxwidgets.org/ticket/13769
393 $self->_on_presets_changed;
394 }
395
396 sub is_dirty {
397 my $self = shift;
398 return @{$self->dirty_options} > 0;
399 }
400
401 sub dirty_options {
402 my $self = shift;
403
404 return [] if !defined $self->current_preset; # happens during initialization
405 return $self->get_preset_config($self->get_current_preset)->diff($self->{config});
406 }
407
408 sub load_presets {
409 my $self = shift;
410
411 $self->{presets} = [
412 Slic3r::GUI::Tab::Preset->new(
413 default => 1,
414 name => '- default -',
415 ),
416 ];
417
418 my %presets = wxTheApp->presets($self->name);
419 foreach my $preset_name (sort keys %presets) {
420 push @{$self->{presets}}, Slic3r::GUI::Tab::Preset->new(
421 name => $preset_name,
422 file => $presets{$preset_name},
423 );
424 }
425 $self->current_preset(undef);
426 $self->{default_suppressed} = Slic3r::GUI::Tab->no_defaults && scalar(@{$self->{presets}}) > 1;
427 $self->{presets_choice}->Clear;
428 foreach my $preset (@{$self->{presets}}) {
429 next if ($preset->default && $self->{default_suppressed});
430 $self->{presets_choice}->Append($preset->name);
431 }
432 {
433 # load last used preset
434 my $i = first { basename($self->{presets}[$_]->file) eq ($Slic3r::GUI::Settings->{presets}{$self->name} || '') } 1 .. $#{$self->{presets}};
435 $self->select_preset($i || $self->{default_suppressed});
436 }
437 $self->_on_presets_changed;
438 }
439
440 sub load_config_file {
441 my $self = shift;
442 my ($file) = @_;
443
444 # look for the loaded config among the existing menu items
445 my $i = first { $self->{presets}[$_]{file} eq $file && $self->{presets}[$_]{external} } 1..$#{$self->{presets}};
446 if (!$i) {
447 my $preset_name = basename($file); # keep the .ini suffix
448 push @{$self->{presets}}, Slic3r::GUI::Tab::Preset->new(
449 file => $file,
450 name => $preset_name,
451 external => 1,
452 );
453 $self->{presets_choice}->Append($preset_name);
454 $i = $#{$self->{presets}};
455 }
456 $self->{presets_choice}->SetSelection($i - $self->{default_suppressed});
457 $self->on_select_preset;
458 $self->_on_presets_changed;
459 }
460
461 sub load_config {
462 my $self = shift;
463 my ($config) = @_;
464
465 foreach my $opt_key (@{$self->{config}->diff($config)}) {
466 $self->{config}->set($opt_key, $config->get($opt_key));
467 $self->update_dirty;
468 }
469 $self->reload_config;
470 $self->_update;
471 }
472
473 sub get_preset_config {
474 my ($self, $preset) = @_;
475 return $preset->config($self->{config}->get_keys);
476 }
477
478 sub get_field {
479 my ($self, $opt_key, $opt_index) = @_;
480
481 foreach my $page (@{ $self->{pages} }) {
482 my $field = $page->get_field($opt_key, $opt_index);
483 return $field if defined $field;
484 }
485 return undef;
486 }
487
488 sub set_value {
489 my $self = shift;
490 my ($opt_key, $value) = @_;
491
492 my $changed = 0;
493 foreach my $page (@{ $self->{pages} }) {
494 $changed = 1 if $page->set_value($opt_key, $value);
495 }
496 return $changed;
497 }
498
499 package Slic3r::GUI::Tab::Print;
500 use base 'Slic3r::GUI::Tab';
501
502 use List::Util qw(first);
503 use Wx qw(:icon :dialog :id);
504
505 sub name { 'print' }
506 sub title { 'Print Settings' }
507
508 sub build {
509 my $self = shift;
510
511 $self->init_config_options(qw(
512 layer_height first_layer_height
513 perimeters spiral_vase
514 top_solid_layers bottom_solid_layers
515 extra_perimeters ensure_vertical_shell_thickness avoid_crossing_perimeters thin_walls overhangs
516 seam_position external_perimeters_first
517 fill_density fill_pattern external_fill_pattern
518 infill_every_layers infill_only_where_needed
519 solid_infill_every_layers fill_angle solid_infill_below_area
520 only_retract_when_crossing_perimeters infill_first
521 max_print_speed max_volumetric_speed
522 max_volumetric_extrusion_rate_slope_positive max_volumetric_extrusion_rate_slope_negative
523 perimeter_speed small_perimeter_speed external_perimeter_speed infill_speed
524 solid_infill_speed top_solid_infill_speed support_material_speed
525 support_material_interface_speed bridge_speed gap_fill_speed
526 travel_speed
527 first_layer_speed
528 perimeter_acceleration infill_acceleration bridge_acceleration
529 first_layer_acceleration default_acceleration
530 skirts skirt_distance skirt_height min_skirt_length
531 brim_width
532 support_material support_material_threshold support_material_enforce_layers
533 raft_layers
534 support_material_pattern support_material_with_sheath support_material_spacing support_material_angle
535 support_material_interface_layers support_material_interface_spacing
536 support_material_contact_distance support_material_buildplate_only dont_support_bridges
537 notes
538 complete_objects extruder_clearance_radius extruder_clearance_height
539 gcode_comments output_filename_format
540 post_process
541 perimeter_extruder infill_extruder solid_infill_extruder
542 support_material_extruder support_material_interface_extruder
543 ooze_prevention standby_temperature_delta
544 interface_shells
545 extrusion_width first_layer_extrusion_width perimeter_extrusion_width
546 external_perimeter_extrusion_width infill_extrusion_width solid_infill_extrusion_width
547 top_infill_extrusion_width support_material_extrusion_width
548 infill_overlap bridge_flow_ratio
549 xy_size_compensation threads resolution
550 ));
551 $self->{config}->set('print_settings_id', '');
552
553 {
554 my $page = $self->add_options_page('Layers and perimeters', 'layers.png');
555 {
556 my $optgroup = $page->new_optgroup('Layer height');
557 $optgroup->append_single_option_line('layer_height');
558 $optgroup->append_single_option_line('first_layer_height');
559 }
560 {
561 my $optgroup = $page->new_optgroup('Vertical shells');
562 $optgroup->append_single_option_line('perimeters');
563 $optgroup->append_single_option_line('spiral_vase');
564 }
565 {
566 my $optgroup = $page->new_optgroup('Horizontal shells');
567 my $line = Slic3r::GUI::OptionsGroup::Line->new(
568 label => 'Solid layers',
569 );
570 $line->append_option($optgroup->get_option('top_solid_layers'));
571 $line->append_option($optgroup->get_option('bottom_solid_layers'));
572 $optgroup->append_line($line);
573 }
574 {
575 my $optgroup = $page->new_optgroup('Quality (slower slicing)');
576 $optgroup->append_single_option_line('extra_perimeters');
577 $optgroup->append_single_option_line('ensure_vertical_shell_thickness');
578 $optgroup->append_single_option_line('avoid_crossing_perimeters');
579 $optgroup->append_single_option_line('thin_walls');
580 $optgroup->append_single_option_line('overhangs');
581 }
582 {
583 my $optgroup = $page->new_optgroup('Advanced');
584 $optgroup->append_single_option_line('seam_position');
585 $optgroup->append_single_option_line('external_perimeters_first');
586 }
587 }
588
589 {
590 my $page = $self->add_options_page('Infill', 'infill.png');
591 {
592 my $optgroup = $page->new_optgroup('Infill');
593 $optgroup->append_single_option_line('fill_density');
594 $optgroup->append_single_option_line('fill_pattern');
595 $optgroup->append_single_option_line('external_fill_pattern');
596 }
597 {
598 my $optgroup = $page->new_optgroup('Reducing printing time');
599 $optgroup->append_single_option_line('infill_every_layers');
600 $optgroup->append_single_option_line('infill_only_where_needed');
601 }
602 {
603 my $optgroup = $page->new_optgroup('Advanced');
604 $optgroup->append_single_option_line('solid_infill_every_layers');
605 $optgroup->append_single_option_line('fill_angle');
606 $optgroup->append_single_option_line('solid_infill_below_area');
607 $optgroup->append_single_option_line('only_retract_when_crossing_perimeters');
608 $optgroup->append_single_option_line('infill_first');
609 }
610 }
611
612 {
613 my $page = $self->add_options_page('Skirt and brim', 'box.png');
614 {
615 my $optgroup = $page->new_optgroup('Skirt');
616 $optgroup->append_single_option_line('skirts');
617 $optgroup->append_single_option_line('skirt_distance');
618 $optgroup->append_single_option_line('skirt_height');
619 $optgroup->append_single_option_line('min_skirt_length');
620 }
621 {
622 my $optgroup = $page->new_optgroup('Brim');
623 $optgroup->append_single_option_line('brim_width');
624 }
625 }
626
627 {
628 my $page = $self->add_options_page('Support material', 'building.png');
629 {
630 my $optgroup = $page->new_optgroup('Support material');
631 $optgroup->append_single_option_line('support_material');
632 $optgroup->append_single_option_line('support_material_threshold');
633 $optgroup->append_single_option_line('support_material_enforce_layers');
634 }
635 {
636 my $optgroup = $page->new_optgroup('Raft');
637 $optgroup->append_single_option_line('raft_layers');
638 }
639 {
640 my $optgroup = $page->new_optgroup('Options for support material and raft');
641 $optgroup->append_single_option_line('support_material_contact_distance');
642 $optgroup->append_single_option_line('support_material_pattern');
643 $optgroup->append_single_option_line('support_material_with_sheath');
644 $optgroup->append_single_option_line('support_material_spacing');
645 $optgroup->append_single_option_line('support_material_angle');
646 $optgroup->append_single_option_line('support_material_interface_layers');
647 $optgroup->append_single_option_line('support_material_interface_spacing');
648 $optgroup->append_single_option_line('support_material_buildplate_only');
649 $optgroup->append_single_option_line('dont_support_bridges');
650 }
651 }
652
653 {
654 my $page = $self->add_options_page('Speed', 'time.png');
655 {
656 my $optgroup = $page->new_optgroup('Speed for print moves');
657 $optgroup->append_single_option_line('perimeter_speed');
658 $optgroup->append_single_option_line('small_perimeter_speed');
659 $optgroup->append_single_option_line('external_perimeter_speed');
660 $optgroup->append_single_option_line('infill_speed');
661 $optgroup->append_single_option_line('solid_infill_speed');
662 $optgroup->append_single_option_line('top_solid_infill_speed');
663 $optgroup->append_single_option_line('support_material_speed');
664 $optgroup->append_single_option_line('support_material_interface_speed');
665 $optgroup->append_single_option_line('bridge_speed');
666 $optgroup->append_single_option_line('gap_fill_speed');
667 }
668 {
669 my $optgroup = $page->new_optgroup('Speed for non-print moves');
670 $optgroup->append_single_option_line('travel_speed');
671 }
672 {
673 my $optgroup = $page->new_optgroup('Modifiers');
674 $optgroup->append_single_option_line('first_layer_speed');
675 }
676 {
677 my $optgroup = $page->new_optgroup('Acceleration control (advanced)');
678 $optgroup->append_single_option_line('perimeter_acceleration');
679 $optgroup->append_single_option_line('infill_acceleration');
680 $optgroup->append_single_option_line('bridge_acceleration');
681 $optgroup->append_single_option_line('first_layer_acceleration');
682 $optgroup->append_single_option_line('default_acceleration');
683 }
684 {
685 my $optgroup = $page->new_optgroup('Autospeed (advanced)');
686 $optgroup->append_single_option_line('max_print_speed');
687 $optgroup->append_single_option_line('max_volumetric_speed');
688 $optgroup->append_single_option_line('max_volumetric_extrusion_rate_slope_positive');
689 $optgroup->append_single_option_line('max_volumetric_extrusion_rate_slope_negative');
690 }
691 }
692
693 {
694 my $page = $self->add_options_page('Multiple Extruders', 'funnel.png');
695 {
696 my $optgroup = $page->new_optgroup('Extruders');
697 $optgroup->append_single_option_line('perimeter_extruder');
698 $optgroup->append_single_option_line('infill_extruder');
699 $optgroup->append_single_option_line('solid_infill_extruder');
700 $optgroup->append_single_option_line('support_material_extruder');
701 $optgroup->append_single_option_line('support_material_interface_extruder');
702 }
703 {
704 my $optgroup = $page->new_optgroup('Ooze prevention');
705 $optgroup->append_single_option_line('ooze_prevention');
706 $optgroup->append_single_option_line('standby_temperature_delta');
707 }
708 {
709 my $optgroup = $page->new_optgroup('Advanced');
710 $optgroup->append_single_option_line('interface_shells');
711 }
712 }
713
714 {
715 my $page = $self->add_options_page('Advanced', 'wrench.png');
716 {
717 my $optgroup = $page->new_optgroup('Extrusion width',
718 label_width => 180,
719 );
720 $optgroup->append_single_option_line('extrusion_width');
721 $optgroup->append_single_option_line('first_layer_extrusion_width');
722 $optgroup->append_single_option_line('perimeter_extrusion_width');
723 $optgroup->append_single_option_line('external_perimeter_extrusion_width');
724 $optgroup->append_single_option_line('infill_extrusion_width');
725 $optgroup->append_single_option_line('solid_infill_extrusion_width');
726 $optgroup->append_single_option_line('top_infill_extrusion_width');
727 $optgroup->append_single_option_line('support_material_extrusion_width');
728 }
729 {
730 my $optgroup = $page->new_optgroup('Overlap');
731 $optgroup->append_single_option_line('infill_overlap');
732 }
733 {
734 my $optgroup = $page->new_optgroup('Flow');
735 $optgroup->append_single_option_line('bridge_flow_ratio');
736 }
737 {
738 my $optgroup = $page->new_optgroup('Other');
739 $optgroup->append_single_option_line('xy_size_compensation');
740 $optgroup->append_single_option_line('threads') if $Slic3r::have_threads;
741 $optgroup->append_single_option_line('resolution');
742 }
743 }
744
745 {
746 my $page = $self->add_options_page('Output options', 'page_white_go.png');
747 {
748 my $optgroup = $page->new_optgroup('Sequential printing');
749 $optgroup->append_single_option_line('complete_objects');
750 my $line = Slic3r::GUI::OptionsGroup::Line->new(
751 label => 'Extruder clearance (mm)',
752 );
753 foreach my $opt_key (qw(extruder_clearance_radius extruder_clearance_height)) {
754 my $option = $optgroup->get_option($opt_key);
755 $option->width(60);
756 $line->append_option($option);
757 }
758 $optgroup->append_line($line);
759 }
760 {
761 my $optgroup = $page->new_optgroup('Output file');
762 $optgroup->append_single_option_line('gcode_comments');
763
764 {
765 my $option = $optgroup->get_option('output_filename_format');
766 $option->full_width(1);
767 $optgroup->append_single_option_line($option);
768 }
769 }
770 {
771 my $optgroup = $page->new_optgroup('Post-processing scripts',
772 label_width => 0,
773 );
774 my $option = $optgroup->get_option('post_process');
775 $option->full_width(1);
776 $option->height(50);
777 $optgroup->append_single_option_line($option);
778 }
779 }
780
781 {
782 my $page = $self->add_options_page('Notes', 'note.png');
783 {
784 my $optgroup = $page->new_optgroup('Notes',
785 label_width => 0,
786 );
787 my $option = $optgroup->get_option('notes');
788 $option->full_width(1);
789 $option->height(250);
790 $optgroup->append_single_option_line($option);
791 }
792 }
793 }
794
795 sub _update {
796 my ($self) = @_;
797
798 my $config = $self->{config};
799
800 if ($config->spiral_vase && !($config->perimeters == 1 && $config->top_solid_layers == 0 && $config->fill_density == 0)) {
801 my $dialog = Wx::MessageDialog->new($self,
802 "The Spiral Vase mode requires:\n"
803 . "- one perimeter\n"
804 . "- no top solid layers\n"
805 . "- 0% fill density\n"
806 . "- no support material\n"
807 . "\nShall I adjust those settings in order to enable Spiral Vase?",
808 'Spiral Vase', wxICON_WARNING | wxYES | wxNO);
809 if ($dialog->ShowModal() == wxID_YES) {
810 my $new_conf = Slic3r::Config->new;
811 $new_conf->set("perimeters", 1);
812 $new_conf->set("top_solid_layers", 0);
813 $new_conf->set("fill_density", 0);
814 $new_conf->set("support_material", 0);
815 $self->load_config($new_conf);
816 } else {
817 my $new_conf = Slic3r::Config->new;
818 $new_conf->set("spiral_vase", 0);
819 $self->load_config($new_conf);
820 }
821 }
822
823 if ($config->fill_density == 100
824 && !first { $_ eq $config->fill_pattern } @{$Slic3r::Config::Options->{external_fill_pattern}{values}}) {
825 my $dialog = Wx::MessageDialog->new($self,
826 "The " . $config->fill_pattern . " infill pattern is not supposed to work at 100% density.\n"
827 . "\nShall I switch to rectilinear fill pattern?",
828 'Infill', wxICON_WARNING | wxYES | wxNO);
829
830 my $new_conf = Slic3r::Config->new;
831 if ($dialog->ShowModal() == wxID_YES) {
832 $new_conf->set("fill_pattern", 'rectilinear');
833 $new_conf->set("fill_density", 100);
834 } else {
835 $new_conf->set("fill_density", 40);
836 }
837 $self->load_config($new_conf);
838 }
839
840 my $have_perimeters = $config->perimeters > 0;
841 $self->get_field($_)->toggle($have_perimeters)
842 for qw(extra_perimeters ensure_vertical_shell_thickness thin_walls overhangs seam_position external_perimeters_first
843 external_perimeter_extrusion_width
844 perimeter_speed small_perimeter_speed external_perimeter_speed);
845
846 my $have_infill = $config->fill_density > 0;
847 # infill_extruder uses the same logic as in Print::extruders()
848 $self->get_field($_)->toggle($have_infill)
849 for qw(fill_pattern infill_every_layers infill_only_where_needed solid_infill_every_layers
850 solid_infill_below_area infill_extruder);
851
852 my $have_solid_infill = ($config->top_solid_layers > 0) || ($config->bottom_solid_layers > 0);
853 # solid_infill_extruder uses the same logic as in Print::extruders()
854 $self->get_field($_)->toggle($have_solid_infill)
855 for qw(external_fill_pattern infill_first solid_infill_extruder solid_infill_extrusion_width
856 solid_infill_speed);
857
858 $self->get_field($_)->toggle($have_infill || $have_solid_infill)
859 for qw(fill_angle infill_extrusion_width infill_speed bridge_speed);
860
861 $self->get_field('gap_fill_speed')->toggle($have_perimeters && $have_infill);
862
863 my $have_top_solid_infill = $config->top_solid_layers > 0;
864 $self->get_field($_)->toggle($have_top_solid_infill)
865 for qw(top_infill_extrusion_width top_solid_infill_speed);
866
867 my $have_default_acceleration = $config->default_acceleration > 0;
868 $self->get_field($_)->toggle($have_default_acceleration)
869 for qw(perimeter_acceleration infill_acceleration bridge_acceleration first_layer_acceleration);
870
871 my $have_skirt = $config->skirts > 0 || $config->min_skirt_length > 0;
872 $self->get_field($_)->toggle($have_skirt)
873 for qw(skirt_distance skirt_height);
874
875 my $have_brim = $config->brim_width > 0;
876 # perimeter_extruder uses the same logic as in Print::extruders()
877 $self->get_field('perimeter_extruder')->toggle($have_perimeters || $have_brim);
878
879 my $have_support_material = $config->support_material || $config->raft_layers > 0;
880 my $have_support_interface = $config->support_material_interface_layers > 0;
881 $self->get_field($_)->toggle($have_support_material)
882 for qw(support_material_threshold support_material_pattern support_material_with_sheath
883 support_material_spacing support_material_angle
884 support_material_interface_layers dont_support_bridges
885 support_material_extrusion_width support_material_contact_distance);
886 $self->get_field($_)->toggle($have_support_material && $have_support_interface)
887 for qw(support_material_interface_spacing support_material_interface_extruder
888 support_material_interface_speed);
889
890 $self->get_field('perimeter_extrusion_width')->toggle($have_perimeters || $have_skirt || $have_brim);
891 $self->get_field('support_material_extruder')->toggle($have_support_material || $have_skirt);
892 $self->get_field('support_material_speed')->toggle($have_support_material || $have_brim || $have_skirt);
893
894 my $have_sequential_printing = $config->complete_objects;
895 $self->get_field($_)->toggle($have_sequential_printing)
896 for qw(extruder_clearance_radius extruder_clearance_height);
897
898 my $have_ooze_prevention = $config->ooze_prevention;
899 $self->get_field($_)->toggle($have_ooze_prevention)
900 for qw(standby_temperature_delta);
901 }
902
903 sub hidden_options { !$Slic3r::have_threads ? qw(threads) : () }
904
905 package Slic3r::GUI::Tab::Filament;
906 use base 'Slic3r::GUI::Tab';
907
908 sub name { 'filament' }
909 sub title { 'Filament Settings' }
910
911 sub build {
912 my $self = shift;
913
914 $self->init_config_options(qw(
915 filament_colour filament_diameter filament_notes filament_max_volumetric_speed extrusion_multiplier
916 temperature first_layer_temperature bed_temperature first_layer_bed_temperature
917 fan_always_on cooling
918 min_fan_speed max_fan_speed bridge_fan_speed disable_fan_first_layers
919 fan_below_layer_time slowdown_below_layer_time min_print_speed
920 ));
921 $self->{config}->set('filament_settings_id', '');
922
923 {
924 my $page = $self->add_options_page('Filament', 'spool.png');
925 {
926 my $optgroup = $page->new_optgroup('Filament');
927 $optgroup->append_single_option_line('filament_colour', 0);
928 $optgroup->append_single_option_line('filament_diameter', 0);
929 $optgroup->append_single_option_line('extrusion_multiplier', 0);
930 }
931
932 {
933 my $optgroup = $page->new_optgroup('Temperature (°C)');
934
935 {
936 my $line = Slic3r::GUI::OptionsGroup::Line->new(
937 label => 'Extruder',
938 );
939 $line->append_option($optgroup->get_option('first_layer_temperature', 0));
940 $line->append_option($optgroup->get_option('temperature', 0));
941 $optgroup->append_line($line);
942 }
943
944 {
945 my $line = Slic3r::GUI::OptionsGroup::Line->new(
946 label => 'Bed',
947 );
948 $line->append_option($optgroup->get_option('first_layer_bed_temperature'));
949 $line->append_option($optgroup->get_option('bed_temperature'));
950 $optgroup->append_line($line);
951 }
952 }
953 }
954
955 {
956 my $page = $self->add_options_page('Cooling', 'hourglass.png');
957 {
958 my $optgroup = $page->new_optgroup('Enable');
959 $optgroup->append_single_option_line('fan_always_on');
960 $optgroup->append_single_option_line('cooling');
961
962 my $line = Slic3r::GUI::OptionsGroup::Line->new(
963 label => '',
964 full_width => 1,
965 widget => sub {
966 my ($parent) = @_;
967 return $self->{description_line} = Slic3r::GUI::OptionsGroup::StaticText->new($parent);
968 },
969 );
970 $optgroup->append_line($line);
971 }
972 {
973 my $optgroup = $page->new_optgroup('Fan settings');
974
975 {
976 my $line = Slic3r::GUI::OptionsGroup::Line->new(
977 label => 'Fan speed',
978 );
979 $line->append_option($optgroup->get_option('min_fan_speed'));
980 $line->append_option($optgroup->get_option('max_fan_speed'));
981 $optgroup->append_line($line);
982 }
983
984 $optgroup->append_single_option_line('bridge_fan_speed');
985 $optgroup->append_single_option_line('disable_fan_first_layers');
986 }
987 {
988 my $optgroup = $page->new_optgroup('Cooling thresholds',
989 label_width => 250,
990 );
991 $optgroup->append_single_option_line('fan_below_layer_time');
992 $optgroup->append_single_option_line('slowdown_below_layer_time');
993 $optgroup->append_single_option_line('min_print_speed');
994 }
995 }
996
997 {
998 my $page = $self->add_options_page('Advanced', 'wrench.png');
999 {
1000 my $optgroup = $page->new_optgroup('Print speed override');
1001 $optgroup->append_single_option_line('filament_max_volumetric_speed', 0);
1002 }
1003 }
1004
1005 {
1006 my $page = $self->add_options_page('Notes', 'note.png');
1007 {
1008 my $optgroup = $page->new_optgroup('Notes',
1009 label_width => 0,
1010 );
1011 my $option = $optgroup->get_option('filament_notes', 0);
1012 $option->full_width(1);
1013 $option->height(250);
1014 $optgroup->append_single_option_line($option);
1015 }
1016 }
1017 }
1018
1019 sub _update {
1020 my ($self) = @_;
1021
1022 $self->_update_description;
1023
1024 my $cooling = $self->{config}->cooling;
1025 $self->get_field($_)->toggle($cooling)
1026 for qw(max_fan_speed fan_below_layer_time slowdown_below_layer_time min_print_speed);
1027 $self->get_field($_)->toggle($cooling || $self->{config}->fan_always_on)
1028 for qw(min_fan_speed disable_fan_first_layers);
1029 }
1030
1031 sub _update_description {
1032 my $self = shift;
1033
1034 my $config = $self->config;
1035
1036 my $msg = "";
1037 my $fan_other_layers = $config->fan_always_on
1038 ? sprintf "will always run at %d%%%s.", $config->min_fan_speed,
1039 ($config->disable_fan_first_layers > 1
1040 ? " except for the first " . $config->disable_fan_first_layers . " layers"
1041 : $config->disable_fan_first_layers == 1
1042 ? " except for the first layer"
1043 : "")
1044 : "will be turned off.";
1045
1046 if ($config->cooling) {
1047 $msg = sprintf "If estimated layer time is below ~%ds, fan will run at %d%% and print speed will be reduced so that no less than %ds are spent on that layer (however, speed will never be reduced below %dmm/s).",
1048 $config->slowdown_below_layer_time, $config->max_fan_speed, $config->slowdown_below_layer_time, $config->min_print_speed;
1049 if ($config->fan_below_layer_time > $config->slowdown_below_layer_time) {
1050 $msg .= sprintf "\nIf estimated layer time is greater, but still below ~%ds, fan will run at a proportionally decreasing speed between %d%% and %d%%.",
1051 $config->fan_below_layer_time, $config->max_fan_speed, $config->min_fan_speed;
1052 }
1053 $msg .= "\nDuring the other layers, fan $fan_other_layers"
1054 } else {
1055 $msg = "Fan $fan_other_layers";
1056 }
1057 $self->{description_line}->SetText($msg);
1058 }
1059
1060 package Slic3r::GUI::Tab::Printer;
1061 use base 'Slic3r::GUI::Tab';
1062 use Wx qw(wxTheApp :sizer :button :bitmap :misc :id :icon :dialog);
1063 use Wx::Event qw(EVT_BUTTON);
1064
1065 sub name { 'printer' }
1066 sub title { 'Printer Settings' }
1067
1068 sub build {
1069 my $self = shift;
1070 my (%params) = @_;
1071
1072 $self->init_config_options(qw(
1073 bed_shape z_offset
1074 gcode_flavor use_relative_e_distances
1075 serial_port serial_speed
1076 octoprint_host octoprint_apikey
1077 use_firmware_retraction pressure_advance
1078 use_volumetric_e
1079 start_gcode end_gcode before_layer_gcode layer_gcode toolchange_gcode
1080 nozzle_diameter extruder_offset
1081 retract_length retract_lift retract_speed retract_restart_extra retract_before_travel retract_layer_change wipe
1082 retract_length_toolchange retract_restart_extra_toolchange
1083 ));
1084 $self->{config}->set('printer_settings_id', '');
1085
1086 my $bed_shape_widget = sub {
1087 my ($parent) = @_;
1088
1089 my $btn = Wx::Button->new($parent, -1, "Set…", wxDefaultPosition, wxDefaultSize,
1090 wxBU_LEFT | wxBU_EXACTFIT);
1091 $btn->SetFont($Slic3r::GUI::small_font);
1092 if ($Slic3r::GUI::have_button_icons) {
1093 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("cog.png"), wxBITMAP_TYPE_PNG));
1094 }
1095
1096 my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
1097 $sizer->Add($btn);
1098
1099 EVT_BUTTON($self, $btn, sub {
1100 my $dlg = Slic3r::GUI::BedShapeDialog->new($self, $self->{config}->bed_shape);
1101 if ($dlg->ShowModal == wxID_OK) {
1102 my $value = $dlg->GetValue;
1103 $self->{config}->set('bed_shape', $value);
1104 $self->update_dirty;
1105 $self->_on_value_change('bed_shape', $value);
1106 }
1107 });
1108
1109 return $sizer;
1110 };
1111
1112 $self->{extruders_count} = 1;
1113
1114 {
1115 my $page = $self->add_options_page('General', 'printer_empty.png');
1116 {
1117 my $optgroup = $page->new_optgroup('Size and coordinates');
1118
1119 my $line = Slic3r::GUI::OptionsGroup::Line->new(
1120 label => 'Bed shape',
1121 widget => $bed_shape_widget,
1122 );
1123 $optgroup->append_line($line);
1124
1125 $optgroup->append_single_option_line('z_offset');
1126 }
1127 {
1128 my $optgroup = $page->new_optgroup('Capabilities');
1129 {
1130 my $option = Slic3r::GUI::OptionsGroup::Option->new(
1131 opt_id => 'extruders_count',
1132 type => 'i',
1133 default => 1,
1134 label => 'Extruders',
1135 tooltip => 'Number of extruders of the printer.',
1136 min => 1,
1137 );
1138 $optgroup->append_single_option_line($option);
1139 }
1140 $optgroup->on_change(sub {
1141 my ($opt_id) = @_;
1142 if ($opt_id eq 'extruders_count') {
1143 wxTheApp->CallAfter(sub {
1144 $self->_extruders_count_changed($optgroup->get_value('extruders_count'));
1145 });
1146 $self->update_dirty;
1147 }
1148 });
1149 }
1150 if (!$params{no_controller})
1151 {
1152 my $optgroup = $page->new_optgroup('USB/Serial connection');
1153 my $line = Slic3r::GUI::OptionsGroup::Line->new(
1154 label => 'Serial port',
1155 );
1156 my $serial_port = $optgroup->get_option('serial_port');
1157 $serial_port->side_widget(sub {
1158 my ($parent) = @_;
1159
1160 my $btn = Wx::BitmapButton->new($parent, -1, Wx::Bitmap->new($Slic3r::var->("arrow_rotate_clockwise.png"), wxBITMAP_TYPE_PNG),
1161 wxDefaultPosition, wxDefaultSize, &Wx::wxBORDER_NONE);
1162 $btn->SetToolTipString("Rescan serial ports")
1163 if $btn->can('SetToolTipString');
1164 EVT_BUTTON($self, $btn, \&_update_serial_ports);
1165
1166 return $btn;
1167 });
1168 my $serial_test = sub {
1169 my ($parent) = @_;
1170
1171 my $btn = $self->{serial_test_btn} = Wx::Button->new($parent, -1,
1172 "Test", wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
1173 $btn->SetFont($Slic3r::GUI::small_font);
1174 if ($Slic3r::GUI::have_button_icons) {
1175 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("wrench.png"), wxBITMAP_TYPE_PNG));
1176 }
1177
1178 EVT_BUTTON($self, $btn, sub {
1179 my $sender = Slic3r::GCode::Sender->new;
1180 my $res = $sender->connect(
1181 $self->{config}->serial_port,
1182 $self->{config}->serial_speed,
1183 );
1184 if ($res && $sender->wait_connected) {
1185 Slic3r::GUI::show_info($self, "Connection to printer works correctly.", "Success!");
1186 } else {
1187 Slic3r::GUI::show_error($self, "Connection failed.");
1188 }
1189 });
1190 return $btn;
1191 };
1192 $line->append_option($serial_port);
1193 $line->append_option($optgroup->get_option('serial_speed'));
1194 $line->append_widget($serial_test);
1195 $optgroup->append_line($line);
1196 }
1197 {
1198 my $optgroup = $page->new_optgroup('OctoPrint upload');
1199
1200 # append two buttons to the Host line
1201 my $octoprint_host_browse = sub {
1202 my ($parent) = @_;
1203
1204 my $btn = Wx::Button->new($parent, -1, "Browse…", wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
1205 $btn->SetFont($Slic3r::GUI::small_font);
1206 if ($Slic3r::GUI::have_button_icons) {
1207 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("zoom.png"), wxBITMAP_TYPE_PNG));
1208 }
1209
1210 if (!eval "use Net::Bonjour; 1") {
1211 $btn->Disable;
1212 }
1213
1214 EVT_BUTTON($self, $btn, sub {
1215 # look for devices
1216 my $entries;
1217 {
1218 my $res = Net::Bonjour->new('http');
1219 $res->discover;
1220 $entries = [ $res->entries ];
1221 }
1222 if (@{$entries}) {
1223 my $dlg = Slic3r::GUI::BonjourBrowser->new($self, $entries);
1224 if ($dlg->ShowModal == wxID_OK) {
1225 my $value = $dlg->GetValue . ":" . $dlg->GetPort;
1226 $self->{config}->set('octoprint_host', $value);
1227 $self->update_dirty;
1228 $self->_on_value_change('octoprint_host', $value);
1229 $self->reload_config;
1230 }
1231 } else {
1232 Wx::MessageDialog->new($self, 'No Bonjour device found', 'Device Browser', wxOK | wxICON_INFORMATION)->ShowModal;
1233 }
1234 });
1235
1236 return $btn;
1237 };
1238 my $octoprint_host_test = sub {
1239 my ($parent) = @_;
1240
1241 my $btn = $self->{octoprint_host_test_btn} = Wx::Button->new($parent, -1,
1242 "Test", wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
1243 $btn->SetFont($Slic3r::GUI::small_font);
1244 if ($Slic3r::GUI::have_button_icons) {
1245 $btn->SetBitmap(Wx::Bitmap->new($Slic3r::var->("wrench.png"), wxBITMAP_TYPE_PNG));
1246 }
1247
1248 EVT_BUTTON($self, $btn, sub {
1249 my $ua = LWP::UserAgent->new;
1250 $ua->timeout(10);
1251
1252 my $res = $ua->get(
1253 "http://" . $self->{config}->octoprint_host . "/api/version",
1254 'X-Api-Key' => $self->{config}->octoprint_apikey,
1255 );
1256 if ($res->is_success) {
1257 Slic3r::GUI::show_info($self, "Connection to OctoPrint works correctly.", "Success!");
1258 } else {
1259 Slic3r::GUI::show_error($self,
1260 "I wasn't able to connect to OctoPrint (" . $res->status_line . "). "
1261 . "Check hostname and OctoPrint version (at least 1.1.0 is required).");
1262 }
1263 });
1264 return $btn;
1265 };
1266
1267 my $host_line = $optgroup->create_single_option_line('octoprint_host');
1268 $host_line->append_widget($octoprint_host_browse);
1269 $host_line->append_widget($octoprint_host_test);
1270 $optgroup->append_line($host_line);
1271 $optgroup->append_single_option_line('octoprint_apikey');
1272 }
1273 {
1274 my $optgroup = $page->new_optgroup('Firmware');
1275 $optgroup->append_single_option_line('gcode_flavor');
1276 }
1277 {
1278 my $optgroup = $page->new_optgroup('Advanced');
1279 $optgroup->append_single_option_line('use_relative_e_distances');
1280 $optgroup->append_single_option_line('use_firmware_retraction');
1281 $optgroup->append_single_option_line('use_volumetric_e');
1282 $optgroup->append_single_option_line('pressure_advance');
1283 }
1284 }
1285 {
1286 my $page = $self->add_options_page('Custom G-code', 'cog.png');
1287 {
1288 my $optgroup = $page->new_optgroup('Start G-code',
1289 label_width => 0,
1290 );
1291 my $option = $optgroup->get_option('start_gcode');
1292 $option->full_width(1);
1293 $option->height(150);
1294 $optgroup->append_single_option_line($option);
1295 }
1296 {
1297 my $optgroup = $page->new_optgroup('End G-code',
1298 label_width => 0,
1299 );
1300 my $option = $optgroup->get_option('end_gcode');
1301 $option->full_width(1);
1302 $option->height(150);
1303 $optgroup->append_single_option_line($option);
1304 }
1305 {
1306 my $optgroup = $page->new_optgroup('Before layer change G-code',
1307 label_width => 0,
1308 );
1309 my $option = $optgroup->get_option('before_layer_gcode');
1310 $option->full_width(1);
1311 $option->height(150);
1312 $optgroup->append_single_option_line($option);
1313 }
1314 {
1315 my $optgroup = $page->new_optgroup('After layer change G-code',
1316 label_width => 0,
1317 );
1318 my $option = $optgroup->get_option('layer_gcode');
1319 $option->full_width(1);
1320 $option->height(150);
1321 $optgroup->append_single_option_line($option);
1322 }
1323 {
1324 my $optgroup = $page->new_optgroup('Tool change G-code',
1325 label_width => 0,
1326 );
1327 my $option = $optgroup->get_option('toolchange_gcode');
1328 $option->full_width(1);
1329 $option->height(150);
1330 $optgroup->append_single_option_line($option);
1331 }
1332 }
1333
1334 $self->{extruder_pages} = [];
1335 $self->_build_extruder_pages;
1336 $self->_update_serial_ports if (!$params{no_controller});
1337 }
1338
1339 sub _update_serial_ports {
1340 my ($self) = @_;
1341
1342 $self->get_field('serial_port')->set_values([ wxTheApp->scan_serial_ports ]);
1343 }
1344
1345 sub _extruders_count_changed {
1346 my ($self, $extruders_count) = @_;
1347
1348 $self->{extruders_count} = $extruders_count;
1349 $self->_build_extruder_pages;
1350 $self->_on_value_change('extruders_count', $extruders_count);
1351 $self->_update;
1352 }
1353
1354 sub _extruder_options { qw(nozzle_diameter extruder_offset retract_length retract_lift retract_lift_above retract_lift_below retract_speed retract_restart_extra retract_before_travel wipe
1355 retract_layer_change retract_length_toolchange retract_restart_extra_toolchange) }
1356
1357 sub _build_extruder_pages {
1358 my $self = shift;
1359
1360 my $default_config = Slic3r::Config::Full->new;
1361
1362 foreach my $extruder_idx (@{$self->{extruder_pages}} .. $self->{extruders_count}-1) {
1363 # extend options
1364 foreach my $opt_key ($self->_extruder_options) {
1365 my $values = $self->{config}->get($opt_key);
1366 if (!defined $values) {
1367 $values = [ $default_config->get_at($opt_key, 0) ];
1368 } else {
1369 # use last extruder's settings for the new one
1370 my $last_value = $values->[-1];
1371 $values->[$extruder_idx] //= $last_value;
1372 }
1373 $self->{config}->set($opt_key, $values)
1374 or die "Unable to extend $opt_key";
1375 }
1376
1377 # build page
1378 my $page = $self->{extruder_pages}[$extruder_idx] = $self->add_options_page("Extruder " . ($extruder_idx + 1), 'funnel.png');
1379 {
1380 my $optgroup = $page->new_optgroup('Size');
1381 $optgroup->append_single_option_line('nozzle_diameter', $extruder_idx);
1382 }
1383 {
1384 my $optgroup = $page->new_optgroup('Position (for multi-extruder printers)');
1385 $optgroup->append_single_option_line('extruder_offset', $extruder_idx);
1386 }
1387 {
1388 my $optgroup = $page->new_optgroup('Retraction');
1389 $optgroup->append_single_option_line($_, $extruder_idx)
1390 for qw(retract_length retract_lift);
1391
1392 {
1393 my $line = Slic3r::GUI::OptionsGroup::Line->new(
1394 label => 'Only lift Z',
1395 );
1396 $line->append_option($optgroup->get_option('retract_lift_above', $extruder_idx));
1397 $line->append_option($optgroup->get_option('retract_lift_below', $extruder_idx));
1398 $optgroup->append_line($line);
1399 }
1400
1401 $optgroup->append_single_option_line($_, $extruder_idx)
1402 for qw(retract_speed retract_restart_extra retract_before_travel retract_layer_change wipe);
1403 }
1404 {
1405 my $optgroup = $page->new_optgroup('Retraction when tool is disabled (advanced settings for multi-extruder setups)');
1406 $optgroup->append_single_option_line($_, $extruder_idx)
1407 for qw(retract_length_toolchange retract_restart_extra_toolchange);
1408 }
1409 }
1410
1411 # remove extra pages
1412 if ($self->{extruders_count} <= $#{$self->{extruder_pages}}) {
1413 $_->Destroy for @{$self->{extruder_pages}}[$self->{extruders_count}..$#{$self->{extruder_pages}}];
1414 splice @{$self->{extruder_pages}}, $self->{extruders_count};
1415 }
1416
1417 # remove extra config values
1418 foreach my $opt_key ($self->_extruder_options) {
1419 my $values = $self->{config}->get($opt_key);
1420 splice @$values, $self->{extruders_count} if $self->{extruders_count} <= $#$values;
1421 $self->{config}->set($opt_key, $values)
1422 or die "Unable to truncate $opt_key";
1423 }
1424
1425 # rebuild page list
1426 @{$self->{pages}} = (
1427 (grep $_->{title} !~ /^Extruder \d+/, @{$self->{pages}}),
1428 @{$self->{extruder_pages}}[ 0 .. $self->{extruders_count}-1 ],
1429 );
1430 $self->update_tree;
1431 }
1432
1433 sub _update {
1434 my ($self) = @_;
1435
1436 my $config = $self->{config};
1437
1438 my $serial_speed = $self->get_field('serial_speed');
1439 if ($serial_speed) {
1440 $self->get_field('serial_speed')->toggle($config->get('serial_port'));
1441 if ($config->get('serial_speed') && $config->get('serial_port')) {
1442 $self->{serial_test_btn}->Enable;
1443 } else {
1444 $self->{serial_test_btn}->Disable;
1445 }
1446 }
1447 if ($config->get('octoprint_host') && eval "use LWP::UserAgent; 1") {
1448 $self->{octoprint_host_test_btn}->Enable;
1449 } else {
1450 $self->{octoprint_host_test_btn}->Disable;
1451 }
1452 $self->get_field('octoprint_apikey')->toggle($config->get('octoprint_host'));
1453
1454 my $have_multiple_extruders = $self->{extruders_count} > 1;
1455 $self->get_field('toolchange_gcode')->toggle($have_multiple_extruders);
1456
1457 for my $i (0 .. ($self->{extruders_count}-1)) {
1458 my $have_retract_length = $config->get_at('retract_length', $i) > 0;
1459
1460 # when using firmware retraction, firmware decides retraction length
1461 $self->get_field('retract_length', $i)->toggle(!$config->use_firmware_retraction);
1462
1463 # user can customize travel length if we have retraction length or we're using
1464 # firmware retraction
1465 $self->get_field('retract_before_travel', $i)->toggle($have_retract_length || $config->use_firmware_retraction);
1466
1467 # user can customize other retraction options if retraction is enabled
1468 my $retraction = ($have_retract_length || $config->use_firmware_retraction);
1469 $self->get_field($_, $i)->toggle($retraction)
1470 for qw(retract_lift retract_layer_change);
1471
1472 # retract lift above/below only applies if using retract lift
1473 $self->get_field($_, $i)->toggle($retraction && $config->get_at('retract_lift', $i) > 0)
1474 for qw(retract_lift_above retract_lift_below);
1475
1476 # some options only apply when not using firmware retraction
1477 $self->get_field($_, $i)->toggle($retraction && !$config->use_firmware_retraction)
1478 for qw(retract_speed retract_restart_extra wipe);
1479 if ($config->use_firmware_retraction && $config->get_at('wipe', $i)) {
1480 my $dialog = Wx::MessageDialog->new($self,
1481 "The Wipe option is not available when using the Firmware Retraction mode.\n"
1482 . "\nShall I disable it in order to enable Firmware Retraction?",
1483 'Firmware Retraction', wxICON_WARNING | wxYES | wxNO);
1484
1485 my $new_conf = Slic3r::Config->new;
1486 if ($dialog->ShowModal() == wxID_YES) {
1487 my $wipe = $config->wipe;
1488 $wipe->[$i] = 0;
1489 $new_conf->set("wipe", $wipe);
1490 } else {
1491 $new_conf->set("use_firmware_retraction", 0);
1492 }
1493 $self->load_config($new_conf);
1494 }
1495
1496 $self->get_field('retract_length_toolchange', $i)->toggle($have_multiple_extruders);
1497
1498 my $toolchange_retraction = $config->get_at('retract_length_toolchange', $i) > 0;
1499 $self->get_field('retract_restart_extra_toolchange', $i)->toggle
1500 ($have_multiple_extruders && $toolchange_retraction);
1501 }
1502 }
1503
1504 # this gets executed after preset is loaded and before GUI fields are updated
1505 sub on_preset_loaded {
1506 my $self = shift;
1507
1508 # update the extruders count field
1509 {
1510 # update the GUI field according to the number of nozzle diameters supplied
1511 my $extruders_count = scalar @{ $self->{config}->nozzle_diameter };
1512 $self->set_value('extruders_count', $extruders_count);
1513 $self->_extruders_count_changed($extruders_count);
1514 }
1515 }
1516
1517 sub load_config_file {
1518 my $self = shift;
1519 $self->SUPER::load_config_file(@_);
1520
1521 Slic3r::GUI::warning_catcher($self)->(
1522 "Your configuration was imported. However, Slic3r is currently only able to import settings "
1523 . "for the first defined filament. We recommend you don't use exported configuration files "
1524 . "for multi-extruder setups and rely on the built-in preset management system instead.")
1525 if @{ $self->{config}->nozzle_diameter } > 1;
1526 }
1527
1528 package Slic3r::GUI::Tab::Page;
1529 use Wx qw(wxTheApp :misc :panel :sizer);
1530 use base 'Wx::ScrolledWindow';
1531
1532 sub new {
1533 my $class = shift;
1534 my ($parent, $title, $iconID) = @_;
1535 my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
1536 $self->{optgroups} = [];
1537 $self->{title} = $title;
1538 $self->{iconID} = $iconID;
1539
1540 $self->SetScrollbars(1, 1, 1, 1);
1541
1542 $self->{vsizer} = Wx::BoxSizer->new(wxVERTICAL);
1543 $self->SetSizer($self->{vsizer});
1544
1545 return $self;
1546 }
1547
1548 sub new_optgroup {
1549 my ($self, $title, %params) = @_;
1550
1551 my $optgroup = Slic3r::GUI::ConfigOptionsGroup->new(
1552 parent => $self,
1553 title => $title,
1554 config => $self->GetParent->{config},
1555 label_width => $params{label_width} // 200,
1556 on_change => sub {
1557 my ($opt_key, $value) = @_;
1558 wxTheApp->CallAfter(sub {
1559 $self->GetParent->update_dirty;
1560 $self->GetParent->_on_value_change($opt_key, $value);
1561 });
1562 },
1563 );
1564
1565 push @{$self->{optgroups}}, $optgroup;
1566 $self->{vsizer}->Add($optgroup->sizer, 0, wxEXPAND | wxALL, 10);
1567
1568 return $optgroup;
1569 }
1570
1571 sub reload_config {
1572 my ($self) = @_;
1573 $_->reload_config for @{$self->{optgroups}};
1574 }
1575
1576 sub get_field {
1577 my ($self, $opt_key, $opt_index) = @_;
1578
1579 foreach my $optgroup (@{ $self->{optgroups} }) {
1580 my $field = $optgroup->get_fieldc($opt_key, $opt_index);
1581 return $field if defined $field;
1582 }
1583 return undef;
1584 }
1585
1586 sub set_value {
1587 my $self = shift;
1588 my ($opt_key, $value) = @_;
1589
1590 my $changed = 0;
1591 foreach my $optgroup (@{$self->{optgroups}}) {
1592 $changed = 1 if $optgroup->set_value($opt_key, $value);
1593 }
1594 return $changed;
1595 }
1596
1597 package Slic3r::GUI::SavePresetWindow;
1598 use Wx qw(:combobox :dialog :id :misc :sizer);
1599 use Wx::Event qw(EVT_BUTTON EVT_TEXT_ENTER);
1600 use base 'Wx::Dialog';
1601
1602 sub new {
1603 my $class = shift;
1604 my ($parent, %params) = @_;
1605 my $self = $class->SUPER::new($parent, -1, "Save preset", wxDefaultPosition, wxDefaultSize);
1606
1607 my @values = @{$params{values}};
1608
1609 my $text = Wx::StaticText->new($self, -1, "Save " . lc($params{title}) . " as:", wxDefaultPosition, wxDefaultSize);
1610 $self->{combo} = Wx::ComboBox->new($self, -1, $params{default}, wxDefaultPosition, wxDefaultSize, \@values,
1611 wxTE_PROCESS_ENTER);
1612 my $buttons = $self->CreateStdDialogButtonSizer(wxOK | wxCANCEL);
1613
1614 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
1615 $sizer->Add($text, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 10);
1616 $sizer->Add($self->{combo}, 0, wxEXPAND | wxLEFT | wxRIGHT, 10);
1617 $sizer->Add($buttons, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
1618
1619 EVT_BUTTON($self, wxID_OK, \&accept);
1620 EVT_TEXT_ENTER($self, $self->{combo}, \&accept);
1621
1622 $self->SetSizer($sizer);
1623 $sizer->SetSizeHints($self);
1624
1625 return $self;
1626 }
1627
1628 sub accept {
1629 my ($self, $event) = @_;
1630
1631 if (($self->{chosen_name} = $self->{combo}->GetValue)) {
1632 if ($self->{chosen_name} !~ /^[^<>:\/\\|?*\"]+$/i) {
1633 Slic3r::GUI::show_error($self, "The supplied name is not valid; the following characters are not allowed: <>:/\|?*\"");
1634 } elsif ($self->{chosen_name} eq '- default -') {
1635 Slic3r::GUI::show_error($self, "The supplied name is not available.");
1636 } else {
1637 $self->EndModal(wxID_OK);
1638 }
1639 }
1640 }
1641
1642 sub get_name {
1643 my $self = shift;
1644 return $self->{chosen_name};
1645 }
1646
1647 package Slic3r::GUI::Tab::Preset;
1648 use Moo;
1649
1650 has 'default' => (is => 'ro', default => sub { 0 });
1651 has 'external' => (is => 'ro', default => sub { 0 });
1652 has 'name' => (is => 'rw', required => 1);
1653 has 'file' => (is => 'rw');
1654
1655 sub config {
1656 my ($self, $keys) = @_;
1657
1658 if ($self->default) {
1659 # Perl class Slic3r::Config extends the C++ class Slic3r::DynamicPrintConfig
1660 return Slic3r::Config->new_from_defaults(@$keys);
1661 } else {
1662 if (!-e Slic3r::encode_path($self->file)) {
1663 Slic3r::GUI::show_error(undef, "The selected preset does not exist anymore (" . $self->file . ").");
1664 return undef;
1665 }
1666
1667 # apply preset values on top of defaults
1668 my $config = Slic3r::Config->new_from_defaults(@$keys);
1669 my $external_config = Slic3r::Config->load($self->file);
1670 $config->set($_, $external_config->get($_))
1671 for grep $external_config->has($_), @$keys;
1672
1673 return $config;
1674 }
1675 }
1676
1677 1;
0 package Slic3r::GUI;
1 use strict;
2 use warnings;
3 use utf8;
4
5 use File::Basename qw(basename);
6 use FindBin;
7 use List::Util qw(first);
8 use Slic3r::GUI::2DBed;
9 use Slic3r::GUI::AboutDialog;
10 use Slic3r::GUI::BedShapeDialog;
11 use Slic3r::GUI::BonjourBrowser;
12 use Slic3r::GUI::ConfigWizard;
13 use Slic3r::GUI::Controller;
14 use Slic3r::GUI::Controller::ManualControlDialog;
15 use Slic3r::GUI::Controller::PrinterPanel;
16 use Slic3r::GUI::MainFrame;
17 use Slic3r::GUI::Notifier;
18 use Slic3r::GUI::Plater;
19 use Slic3r::GUI::Plater::2D;
20 use Slic3r::GUI::Plater::2DToolpaths;
21 use Slic3r::GUI::Plater::3D;
22 use Slic3r::GUI::Plater::3DPreview;
23 use Slic3r::GUI::Plater::ObjectPartsPanel;
24 use Slic3r::GUI::Plater::ObjectCutDialog;
25 use Slic3r::GUI::Plater::ObjectSettingsDialog;
26 use Slic3r::GUI::Plater::OverrideSettingsPanel;
27 use Slic3r::GUI::Preferences;
28 use Slic3r::GUI::ProgressStatusBar;
29 use Slic3r::GUI::Projector;
30 use Slic3r::GUI::OptionsGroup;
31 use Slic3r::GUI::OptionsGroup::Field;
32 use Slic3r::GUI::SimpleTab;
33 use Slic3r::GUI::Tab;
34
35 our $have_OpenGL = eval "use Slic3r::GUI::3DScene; 1";
36 our $have_LWP = eval "use LWP::UserAgent; 1";
37
38 use Wx 0.9901 qw(:bitmap :dialog :icon :id :misc :systemsettings :toplevelwindow
39 :filedialog :font);
40 use Wx::Event qw(EVT_IDLE EVT_COMMAND);
41 use base 'Wx::App';
42
43 use constant FILE_WILDCARDS => {
44 known => 'Known files (*.stl, *.obj, *.amf, *.xml)|*.stl;*.STL;*.obj;*.OBJ;*.amf;*.AMF;*.xml;*.XML',
45 stl => 'STL files (*.stl)|*.stl;*.STL',
46 obj => 'OBJ files (*.obj)|*.obj;*.OBJ',
47 amf => 'AMF files (*.amf)|*.amf;*.AMF;*.xml;*.XML',
48 ini => 'INI files *.ini|*.ini;*.INI',
49 gcode => 'G-code files (*.gcode, *.gco, *.g, *.ngc)|*.gcode;*.GCODE;*.gco;*.GCO;*.g;*.G;*.ngc;*.NGC',
50 svg => 'SVG files *.svg|*.svg;*.SVG',
51 };
52 use constant MODEL_WILDCARD => join '|', @{&FILE_WILDCARDS}{qw(known stl obj amf)};
53
54 our $datadir;
55 # If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden.
56 our $no_controller;
57 our $no_plater;
58 our $mode;
59 our $autosave;
60 our @cb;
61
62 our $Settings = {
63 _ => {
64 mode => 'simple',
65 version_check => 1,
66 autocenter => 1,
67 background_processing => 1,
68 # If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden.
69 # By default, Prusa has the controller hidden.
70 no_controller => 1,
71 # If set, the "- default -" selections of print/filament/printer are suppressed, if there is a valid preset available.
72 no_defaults => 1,
73 },
74 };
75
76 our $have_button_icons = &Wx::wxVERSION_STRING =~ m" (?:2\.9\.[1-9]|3\.)";
77 our $small_font = Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
78 $small_font->SetPointSize(11) if !&Wx::wxMSW;
79 our $small_bold_font = Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
80 $small_bold_font->SetPointSize(11) if !&Wx::wxMSW;
81 $small_bold_font->SetWeight(wxFONTWEIGHT_BOLD);
82 our $medium_font = Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
83 $medium_font->SetPointSize(12);
84 our $grey = Wx::Colour->new(200,200,200);
85
86 our $VERSION_CHECK_EVENT : shared = Wx::NewEventType;
87
88 our $DLP_projection_screen;
89
90 sub OnInit {
91 my ($self) = @_;
92
93 $self->SetAppName('Slic3r');
94 $self->SetAppDisplayName('Slic3r Prusa Edition') if (Wx::wxVERSION >= 3.000000);
95 Slic3r::debugf "wxWidgets version %s, Wx version %s\n", &Wx::wxVERSION_STRING, $Wx::VERSION;
96
97 $self->{notifier} = Slic3r::GUI::Notifier->new;
98
99 # locate or create data directory
100 # Unix: ~/.Slic3r
101 # Windows: "C:\Users\username\AppData\Roaming\Slic3r" or "C:\Documents and Settings\username\Application Data\Slic3r"
102 # Mac: "~/Library/Application Support/Slic3r"
103 $datadir ||= Slic3r::decode_path(Wx::StandardPaths::Get->GetUserDataDir);
104 my $enc_datadir = Slic3r::encode_path($datadir);
105 Slic3r::debugf "Data directory: %s\n", $datadir;
106
107 # just checking for existence of $datadir is not enough: it may be an empty directory
108 # supplied as argument to --datadir; in that case we should still run the wizard
109 my $run_wizard = (-d $enc_datadir && -e "$enc_datadir/slic3r.ini") ? 0 : 1;
110 foreach my $dir ($enc_datadir, "$enc_datadir/print", "$enc_datadir/filament", "$enc_datadir/printer") {
111 next if -d $dir;
112 if (!mkdir $dir) {
113 my $error = "Slic3r was unable to create its data directory at $dir ($!).";
114 warn "$error\n";
115 fatal_error(undef, $error);
116 }
117 }
118
119 # load settings
120 my $last_version;
121 if (-f "$enc_datadir/slic3r.ini") {
122 my $ini = eval { Slic3r::Config->read_ini("$datadir/slic3r.ini") };
123 $Settings = $ini if $ini;
124 $last_version = $Settings->{_}{version};
125 $Settings->{_}{mode} ||= 'expert';
126 $Settings->{_}{autocenter} //= 1;
127 $Settings->{_}{background_processing} //= 1;
128 # If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden.
129 $Settings->{_}{no_controller} //= 1;
130 # If set, the "- default -" selections of print/filament/printer are suppressed, if there is a valid preset available.
131 $Settings->{_}{no_defaults} //= 1;
132 }
133 $Settings->{_}{version} = $Slic3r::VERSION;
134 $self->save_settings;
135
136 # application frame
137 Wx::Image::AddHandler(Wx::PNGHandler->new);
138 $self->{mainframe} = my $frame = Slic3r::GUI::MainFrame->new(
139 mode => $mode // $Settings->{_}{mode},
140 # If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden.
141 no_controller => $no_controller // $Settings->{_}{no_controller},
142 no_plater => $no_plater,
143 );
144 $self->SetTopWindow($frame);
145
146 # load init bundle
147 {
148 my @dirs = ($FindBin::Bin);
149 if (&Wx::wxMAC) {
150 push @dirs, qw();
151 } elsif (&Wx::wxMSW) {
152 push @dirs, qw();
153 }
154 my $init_bundle = first { -e $_ } map "$_/.init_bundle.ini", @dirs;
155 if ($init_bundle) {
156 Slic3r::debugf "Loading config bundle from %s\n", $init_bundle;
157 $self->{mainframe}->load_configbundle($init_bundle, 1);
158 $run_wizard = 0;
159 }
160 }
161
162 if (!$run_wizard && (!defined $last_version || $last_version ne $Slic3r::VERSION)) {
163 # user was running another Slic3r version on this computer
164 if (!defined $last_version || $last_version =~ /^0\./) {
165 show_info($self->{mainframe}, "Hello! Support material was improved since the "
166 . "last version of Slic3r you used. It is strongly recommended to revert "
167 . "your support material settings to the factory defaults and start from "
168 . "those. Enjoy and provide feedback!", "Support Material");
169 }
170 if (!defined $last_version || $last_version =~ /^(?:0|1\.[01])\./) {
171 show_info($self->{mainframe}, "Hello! In this version a new Bed Shape option was "
172 . "added. If the bed coordinates in the plater preview screen look wrong, go "
173 . "to Print Settings and click the \"Set\" button next to \"Bed Shape\".", "Bed Shape");
174 }
175 }
176 $self->{mainframe}->config_wizard if $run_wizard;
177
178 $self->check_version
179 if $self->have_version_check
180 && ($Settings->{_}{version_check} // 1)
181 && (!$Settings->{_}{last_version_check} || (time - $Settings->{_}{last_version_check}) >= 86400);
182
183 EVT_IDLE($frame, sub {
184 while (my $cb = shift @cb) {
185 $cb->();
186 }
187 });
188
189 EVT_COMMAND($self, -1, $VERSION_CHECK_EVENT, sub {
190 my ($self, $event) = @_;
191 my ($success, $response, $manual_check) = @{$event->GetData};
192
193 if ($success) {
194 if ($response =~ /^obsolete ?= ?([a-z0-9.-]+,)*\Q$Slic3r::VERSION\E(?:,|$)/) {
195 my $res = Wx::MessageDialog->new(undef, "A new version is available. Do you want to open the Slic3r website now?",
196 'Update', wxYES_NO | wxCANCEL | wxYES_DEFAULT | wxICON_INFORMATION | wxICON_ERROR)->ShowModal;
197 Wx::LaunchDefaultBrowser('http://slic3r.org/') if $res == wxID_YES;
198 } else {
199 Slic3r::GUI::show_info(undef, "You're using the latest version. No updates are available.") if $manual_check;
200 }
201 $Settings->{_}{last_version_check} = time();
202 $self->save_settings;
203 } else {
204 Slic3r::GUI::show_error(undef, "Failed to check for updates. Try later.") if $manual_check;
205 }
206 });
207
208 return 1;
209 }
210
211 sub about {
212 my ($self) = @_;
213
214 my $about = Slic3r::GUI::AboutDialog->new(undef);
215 $about->ShowModal;
216 $about->Destroy;
217 }
218
219 # static method accepting a wxWindow object as first parameter
220 sub catch_error {
221 my ($self, $cb, $message_dialog) = @_;
222 if (my $err = $@) {
223 $cb->() if $cb;
224 $message_dialog
225 ? $message_dialog->($err, 'Error', wxOK | wxICON_ERROR)
226 : Slic3r::GUI::show_error($self, $err);
227 return 1;
228 }
229 return 0;
230 }
231
232 # static method accepting a wxWindow object as first parameter
233 sub show_error {
234 my ($parent, $message) = @_;
235 Wx::MessageDialog->new($parent, $message, 'Error', wxOK | wxICON_ERROR)->ShowModal;
236 }
237
238 # static method accepting a wxWindow object as first parameter
239 sub show_info {
240 my ($parent, $message, $title) = @_;
241 Wx::MessageDialog->new($parent, $message, $title || 'Notice', wxOK | wxICON_INFORMATION)->ShowModal;
242 }
243
244 # static method accepting a wxWindow object as first parameter
245 sub fatal_error {
246 show_error(@_);
247 exit 1;
248 }
249
250 # static method accepting a wxWindow object as first parameter
251 sub warning_catcher {
252 my ($self, $message_dialog) = @_;
253 return sub {
254 my $message = shift;
255 return if $message =~ /GLUquadricObjPtr|Attempt to free unreferenced scalar/;
256 my @params = ($message, 'Warning', wxOK | wxICON_WARNING);
257 $message_dialog
258 ? $message_dialog->(@params)
259 : Wx::MessageDialog->new($self, @params)->ShowModal;
260 };
261 }
262
263 sub notify {
264 my ($self, $message) = @_;
265
266 my $frame = $self->GetTopWindow;
267 # try harder to attract user attention on OS X
268 $frame->RequestUserAttention(&Wx::wxMAC ? wxUSER_ATTENTION_ERROR : wxUSER_ATTENTION_INFO)
269 unless ($frame->IsActive);
270
271 $self->{notifier}->notify($message);
272 }
273
274 sub save_settings {
275 my ($self) = @_;
276 Slic3r::Config->write_ini("$datadir/slic3r.ini", $Settings);
277 }
278
279 # Called after the Preferences dialog is closed and the program settings are saved.
280 # Update the UI based on the current preferences.
281 sub update_ui_from_settings {
282 my ($self) = @_;
283 $self->{mainframe}->update_ui_from_settings;
284 }
285
286 sub presets {
287 my ($self, $section) = @_;
288
289 my %presets = ();
290 opendir my $dh, Slic3r::encode_path("$Slic3r::GUI::datadir/$section")
291 or die "Failed to read directory $Slic3r::GUI::datadir/$section (errno: $!)\n";
292 foreach my $file (grep /\.ini$/i, readdir $dh) {
293 $file = Slic3r::decode_path($file);
294 my $name = basename($file);
295 $name =~ s/\.ini$//;
296 $presets{$name} = "$Slic3r::GUI::datadir/$section/$file";
297 }
298 closedir $dh;
299
300 return %presets;
301 }
302
303 sub have_version_check {
304 my ($self) = @_;
305
306 # return an explicit 0
307 return ($Slic3r::have_threads && $Slic3r::build && $have_LWP) || 0;
308 }
309
310 sub check_version {
311 my ($self, $manual_check) = @_;
312
313 Slic3r::debugf "Checking for updates...\n";
314
315 @_ = ();
316 threads->create(sub {
317 my $ua = LWP::UserAgent->new;
318 $ua->timeout(10);
319 my $response = $ua->get('http://slic3r.org/updatecheck');
320 Wx::PostEvent($self, Wx::PlThreadEvent->new(-1, $VERSION_CHECK_EVENT,
321 threads::shared::shared_clone([ $response->is_success, $response->decoded_content, $manual_check ])));
322
323 Slic3r::thread_cleanup();
324 })->detach;
325 }
326
327 sub output_path {
328 my ($self, $dir) = @_;
329
330 return ($Settings->{_}{last_output_path} && $Settings->{_}{remember_output_path})
331 ? $Settings->{_}{last_output_path}
332 : $dir;
333 }
334
335 sub open_model {
336 my ($self, $window) = @_;
337
338 my $dir = $Slic3r::GUI::Settings->{recent}{skein_directory}
339 || $Slic3r::GUI::Settings->{recent}{config_directory}
340 || '';
341
342 my $dialog = Wx::FileDialog->new($window // $self->GetTopWindow, 'Choose one or more files (STL/OBJ/AMF):', $dir, "",
343 MODEL_WILDCARD, wxFD_OPEN | wxFD_MULTIPLE | wxFD_FILE_MUST_EXIST);
344 if ($dialog->ShowModal != wxID_OK) {
345 $dialog->Destroy;
346 return;
347 }
348 my @input_files = map Slic3r::decode_path($_), $dialog->GetPaths;
349 $dialog->Destroy;
350
351 return @input_files;
352 }
353
354 sub CallAfter {
355 my ($self, $cb) = @_;
356 push @cb, $cb;
357 }
358
359 sub scan_serial_ports {
360 my ($self) = @_;
361
362 my @ports = ();
363
364 if ($^O eq 'MSWin32') {
365 # Windows
366 if (eval "use Win32::TieRegistry; 1") {
367 my $ts = Win32::TieRegistry->new("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM",
368 { Access => 'KEY_READ' });
369 if ($ts) {
370 # when no serial ports are available, the registry key doesn't exist and
371 # TieRegistry->new returns undef
372 $ts->Tie(\my %reg);
373 push @ports, sort values %reg;
374 }
375 }
376 } else {
377 # UNIX and OS X
378 push @ports, glob '/dev/{ttyUSB,ttyACM,tty.,cu.,rfcomm}*';
379 }
380
381 return grep !/Bluetooth|FireFly/, @ports;
382 }
383
384 1;
0 package Slic3r::Geometry::Clipper;
1 use strict;
2 use warnings;
3
4 require Exporter;
5 our @ISA = qw(Exporter);
6 our @EXPORT_OK = qw(offset offset_ex
7 diff_ex diff union_ex intersection_ex xor_ex JT_ROUND JT_MITER
8 JT_SQUARE is_counter_clockwise union_pt offset2 offset2_ex
9 intersection intersection_pl diff_pl union CLIPPER_OFFSET_SCALE
10 union_pt_chained diff_ppl intersection_ppl);
11
12 1;
0 package Slic3r::Geometry;
1 use strict;
2 use warnings;
3
4 require Exporter;
5 our @ISA = qw(Exporter);
6 our @EXPORT_OK = qw(
7 PI X Y Z A B X1 Y1 X2 Y2 Z1 Z2 MIN MAX epsilon slope
8 line_point_belongs_to_segment points_coincide distance_between_points
9 normalize tan move_points_3D
10 point_in_polygon point_in_segment segment_in_segment
11 polyline_lines polygon_lines
12 point_along_segment polygon_segment_having_point polygon_has_subsegment
13 deg2rad rad2deg
14 rotate_points move_points
15 dot perp
16 line_intersection bounding_box bounding_box_intersect
17 angle3points
18 chained_path chained_path_from collinear scale unscale
19 rad2deg_dir bounding_box_center line_intersects_any douglas_peucker
20 polyline_remove_short_segments normal triangle_normal polygon_is_convex
21 scaled_epsilon bounding_box_3D size_3D size_2D
22 convex_hull directions_parallel directions_parallel_within
23 );
24
25
26 use constant PI => 4 * atan2(1, 1);
27 use constant A => 0;
28 use constant B => 1;
29 use constant X1 => 0;
30 use constant Y1 => 1;
31 use constant X2 => 2;
32 use constant Y2 => 3;
33 use constant Z1 => 4;
34 use constant Z2 => 5;
35 use constant MIN => 0;
36 use constant MAX => 1;
37 our $parallel_degrees_limit = abs(deg2rad(0.1));
38
39 sub epsilon () { 1E-4 }
40 sub scaled_epsilon () { epsilon / &Slic3r::SCALING_FACTOR }
41
42 sub scale ($) { $_[0] / &Slic3r::SCALING_FACTOR }
43 sub unscale ($) { $_[0] * &Slic3r::SCALING_FACTOR }
44
45 sub tan {
46 my ($angle) = @_;
47 return (sin $angle) / (cos $angle);
48 }
49
50 sub slope {
51 my ($line) = @_;
52 return undef if abs($line->[B][X] - $line->[A][X]) < epsilon; # line is vertical
53 return ($line->[B][Y] - $line->[A][Y]) / ($line->[B][X] - $line->[A][X]);
54 }
55
56 # this subroutine checks whether a given point may belong to a given
57 # segment given the hypothesis that it belongs to the line containing
58 # the segment
59 sub line_point_belongs_to_segment {
60 my ($point, $segment) = @_;
61
62 #printf " checking whether %f,%f may belong to segment %f,%f - %f,%f\n",
63 # @$point, map @$_, @$segment;
64
65 my @segment_extents = (
66 [ sort { $a <=> $b } map $_->[X], @$segment ],
67 [ sort { $a <=> $b } map $_->[Y], @$segment ],
68 );
69
70 return 0 if $point->[X] < ($segment_extents[X][0] - epsilon) || $point->[X] > ($segment_extents[X][1] + epsilon);
71 return 0 if $point->[Y] < ($segment_extents[Y][0] - epsilon) || $point->[Y] > ($segment_extents[Y][1] + epsilon);
72 return 1;
73 }
74
75 sub points_coincide {
76 my ($p1, $p2) = @_;
77 return 1 if abs($p2->[X] - $p1->[X]) < epsilon && abs($p2->[Y] - $p1->[Y]) < epsilon;
78 return 0;
79 }
80
81 sub distance_between_points {
82 my ($p1, $p2) = @_;
83 return sqrt((($p1->[X] - $p2->[X])**2) + ($p1->[Y] - $p2->[Y])**2);
84 }
85
86 # this will check whether a point is in a polygon regardless of polygon orientation
87 sub point_in_polygon {
88 my ($point, $polygon) = @_;
89
90 my ($x, $y) = @$point;
91 my $n = @$polygon;
92 my @x = map $_->[X], @$polygon;
93 my @y = map $_->[Y], @$polygon;
94
95 # Derived from the comp.graphics.algorithms FAQ,
96 # courtesy of Wm. Randolph Franklin
97 my ($i, $j);
98 my $side = 0; # 0 = outside; 1 = inside
99 for ($i = 0, $j = $n - 1; $i < $n; $j = $i++) {
100 if (
101 # If the y is between the (y-) borders...
102 ($y[$i] <= $y && $y < $y[$j]) || ($y[$j] <= $y && $y < $y[$i])
103 and
104 # ...the (x,y) to infinity line crosses the edge
105 # from the ith point to the jth point...
106 ($x < ($x[$j] - $x[$i]) * ($y - $y[$i]) / ($y[$j] - $y[$i]) + $x[$i])
107 ) {
108 $side = not $side; # Jump the fence
109 }
110 }
111
112 # if point is not in polygon, let's check whether it belongs to the contour
113 if (!$side && 0) {
114 return 1 if polygon_segment_having_point($polygon, $point);
115 }
116
117 return $side;
118 }
119
120 sub point_in_segment {
121 my ($point, $line) = @_;
122
123 my ($x, $y) = @$point;
124 my $line_p = $line->pp;
125 my @line_x = sort { $a <=> $b } $line_p->[A][X], $line_p->[B][X];
126 my @line_y = sort { $a <=> $b } $line_p->[A][Y], $line_p->[B][Y];
127
128 # check whether the point is in the segment bounding box
129 return 0 unless $x >= ($line_x[0] - epsilon) && $x <= ($line_x[1] + epsilon)
130 && $y >= ($line_y[0] - epsilon) && $y <= ($line_y[1] + epsilon);
131
132 # if line is vertical, check whether point's X is the same as the line
133 if ($line_p->[A][X] == $line_p->[B][X]) {
134 return abs($x - $line_p->[A][X]) < epsilon ? 1 : 0;
135 }
136
137 # calculate the Y in line at X of the point
138 my $y3 = $line_p->[A][Y] + ($line_p->[B][Y] - $line_p->[A][Y])
139 * ($x - $line_p->[A][X]) / ($line_p->[B][X] - $line_p->[A][X]);
140 return abs($y3 - $y) < epsilon ? 1 : 0;
141 }
142
143 sub segment_in_segment {
144 my ($needle, $haystack) = @_;
145
146 # a segment is contained in another segment if its endpoints are contained
147 return point_in_segment($needle->[A], $haystack) && point_in_segment($needle->[B], $haystack);
148 }
149
150 sub polyline_lines {
151 my ($polyline) = @_;
152 my @points = @$polyline;
153 return map Slic3r::Line->new(@points[$_, $_+1]), 0 .. $#points-1;
154 }
155
156 sub polygon_lines {
157 my ($polygon) = @_;
158 return polyline_lines([ @$polygon, $polygon->[0] ]);
159 }
160
161 # given a segment $p1-$p2, get the point at $distance from $p1 along segment
162 sub point_along_segment {
163 my ($p1, $p2, $distance) = @_;
164
165 my $point = [ @$p1 ];
166
167 my $line_length = sqrt( (($p2->[X] - $p1->[X])**2) + (($p2->[Y] - $p1->[Y])**2) );
168 for (X, Y) {
169 if ($p1->[$_] != $p2->[$_]) {
170 $point->[$_] = $p1->[$_] + ($p2->[$_] - $p1->[$_]) * $distance / $line_length;
171 }
172 }
173
174 return Slic3r::Point->new(@$point);
175 }
176
177 # given a $polygon, return the (first) segment having $point
178 sub polygon_segment_having_point {
179 my ($polygon, $point) = @_;
180
181 foreach my $line (@{ $polygon->lines }) {
182 return $line if point_in_segment($point, $line);
183 }
184 return undef;
185 }
186
187 # return true if the given segment is contained in any edge of the polygon
188 sub polygon_has_subsegment {
189 my ($polygon, $segment) = @_;
190 foreach my $line (polygon_lines($polygon)) {
191 return 1 if segment_in_segment($segment, $line);
192 }
193 return 0;
194 }
195
196 # polygon must be simple (non complex) and ccw
197 sub polygon_is_convex {
198 my ($points) = @_;
199 for (my $i = 0; $i <= $#$points; $i++) {
200 my $angle = angle3points($points->[$i-1], $points->[$i-2], $points->[$i]);
201 return 0 if $angle < PI;
202 }
203 return 1;
204 }
205
206 sub rotate_points {
207 my ($radians, $center, @points) = @_;
208 $center //= [0,0];
209 return map {
210 [
211 $center->[X] + cos($radians) * ($_->[X] - $center->[X]) - sin($radians) * ($_->[Y] - $center->[Y]),
212 $center->[Y] + cos($radians) * ($_->[Y] - $center->[Y]) + sin($radians) * ($_->[X] - $center->[X]),
213 ]
214 } @points;
215 }
216
217 sub move_points {
218 my ($shift, @points) = @_;
219 return map {
220 my @p = @$_;
221 Slic3r::Point->new($shift->[X] + $p[X], $shift->[Y] + $p[Y]);
222 } @points;
223 }
224
225 sub move_points_3D {
226 my ($shift, @points) = @_;
227 return map [
228 $shift->[X] + $_->[X],
229 $shift->[Y] + $_->[Y],
230 $shift->[Z] + $_->[Z],
231 ], @points;
232 }
233
234 sub normal {
235 my ($line1, $line2) = @_;
236
237 return [
238 ($line1->[Y] * $line2->[Z]) - ($line1->[Z] * $line2->[Y]),
239 -($line2->[Z] * $line1->[X]) + ($line2->[X] * $line1->[Z]),
240 ($line1->[X] * $line2->[Y]) - ($line1->[Y] * $line2->[X]),
241 ];
242 }
243
244 sub triangle_normal {
245 my ($v1, $v2, $v3) = @_;
246
247 my $u = [ map +($v2->[$_] - $v1->[$_]), (X,Y,Z) ];
248 my $v = [ map +($v3->[$_] - $v1->[$_]), (X,Y,Z) ];
249
250 return normal($u, $v);
251 }
252
253 sub normalize {
254 my ($line) = @_;
255
256 my $len = sqrt( ($line->[X]**2) + ($line->[Y]**2) + ($line->[Z]**2) )
257 or return [0, 0, 0]; # to avoid illegal division by zero
258 return [ map $_ / $len, @$line ];
259 }
260
261 # 2D dot product
262 sub dot {
263 my ($u, $v) = @_;
264 return $u->[X] * $v->[X] + $u->[Y] * $v->[Y];
265 }
266
267 # 2D perp product
268 sub perp {
269 my ($u, $v) = @_;
270 return $u->[X] * $v->[Y] - $u->[Y] * $v->[X];
271 }
272
273 sub line_intersects_any {
274 my ($line, $lines) = @_;
275 for (@$lines) {
276 return 1 if line_intersection($line, $_, 1);
277 }
278 return 0;
279 }
280
281 sub line_intersection {
282 my ($line1, $line2, $require_crossing) = @_;
283 $require_crossing ||= 0;
284
285 my $intersection = _line_intersection(map @$_, @$line1, @$line2);
286 return (ref $intersection && $intersection->[1] == $require_crossing)
287 ? $intersection->[0]
288 : undef;
289 }
290
291 sub collinear {
292 my ($line1, $line2, $require_overlapping) = @_;
293 my $intersection = _line_intersection(map @$_, @$line1, @$line2);
294 return 0 unless !ref($intersection)
295 && ($intersection eq 'parallel collinear'
296 || ($intersection eq 'parallel vertical' && abs($line1->[A][X] - $line2->[A][X]) < epsilon));
297
298 if ($require_overlapping) {
299 my @box_a = bounding_box([ $line1->[0], $line1->[1] ]);
300 my @box_b = bounding_box([ $line2->[0], $line2->[1] ]);
301 return 0 unless bounding_box_intersect( 2, @box_a, @box_b );
302 }
303
304 return 1;
305 }
306
307 sub _line_intersection {
308 my ( $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3 ) = @_;
309
310 my ($x, $y); # The as-yet-undetermined intersection point.
311
312 my $dy10 = $y1 - $y0; # dyPQ, dxPQ are the coordinate differences
313 my $dx10 = $x1 - $x0; # between the points P and Q.
314 my $dy32 = $y3 - $y2;
315 my $dx32 = $x3 - $x2;
316
317 my $dy10z = abs( $dy10 ) < epsilon; # Is the difference $dy10 "zero"?
318 my $dx10z = abs( $dx10 ) < epsilon;
319 my $dy32z = abs( $dy32 ) < epsilon;
320 my $dx32z = abs( $dx32 ) < epsilon;
321
322 my $dyx10; # The slopes.
323 my $dyx32;
324
325 $dyx10 = $dy10 / $dx10 unless $dx10z;
326 $dyx32 = $dy32 / $dx32 unless $dx32z;
327
328 # Now we know all differences and the slopes;
329 # we can detect horizontal/vertical special cases.
330 # E.g., slope = 0 means a horizontal line.
331
332 unless ( defined $dyx10 or defined $dyx32 ) {
333 return "parallel vertical";
334 }
335 elsif ( $dy10z and not $dy32z ) { # First line horizontal.
336 $y = $y0;
337 $x = $x2 + ( $y - $y2 ) * $dx32 / $dy32;
338 }
339 elsif ( not $dy10z and $dy32z ) { # Second line horizontal.
340 $y = $y2;
341 $x = $x0 + ( $y - $y0 ) * $dx10 / $dy10;
342 }
343 elsif ( $dx10z and not $dx32z ) { # First line vertical.
344 $x = $x0;
345 $y = $y2 + $dyx32 * ( $x - $x2 );
346 }
347 elsif ( not $dx10z and $dx32z ) { # Second line vertical.
348 $x = $x2;
349 $y = $y0 + $dyx10 * ( $x - $x0 );
350 }
351 elsif ( abs( $dyx10 - $dyx32 ) < epsilon ) {
352 # The slopes are suspiciously close to each other.
353 # Either we have parallel collinear or just parallel lines.
354
355 # The bounding box checks have already weeded the cases
356 # "parallel horizontal" and "parallel vertical" away.
357
358 my $ya = $y0 - $dyx10 * $x0;
359 my $yb = $y2 - $dyx32 * $x2;
360
361 return "parallel collinear" if abs( $ya - $yb ) < epsilon;
362 return "parallel";
363 }
364 else {
365 # None of the special cases matched.
366 # We have a "honest" line intersection.
367
368 $x = ($y2 - $y0 + $dyx10*$x0 - $dyx32*$x2)/($dyx10 - $dyx32);
369 $y = $y0 + $dyx10 * ($x - $x0);
370 }
371
372 my $h10 = $dx10 ? ($x - $x0) / $dx10 : ($dy10 ? ($y - $y0) / $dy10 : 1);
373 my $h32 = $dx32 ? ($x - $x2) / $dx32 : ($dy32 ? ($y - $y2) / $dy32 : 1);
374
375 return [Slic3r::Point->new($x, $y), $h10 >= 0 && $h10 <= 1 && $h32 >= 0 && $h32 <= 1];
376 }
377
378 # http://paulbourke.net/geometry/lineline2d/
379 sub _line_intersection2 {
380 my ($line1, $line2) = @_;
381
382 my $denom = ($line2->[B][Y] - $line2->[A][Y]) * ($line1->[B][X] - $line1->[A][X])
383 - ($line2->[B][X] - $line2->[A][X]) * ($line1->[B][Y] - $line1->[A][Y]);
384 my $numerA = ($line2->[B][X] - $line2->[A][X]) * ($line1->[A][Y] - $line2->[A][Y])
385 - ($line2->[B][Y] - $line2->[A][Y]) * ($line1->[A][X] - $line2->[A][X]);
386 my $numerB = ($line1->[B][X] - $line1->[A][X]) * ($line1->[A][Y] - $line2->[A][Y])
387 - ($line1->[B][Y] - $line1->[A][Y]) * ($line1->[A][X] - $line2->[A][X]);
388
389 # are the lines coincident?
390 if (abs($numerA) < epsilon && abs($numerB) < epsilon && abs($denom) < epsilon) {
391 return Slic3r::Point->new(
392 ($line1->[A][X] + $line1->[B][X]) / 2,
393 ($line1->[A][Y] + $line1->[B][Y]) / 2,
394 );
395 }
396
397 # are the lines parallel?
398 if (abs($denom) < epsilon) {
399 return undef;
400 }
401
402 # is the intersection along the segments?
403 my $muA = $numerA / $denom;
404 my $muB = $numerB / $denom;
405 if ($muA < 0 || $muA > 1 || $muB < 0 || $muB > 1) {
406 return undef;
407 }
408
409 return Slic3r::Point->new(
410 $line1->[A][X] + $muA * ($line1->[B][X] - $line1->[A][X]),
411 $line1->[A][Y] + $muA * ($line1->[B][Y] - $line1->[A][Y]),
412 );
413 }
414
415 # 2D
416 sub bounding_box {
417 my ($points) = @_;
418
419 my @x = map $_->x, @$points;
420 my @y = map $_->y, @$points; #,,
421 my @bb = (undef, undef, undef, undef);
422 for (0..$#x) {
423 $bb[X1] = $x[$_] if !defined $bb[X1] || $x[$_] < $bb[X1];
424 $bb[X2] = $x[$_] if !defined $bb[X2] || $x[$_] > $bb[X2];
425 $bb[Y1] = $y[$_] if !defined $bb[Y1] || $y[$_] < $bb[Y1];
426 $bb[Y2] = $y[$_] if !defined $bb[Y2] || $y[$_] > $bb[Y2];
427 }
428
429 return @bb[X1,Y1,X2,Y2];
430 }
431
432 sub bounding_box_center {
433 my ($bounding_box) = @_;
434 return Slic3r::Point->new(
435 ($bounding_box->[X2] + $bounding_box->[X1]) / 2,
436 ($bounding_box->[Y2] + $bounding_box->[Y1]) / 2,
437 );
438 }
439
440 sub size_2D {
441 my @bounding_box = bounding_box(@_);
442 return (
443 ($bounding_box[X2] - $bounding_box[X1]),
444 ($bounding_box[Y2] - $bounding_box[Y1]),
445 );
446 }
447
448 # bounding_box_intersect($d, @a, @b)
449 # Return true if the given bounding boxes @a and @b intersect
450 # in $d dimensions. Used by line_intersection().
451 sub bounding_box_intersect {
452 my ( $d, @bb ) = @_; # Number of dimensions and box coordinates.
453 my @aa = splice( @bb, 0, 2 * $d ); # The first box.
454 # (@bb is the second one.)
455
456 # Must intersect in all dimensions.
457 for ( my $i_min = 0; $i_min < $d; $i_min++ ) {
458 my $i_max = $i_min + $d; # The index for the maximum.
459 return 0 if ( $aa[ $i_max ] + epsilon ) < $bb[ $i_min ];
460 return 0 if ( $bb[ $i_max ] + epsilon ) < $aa[ $i_min ];
461 }
462
463 return 1;
464 }
465
466 # 3D
467 sub bounding_box_3D {
468 my ($points) = @_;
469
470 my @extents = (map [undef, undef], X,Y,Z);
471 foreach my $point (@$points) {
472 for (X,Y,Z) {
473 $extents[$_][MIN] = $point->[$_] if !defined $extents[$_][MIN] || $point->[$_] < $extents[$_][MIN];
474 $extents[$_][MAX] = $point->[$_] if !defined $extents[$_][MAX] || $point->[$_] > $extents[$_][MAX];
475 }
476 }
477 return @extents;
478 }
479
480 sub size_3D {
481 my ($points) = @_;
482
483 my @extents = bounding_box_3D($points);
484 return map $extents[$_][MAX] - $extents[$_][MIN], (X,Y,Z);
485 }
486
487 # this assumes a CCW rotation from $p2 to $p3 around $p1
488 sub angle3points {
489 my ($p1, $p2, $p3) = @_;
490 # p1 is the center
491
492 my $angle = atan2($p2->[X] - $p1->[X], $p2->[Y] - $p1->[Y])
493 - atan2($p3->[X] - $p1->[X], $p3->[Y] - $p1->[Y]);
494
495 # we only want to return only positive angles
496 return $angle <= 0 ? $angle + 2*PI() : $angle;
497 }
498
499 sub polyline_remove_short_segments {
500 my ($points, $min_length, $isPolygon) = @_;
501 for (my $i = $isPolygon ? 0 : 1; $i < $#$points; $i++) {
502 if (distance_between_points($points->[$i-1], $points->[$i]) < $min_length) {
503 # we can remove $points->[$i]
504 splice @$points, $i, 1;
505 $i--;
506 }
507 }
508 }
509
510 sub douglas_peucker {
511 my ($points, $tolerance) = @_;
512 no warnings "recursion";
513
514 my $results = [];
515 my $dmax = 0;
516 my $index = 0;
517 for my $i (1..$#$points) {
518 my $d = $points->[$i]->distance_to(Slic3r::Line->new($points->[0], $points->[-1]));
519 if ($d > $dmax) {
520 $index = $i;
521 $dmax = $d;
522 }
523 }
524 if ($dmax >= $tolerance) {
525 my $dp1 = douglas_peucker([ @$points[0..$index] ], $tolerance);
526 $results = [
527 @$dp1[0..($#$dp1-1)],
528 @{douglas_peucker([ @$points[$index..$#$points] ], $tolerance)},
529 ];
530 } else {
531 $results = [ $points->[0], $points->[-1] ];
532 }
533 return $results;
534 }
535
536 sub douglas_peucker2 {
537 my ($points, $tolerance) = @_;
538
539 my $anchor = 0;
540 my $floater = $#$points;
541 my @stack = ();
542 my %keep = ();
543
544 push @stack, [$anchor, $floater];
545 while (@stack) {
546 ($anchor, $floater) = @{pop @stack};
547
548 # initialize line segment
549 my ($anchor_x, $anchor_y, $seg_len);
550 if (grep $points->[$floater][$_] != $points->[$anchor][$_], X, Y) {
551 $anchor_x = $points->[$floater][X] - $points->[$anchor][X];
552 $anchor_y = $points->[$floater][Y] - $points->[$anchor][Y];
553 $seg_len = sqrt(($anchor_x ** 2) + ($anchor_y ** 2));
554 # get the unit vector
555 $anchor_x /= $seg_len;
556 $anchor_y /= $seg_len;
557 } else {
558 $anchor_x = $anchor_y = $seg_len = 0;
559 }
560
561 # inner loop:
562 my $max_dist = 0;
563 my $farthest = $anchor + 1;
564 for my $i (($anchor + 1) .. $floater) {
565 my $dist_to_seg = 0;
566 # compare to anchor
567 my $vecX = $points->[$i][X] - $points->[$anchor][X];
568 my $vecY = $points->[$i][Y] - $points->[$anchor][Y];
569 $seg_len = sqrt(($vecX ** 2) + ($vecY ** 2));
570 # dot product:
571 my $proj = $vecX * $anchor_x + $vecY * $anchor_y;
572 if ($proj < 0) {
573 $dist_to_seg = $seg_len;
574 } else {
575 # compare to floater
576 $vecX = $points->[$i][X] - $points->[$floater][X];
577 $vecY = $points->[$i][Y] - $points->[$floater][Y];
578 $seg_len = sqrt(($vecX ** 2) + ($vecY ** 2));
579 # dot product:
580 $proj = $vecX * (-$anchor_x) + $vecY * (-$anchor_y);
581 if ($proj < 0) {
582 $dist_to_seg = $seg_len
583 } else { # calculate perpendicular distance to line (pythagorean theorem):
584 $dist_to_seg = sqrt(abs(($seg_len ** 2) - ($proj ** 2)));
585 }
586 if ($max_dist < $dist_to_seg) {
587 $max_dist = $dist_to_seg;
588 $farthest = $i;
589 }
590 }
591 }
592
593 if ($max_dist <= $tolerance) { # use line segment
594 $keep{$_} = 1 for $anchor, $floater;
595 } else {
596 push @stack, [$anchor, $farthest];
597 push @stack, [$farthest, $floater];
598 }
599 }
600
601 return [ map $points->[$_], sort keys %keep ];
602 }
603
604 1;
0 # Extends the C++ class Slic3r::Layer.
1
2 package Slic3r::Layer;
3 use strict;
4 use warnings;
5
6 # the following two were previously generated by Moo
7 sub print {
8 my $self = shift;
9 return $self->object->print;
10 }
11
12 sub config {
13 my $self = shift;
14 return $self->object->config;
15 }
16
17 sub region {
18 my $self = shift;
19 my ($region_id) = @_;
20
21 while ($self->region_count <= $region_id) {
22 $self->add_region($self->object->print->get_region($self->region_count));
23 }
24
25 return $self->get_region($region_id);
26 }
27
28 sub regions {
29 my ($self) = @_;
30 return [ map $self->get_region($_), 0..($self->region_count-1) ];
31 }
32
33 package Slic3r::Layer::Support;
34 our @ISA = qw(Slic3r::Layer);
35
36 1;
0 package Slic3r::Line;
1 use strict;
2 use warnings;
3
4 # a line is a two-points line
5 use parent 'Slic3r::Polyline';
6
7 sub intersection {
8 my $self = shift;
9 my ($line, $require_crossing) = @_;
10 return Slic3r::Geometry::line_intersection($self, $line, $require_crossing);
11 }
12
13 sub grow {
14 my $self = shift;
15 return Slic3r::Polyline->new(@$self)->grow(@_);
16 }
17
18 1;
0 # extends C++ class Slic3r::Model
1 package Slic3r::Model;
2
3 use List::Util qw(first max any);
4 use Slic3r::Geometry qw(X Y Z move_points);
5
6 sub read_from_file {
7 my $class = shift;
8 my ($input_file) = @_;
9
10 my $model = $input_file =~ /\.stl$/i ? Slic3r::Format::STL->read_file($input_file)
11 : $input_file =~ /\.obj$/i ? Slic3r::Format::OBJ->read_file($input_file)
12 : $input_file =~ /\.amf(\.xml)?$/i ? Slic3r::Format::AMF->read_file($input_file)
13 : die "Input file must have .stl, .obj or .amf(.xml) extension\n";
14
15 die "The supplied file couldn't be read because it's empty.\n"
16 if $model->objects_count == 0;
17
18 $_->set_input_file($input_file) for @{$model->objects};
19 return $model;
20 }
21
22 sub merge {
23 my $class = shift;
24 my @models = @_;
25
26 my $new_model = ref($class)
27 ? $class
28 : $class->new;
29
30 $new_model->add_object($_) for map @{$_->objects}, @models;
31 return $new_model;
32 }
33
34 sub add_object {
35 my $self = shift;
36
37 if (@_ == 1) {
38 # we have a Model::Object
39 my ($object) = @_;
40 return $self->_add_object_clone($object);
41 } else {
42 my (%args) = @_;
43
44 my $new_object = $self->_add_object;
45
46 $new_object->set_name($args{name})
47 if defined $args{name};
48 $new_object->set_input_file($args{input_file})
49 if defined $args{input_file};
50 $new_object->config->apply($args{config})
51 if defined $args{config};
52 $new_object->set_layer_height_ranges($args{layer_height_ranges})
53 if defined $args{layer_height_ranges};
54 $new_object->set_origin_translation($args{origin_translation})
55 if defined $args{origin_translation};
56
57 return $new_object;
58 }
59 }
60
61 sub set_material {
62 my $self = shift;
63 my ($material_id, $attributes) = @_;
64
65 my $material = $self->add_material($material_id);
66 $material->apply($attributes // {});
67 return $material;
68 }
69
70 sub print_info {
71 my $self = shift;
72 $_->print_info for @{$self->objects};
73 }
74
75 sub looks_like_multipart_object {
76 my ($self) = @_;
77
78 return 0 if $self->objects_count == 1;
79 return 0 if any { $_->volumes_count > 1 } @{$self->objects};
80 return 0 if any { @{$_->config->get_keys} > 1 } @{$self->objects};
81
82 my %heights = map { $_ => 1 } map $_->mesh->bounding_box->z_min, map @{$_->volumes}, @{$self->objects};
83 return scalar(keys %heights) > 1;
84 }
85
86 sub convert_multipart_object {
87 my ($self) = @_;
88
89 my @objects = @{$self->objects};
90 my $object = $self->add_object(
91 input_file => $objects[0]->input_file,
92 );
93 foreach my $v (map @{$_->volumes}, @objects) {
94 my $volume = $object->add_volume($v);
95 $volume->set_name($v->object->name);
96 }
97 $object->add_instance($_) for map @{$_->instances}, @objects;
98
99 $self->delete_object($_) for reverse 0..($self->objects_count-2);
100 }
101
102 # Extends C++ class Slic3r::ModelMaterial
103 package Slic3r::Model::Material;
104
105 sub apply {
106 my ($self, $attributes) = @_;
107 $self->set_attribute($_, $attributes{$_}) for keys %$attributes;
108 }
109
110 # Extends C++ class Slic3r::ModelObject
111 package Slic3r::Model::Object;
112
113 use File::Basename qw(basename);
114 use List::Util qw(first sum);
115 use Slic3r::Geometry qw(X Y Z rad2deg);
116
117 sub add_volume {
118 my $self = shift;
119
120 my $new_volume;
121 if (@_ == 1) {
122 # we have a Model::Volume
123 my ($volume) = @_;
124
125 $new_volume = $self->_add_volume_clone($volume);
126
127 if ($volume->material_id ne '') {
128 # merge material attributes and config (should we rename materials in case of duplicates?)
129 if (my $material = $volume->object->model->get_material($volume->material_id)) {
130 my %attributes = %{ $material->attributes };
131 if ($self->model->has_material($volume->material_id)) {
132 %attributes = (%attributes, %{ $self->model->get_material($volume->material_id)->attributes })
133 }
134 my $new_material = $self->model->set_material($volume->material_id, {%attributes});
135 $new_material->config->apply($material->config);
136 }
137 }
138 } else {
139 my %args = @_;
140
141 $new_volume = $self->_add_volume($args{mesh});
142
143 $new_volume->set_name($args{name})
144 if defined $args{name};
145 $new_volume->set_material_id($args{material_id})
146 if defined $args{material_id};
147 $new_volume->set_modifier($args{modifier})
148 if defined $args{modifier};
149 $new_volume->config->apply($args{config})
150 if defined $args{config};
151 }
152
153 if ($new_volume->material_id ne '' && !defined $self->model->get_material($new_volume->material_id)) {
154 # TODO: this should be a trigger on Volume::material_id
155 $self->model->set_material($new_volume->material_id);
156 }
157
158 $self->invalidate_bounding_box;
159
160 return $new_volume;
161 }
162
163 sub add_instance {
164 my $self = shift;
165 my %params = @_;
166
167 if (@_ == 1) {
168 # we have a Model::Instance
169 my ($instance) = @_;
170 return $self->_add_instance_clone($instance);
171 } else {
172 my (%args) = @_;
173
174 my $new_instance = $self->_add_instance;
175
176 $new_instance->set_rotation($args{rotation})
177 if defined $args{rotation};
178 $new_instance->set_scaling_factor($args{scaling_factor})
179 if defined $args{scaling_factor};
180 $new_instance->set_offset($args{offset})
181 if defined $args{offset};
182
183 return $new_instance;
184 }
185 }
186
187 sub mesh_stats {
188 my $self = shift;
189
190 # TODO: sum values from all volumes
191 return $self->volumes->[0]->mesh->stats;
192 }
193
194 sub print_info {
195 my $self = shift;
196
197 printf "Info about %s:\n", basename($self->input_file);
198 printf " size: x=%.3f y=%.3f z=%.3f\n", @{$self->raw_mesh->bounding_box->size};
199 if (my $stats = $self->mesh_stats) {
200 printf " number of facets: %d\n", $stats->{number_of_facets};
201 printf " number of shells: %d\n", $stats->{number_of_parts};
202 printf " volume: %.3f\n", $stats->{volume};
203 if ($self->needed_repair) {
204 printf " needed repair: yes\n";
205 printf " degenerate facets: %d\n", $stats->{degenerate_facets};
206 printf " edges fixed: %d\n", $stats->{edges_fixed};
207 printf " facets removed: %d\n", $stats->{facets_removed};
208 printf " facets added: %d\n", $stats->{facets_added};
209 printf " facets reversed: %d\n", $stats->{facets_reversed};
210 printf " backwards edges: %d\n", $stats->{backwards_edges};
211 } else {
212 printf " needed repair: no\n";
213 }
214 } else {
215 printf " number of facets: %d\n", scalar(map @{$_->facets}, grep !$_->modifier, @{$self->volumes});
216 }
217 }
218
219 1;
0 package Slic3r::Point;
1 use strict;
2 use warnings;
3
4 sub new_scale {
5 my $class = shift;
6 return $class->new(map Slic3r::Geometry::scale($_), @_);
7 }
8
9 sub dump_perl {
10 my $self = shift;
11 return sprintf "[%s,%s]", @$self;
12 }
13
14 package Slic3r::Pointf;
15 use strict;
16 use warnings;
17
18 sub new_unscale {
19 my $class = shift;
20 return $class->new(map Slic3r::Geometry::unscale($_), @_);
21 }
22
23 package Slic3r::Pointf3;
24 use strict;
25 use warnings;
26
27 sub new_unscale {
28 my $class = shift;
29 return $class->new(map Slic3r::Geometry::unscale($_), @_);
30 }
31
32 1;
0 package Slic3r::Polygon;
1 use strict;
2 use warnings;
3
4 # a polygon is a closed polyline.
5 use parent 'Slic3r::Polyline';
6
7 use Slic3r::Geometry qw(PI);
8
9 sub grow {
10 my $self = shift;
11 return $self->split_at_first_point->grow(@_);
12 }
13
14 # this method subdivides the polygon segments to that no one of them
15 # is longer than the length provided
16 sub subdivide {
17 my $self = shift;
18 my ($max_length) = @_;
19
20 my @points = @$self;
21 push @points, $points[0]; # append first point as this is a polygon
22 my @new_points = shift @points;
23 while (@points) {
24 while ($new_points[-1]->distance_to($points[0]) > $max_length) {
25 push @new_points, map Slic3r::Point->new(@$_),
26 Slic3r::Geometry::point_along_segment($new_points[-1], $points[0], $max_length);
27 }
28 push @new_points, shift @points;
29 }
30 pop @new_points; # remove last point as it coincides with first one
31 return Slic3r::Polygon->new(@new_points);
32 }
33
34 1;
0 package Slic3r::Polyline;
1 use strict;
2 use warnings;
3
4 use Slic3r::Geometry qw(X Y);
5
6 sub new_scale {
7 my $class = shift;
8 my @points = map { ref($_) eq 'Slic3r::Point' ? $_->pp : $_ } @_;
9 return $class->new(map [ Slic3r::Geometry::scale($_->[X]), Slic3r::Geometry::scale($_->[Y]) ], @points);
10 }
11
12 sub dump_perl {
13 my $self = shift;
14 return sprintf "[%s]", join ',', map "[$_->[0],$_->[1]]", @$self;
15 }
16
17 1;
0 package Slic3r::Print::GCode;
1 use Moo;
2
3 has 'print' => (is => 'ro', required => 1, handles => [qw(objects placeholder_parser config)]);
4 has 'fh' => (is => 'ro', required => 1);
5
6 has '_gcodegen' => (is => 'rw');
7 has '_cooling_buffer' => (is => 'rw');
8 has '_spiral_vase' => (is => 'rw');
9 has '_arc_fitting' => (is => 'rw');
10 has '_pressure_regulator' => (is => 'rw');
11 has '_pressure_equalizer' => (is => 'rw');
12 has '_skirt_done' => (is => 'rw', default => sub { {} }); # print_z => 1
13 has '_brim_done' => (is => 'rw');
14 has '_second_layer_things_done' => (is => 'rw');
15 has '_last_obj_copy' => (is => 'rw');
16
17 use List::Util qw(first sum min max);
18 use Slic3r::ExtrusionPath ':roles';
19 use Slic3r::Flow ':roles';
20 use Slic3r::Geometry qw(X Y scale unscale chained_path convex_hull);
21 use Slic3r::Geometry::Clipper qw(JT_SQUARE union_ex offset);
22
23 sub BUILD {
24 my ($self) = @_;
25
26 {
27 # estimate the total number of layer changes
28 # TODO: only do this when M73 is enabled
29 my $layer_count;
30 if ($self->config->complete_objects) {
31 $layer_count = sum(map { $_->total_layer_count * @{$_->copies} } @{$self->objects});
32 } else {
33 # if sequential printing is not enable, all copies of the same object share the same layer change command(s)
34 $layer_count = sum(map { $_->total_layer_count } @{$self->objects});
35 }
36
37 # set up our helper object: This is a C++ Slic3r::GCode instance.
38 my $gcodegen = Slic3r::GCode->new;
39 $self->_gcodegen($gcodegen);
40 $gcodegen->set_placeholder_parser($self->placeholder_parser);
41 # Tell the G-code generator, how many times the $gcodegen->change_layer() will be called.
42 # $gcodegen->change_layer() in turn increments the progress bar status.
43 $gcodegen->set_layer_count($layer_count);
44 $gcodegen->set_enable_cooling_markers(1);
45 $gcodegen->apply_print_config($self->config);
46 $gcodegen->set_extruders($self->print->extruders);
47
48 # initialize autospeed
49 {
50 # get the minimum cross-section used in the print
51 my @mm3_per_mm = ();
52 foreach my $object (@{$self->print->objects}) {
53 foreach my $region_id (0..$#{$self->print->regions}) {
54 my $region = $self->print->get_region($region_id);
55 foreach my $layer (@{$object->layers}) {
56 my $layerm = $layer->get_region($region_id);
57 if ($region->config->get_abs_value('perimeter_speed') == 0
58 || $region->config->get_abs_value('small_perimeter_speed') == 0
59 || $region->config->get_abs_value('external_perimeter_speed') == 0
60 || $region->config->get_abs_value('bridge_speed') == 0) {
61 push @mm3_per_mm, $layerm->perimeters->min_mm3_per_mm;
62 }
63 if ($region->config->get_abs_value('infill_speed') == 0
64 || $region->config->get_abs_value('solid_infill_speed') == 0
65 || $region->config->get_abs_value('top_solid_infill_speed') == 0
66 || $region->config->get_abs_value('bridge_speed') == 0) {
67 push @mm3_per_mm, $layerm->fills->min_mm3_per_mm;
68 }
69 }
70 }
71 if ($object->config->get_abs_value('support_material_speed') == 0
72 || $object->config->get_abs_value('support_material_interface_speed') == 0) {
73 foreach my $layer (@{$object->support_layers}) {
74 push @mm3_per_mm, $layer->support_fills->min_mm3_per_mm;
75 push @mm3_per_mm, $layer->support_interface_fills->min_mm3_per_mm;
76 }
77 }
78 }
79 # filter out 0-width segments
80 @mm3_per_mm = grep $_ > 0.000001, @mm3_per_mm;
81 if (@mm3_per_mm) {
82 my $min_mm3_per_mm = min(@mm3_per_mm);
83 # In order to honor max_print_speed we need to find a target volumetric
84 # speed that we can use throughout the print. So we define this target
85 # volumetric speed as the volumetric speed produced by printing the
86 # smallest cross-section at the maximum speed: any larger cross-section
87 # will need slower feedrates.
88 my $volumetric_speed = $min_mm3_per_mm * $self->config->max_print_speed;
89
90 # limit such volumetric speed with max_volumetric_speed if set
91 if ($self->config->max_volumetric_speed > 0) {
92 $volumetric_speed = min(
93 $volumetric_speed,
94 $self->config->max_volumetric_speed,
95 );
96 }
97 $gcodegen->set_volumetric_speed($volumetric_speed);
98 }
99 }
100 }
101
102 $self->_cooling_buffer(Slic3r::GCode::CoolingBuffer->new(
103 config => $self->config,
104 gcodegen => $self->_gcodegen,
105 ));
106
107 $self->_spiral_vase(Slic3r::GCode::SpiralVase->new(config => $self->config))
108 if $self->config->spiral_vase;
109
110 $self->_arc_fitting(Slic3r::GCode::ArcFitting->new(config => $self->config))
111 if $self->config->gcode_arcs;
112
113 $self->_pressure_regulator(Slic3r::GCode::PressureRegulator->new(config => $self->config))
114 if $self->config->pressure_advance > 0;
115
116 $self->_pressure_equalizer(Slic3r::GCode::PressureEqualizer->new($self->config))
117 if ($self->config->max_volumetric_extrusion_rate_slope_positive > 0 ||
118 $self->config->max_volumetric_extrusion_rate_slope_negative > 0);
119
120 $self->_gcodegen->set_enable_extrusion_role_markers(defined $self->_pressure_equalizer);
121 }
122
123 # Export a G-code for the complete print.
124 sub export {
125 my ($self) = @_;
126
127 my $fh = $self->fh;
128 my $gcodegen = $self->_gcodegen;
129
130 # Write information on the generator.
131 my @lt = localtime;
132 printf $fh "; generated by Slic3r $Slic3r::VERSION on %04d-%02d-%02d at %02d:%02d:%02d\n\n",
133 $lt[5] + 1900, $lt[4]+1, $lt[3], $lt[2], $lt[1], $lt[0];
134 # Write notes (content of the Print Settings tab -> Notes)
135 print $fh "; $_\n" foreach split /\R/, $self->config->notes;
136 print $fh "\n" if $self->config->notes;
137 # Write some terse information on the slicing parameters.
138 my $first_object = $self->objects->[0];
139 my $layer_height = $first_object->config->layer_height;
140 for my $region_id (0..$#{$self->print->regions}) {
141 my $region = $self->print->regions->[$region_id];
142 printf $fh "; external perimeters extrusion width = %.2fmm\n",
143 $region->flow(FLOW_ROLE_EXTERNAL_PERIMETER, $layer_height, 0, 0, -1, $first_object)->width;
144 printf $fh "; perimeters extrusion width = %.2fmm\n",
145 $region->flow(FLOW_ROLE_PERIMETER, $layer_height, 0, 0, -1, $first_object)->width;
146 printf $fh "; infill extrusion width = %.2fmm\n",
147 $region->flow(FLOW_ROLE_INFILL, $layer_height, 0, 0, -1, $first_object)->width;
148 printf $fh "; solid infill extrusion width = %.2fmm\n",
149 $region->flow(FLOW_ROLE_SOLID_INFILL, $layer_height, 0, 0, -1, $first_object)->width;
150 printf $fh "; top infill extrusion width = %.2fmm\n",
151 $region->flow(FLOW_ROLE_TOP_SOLID_INFILL, $layer_height, 0, 0, -1, $first_object)->width;
152 printf $fh "; support material extrusion width = %.2fmm\n",
153 $self->objects->[0]->support_material_flow->width
154 if $self->print->has_support_material;
155 printf $fh "; first layer extrusion width = %.2fmm\n",
156 $region->flow(FLOW_ROLE_PERIMETER, $layer_height, 0, 1, -1, $self->objects->[0])->width
157 if $region->config->first_layer_extrusion_width;
158 print $fh "\n";
159 }
160
161 # prepare the helper object for replacing placeholders in custom G-code and output filename
162 $self->placeholder_parser->update_timestamp;
163
164 # disable fan
165 print $fh $gcodegen->writer->set_fan(0, 1)
166 if $self->config->cooling && $self->config->disable_fan_first_layers;
167
168 # set bed temperature
169 if ((my $temp = $self->config->first_layer_bed_temperature) && $self->config->start_gcode !~ /M(?:190|140)/i) {
170 printf $fh $gcodegen->writer->set_bed_temperature($temp, 1);
171 }
172
173 # set extruder(s) temperature before and after start G-code
174 $self->_print_first_layer_temperature(0);
175 printf $fh "%s\n", $gcodegen->placeholder_parser->process($self->config->start_gcode);
176 $self->_print_first_layer_temperature(1);
177
178 # set other general things
179 print $fh $gcodegen->preamble;
180
181 # initialize a motion planner for object-to-object travel moves
182 if ($self->config->avoid_crossing_perimeters) {
183 my $distance_from_objects = scale 1;
184
185 # compute the offsetted convex hull for each object and repeat it for each copy.
186 my @islands_p = ();
187 foreach my $object (@{$self->objects}) {
188 # discard objects only containing thin walls (offset would fail on an empty polygon)
189 my @polygons = map $_->contour, map @{$_->slices}, @{$object->layers};
190 next if !@polygons;
191
192 # translate convex hull for each object copy and append it to the islands array
193 foreach my $copy (@{ $object->_shifted_copies }) {
194 my @copy_islands_p = map $_->clone, @polygons;
195 $_->translate(@$copy) for @copy_islands_p;
196 push @islands_p, @copy_islands_p;
197 }
198 }
199 $gcodegen->avoid_crossing_perimeters->init_external_mp(union_ex(\@islands_p));
200 }
201
202 # calculate wiping points if needed
203 if ($self->config->ooze_prevention) {
204 my @skirt_points = map @$_, map @$_, @{$self->print->skirt};
205 if (@skirt_points) {
206 my $outer_skirt = convex_hull(\@skirt_points);
207 my @skirts = ();
208 foreach my $extruder_id (@{$self->print->extruders}) {
209 my $extruder_offset = $self->config->get_at('extruder_offset', $extruder_id);
210 push @skirts, my $s = $outer_skirt->clone;
211 $s->translate(-scale($extruder_offset->x), -scale($extruder_offset->y)); #)
212 }
213 my $convex_hull = convex_hull([ map @$_, @skirts ]);
214
215 $gcodegen->ooze_prevention->set_enable(1);
216 $gcodegen->ooze_prevention->set_standby_points(
217 [ map @{$_->equally_spaced_points(scale 10)}, @{offset([$convex_hull], scale 3)} ]
218 );
219
220 if (0) {
221 require "Slic3r/SVG.pm";
222 Slic3r::SVG::output(
223 "ooze_prevention.svg",
224 red_polygons => \@skirts,
225 polygons => [$outer_skirt],
226 points => $gcodegen->ooze_prevention->standby_points,
227 );
228 }
229 }
230 }
231
232 # set initial extruder only after custom start G-code
233 print $fh $gcodegen->set_extruder($self->print->extruders->[0]);
234
235 # do all objects for each layer
236 if ($self->config->complete_objects) {
237 # print objects from the smallest to the tallest to avoid collisions
238 # when moving onto next object starting point
239 my @obj_idx = sort { $self->objects->[$a]->size->z <=> $self->objects->[$b]->size->z } 0..($self->print->object_count - 1);
240
241 my $finished_objects = 0;
242 for my $obj_idx (@obj_idx) {
243 my $object = $self->objects->[$obj_idx];
244 for my $copy (@{ $self->objects->[$obj_idx]->_shifted_copies }) {
245 # move to the origin position for the copy we're going to print.
246 # this happens before Z goes down to layer 0 again, so that
247 # no collision happens hopefully.
248 if ($finished_objects > 0) {
249 $gcodegen->set_origin(Slic3r::Pointf->new(map unscale $copy->[$_], X,Y));
250 $gcodegen->set_enable_cooling_markers(0); # we're not filtering these moves through CoolingBuffer
251 $gcodegen->avoid_crossing_perimeters->set_use_external_mp_once(1);
252 print $fh $gcodegen->retract;
253 print $fh $gcodegen->travel_to(
254 Slic3r::Point->new(0,0),
255 EXTR_ROLE_NONE,
256 'move to origin position for next object',
257 );
258 $gcodegen->set_enable_cooling_markers(1);
259
260 # disable motion planner when traveling to first object point
261 $gcodegen->avoid_crossing_perimeters->set_disable_once(1);
262 }
263
264 my @layers = sort { $a->print_z <=> $b->print_z } @{$object->layers}, @{$object->support_layers};
265 for my $layer (@layers) {
266 # if we are printing the bottom layer of an object, and we have already finished
267 # another one, set first layer temperatures. this happens before the Z move
268 # is triggered, so machine has more time to reach such temperatures
269 if ($layer->id == 0 && $finished_objects > 0) {
270 printf $fh $gcodegen->writer->set_bed_temperature($self->config->first_layer_bed_temperature),
271 if $self->config->first_layer_bed_temperature;
272 $self->_print_first_layer_temperature(0);
273 }
274 $self->process_layer($layer, [$copy]);
275 }
276 $self->flush_filters;
277 $finished_objects++;
278 $self->_second_layer_things_done(0);
279 }
280 }
281 } else {
282 # order objects using a nearest neighbor search
283 my @obj_idx = @{chained_path([ map Slic3r::Point->new(@{$_->_shifted_copies->[0]}), @{$self->objects} ])};
284
285 # sort layers by Z
286 # All extrusion moves with the same top layer height are extruded uninterrupted,
287 # object extrusion moves are performed first, then the support.
288 my %layers = (); # print_z => [ [layers], [layers], [layers] ] by obj_idx
289 foreach my $obj_idx (0 .. ($self->print->object_count - 1)) {
290 my $object = $self->objects->[$obj_idx];
291 foreach my $layer (@{$object->layers}, @{$object->support_layers}) {
292 $layers{ $layer->print_z } ||= [];
293 $layers{ $layer->print_z }[$obj_idx] ||= [];
294 push @{$layers{ $layer->print_z }[$obj_idx]}, $layer;
295 }
296 }
297
298 foreach my $print_z (sort { $a <=> $b } keys %layers) {
299 foreach my $obj_idx (@obj_idx) {
300 foreach my $layer (@{ $layers{$print_z}[$obj_idx] // [] }) {
301 $self->process_layer($layer, $layer->object->_shifted_copies);
302 }
303 }
304 }
305 $self->flush_filters;
306 }
307
308 # write end commands to file
309 print $fh $gcodegen->retract; # TODO: process this retract through PressureRegulator in order to discharge fully
310 print $fh $gcodegen->writer->set_fan(0);
311 printf $fh "%s\n", $gcodegen->placeholder_parser->process($self->config->end_gcode);
312 print $fh $gcodegen->writer->update_progress($gcodegen->layer_count, $gcodegen->layer_count, 1); # 100%
313 print $fh $gcodegen->writer->postamble;
314
315 # get filament stats
316 $self->print->clear_filament_stats;
317 $self->print->total_used_filament(0);
318 $self->print->total_extruded_volume(0);
319 foreach my $extruder (@{$gcodegen->writer->extruders}) {
320 my $used_filament = $extruder->used_filament;
321 my $extruded_volume = $extruder->extruded_volume;
322 $self->print->set_filament_stats($extruder->id, $used_filament);
323
324 printf $fh "; filament used = %.1fmm (%.1fcm3)\n",
325 $used_filament, $extruded_volume/1000;
326
327 $self->print->total_used_filament($self->print->total_used_filament + $used_filament);
328 $self->print->total_extruded_volume($self->print->total_extruded_volume + $extruded_volume);
329 }
330
331 # append full config
332 print $fh "\n";
333 foreach my $config ($self->print->config, $self->print->default_object_config, $self->print->default_region_config) {
334 foreach my $opt_key (sort @{$config->get_keys}) {
335 next if $Slic3r::Config::Options->{$opt_key}{shortcut};
336 printf $fh "; %s = %s\n", $opt_key, $config->serialize($opt_key);
337 }
338 }
339 }
340
341 sub _print_first_layer_temperature {
342 my ($self, $wait) = @_;
343
344 return if $self->config->start_gcode =~ /M(?:109|104)/i;
345 for my $t (@{$self->print->extruders}) {
346 my $temp = $self->config->get_at('first_layer_temperature', $t);
347 $temp += $self->config->standby_temperature_delta if $self->config->ooze_prevention;
348 printf {$self->fh} $self->_gcodegen->writer->set_temperature($temp, $wait, $t) if $temp > 0;
349 }
350 }
351
352 # Called per object's layer.
353 # First a $gcode string is collected,
354 # then filtered and finally written to a file $fh.
355 #FIXME If printing multiple objects at once, this incorrectly applies cooling logic to a single object's layer instead
356 # of all the objects printed.
357 sub process_layer {
358 my $self = shift;
359 my ($layer, $object_copies) = @_;
360 my $gcode = "";
361
362 my $object = $layer->object;
363 $self->_gcodegen->config->apply_static($object->config);
364
365 # check whether we're going to apply spiralvase logic
366 if (defined $self->_spiral_vase) {
367 $self->_spiral_vase->enable(
368 ($layer->id > 0 || $self->print->config->brim_width == 0)
369 && ($layer->id >= $self->print->config->skirt_height && !$self->print->has_infinite_skirt)
370 && !defined(first { $_->region->config->bottom_solid_layers > $layer->id } @{$layer->regions})
371 && !defined(first { $_->perimeters->items_count > 1 } @{$layer->regions})
372 && !defined(first { $_->fills->items_count > 0 } @{$layer->regions})
373 );
374 }
375
376 # if we're going to apply spiralvase to this layer, disable loop clipping
377 $self->_gcodegen->set_enable_loop_clipping(!defined $self->_spiral_vase || !$self->_spiral_vase->enable);
378
379 if (!$self->_second_layer_things_done && $layer->id == 1) {
380 for my $extruder (@{$self->_gcodegen->writer->extruders}) {
381 my $temperature = $self->config->get_at('temperature', $extruder->id);
382 $gcode .= $self->_gcodegen->writer->set_temperature($temperature, 0, $extruder->id)
383 if $temperature && $temperature != $self->config->get_at('first_layer_temperature', $extruder->id);
384 }
385 $gcode .= $self->_gcodegen->writer->set_bed_temperature($self->print->config->bed_temperature)
386 if $self->print->config->bed_temperature && $self->print->config->bed_temperature != $self->print->config->first_layer_bed_temperature;
387 $self->_second_layer_things_done(1);
388 }
389
390 # set new layer - this will change Z and force a retraction if retract_layer_change is enabled
391 if ($self->print->config->before_layer_gcode) {
392 my $pp = $self->_gcodegen->placeholder_parser->clone;
393 $pp->set('layer_num' => $self->_gcodegen->layer_index + 1);
394 $pp->set('layer_z' => $layer->print_z);
395 $gcode .= $pp->process($self->print->config->before_layer_gcode) . "\n";
396 }
397 $gcode .= $self->_gcodegen->change_layer($layer->as_layer); # this will increase $self->_gcodegen->layer_index
398 if ($self->print->config->layer_gcode) {
399 my $pp = $self->_gcodegen->placeholder_parser->clone;
400 $pp->set('layer_num' => $self->_gcodegen->layer_index);
401 $pp->set('layer_z' => $layer->print_z);
402 $gcode .= $pp->process($self->print->config->layer_gcode) . "\n";
403 }
404
405 # extrude skirt along raft layers and normal object layers
406 # (not along interlaced support material layers)
407 if (((values %{$self->_skirt_done}) < $self->print->config->skirt_height || $self->print->has_infinite_skirt)
408 && !$self->_skirt_done->{$layer->print_z}
409 && (!$layer->isa('Slic3r::Layer::Support') || $layer->id < $object->config->raft_layers)) {
410 $self->_gcodegen->set_origin(Slic3r::Pointf->new(0,0));
411 $self->_gcodegen->avoid_crossing_perimeters->set_use_external_mp(1);
412 my @extruder_ids = map { $_->id } @{$self->_gcodegen->writer->extruders};
413 $gcode .= $self->_gcodegen->set_extruder($extruder_ids[0]);
414 # skip skirt if we have a large brim
415 if ($layer->id < $self->print->config->skirt_height || $self->print->has_infinite_skirt) {
416 my $skirt_flow = $self->print->skirt_flow;
417
418 # distribute skirt loops across all extruders
419 my @skirt_loops = @{$self->print->skirt};
420 for my $i (0 .. $#skirt_loops) {
421 # when printing layers > 0 ignore 'min_skirt_length' and
422 # just use the 'skirts' setting; also just use the current extruder
423 last if ($layer->id > 0) && ($i >= $self->print->config->skirts);
424 my $extruder_id = $extruder_ids[($i/@extruder_ids) % @extruder_ids];
425 $gcode .= $self->_gcodegen->set_extruder($extruder_id)
426 if $layer->id == 0;
427
428 # adjust flow according to this layer's layer height
429 my $loop = $skirt_loops[$i]->clone;
430 {
431 my $layer_skirt_flow = $skirt_flow->clone;
432 $layer_skirt_flow->set_height($layer->height);
433 my $mm3_per_mm = $layer_skirt_flow->mm3_per_mm;
434 foreach my $path (@$loop) {
435 $path->height($layer->height);
436 $path->mm3_per_mm($mm3_per_mm);
437 }
438 }
439
440 $gcode .= $self->_gcodegen->extrude_loop($loop, 'skirt', $object->config->support_material_speed);
441 }
442 }
443 $self->_skirt_done->{$layer->print_z} = 1;
444 $self->_gcodegen->avoid_crossing_perimeters->set_use_external_mp(0);
445
446 # allow a straight travel move to the first object point if this is the first layer
447 # (but don't in next layers)
448 if ($layer->id == 0) {
449 $self->_gcodegen->avoid_crossing_perimeters->set_disable_once(1);
450 }
451 }
452
453 # extrude brim
454 if (!$self->_brim_done) {
455 $gcode .= $self->_gcodegen->set_extruder($self->print->regions->[0]->config->perimeter_extruder-1);
456 $self->_gcodegen->set_origin(Slic3r::Pointf->new(0,0));
457 $self->_gcodegen->avoid_crossing_perimeters->set_use_external_mp(1);
458 $gcode .= $self->_gcodegen->extrude_loop($_, 'brim', $object->config->support_material_speed)
459 for @{$self->print->brim};
460 $self->_brim_done(1);
461 $self->_gcodegen->avoid_crossing_perimeters->set_use_external_mp(0);
462
463 # allow a straight travel move to the first object point
464 $self->_gcodegen->avoid_crossing_perimeters->set_disable_once(1);
465 }
466
467 for my $copy (@$object_copies) {
468 # when starting a new object, use the external motion planner for the first travel move
469 $self->_gcodegen->avoid_crossing_perimeters->set_use_external_mp_once(1) if ($self->_last_obj_copy // '') ne "$copy";
470 $self->_last_obj_copy("$copy");
471
472 $self->_gcodegen->set_origin(Slic3r::Pointf->new(map unscale $copy->[$_], X,Y));
473
474 # extrude support material before other things because it might use a lower Z
475 # and also because we avoid travelling on other things when printing it
476 if ($layer->isa('Slic3r::Layer::Support')) {
477 if ($layer->support_interface_fills->count > 0) {
478 $gcode .= $self->_gcodegen->set_extruder($object->config->support_material_interface_extruder-1);
479 $gcode .= $self->_gcodegen->extrude_path($_, 'support material interface', $object->config->get_abs_value('support_material_interface_speed'))
480 for @{$layer->support_interface_fills->chained_path_from($self->_gcodegen->last_pos, 0)};
481 }
482 if ($layer->support_fills->count > 0) {
483 $gcode .= $self->_gcodegen->set_extruder($object->config->support_material_extruder-1);
484 $gcode .= $self->_gcodegen->extrude_path($_, 'support material', $object->config->get_abs_value('support_material_speed'))
485 for @{$layer->support_fills->chained_path_from($self->_gcodegen->last_pos, 0)};
486 }
487 }
488
489 # We now define a strategy for building perimeters and fills. The separation
490 # between regions doesn't matter in terms of printing order, as we follow
491 # another logic instead:
492 # - we group all extrusions by extruder so that we minimize toolchanges
493 # - we start from the last used extruder
494 # - for each extruder, we group extrusions by island
495 # - for each island, we extrude perimeters first, unless user set the infill_first
496 # option
497 # (Still, we have to keep track of regions because we need to apply their config)
498
499 # group extrusions by extruder and then by island
500 my %by_extruder = (); # extruder_id => [ { perimeters => \@perimeters, infill => \@infill } ]
501
502 my $n_slices = $#{$layer->slices};
503 my @layer_surface_bboxes = ();
504 for my $i (0 .. $n_slices) {
505 push @layer_surface_bboxes, $layer->slices->[$i]->contour->bounding_box;
506 }
507 my $point_inside_surface = sub {
508 my ($i, $point) = @_;
509 my $bbox = $layer_surface_bboxes[$i];
510 return
511 $point->x >= $bbox->x_min && $point->x < $bbox->x_max &&
512 $point->y >= $bbox->y_min && $point->y < $bbox->y_max &&
513 $layer->slices->[$i]->contour->contains_point($point);
514 };
515
516 foreach my $region_id (0..($self->print->region_count-1)) {
517 my $layerm = $layer->regions->[$region_id] or next;
518 my $region = $self->print->get_region($region_id);
519
520 # process perimeters
521 {
522 my $extruder_id = $region->config->perimeter_extruder-1;
523 foreach my $perimeter_coll (@{$layerm->perimeters}) {
524 next if $perimeter_coll->empty; # this shouldn't happen but first_point() would fail
525
526 # init by_extruder item only if we actually use the extruder
527 $by_extruder{$extruder_id} //= [];
528
529 # $perimeter_coll is an ExtrusionPath::Collection object representing a single slice
530 for my $i (0 .. $n_slices) {
531 if (
532 # $perimeter_coll->first_point does not fit inside any slice
533 $i == $n_slices
534 # $perimeter_coll->first_point fits inside ith slice
535 || $point_inside_surface->($i, $perimeter_coll->first_point)) {
536 $by_extruder{$extruder_id}[$i] //= { perimeters => {} };
537 $by_extruder{$extruder_id}[$i]{perimeters}{$region_id} //= [];
538 push @{ $by_extruder{$extruder_id}[$i]{perimeters}{$region_id} }, @$perimeter_coll;
539 last;
540 }
541 }
542 }
543 }
544
545 # process infill
546 # $layerm->fills is a collection of Slic3r::ExtrusionPath::Collection objects (C++ class ExtrusionEntityCollection),
547 # each one containing the ExtrusionPath objects of a certain infill "group" (also called "surface"
548 # throughout the code). We can redefine the order of such Collections but we have to
549 # do each one completely at once.
550 foreach my $fill (@{$layerm->fills}) {
551 next if $fill->empty; # this shouldn't happen but first_point() would fail
552
553 # init by_extruder item only if we actually use the extruder
554 my $extruder_id = $fill->[0]->is_solid_infill
555 ? $region->config->solid_infill_extruder-1
556 : $region->config->infill_extruder-1;
557
558 $by_extruder{$extruder_id} //= [];
559
560 # $fill is an ExtrusionPath::Collection object
561 for my $i (0 .. $n_slices) {
562 if ($i == $n_slices
563 || $point_inside_surface->($i, $fill->first_point)) {
564 $by_extruder{$extruder_id}[$i] //= { infill => {} };
565 $by_extruder{$extruder_id}[$i]{infill}{$region_id} //= [];
566 push @{ $by_extruder{$extruder_id}[$i]{infill}{$region_id} }, $fill;
567 last;
568 }
569 }
570 }
571 } # for regions
572
573 # tweak extruder ordering to save toolchanges
574 my @extruders = sort keys %by_extruder;
575 if (@extruders > 1) {
576 my $last_extruder_id = $self->_gcodegen->writer->extruder->id;
577 if (exists $by_extruder{$last_extruder_id}) {
578 @extruders = (
579 $last_extruder_id,
580 grep $_ != $last_extruder_id, @extruders,
581 );
582 }
583 }
584
585 foreach my $extruder_id (@extruders) {
586 $gcode .= $self->_gcodegen->set_extruder($extruder_id);
587 foreach my $island (@{ $by_extruder{$extruder_id} }) {
588 if ($self->print->config->infill_first) {
589 $gcode .= $self->_extrude_infill($island->{infill} // {});
590 $gcode .= $self->_extrude_perimeters($island->{perimeters} // {});
591 } else {
592 $gcode .= $self->_extrude_perimeters($island->{perimeters} // {});
593 $gcode .= $self->_extrude_infill($island->{infill} // {});
594 }
595 }
596 }
597 } # for object copies
598
599 # apply spiral vase post-processing if this layer contains suitable geometry
600 # (we must feed all the G-code into the post-processor, including the first
601 # bottom non-spiral layers otherwise it will mess with positions)
602 # we apply spiral vase at this stage because it requires a full layer
603 $gcode = $self->_spiral_vase->process_layer($gcode)
604 if defined $self->_spiral_vase;
605
606 # apply cooling logic; this may alter speeds
607 $gcode = $self->_cooling_buffer->append(
608 $gcode,
609 $layer->object->ptr . ref($layer), # differentiate $obj_id between normal layers and support layers
610 $layer->id,
611 $layer->print_z,
612 ) if defined $self->_cooling_buffer;
613
614 $gcode = $self->filter($gcode);
615 print {$self->fh} $gcode if defined($gcode);
616 }
617
618 # Extrude perimeters: Decide where to put seams (hide or align seams).
619 sub _extrude_perimeters {
620 my ($self, $entities_by_region) = @_;
621
622 my $gcode = "";
623 foreach my $region_id (sort keys %$entities_by_region) {
624 $self->_gcodegen->config->apply_static($self->print->get_region($region_id)->config);
625 $gcode .= $self->_gcodegen->extrude($_, 'perimeter', -1)
626 for @{ $entities_by_region->{$region_id} };
627 }
628 return $gcode;
629 }
630
631 # Chain the paths hierarchically by a greedy algorithm to minimize a travel distance.
632 sub _extrude_infill {
633 my ($self, $entities_by_region) = @_;
634
635 my $gcode = "";
636 foreach my $region_id (sort keys %$entities_by_region) {
637 $self->_gcodegen->config->apply_static($self->print->get_region($region_id)->config);
638
639 my $collection = Slic3r::ExtrusionPath::Collection->new(@{ $entities_by_region->{$region_id} });
640 for my $fill (@{$collection->chained_path_from($self->_gcodegen->last_pos, 0)}) {
641 if ($fill->isa('Slic3r::ExtrusionPath::Collection')) {
642 $gcode .= $self->_gcodegen->extrude($_, 'infill', -1)
643 for @{$fill->chained_path_from($self->_gcodegen->last_pos, 0)};
644 } else {
645 $gcode .= $self->_gcodegen->extrude($fill, 'infill', -1) ;
646 }
647 }
648 }
649 return $gcode;
650 }
651
652 sub flush_filters {
653 my ($self) = @_;
654
655 print {$self->fh} $self->filter($self->_cooling_buffer->flush, 1);
656 }
657
658 sub filter {
659 my ($self, $gcode, $flush) = @_;
660 $flush //= 0;
661
662 # apply pressure regulation if enabled;
663 # this depends on actual speeds
664 $gcode = $self->_pressure_regulator->process($gcode, $flush)
665 if defined $self->_pressure_regulator;
666
667 # apply pressure equalization if enabled;
668 # print "G-code before filter:\n", $gcode;
669 $gcode = $self->_pressure_equalizer->process($gcode, $flush)
670 if defined $self->_pressure_equalizer;
671 # print "G-code after filter:\n", $gcode;
672
673 # apply arc fitting if enabled;
674 # this does not depend on speeds but changes G1 XY commands into G2/G2 IJ
675 $gcode = $self->_arc_fitting->process($gcode)
676 if defined $self->_arc_fitting;
677
678 return $gcode;
679 }
680
681 1;
0 package Slic3r::Print::Object;
1 # extends c++ class Slic3r::PrintObject (Print.xsp)
2 use strict;
3 use warnings;
4
5 use List::Util qw(min max sum first);
6 use Slic3r::Flow ':roles';
7 use Slic3r::Geometry qw(X Y Z PI scale unscale chained_path epsilon);
8 use Slic3r::Geometry::Clipper qw(diff diff_ex intersection intersection_ex union union_ex
9 offset offset_ex offset2 offset2_ex intersection_ppl CLIPPER_OFFSET_SCALE JT_MITER);
10 use Slic3r::Print::State ':steps';
11 use Slic3r::Surface ':types';
12
13 # If enabled, phases of prepare_infill will be written into SVG files to an "out" directory.
14 our $SLIC3R_DEBUG_SLICE_PROCESSING = 0;
15
16 sub region_volumes {
17 my $self = shift;
18 return [ map $self->get_region_volumes($_), 0..($self->region_count - 1) ];
19 }
20
21 sub layers {
22 my $self = shift;
23 return [ map $self->get_layer($_), 0..($self->layer_count - 1) ];
24 }
25
26 sub support_layers {
27 my $self = shift;
28 return [ map $self->get_support_layer($_), 0..($self->support_layer_count - 1) ];
29 }
30
31 # 1) Decides Z positions of the layers,
32 # 2) Initializes layers and their regions
33 # 3) Slices the object meshes
34 # 4) Slices the modifier meshes and reclassifies the slices of the object meshes by the slices of the modifier meshes
35 # 5) Applies size compensation (offsets the slices in XY plane)
36 # 6) Replaces bad slices by the slices reconstructed from the upper/lower layer
37 # Resulting expolygons of layer regions are marked as Internal.
38 #
39 # this should be idempotent
40 sub slice {
41 my $self = shift;
42
43 return if $self->step_done(STEP_SLICE);
44 $self->set_step_started(STEP_SLICE);
45 $self->print->status_cb->(10, "Processing triangulated mesh");
46
47 # init layers
48 {
49 $self->clear_layers;
50
51 # make layers taking custom heights into account
52 my $id = 0;
53 my $print_z = 0;
54 my $first_object_layer_height = -1;
55 my $first_object_layer_distance = -1;
56
57 # add raft layers
58 if ($self->config->raft_layers > 0) {
59 # Reserve object layers for the raft. Last layer of the raft is the contact layer.
60 $id += $self->config->raft_layers;
61
62 # Raise first object layer Z by the thickness of the raft itself
63 # plus the extra distance required by the support material logic.
64 #FIXME The last raft layer is the contact layer, which shall be printed with a bridging flow for ease of separation. Currently it is not the case.
65 my $first_layer_height = $self->config->get_value('first_layer_height');
66 $print_z += $first_layer_height;
67
68 # Use as large as possible layer height for the intermediate raft layers.
69 my $support_material_layer_height;
70 {
71 my @nozzle_diameters = (
72 map $self->print->config->get_at('nozzle_diameter', $_),
73 $self->config->support_material_extruder-1,
74 $self->config->support_material_interface_extruder-1,
75 );
76 $support_material_layer_height = 0.75 * min(@nozzle_diameters);
77 }
78 $print_z += $support_material_layer_height * ($self->config->raft_layers - 1);
79
80 # compute the average of all nozzles used for printing the object
81 #FIXME It is expected, that the 1st layer of the object is printed with a bridging flow over a full raft. Shall it not be vice versa?
82 my $nozzle_diameter;
83 {
84 my @nozzle_diameters = (
85 map $self->print->config->get_at('nozzle_diameter', $_), @{$self->print->object_extruders}
86 );
87 $nozzle_diameter = sum(@nozzle_diameters)/@nozzle_diameters;
88 }
89 $first_object_layer_distance = $self->_support_material->contact_distance($self->config->layer_height, $nozzle_diameter);
90
91 # force first layer print_z according to the contact distance
92 # (the loop below will raise print_z by such height)
93 $first_object_layer_height = $first_object_layer_distance - $self->config->support_material_contact_distance;
94 }
95
96 # loop until we have at least one layer and the max slice_z reaches the object height
97 my $slice_z = 0;
98 my $height = 0;
99 my $max_z = unscale($self->size->z);
100 while (($slice_z - $height) <= $max_z) {
101 # assign the default height to the layer according to the general settings
102 $height = ($id == 0)
103 ? $self->config->get_value('first_layer_height')
104 : $self->config->layer_height;
105
106 # look for an applicable custom range
107 if (my $range = first { $_->[0] <= $slice_z && $_->[1] > $slice_z } @{$self->layer_height_ranges}) {
108 $height = $range->[2];
109
110 # if user set custom height to zero we should just skip the range and resume slicing over it
111 if ($height == 0) {
112 $slice_z += $range->[1] - $range->[0];
113 next;
114 }
115 }
116
117 if ($first_object_layer_height != -1 && !@{$self->layers}) {
118 $height = $first_object_layer_height;
119 $print_z += ($first_object_layer_distance - $height);
120 }
121
122 $print_z += $height;
123 $slice_z += $height/2;
124
125 ### Slic3r::debugf "Layer %d: height = %s; slice_z = %s; print_z = %s\n", $id, $height, $slice_z, $print_z;
126
127 $self->add_layer($id, $height, $print_z, $slice_z);
128 if ($self->layer_count >= 2) {
129 my $lc = $self->layer_count;
130 $self->get_layer($lc - 2)->set_upper_layer($self->get_layer($lc - 1));
131 $self->get_layer($lc - 1)->set_lower_layer($self->get_layer($lc - 2));
132 }
133 $id++;
134
135 $slice_z += $height/2; # add the other half layer
136 }
137 }
138
139 # make sure all layers contain layer region objects for all regions
140 my $regions_count = $self->print->region_count;
141 foreach my $layer (@{ $self->layers }) {
142 $layer->region($_) for 0 .. ($regions_count-1);
143 }
144
145 # get array of Z coordinates for slicing
146 my @z = map $_->slice_z, @{$self->layers};
147
148 # slice all non-modifier volumes
149 for my $region_id (0..($self->region_count - 1)) {
150 my $expolygons_by_layer = $self->_slice_region($region_id, \@z, 0);
151 for my $layer_id (0..$#$expolygons_by_layer) {
152 my $layerm = $self->get_layer($layer_id)->regions->[$region_id];
153 $layerm->slices->clear;
154 foreach my $expolygon (@{ $expolygons_by_layer->[$layer_id] }) {
155 $layerm->slices->append(Slic3r::Surface->new(
156 expolygon => $expolygon,
157 surface_type => S_TYPE_INTERNAL,
158 ));
159 }
160 }
161 }
162
163 # then slice all modifier volumes
164 if ($self->region_count > 1) {
165 for my $region_id (0..$self->region_count) {
166 my $expolygons_by_layer = $self->_slice_region($region_id, \@z, 1);
167
168 # loop through the other regions and 'steal' the slices belonging to this one
169 for my $other_region_id (0..$self->region_count) {
170 next if $other_region_id == $region_id;
171
172 for my $layer_id (0..$#$expolygons_by_layer) {
173 my $layerm = $self->get_layer($layer_id)->regions->[$region_id];
174 my $other_layerm = $self->get_layer($layer_id)->regions->[$other_region_id];
175 next if !defined $other_layerm;
176
177 my $other_slices = [ map $_->p, @{$other_layerm->slices} ]; # Polygons
178 my $my_parts = intersection_ex(
179 $other_slices,
180 [ map @$_, @{ $expolygons_by_layer->[$layer_id] } ],
181 );
182 next if !@$my_parts;
183
184 # append new parts to our region
185 foreach my $expolygon (@$my_parts) {
186 $layerm->slices->append(Slic3r::Surface->new(
187 expolygon => $expolygon,
188 surface_type => S_TYPE_INTERNAL,
189 ));
190 }
191
192 # remove such parts from original region
193 $other_layerm->slices->clear;
194 $other_layerm->slices->append(Slic3r::Surface->new(
195 expolygon => $_,
196 surface_type => S_TYPE_INTERNAL,
197 )) for @{ diff_ex($other_slices, [ map @$_, @$my_parts ]) };
198 }
199 }
200 }
201 }
202
203 # remove last layer(s) if empty
204 $self->delete_layer($self->layer_count - 1)
205 while $self->layer_count && (!map @{$_->slices}, @{$self->get_layer($self->layer_count - 1)->regions});
206
207 foreach my $layer (@{ $self->layers }) {
208 # apply size compensation
209 if ($self->config->xy_size_compensation != 0) {
210 my $delta = scale($self->config->xy_size_compensation);
211 if (@{$layer->regions} == 1) {
212 # single region
213 my $layerm = $layer->regions->[0];
214 my $slices = [ map $_->p, @{$layerm->slices} ];
215 $layerm->slices->clear;
216 $layerm->slices->append(Slic3r::Surface->new(
217 expolygon => $_,
218 surface_type => S_TYPE_INTERNAL,
219 )) for @{offset_ex($slices, $delta)};
220 } else {
221 if ($delta < 0) {
222 # multiple regions, shrinking
223 # we apply the offset to the combined shape, then intersect it
224 # with the original slices for each region
225 my $slices = union([ map $_->p, map @{$_->slices}, @{$layer->regions} ]);
226 $slices = offset($slices, $delta);
227 foreach my $layerm (@{$layer->regions}) {
228 my $this_slices = intersection_ex(
229 $slices,
230 [ map $_->p, @{$layerm->slices} ],
231 );
232 $layerm->slices->clear;
233 $layerm->slices->append(Slic3r::Surface->new(
234 expolygon => $_,
235 surface_type => S_TYPE_INTERNAL,
236 )) for @$this_slices;
237 }
238 } else {
239 # multiple regions, growing
240 # this is an ambiguous case, since it's not clear how to grow regions where they are going to overlap
241 # so we give priority to the first one and so on
242 for my $i (0..$#{$layer->regions}) {
243 my $layerm = $layer->regions->[$i];
244 my $slices = offset_ex([ map $_->p, @{$layerm->slices} ], $delta);
245 if ($i > 0) {
246 $slices = diff_ex(
247 [ map @$_, @$slices ],
248 [ map $_->p, map @{$_->slices}, map $layer->regions->[$_], 0..($i-1) ], # slices of already processed regions
249 );
250 }
251 $layerm->slices->clear;
252 $layerm->slices->append(Slic3r::Surface->new(
253 expolygon => $_,
254 surface_type => S_TYPE_INTERNAL,
255 )) for @$slices;
256 }
257 }
258 }
259 }
260
261 # merge all regions' slices to get islands
262 $layer->make_slices;
263 }
264
265 # detect slicing errors
266 my $warning_thrown = 0;
267 for my $i (0 .. ($self->layer_count - 1)) {
268 my $layer = $self->get_layer($i);
269 next unless $layer->slicing_errors;
270 if (!$warning_thrown) {
271 warn "The model has overlapping or self-intersecting facets. I tried to repair it, "
272 . "however you might want to check the results or repair the input file and retry.\n";
273 $warning_thrown = 1;
274 }
275
276 # try to repair the layer surfaces by merging all contours and all holes from
277 # neighbor layers
278 Slic3r::debugf "Attempting to repair layer %d\n", $i;
279
280 foreach my $region_id (0 .. ($layer->region_count - 1)) {
281 my $layerm = $layer->region($region_id);
282
283 my (@upper_surfaces, @lower_surfaces);
284 for (my $j = $i+1; $j < $self->layer_count; $j++) {
285 if (!$self->get_layer($j)->slicing_errors) {
286 @upper_surfaces = @{$self->get_layer($j)->region($region_id)->slices};
287 last;
288 }
289 }
290 for (my $j = $i-1; $j >= 0; $j--) {
291 if (!$self->get_layer($j)->slicing_errors) {
292 @lower_surfaces = @{$self->get_layer($j)->region($region_id)->slices};
293 last;
294 }
295 }
296
297 my $union = union_ex([
298 map $_->expolygon->contour, @upper_surfaces, @lower_surfaces,
299 ]);
300 my $diff = diff_ex(
301 [ map @$_, @$union ],
302 [ map @{$_->expolygon->holes}, @upper_surfaces, @lower_surfaces, ],
303 );
304
305 $layerm->slices->clear;
306 $layerm->slices->append($_)
307 for map Slic3r::Surface->new
308 (expolygon => $_, surface_type => S_TYPE_INTERNAL),
309 @$diff;
310 }
311
312 # update layer slices after repairing the single regions
313 $layer->make_slices;
314 }
315
316 # remove empty layers from bottom
317 while (@{$self->layers} && !@{$self->get_layer(0)->slices}) {
318 $self->delete_layer(0);
319 for (my $i = 0; $i <= $#{$self->layers}; $i++) {
320 $self->get_layer($i)->set_id( $self->get_layer($i)->id-1 );
321 }
322 }
323
324 # simplify slices if required
325 if ($self->print->config->resolution) {
326 $self->_simplify_slices(scale($self->print->config->resolution));
327 }
328
329 die "No layers were detected. You might want to repair your STL file(s) or check their size or thickness and retry.\n"
330 if !@{$self->layers};
331
332 $self->set_typed_slices(0);
333 $self->set_step_done(STEP_SLICE);
334 }
335
336 # called from slice()
337 sub _slice_region {
338 my ($self, $region_id, $z, $modifier) = @_;
339
340 return [] if !@{$self->get_region_volumes($region_id)};
341
342 # compose mesh
343 my $mesh;
344 foreach my $volume_id (@{ $self->get_region_volumes($region_id) }) {
345 my $volume = $self->model_object->volumes->[$volume_id];
346 next if $volume->modifier && !$modifier;
347 next if !$volume->modifier && $modifier;
348
349 if (defined $mesh) {
350 $mesh->merge($volume->mesh);
351 } else {
352 $mesh = $volume->mesh->clone;
353 }
354 }
355 return if !defined $mesh;
356
357 # transform mesh
358 # we ignore the per-instance transformations currently and only
359 # consider the first one
360 $self->model_object->instances->[0]->transform_mesh($mesh, 1);
361
362 # align mesh to Z = 0 (it should be already aligned actually) and apply XY shift
363 $mesh->translate((map unscale(-$_), @{$self->_copies_shift}), -$self->model_object->bounding_box->z_min);
364
365 # perform actual slicing
366 return $mesh->slice($z);
367 }
368
369 sub make_perimeters {
370 my $self = shift;
371
372 # prerequisites
373 $self->slice;
374
375 return if $self->step_done(STEP_PERIMETERS);
376 $self->set_step_started(STEP_PERIMETERS);
377 $self->print->status_cb->(20, "Generating perimeters");
378
379 # merge slices if they were split into types
380 if ($self->typed_slices) {
381 $_->merge_slices for @{$self->layers};
382 $self->set_typed_slices(0);
383 $self->invalidate_step(STEP_PREPARE_INFILL);
384 }
385
386 # compare each layer to the one below, and mark those slices needing
387 # one additional inner perimeter, like the top of domed objects-
388
389 # this algorithm makes sure that at least one perimeter is overlapping
390 # but we don't generate any extra perimeter if fill density is zero, as they would be floating
391 # inside the object - infill_only_where_needed should be the method of choice for printing
392 # hollow objects
393 for my $region_id (0 .. ($self->print->region_count-1)) {
394 my $region = $self->print->regions->[$region_id];
395 my $region_perimeters = $region->config->perimeters;
396
397 next if !$region->config->extra_perimeters;
398 next if $region_perimeters == 0;
399 next if $region->config->fill_density == 0;
400
401 for my $i (0 .. ($self->layer_count - 2)) {
402 my $layerm = $self->get_layer($i)->get_region($region_id);
403 my $upper_layerm = $self->get_layer($i+1)->get_region($region_id);
404 my $upper_layerm_polygons = [ map $_->p, @{$upper_layerm->slices} ];
405 # Filter upper layer polygons in intersection_ppl by their bounding boxes?
406 # my $upper_layerm_poly_bboxes= [ map $_->bounding_box, @{$upper_layerm_polygons} ];
407 my $total_loop_length = sum(map $_->length, @$upper_layerm_polygons) // 0;
408
409 my $perimeter_spacing = $layerm->flow(FLOW_ROLE_PERIMETER)->scaled_spacing;
410 my $ext_perimeter_flow = $layerm->flow(FLOW_ROLE_EXTERNAL_PERIMETER);
411 my $ext_perimeter_width = $ext_perimeter_flow->scaled_width;
412 my $ext_perimeter_spacing = $ext_perimeter_flow->scaled_spacing;
413
414 foreach my $slice (@{$layerm->slices}) {
415 while (1) {
416 # compute the total thickness of perimeters
417 my $perimeters_thickness = $ext_perimeter_width/2 + $ext_perimeter_spacing/2
418 + ($region_perimeters-1 + $slice->extra_perimeters) * $perimeter_spacing;
419
420 # define a critical area where we don't want the upper slice to fall into
421 # (it should either lay over our perimeters or outside this area)
422 my $critical_area_depth = $perimeter_spacing*1.5;
423 my $critical_area = diff(
424 offset($slice->expolygon->arrayref, -$perimeters_thickness),
425 offset($slice->expolygon->arrayref, -($perimeters_thickness + $critical_area_depth)),
426 );
427
428 # check whether a portion of the upper slices falls inside the critical area
429 my $intersection = intersection_ppl(
430 $upper_layerm_polygons,
431 $critical_area,
432 );
433
434 # only add an additional loop if at least 30% of the slice loop would benefit from it
435 my $total_intersection_length = sum(map $_->length, @$intersection) // 0;
436 last unless $total_intersection_length > $total_loop_length*0.3;
437
438 if (0) {
439 require "Slic3r/SVG.pm";
440 Slic3r::SVG::output(
441 "extra.svg",
442 no_arrows => 1,
443 expolygons => union_ex($critical_area),
444 polylines => [ map $_->split_at_first_point, map $_->p, @{$upper_layerm->slices} ],
445 );
446 }
447
448 $slice->extra_perimeters($slice->extra_perimeters + 1);
449 }
450 Slic3r::debugf " adding %d more perimeter(s) at layer %d\n",
451 $slice->extra_perimeters, $layerm->layer->id
452 if $slice->extra_perimeters > 0;
453 }
454 }
455 }
456
457 Slic3r::parallelize(
458 threads => $self->print->config->threads,
459 items => sub { 0 .. ($self->layer_count - 1) },
460 thread_cb => sub {
461 my $q = shift;
462 while (defined (my $i = $q->dequeue)) {
463 $self->get_layer($i)->make_perimeters;
464 }
465 },
466 no_threads_cb => sub {
467 $_->make_perimeters for @{$self->layers};
468 },
469 );
470
471 # simplify slices (both layer and region slices),
472 # we only need the max resolution for perimeters
473 ### This makes this method not-idempotent, so we keep it disabled for now.
474 ###$self->_simplify_slices(&Slic3r::SCALED_RESOLUTION);
475
476 $self->set_step_done(STEP_PERIMETERS);
477 }
478
479 sub prepare_infill {
480 my ($self) = @_;
481
482 # prerequisites
483 $self->make_perimeters;
484
485 return if $self->step_done(STEP_PREPARE_INFILL);
486 $self->set_step_started(STEP_PREPARE_INFILL);
487 $self->print->status_cb->(30, "Preparing infill");
488
489 # this will assign a type (top/bottom/internal) to $layerm->slices
490 # and transform $layerm->fill_surfaces from expolygon
491 # to typed top/bottom/internal surfaces;
492 $self->detect_surfaces_type;
493 # Mark the object to have the slices classified (typed, which also means they are split based on whether they are supported, bridging, top layers etc.)
494 $self->set_typed_slices(1);
495
496 # Decide what surfaces are to be filled.
497 # Here the S_TYPE_TOP / S_TYPE_BOTTOMBRIDGE / S_TYPE_BOTTOM infill is turned to just S_TYPE_INTERNAL if zero top / bottom infill layers are configured.
498 # Also tiny S_TYPE_INTERNAL surfaces are turned to S_TYPE_INTERNAL_SOLID.
499 $_->prepare_fill_surfaces for map @{$_->regions}, @{$self->layers};
500
501 # this will detect bridges and reverse bridges
502 # and rearrange top/bottom/internal surfaces
503 # It produces enlarged overlapping bridging areas.
504 #
505 # 1) S_TYPE_BOTTOMBRIDGE / S_TYPE_BOTTOM infill is grown by 3mm and clipped by the total infill area. Bridges are detected. The areas may overlap.
506 # 2) S_TYPE_TOP is grown by 3mm and clipped by the grown bottom areas. The areas may overlap.
507 # 3) Clip the internal surfaces by the grown top/bottom surfaces.
508 # 4) Merge surfaces with the same style. This will mostly get rid of the overlaps.
509 #FIXME This does not likely merge surfaces, which are supported by a material with different colors, but same properties.
510 $self->process_external_surfaces;
511
512 # Add solid fills to ensure the shell vertical thickness.
513 $self->discover_vertical_shells;
514
515 # Debugging output.
516 if ($SLIC3R_DEBUG_SLICE_PROCESSING) {
517 for my $region_id (0 .. ($self->print->region_count-1)) {
518 for (my $i = 0; $i < $self->layer_count; $i++) {
519 my $layerm = $self->get_layer($i)->regions->[$region_id];
520 $layerm->export_region_slices_to_svg_debug("6_discover_vertical_shells-final");
521 $layerm->export_region_fill_surfaces_to_svg_debug("6_discover_vertical_shells-final");
522 } # for each layer
523 } # for each region
524 }
525
526 # Detect, which fill surfaces are near external layers.
527 # They will be split in internal and internal-solid surfaces.
528 # The purpose is to add a configurable number of solid layers to support the TOP surfaces
529 # and to add a configurable number of solid layers above the BOTTOM / BOTTOMBRIDGE surfaces
530 # to close these surfaces reliably.
531 #FIXME Vojtech: Is this a good place to add supporting infills below sloping perimeters?
532 $self->discover_horizontal_shells;
533
534 if ($SLIC3R_DEBUG_SLICE_PROCESSING) {
535 # Debugging output.
536 for my $region_id (0 .. ($self->print->region_count-1)) {
537 for (my $i = 0; $i < $self->layer_count; $i++) {
538 my $layerm = $self->get_layer($i)->regions->[$region_id];
539 $layerm->export_region_slices_to_svg_debug("7_discover_horizontal_shells-final");
540 $layerm->export_region_fill_surfaces_to_svg_debug("7_discover_horizontal_shells-final");
541 } # for each layer
542 } # for each region
543 }
544
545 # Only active if config->infill_only_where_needed. This step trims the sparse infill,
546 # so it acts as an internal support. It maintains all other infill types intact.
547 # Here the internal surfaces and perimeters have to be supported by the sparse infill.
548 #FIXME The surfaces are supported by a sparse infill, but the sparse infill is only as large as the area to support.
549 # Likely the sparse infill will not be anchored correctly, so it will not work as intended.
550 # Also one wishes the perimeters to be supported by a full infill.
551 $self->clip_fill_surfaces;
552
553 if ($SLIC3R_DEBUG_SLICE_PROCESSING) {
554 # Debugging output.
555 for my $region_id (0 .. ($self->print->region_count-1)) {
556 for (my $i = 0; $i < $self->layer_count; $i++) {
557 my $layerm = $self->get_layer($i)->regions->[$region_id];
558 $layerm->export_region_slices_to_svg_debug("8_clip_surfaces-final");
559 $layerm->export_region_fill_surfaces_to_svg_debug("8_clip_surfaces-final");
560 } # for each layer
561 } # for each region
562 }
563
564 # the following step needs to be done before combination because it may need
565 # to remove only half of the combined infill
566 $self->bridge_over_infill;
567
568 # combine fill surfaces to honor the "infill every N layers" option
569 $self->combine_infill;
570
571 # Debugging output.
572 if ($SLIC3R_DEBUG_SLICE_PROCESSING) {
573 for my $region_id (0 .. ($self->print->region_count-1)) {
574 for (my $i = 0; $i < $self->layer_count; $i++) {
575 my $layerm = $self->get_layer($i)->regions->[$region_id];
576 $layerm->export_region_slices_to_svg_debug("9_prepare_infill-final");
577 $layerm->export_region_fill_surfaces_to_svg_debug("9_prepare_infill-final");
578 } # for each layer
579 } # for each region
580 for (my $i = 0; $i < $self->layer_count; $i++) {
581 my $layer = $self->get_layer($i);
582 $layer->export_region_slices_to_svg_debug("9_prepare_infill-final");
583 $layer->export_region_fill_surfaces_to_svg_debug("9_prepare_infill-final");
584 } # for each layer
585 }
586
587 $self->set_step_done(STEP_PREPARE_INFILL);
588 }
589
590 sub infill {
591 my ($self) = @_;
592
593 # prerequisites
594 $self->prepare_infill;
595
596 return if $self->step_done(STEP_INFILL);
597 $self->set_step_started(STEP_INFILL);
598 $self->print->status_cb->(70, "Infilling layers");
599
600 Slic3r::parallelize(
601 threads => $self->print->config->threads,
602 items => sub { 0..$#{$self->layers} },
603 thread_cb => sub {
604 my $q = shift;
605 while (defined (my $i = $q->dequeue)) {
606 $self->get_layer($i)->make_fills;
607 }
608 },
609 no_threads_cb => sub {
610 foreach my $layer (@{$self->layers}) {
611 $layer->make_fills;
612 }
613 },
614 );
615
616 ### we could free memory now, but this would make this step not idempotent
617 ### $_->fill_surfaces->clear for map @{$_->regions}, @{$object->layers};
618
619 $self->set_step_done(STEP_INFILL);
620 }
621
622 sub generate_support_material {
623 my $self = shift;
624
625 # prerequisites
626 $self->slice;
627
628 return if $self->step_done(STEP_SUPPORTMATERIAL);
629 $self->set_step_started(STEP_SUPPORTMATERIAL);
630
631 $self->clear_support_layers;
632
633 if ((!$self->config->support_material && $self->config->raft_layers == 0) || scalar(@{$self->layers}) < 2) {
634 $self->set_step_done(STEP_SUPPORTMATERIAL);
635 return;
636 }
637 $self->print->status_cb->(85, "Generating support material");
638
639 $self->_support_material->generate($self);
640
641 $self->set_step_done(STEP_SUPPORTMATERIAL);
642 }
643
644 sub _support_material {
645 my ($self) = @_;
646
647 my $first_layer_flow = Slic3r::Flow->new_from_width(
648 width => ($self->print->config->first_layer_extrusion_width || $self->config->support_material_extrusion_width),
649 role => FLOW_ROLE_SUPPORT_MATERIAL,
650 nozzle_diameter => $self->print->config->nozzle_diameter->[ $self->config->support_material_extruder-1 ]
651 // $self->print->config->nozzle_diameter->[0],
652 layer_height => $self->config->get_abs_value('first_layer_height'),
653 bridge_flow_ratio => 0,
654 );
655
656 if (1) {
657 # Old supports, Perl implementation.
658 return Slic3r::Print::SupportMaterial->new(
659 print_config => $self->print->config,
660 object_config => $self->config,
661 first_layer_flow => $first_layer_flow,
662 flow => $self->support_material_flow,
663 interface_flow => $self->support_material_flow(FLOW_ROLE_SUPPORT_MATERIAL_INTERFACE),
664 );
665 } else {
666 # New supports, C++ implementation.
667 return Slic3r::Print::SupportMaterial2->new($self);
668 }
669 }
670
671 # Idempotence of this method is guaranteed by the fact that we don't remove things from
672 # fill_surfaces but we only turn them into VOID surfaces, thus preserving the boundaries.
673 sub clip_fill_surfaces {
674 my $self = shift;
675 return unless $self->config->infill_only_where_needed;
676
677 # We only want infill under ceilings; this is almost like an
678 # internal support material.
679
680 # proceed top-down skipping bottom layer
681 my $upper_internal = [];
682 for my $layer_id (reverse 1..($self->layer_count - 1)) {
683 my $layer = $self->get_layer($layer_id);
684 my $lower_layer = $self->get_layer($layer_id-1);
685
686 # detect things that we need to support
687 my $overhangs = []; # Polygons
688
689 # we need to support any solid surface
690 push @$overhangs, map $_->p,
691 grep $_->is_solid, map @{$_->fill_surfaces}, @{$layer->regions};
692
693 # we also need to support perimeters when there's at least one full
694 # unsupported loop
695 {
696 # get perimeters area as the difference between slices and fill_surfaces
697 my $perimeters = diff(
698 [ map @$_, @{$layer->slices} ],
699 [ map $_->p, map @{$_->fill_surfaces}, @{$layer->regions} ],
700 );
701
702 # only consider the area that is not supported by lower perimeters
703 $perimeters = intersection(
704 $perimeters,
705 [ map $_->p, map @{$_->fill_surfaces}, @{$lower_layer->regions} ],
706 1,
707 );
708
709 # only consider perimeter areas that are at least one extrusion width thick
710 #FIXME Offset2 eats out from both sides, while the perimeters are create outside in.
711 #Should the $pw not be half of the current value?
712 my $pw = min(map $_->flow(FLOW_ROLE_PERIMETER)->scaled_width, @{$layer->regions});
713 $perimeters = offset2($perimeters, -$pw, +$pw);
714
715 # append such thick perimeters to the areas that need support
716 push @$overhangs, @$perimeters;
717 }
718
719 # find new internal infill
720 $upper_internal = my $new_internal = intersection(
721 [
722 @$overhangs,
723 @$upper_internal,
724 ],
725 [
726 # our current internal fill boundaries
727 map $_->p,
728 grep $_->surface_type == S_TYPE_INTERNAL || $_->surface_type == S_TYPE_INTERNALVOID,
729 map @{$_->fill_surfaces}, @{$lower_layer->regions}
730 ],
731 );
732
733 # apply new internal infill to regions
734 foreach my $layerm (@{$lower_layer->regions}) {
735 my (@internal, @other) = ();
736 foreach my $surface (map $_->clone, @{$layerm->fill_surfaces}) {
737 if ($surface->surface_type == S_TYPE_INTERNAL || $surface->surface_type == S_TYPE_INTERNALVOID) {
738 push @internal, $surface;
739 } else {
740 push @other, $surface;
741 }
742 }
743
744 my @new = map Slic3r::Surface->new(
745 expolygon => $_,
746 surface_type => S_TYPE_INTERNAL,
747 ),
748 @{intersection_ex(
749 [ map $_->p, @internal ],
750 $new_internal,
751 1,
752 )};
753
754 push @other, map Slic3r::Surface->new(
755 expolygon => $_,
756 surface_type => S_TYPE_INTERNALVOID,
757 ),
758 @{diff_ex(
759 [ map $_->p, @internal ],
760 $new_internal,
761 1,
762 )};
763
764 # If there are voids it means that our internal infill is not adjacent to
765 # perimeters. In this case it would be nice to add a loop around infill to
766 # make it more robust and nicer. TODO.
767
768 $layerm->fill_surfaces->clear;
769 $layerm->fill_surfaces->append($_) for (@new, @other);
770
771 if ($SLIC3R_DEBUG_SLICE_PROCESSING) {
772 $layerm->export_region_fill_surfaces_to_svg_debug("6_clip_fill_surfaces");
773 }
774 }
775 }
776 }
777
778 sub discover_horizontal_shells {
779 my $self = shift;
780
781 Slic3r::debugf "==> DISCOVERING HORIZONTAL SHELLS\n";
782
783 for my $region_id (0 .. ($self->print->region_count-1)) {
784 for (my $i = 0; $i < $self->layer_count; $i++) {
785 my $layerm = $self->get_layer($i)->regions->[$region_id];
786
787 if ($layerm->region->config->solid_infill_every_layers && $layerm->region->config->fill_density > 0
788 && ($i % $layerm->region->config->solid_infill_every_layers) == 0) {
789 # This is the layer to put the sparse infill in. Mark S_TYPE_INTERNAL surfaces as S_TYPE_INTERNALSOLID or S_TYPE_INTERNALBRIDGE.
790 # If the sparse infill is not active, the internal surfaces are of type S_TYPE_INTERNAL.
791 my $type = $layerm->region->config->fill_density == 100 ? S_TYPE_INTERNALSOLID : S_TYPE_INTERNALBRIDGE;
792 $_->surface_type($type) for @{$layerm->fill_surfaces->filter_by_type(S_TYPE_INTERNAL)};
793 }
794
795 # If ensure_vertical_shell_thickness, then the rest has already been performed by discover_vertical_shells().
796 next if ($layerm->region->config->ensure_vertical_shell_thickness);
797
798 EXTERNAL: foreach my $type (S_TYPE_TOP, S_TYPE_BOTTOM, S_TYPE_BOTTOMBRIDGE) {
799 # find slices of current type for current layer
800 # use slices instead of fill_surfaces because they also include the perimeter area
801 # which needs to be propagated in shells; we need to grow slices like we did for
802 # fill_surfaces though. Using both ungrown slices and grown fill_surfaces will
803 # not work in some situations, as there won't be any grown region in the perimeter
804 # area (this was seen in a model where the top layer had one extra perimeter, thus
805 # its fill_surfaces were thinner than the lower layer's infill), however it's the best
806 # solution so far. Growing the external slices by EXTERNAL_INFILL_MARGIN will put
807 # too much solid infill inside nearly-vertical slopes.
808 my $solid = [
809 # Surfaces including the area of perimeters. Everything, that is visible from the top / bottom
810 # (not covered by a layer above / below).
811 # This does not contain the areas covered by perimeters!
812 (map $_->p, @{$layerm->slices->filter_by_type($type)}),
813 # Infill areas (slices without the perimeters).
814 (map $_->p, @{$layerm->fill_surfaces->filter_by_type($type)}),
815 ];
816 next if !@$solid;
817 Slic3r::debugf "Layer %d has %s surfaces\n", $i, ($type == S_TYPE_TOP) ? 'top' : 'bottom';
818
819 my $solid_layers = ($type == S_TYPE_TOP)
820 ? $layerm->region->config->top_solid_layers
821 : $layerm->region->config->bottom_solid_layers;
822 NEIGHBOR: for (my $n = ($type == S_TYPE_TOP) ? $i-1 : $i+1;
823 abs($n - $i) < $solid_layers;
824 ($type == S_TYPE_TOP) ? $n-- : $n++) {
825
826 next if $n < 0 || $n >= $self->layer_count;
827 Slic3r::debugf " looking for neighbors on layer %d...\n", $n;
828
829 # Reference to the lower layer of a TOP surface, or an upper layer of a BOTTOM surface.
830 my $neighbor_layerm = $self->get_layer($n)->regions->[$region_id];
831 # Reference to the neighbour fill surfaces.
832 my $neighbor_fill_surfaces = $neighbor_layerm->fill_surfaces;
833 # Clone because we will use these surfaces even after clearing the collection.
834 my @neighbor_fill_surfaces = map $_->clone, @$neighbor_fill_surfaces;
835
836 # find intersection between neighbor and current layer's surfaces
837 # intersections have contours and holes
838 # we update $solid so that we limit the next neighbor layer to the areas that were
839 # found on this one - in other words, solid shells on one layer (for a given external surface)
840 # are always a subset of the shells found on the previous shell layer
841 # this approach allows for DWIM in hollow sloping vases, where we want bottom
842 # shells to be generated in the base but not in the walls (where there are many
843 # narrow bottom surfaces): reassigning $solid will consider the 'shadow' of the
844 # upper perimeter as an obstacle and shell will not be propagated to more upper layers
845 #FIXME How does it work for S_TYPE_INTERNALBRIDGE? This is set for sparse infill. Likely this does not work.
846 my $new_internal_solid = $solid = intersection(
847 $solid,
848 [ map $_->p, grep { ($_->surface_type == S_TYPE_INTERNAL) || ($_->surface_type == S_TYPE_INTERNALSOLID) } @neighbor_fill_surfaces ],
849 1,
850 );
851 next EXTERNAL if !@$new_internal_solid;
852
853 if ($layerm->region->config->fill_density == 0) {
854 # if we're printing a hollow object we discard any solid shell thinner
855 # than a perimeter width, since it's probably just crossing a sloping wall
856 # and it's not wanted in a hollow print even if it would make sense when
857 # obeying the solid shell count option strictly (DWIM!)
858 my $margin = $neighbor_layerm->flow(FLOW_ROLE_EXTERNAL_PERIMETER)->scaled_width;
859 my $regularized = offset2($new_internal_solid, -$margin, +$margin, CLIPPER_OFFSET_SCALE, JT_MITER, 5);
860 my $too_narrow = diff(
861 $new_internal_solid,
862 $regularized,
863 1,
864 );
865 # Trim the regularized region by the original region.
866 $new_internal_solid = $solid = intersection(
867 $new_internal_solid,
868 $regularized,
869 ) if @$too_narrow;
870 }
871
872 # make sure the new internal solid is wide enough, as it might get collapsed
873 # when spacing is added in Fill.pm
874 if ($layerm->region->config->ensure_vertical_shell_thickness) {
875 # The possible thin sickles of top / bottom surfaces on steeply sloping surfaces touch
876 # the projections of top / bottom perimeters, therefore they will be sufficiently inflated by
877 # merging them with the projections of the top / bottom perimeters.
878 } else {
879 #FIXME Vojtech: Disable this and you will be sorry.
880 # https://github.com/prusa3d/Slic3r/issues/26 bottom
881 my $margin = 3 * $layerm->flow(FLOW_ROLE_SOLID_INFILL)->scaled_width; # require at least this size
882 # we use a higher miterLimit here to handle areas with acute angles
883 # in those cases, the default miterLimit would cut the corner and we'd
884 # get a triangle in $too_narrow; if we grow it below then the shell
885 # would have a different shape from the external surface and we'd still
886 # have the same angle, so the next shell would be grown even more and so on.
887 my $too_narrow = diff(
888 $new_internal_solid,
889 offset2($new_internal_solid, -$margin, +$margin, CLIPPER_OFFSET_SCALE, JT_MITER, 5),
890 1,
891 );
892
893 if (@$too_narrow) {
894 # grow the collapsing parts and add the extra area to the neighbor layer
895 # as well as to our original surfaces so that we support this
896 # additional area in the next shell too
897
898 # make sure our grown surfaces don't exceed the fill area
899 my @grown = @{intersection(
900 offset($too_narrow, +$margin),
901 # Discard bridges as they are grown for anchoring and we can't
902 # remove such anchors. (This may happen when a bridge is being
903 # anchored onto a wall where little space remains after the bridge
904 # is grown, and that little space is an internal solid shell so
905 # it triggers this too_narrow logic.)
906 [ map $_->p, grep { $_->is_internal && !$_->is_bridge } @neighbor_fill_surfaces ],
907 )};
908 $new_internal_solid = $solid = [ @grown, @$new_internal_solid ];
909 }
910 }
911
912 # internal-solid are the union of the existing internal-solid surfaces
913 # and new ones
914 my $internal_solid = union_ex([
915 ( map $_->p, grep $_->surface_type == S_TYPE_INTERNALSOLID, @neighbor_fill_surfaces ),
916 @$new_internal_solid,
917 ]);
918
919 # subtract intersections from layer surfaces to get resulting internal surfaces
920 my $internal = diff_ex(
921 [ map $_->p, grep $_->surface_type == S_TYPE_INTERNAL, @neighbor_fill_surfaces ],
922 [ map @$_, @$internal_solid ],
923 1,
924 );
925 Slic3r::debugf " %d internal-solid and %d internal surfaces found\n",
926 scalar(@$internal_solid), scalar(@$internal);
927
928 # assign resulting internal surfaces to layer
929 $neighbor_fill_surfaces->clear;
930 $neighbor_fill_surfaces->append($_)
931 for map Slic3r::Surface->new(expolygon => $_, surface_type => S_TYPE_INTERNAL),
932 @$internal;
933
934 # assign new internal-solid surfaces to layer
935 $neighbor_fill_surfaces->append($_)
936 for map Slic3r::Surface->new(expolygon => $_, surface_type => S_TYPE_INTERNALSOLID),
937 @$internal_solid;
938
939 # assign top and bottom surfaces to layer
940 foreach my $s (@{Slic3r::Surface::Collection->new(grep { ($_->surface_type == S_TYPE_TOP) || $_->is_bottom } @neighbor_fill_surfaces)->group}) {
941 my $solid_surfaces = diff_ex(
942 [ map $_->p, @$s ],
943 [ map @$_, @$internal_solid, @$internal ],
944 1,
945 );
946 $neighbor_fill_surfaces->append($_)
947 for map $s->[0]->clone(expolygon => $_), @$solid_surfaces;
948 }
949 }
950 } # foreach my $type (S_TYPE_TOP, S_TYPE_BOTTOM, S_TYPE_BOTTOMBRIDGE)
951 } # for each layer
952 } # for each region
953
954 # Debugging output.
955 if ($SLIC3R_DEBUG_SLICE_PROCESSING) {
956 for my $region_id (0 .. ($self->print->region_count-1)) {
957 for (my $i = 0; $i < $self->layer_count; $i++) {
958 my $layerm = $self->get_layer($i)->regions->[$region_id];
959 $layerm->export_region_slices_to_svg_debug("5_discover_horizontal_shells");
960 $layerm->export_region_fill_surfaces_to_svg_debug("5_discover_horizontal_shells");
961 } # for each layer
962 } # for each region
963 }
964 }
965
966 # combine fill surfaces across layers to honor the "infill every N layers" option
967 # Idempotence of this method is guaranteed by the fact that we don't remove things from
968 # fill_surfaces but we only turn them into VOID surfaces, thus preserving the boundaries.
969 sub combine_infill {
970 my $self = shift;
971
972 # define the type used for voids
973 my %voidtype = (
974 &S_TYPE_INTERNAL() => S_TYPE_INTERNALVOID,
975 );
976
977 # work on each region separately
978 for my $region_id (0 .. ($self->print->region_count-1)) {
979 my $region = $self->print->get_region($region_id);
980 my $every = $region->config->infill_every_layers;
981 next unless $every > 1 && $region->config->fill_density > 0;
982
983 # limit the number of combined layers to the maximum height allowed by this regions' nozzle
984 my $nozzle_diameter = min(
985 $self->print->config->get_at('nozzle_diameter', $region->config->infill_extruder-1),
986 $self->print->config->get_at('nozzle_diameter', $region->config->solid_infill_extruder-1),
987 );
988
989 # define the combinations
990 my %combine = (); # layer_idx => number of additional combined lower layers
991 {
992 my $current_height = my $layers = 0;
993 for my $layer_idx (0 .. ($self->layer_count-1)) {
994 my $layer = $self->get_layer($layer_idx);
995 next if $layer->id == 0; # skip first print layer (which may not be first layer in array because of raft)
996 my $height = $layer->height;
997
998 # check whether the combination of this layer with the lower layers' buffer
999 # would exceed max layer height or max combined layer count
1000 if ($current_height + $height >= $nozzle_diameter + epsilon || $layers >= $every) {
1001 # append combination to lower layer
1002 $combine{$layer_idx-1} = $layers;
1003 $current_height = $layers = 0;
1004 }
1005
1006 $current_height += $height;
1007 $layers++;
1008 }
1009
1010 # append lower layers (if any) to uppermost layer
1011 $combine{$self->layer_count-1} = $layers;
1012 }
1013
1014 # loop through layers to which we have assigned layers to combine
1015 for my $layer_idx (sort keys %combine) {
1016 next unless $combine{$layer_idx} > 1;
1017
1018 # get all the LayerRegion objects to be combined
1019 my @layerms = map $self->get_layer($_)->get_region($region_id),
1020 ($layer_idx - ($combine{$layer_idx}-1) .. $layer_idx);
1021
1022 # only combine internal infill
1023 for my $type (S_TYPE_INTERNAL) {
1024 # we need to perform a multi-layer intersection, so let's split it in pairs
1025
1026 # initialize the intersection with the candidates of the lowest layer
1027 my $intersection = [ map $_->expolygon, @{$layerms[0]->fill_surfaces->filter_by_type($type)} ];
1028
1029 # start looping from the second layer and intersect the current intersection with it
1030 for my $layerm (@layerms[1 .. $#layerms]) {
1031 $intersection = intersection_ex(
1032 [ map @$_, @$intersection ],
1033 [ map @{$_->expolygon}, @{$layerm->fill_surfaces->filter_by_type($type)} ],
1034 );
1035 }
1036
1037 my $area_threshold = $layerms[0]->infill_area_threshold;
1038 @$intersection = grep $_->area > $area_threshold, @$intersection;
1039 next if !@$intersection;
1040 Slic3r::debugf " combining %d %s regions from layers %d-%d\n",
1041 scalar(@$intersection),
1042 ($type == S_TYPE_INTERNAL ? 'internal' : 'internal-solid'),
1043 $layer_idx-($every-1), $layer_idx;
1044
1045 # $intersection now contains the regions that can be combined across the full amount of layers
1046 # so let's remove those areas from all layers
1047
1048 my @intersection_with_clearance = map @{$_->offset(
1049 $layerms[-1]->flow(FLOW_ROLE_SOLID_INFILL)->scaled_width / 2
1050 + $layerms[-1]->flow(FLOW_ROLE_PERIMETER)->scaled_width / 2
1051 # Because fill areas for rectilinear and honeycomb are grown
1052 # later to overlap perimeters, we need to counteract that too.
1053 + (($type == S_TYPE_INTERNALSOLID || $region->config->fill_pattern =~ /(rectilinear|grid|line|honeycomb)/)
1054 ? $layerms[-1]->flow(FLOW_ROLE_SOLID_INFILL)->scaled_width
1055 : 0)
1056 )}, @$intersection;
1057
1058
1059 foreach my $layerm (@layerms) {
1060 my @this_type = @{$layerm->fill_surfaces->filter_by_type($type)};
1061 my @other_types = map $_->clone, grep $_->surface_type != $type, @{$layerm->fill_surfaces};
1062
1063 my @new_this_type = map Slic3r::Surface->new(expolygon => $_, surface_type => $type),
1064 @{diff_ex(
1065 [ map $_->p, @this_type ],
1066 [ @intersection_with_clearance ],
1067 )};
1068
1069 # apply surfaces back with adjusted depth to the uppermost layer
1070 if ($layerm->layer->id == $self->get_layer($layer_idx)->id) {
1071 push @new_this_type,
1072 map Slic3r::Surface->new(
1073 expolygon => $_,
1074 surface_type => $type,
1075 thickness => sum(map $_->layer->height, @layerms),
1076 thickness_layers => scalar(@layerms),
1077 ),
1078 @$intersection;
1079 } else {
1080 # save void surfaces
1081 push @new_this_type,
1082 map Slic3r::Surface->new(expolygon => $_, surface_type => $voidtype{$type}),
1083 @{intersection_ex(
1084 [ map @{$_->expolygon}, @this_type ],
1085 [ @intersection_with_clearance ],
1086 )};
1087 }
1088
1089 $layerm->fill_surfaces->clear;
1090 $layerm->fill_surfaces->append($_) for (@new_this_type, @other_types);
1091 }
1092 }
1093 }
1094 }
1095 }
1096
1097 # Simplify the sliced model, if "resolution" configuration parameter > 0.
1098 # The simplification is problematic, because it simplifies the slices independent from each other,
1099 # which makes the simplified discretization visible on the object surface.
1100 sub _simplify_slices {
1101 my ($self, $distance) = @_;
1102
1103 foreach my $layer (@{$self->layers}) {
1104 $layer->slices->simplify($distance);
1105 $_->slices->simplify($distance) for @{$layer->regions};
1106 }
1107 }
1108
1109 sub support_material_flow {
1110 my ($self, $role) = @_;
1111
1112 $role //= FLOW_ROLE_SUPPORT_MATERIAL;
1113 my $extruder = ($role == FLOW_ROLE_SUPPORT_MATERIAL)
1114 ? $self->config->support_material_extruder
1115 : $self->config->support_material_interface_extruder;
1116
1117 # we use a bogus layer_height because we use the same flow for all
1118 # support material layers
1119 return Slic3r::Flow->new_from_width(
1120 width => $self->config->support_material_extrusion_width || $self->config->extrusion_width,
1121 role => $role,
1122 nozzle_diameter => $self->print->config->nozzle_diameter->[$extruder-1] // $self->print->config->nozzle_diameter->[0],
1123 layer_height => $self->config->layer_height,
1124 bridge_flow_ratio => 0,
1125 );
1126 }
1127
1128 1;
0 # A simple wrapper to quickly print a single model without a GUI.
1 # Used by the command line slic3r.pl, by command line utilities pdf-slic3s.pl and view-toolpaths.pl,
2 # and by the quick slice menu of the Slic3r GUI.
3 #
4 # It creates and owns an instance of Slic3r::Print to perform the slicing
5 # and it accepts an instance of Slic3r::Model from the outside.
6
7 package Slic3r::Print::Simple;
8 use Moo;
9
10 use Slic3r::Geometry qw(X Y);
11
12 has '_print' => (
13 is => 'ro',
14 default => sub { Slic3r::Print->new },
15 handles => [qw(apply_config extruders expanded_output_filepath
16 total_used_filament total_extruded_volume
17 placeholder_parser process)],
18 );
19
20 has 'duplicate' => (
21 is => 'rw',
22 default => sub { 1 },
23 );
24
25 has 'scale' => (
26 is => 'rw',
27 default => sub { 1 },
28 );
29
30 has 'rotate' => (
31 is => 'rw',
32 default => sub { 0 },
33 );
34
35 has 'duplicate_grid' => (
36 is => 'rw',
37 default => sub { [1,1] },
38 );
39
40 has 'status_cb' => (
41 is => 'rw',
42 default => sub { sub {} },
43 );
44
45 has 'print_center' => (
46 is => 'rw',
47 default => sub { Slic3r::Pointf->new(100,100) },
48 );
49
50 has 'dont_arrange' => (
51 is => 'rw',
52 default => sub { 0 },
53 );
54
55 has 'output_file' => (
56 is => 'rw',
57 );
58
59 sub set_model {
60 # $model is of type Slic3r::Model
61 my ($self, $model) = @_;
62
63 # make method idempotent so that the object is reusable
64 $self->_print->clear_objects;
65
66 # make sure all objects have at least one defined instance
67 my $need_arrange = $model->add_default_instances && ! $self->dont_arrange;
68
69 # apply scaling and rotation supplied from command line if any
70 foreach my $instance (map @{$_->instances}, @{$model->objects}) {
71 $instance->set_scaling_factor($instance->scaling_factor * $self->scale);
72 $instance->set_rotation($instance->rotation + $self->rotate);
73 }
74
75 if ($self->duplicate_grid->[X] > 1 || $self->duplicate_grid->[Y] > 1) {
76 $model->duplicate_objects_grid($self->duplicate_grid->[X], $self->duplicate_grid->[Y], $self->_print->config->duplicate_distance);
77 } elsif ($need_arrange) {
78 $model->duplicate_objects($self->duplicate, $self->_print->config->min_object_distance);
79 } elsif ($self->duplicate > 1) {
80 # if all input objects have defined position(s) apply duplication to the whole model
81 $model->duplicate($self->duplicate, $self->_print->config->min_object_distance);
82 }
83 $_->translate(0,0,-$_->bounding_box->z_min) for @{$model->objects};
84 $model->center_instances_around_point($self->print_center) if (! $self->dont_arrange);
85
86 foreach my $model_object (@{$model->objects}) {
87 $self->_print->auto_assign_extruders($model_object);
88 $self->_print->add_model_object($model_object);
89 }
90 }
91
92 sub _before_export {
93 my ($self) = @_;
94
95 $self->_print->set_status_cb($self->status_cb);
96 $self->_print->validate;
97 }
98
99 sub _after_export {
100 my ($self) = @_;
101
102 $self->_print->set_status_cb(undef);
103 }
104
105 sub export_gcode {
106 my ($self) = @_;
107
108 $self->_before_export;
109 $self->_print->export_gcode(output_file => $self->output_file);
110 $self->_after_export;
111 }
112
113 sub export_svg {
114 my ($self) = @_;
115
116 $self->_before_export;
117
118 $self->_print->export_svg(output_file => $self->output_file);
119
120 $self->_after_export;
121 }
122
123 1;
0 # Wraps C++ enums Slic3r::PrintStep and Slic3r::PrintObjectStep
1 package Slic3r::Print::State;
2 use strict;
3 use warnings;
4
5 require Exporter;
6 our @ISA = qw(Exporter);
7 our @EXPORT_OK = qw(STEP_SLICE STEP_PERIMETERS STEP_PREPARE_INFILL
8 STEP_INFILL STEP_SUPPORTMATERIAL STEP_SKIRT STEP_BRIM);
9 our %EXPORT_TAGS = (steps => \@EXPORT_OK);
10
11 1;
0 # Instantiated by Slic3r::Print::Object->_support_material()
1 # only generate() and contact_distance() are called from the outside of this module.
2 package Slic3r::Print::SupportMaterial;
3 use Moo;
4
5 use List::Util qw(sum min max);
6 use Slic3r::ExtrusionPath ':roles';
7 use Slic3r::Flow ':roles';
8 use Slic3r::Geometry qw(epsilon scale scaled_epsilon PI rad2deg deg2rad convex_hull);
9 use Slic3r::Geometry::Clipper qw(offset diff union union_ex intersection offset_ex offset2
10 intersection_pl offset2_ex diff_pl CLIPPER_OFFSET_SCALE JT_MITER JT_ROUND);
11 use Slic3r::Surface ':types';
12
13 has 'print_config' => (is => 'rw', required => 1);
14 has 'object_config' => (is => 'rw', required => 1);
15 has 'flow' => (is => 'rw', required => 1);
16 has 'first_layer_flow' => (is => 'rw', required => 1);
17 has 'interface_flow' => (is => 'rw', required => 1);
18
19 use constant DEBUG_CONTACT_ONLY => 0;
20
21 # increment used to reach MARGIN in steps to avoid trespassing thin objects
22 use constant MARGIN_STEP => MARGIN/3;
23
24 # generate a tree-like structure to save material
25 use constant PILLAR_SIZE => 2.5;
26 use constant PILLAR_SPACING => 10;
27
28 sub generate {
29 # $object is Slic3r::Print::Object
30 my ($self, $object) = @_;
31
32 # Determine the top surfaces of the support, defined as:
33 # contact = overhangs - clearance + margin
34 # This method is responsible for identifying what contact surfaces
35 # should the support material expose to the object in order to guarantee
36 # that it will be effective, regardless of how it's built below.
37 my ($contact, $overhang) = $self->contact_area($object);
38
39 # Determine the top surfaces of the object. We need these to determine
40 # the layer heights of support material and to clip support to the object
41 # silhouette.
42 my ($top) = $self->object_top($object, $contact);
43
44 # We now know the upper and lower boundaries for our support material object
45 # (@$contact_z and @$top_z), so we can generate intermediate layers.
46 my $support_z = $self->support_layers_z(
47 [ sort keys %$contact ],
48 [ sort keys %$top ],
49 max(map $_->height, @{$object->layers})
50 );
51
52 # If we wanted to apply some special logic to the first support layers lying on
53 # object's top surfaces this is the place to detect them
54
55 my $shape = [];
56 if ($self->object_config->support_material_pattern eq 'pillars') {
57 $self->generate_pillars_shape($contact, $support_z, $shape);
58 }
59
60 # Propagate contact layers downwards to generate interface layers
61 my ($interface) = $self->generate_top_interface_layers($support_z, $contact, $top);
62 $self->clip_with_object($interface, $support_z, $object);
63 $self->clip_with_shape($interface, $shape) if @$shape;
64
65 # Propagate contact layers and interface layers downwards to generate
66 # the main support layers.
67 my ($base) = $self->generate_base_layers($support_z, $contact, $interface, $top);
68 $self->clip_with_object($base, $support_z, $object);
69 $self->clip_with_shape($base, $shape) if @$shape;
70
71 # Detect what part of base support layers are "reverse interfaces" because they
72 # lie above object's top surfaces.
73 $self->generate_bottom_interface_layers($support_z, $base, $top, $interface);
74
75 # Install support layers into object.
76 for my $i (0 .. $#$support_z) {
77 $object->add_support_layer(
78 $i, # id
79 ($i == 0) ? $support_z->[$i] : ($support_z->[$i] - $support_z->[$i-1]), # height
80 $support_z->[$i], # print_z
81 );
82 if ($i >= 1) {
83 $object->support_layers->[-2]->set_upper_layer($object->support_layers->[-1]);
84 $object->support_layers->[-1]->set_lower_layer($object->support_layers->[-2]);
85 }
86 }
87
88 # Generate the actual toolpaths and save them into each layer.
89 $self->generate_toolpaths($object, $overhang, $contact, $interface, $base);
90 }
91
92 sub contact_area {
93 # $object is Slic3r::Print::Object
94 my ($self, $object) = @_;
95
96 # if user specified a custom angle threshold, convert it to radians
97 my $threshold_rad;
98 if ($self->object_config->support_material_threshold) {
99 $threshold_rad = deg2rad($self->object_config->support_material_threshold + 1); # +1 makes the threshold inclusive
100 Slic3r::debugf "Threshold angle = %d°\n", rad2deg($threshold_rad);
101 }
102
103 # Build support on a build plate only? If so, then collect top surfaces into $buildplate_only_top_surfaces
104 # and subtract $buildplate_only_top_surfaces from the contact surfaces, so
105 # there is no contact surface supported by a top surface.
106 my $buildplate_only = $self->object_config->support_material && $self->object_config->support_material_buildplate_only;
107 my $buildplate_only_top_surfaces = [];
108
109 # determine contact areas
110 my %contact = (); # contact_z => [ polygons ]
111 my %overhang = (); # contact_z => [ polygons ] - this stores the actual overhang supported by each contact layer
112 for my $layer_id (0 .. $#{$object->layers}) {
113 # note $layer_id might != $layer->id when raft_layers > 0
114 # so $layer_id == 0 means first object layer
115 # and $layer->id == 0 means first print layer (including raft)
116
117 if ($self->object_config->raft_layers == 0) {
118 next if $layer_id == 0;
119 } elsif (!$self->object_config->support_material) {
120 # if we are only going to generate raft just check
121 # the 'overhangs' of the first object layer
122 last if $layer_id > 0;
123 }
124 my $layer = $object->get_layer($layer_id);
125
126 if ($buildplate_only) {
127 # Collect the top surfaces up to this layer and merge them.
128 my $projection_new = [];
129 push @$projection_new, ( map $_->p, map @{$_->slices->filter_by_type(S_TYPE_TOP)}, @{$layer->regions} );
130 if (@$projection_new) {
131 # Merge the new top surfaces with the preceding top surfaces.
132 # Apply the safety offset to the newly added polygons, so they will connect
133 # with the polygons collected before,
134 # but don't apply the safety offset during the union operation as it would
135 # inflate the polygons over and over.
136 push @$buildplate_only_top_surfaces, @{ offset($projection_new, scale(0.01)) };
137 $buildplate_only_top_surfaces = union($buildplate_only_top_surfaces, 0);
138 }
139 }
140
141 # detect overhangs and contact areas needed to support them
142 my (@overhang, @contact) = ();
143 if ($layer_id == 0) {
144 # this is the first object layer, so we're here just to get the object
145 # footprint for the raft
146 # we only consider contours and discard holes to get a more continuous raft
147 push @overhang, map $_->clone, map $_->contour, @{$layer->slices};
148 # Extend by SUPPORT_MATERIAL_MARGIN, which is 1.5mm
149 # MARGIN is the C++ Slic3r::SUPPORT_MATERIAL_MARGIN constant.
150 push @contact, @{offset(\@overhang, scale +MARGIN)};
151 } else {
152 my $lower_layer = $object->get_layer($layer_id-1);
153 foreach my $layerm (@{$layer->regions}) {
154 # Extrusion width accounts for the roundings of the extrudates.
155 # It is the maximum widh of the extrudate.
156 my $fw = $layerm->flow(FLOW_ROLE_EXTERNAL_PERIMETER)->scaled_width;
157 my $diff;
158
159 # If a threshold angle was specified, use a different logic for detecting overhangs.
160 if (defined $threshold_rad
161 || $layer_id < $self->object_config->support_material_enforce_layers
162 || ($self->object_config->raft_layers > 0 && $layer_id == 0)) {
163 my $d = defined $threshold_rad
164 ? scale $lower_layer->height * ((cos $threshold_rad) / (sin $threshold_rad))
165 : 0;
166
167 # Shrinking the supported layer by layer_height/atan(threshold_rad).
168 $diff = diff(
169 offset([ map $_->p, @{$layerm->slices} ], -$d),
170 [ map @$_, @{$lower_layer->slices} ],
171 );
172
173 # only enforce spacing from the object ($fw/2) if the threshold angle
174 # is not too high: in that case, $d will be very small (as we need to catch
175 # very short overhangs), and such contact area would be eaten by the
176 # enforced spacing, resulting in high threshold angles to be almost ignored
177 $diff = diff(
178 offset($diff, $d - $fw/2),
179 [ map @$_, @{$lower_layer->slices} ],
180 ) if $d > $fw/2;
181 } else {
182 # Automatic overhang detection.
183 $diff = diff(
184 [ map $_->p, @{$layerm->slices} ],
185 offset([ map @$_, @{$lower_layer->slices} ],
186 #FIXME Vojtech: Why 2x extrusion width? Isn't this too much? Should it not be /2?
187 +$fw/2),
188 );
189
190 # collapse very tiny spots
191 $diff = offset2($diff, -$fw/10, +$fw/10);
192
193 # $diff now contains the ring or stripe comprised between the boundary of
194 # lower slices and the centerline of the last perimeter in this overhanging layer.
195 # Void $diff means that there's no upper perimeter whose centerline is
196 # outside the lower slice boundary, thus no overhang
197 }
198
199 if ($self->object_config->dont_support_bridges) {
200 # compute the area of bridging perimeters
201 # Note: this is duplicate code from GCode.pm, we need to refactor
202
203 my $bridged_perimeters; # Polygons
204 {
205 my $bridge_flow = $layerm->flow(FLOW_ROLE_PERIMETER, 1);
206
207 my $nozzle_diameter = $self->print_config->get_at('nozzle_diameter', $layerm->region->config->perimeter_extruder-1);
208 my $lower_grown_slices = offset([ map @$_, @{$lower_layer->slices} ], +scale($nozzle_diameter/2));
209
210 # TODO: split_at_first_point() could split a bridge mid-way
211 my @overhang_perimeters =
212 map { $_->isa('Slic3r::ExtrusionLoop') ? $_->polygon->split_at_first_point : $_->polyline->clone }
213 map @$_, @{$layerm->perimeters};
214
215 # workaround for Clipper bug, see Slic3r::Polygon::clip_as_polyline()
216 $_->[0]->translate(1,0) for @overhang_perimeters;
217 @overhang_perimeters = @{diff_pl(
218 \@overhang_perimeters,
219 $lower_grown_slices,
220 )};
221
222 # only consider straight overhangs
223 @overhang_perimeters = grep $_->is_straight, @overhang_perimeters;
224
225 # only consider overhangs having endpoints inside layer's slices
226 foreach my $polyline (@overhang_perimeters) {
227 $polyline->extend_start($fw);
228 $polyline->extend_end($fw);
229 }
230 @overhang_perimeters = grep {
231 $layer->slices->contains_point($_->first_point) && $layer->slices->contains_point($_->last_point)
232 } @overhang_perimeters;
233
234 # convert bridging polylines into polygons by inflating them with their thickness
235 {
236 # since we're dealing with bridges, we can't assume width is larger than spacing,
237 # so we take the largest value and also apply safety offset to be ensure no gaps
238 # are left in between
239 my $w = max($bridge_flow->scaled_width, $bridge_flow->scaled_spacing);
240 $bridged_perimeters = union([
241 map @{$_->grow($w/2 + 10)}, @overhang_perimeters
242 ]);
243 }
244 }
245
246 if (1) {
247 # remove the entire bridges and only support the unsupported edges
248 my @bridges = map $_->expolygon,
249 grep $_->bridge_angle != -1,
250 @{$layerm->fill_surfaces->filter_by_type(S_TYPE_BOTTOMBRIDGE)};
251
252 $diff = diff(
253 $diff,
254 [
255 (map @$_, @bridges),
256 @$bridged_perimeters,
257 ],
258 1,
259 );
260
261 push @$diff, @{intersection(
262 [ map @{$_->grow(+scale MARGIN)}, @{$layerm->unsupported_bridge_edges} ],
263 [ map @$_, @bridges ],
264 )};
265
266 } else {
267 # just remove bridged areas
268 $diff = diff(
269 $diff,
270 $layerm->bridged,
271 1,
272 );
273 }
274 } # if ($self->object_config->dont_support_bridges)
275
276 if ($buildplate_only) {
277 # Don't support overhangs above the top surfaces.
278 # This step is done before the contact surface is calcuated by growing the overhang region.
279 $diff = diff($diff, $buildplate_only_top_surfaces);
280 }
281
282 next if !@$diff;
283 push @overhang, @$diff; # NOTE: this is not the full overhang as it misses the outermost half of the perimeter width!
284
285 # Let's define the required contact area by using a max gap of half the upper
286 # extrusion width and extending the area according to the configured margin.
287 # We increment the area in steps because we don't want our support to overflow
288 # on the other side of the object (if it's very thin).
289 {
290 my $slices_margin = offset([ map @$_, @{$lower_layer->slices} ], +$fw/2);
291 if ($buildplate_only) {
292 # Trim the inflated contact surfaces by the top surfaces as well.
293 push @$slices_margin, map $_->clone, @{$buildplate_only_top_surfaces};
294 $slices_margin = union($slices_margin);
295 }
296 for ($fw/2, map {scale MARGIN_STEP} 1..(MARGIN / MARGIN_STEP)) {
297 $diff = diff(
298 offset(
299 $diff,
300 $_,
301 CLIPPER_OFFSET_SCALE,
302 JT_ROUND,
303 scale(0.05)*CLIPPER_OFFSET_SCALE),
304 $slices_margin
305 );
306 }
307 }
308 push @contact, @$diff;
309 }
310 }
311 next if !@contact;
312
313 # now apply the contact areas to the layer were they need to be made
314 {
315 # get the average nozzle diameter used on this layer
316 my @nozzle_diameters = map $self->print_config->get_at('nozzle_diameter', $_),
317 map { $_->config->perimeter_extruder-1, $_->config->infill_extruder-1, $_->config->solid_infill_extruder-1 }
318 map $_->region, @{$layer->regions};
319 my $nozzle_diameter = sum(@nozzle_diameters)/@nozzle_diameters;
320
321 my $contact_z = $layer->print_z - $self->contact_distance($layer->height, $nozzle_diameter);
322
323 # Ignore this contact area if it's too low.
324 #FIXME Better to control the thickness of the interface layer printed, but that would
325 # require having attributes (extrusion width / height, bridge flow etc) per island.
326 next if $contact_z < $self->object_config->get_value('first_layer_height') - epsilon;
327
328 $contact{$contact_z} = [ @contact ];
329 $overhang{$contact_z} = [ @overhang ];
330
331 if (0) {
332 require "Slic3r/SVG.pm";
333 Slic3r::SVG::output(Slic3r::DEBUG_OUT_PATH_PREFIX . "contact_" . $contact_z . ".svg",
334 green_expolygons => union_ex($buildplate_only_top_surfaces),
335 blue_expolygons => union_ex(\@contact),
336 red_expolygons => union_ex(\@overhang),
337 );
338 }
339 }
340 }
341
342 return (\%contact, \%overhang);
343 }
344
345 sub object_top {
346 my ($self, $object, $contact) = @_;
347
348 # find object top surfaces
349 # we'll use them to clip our support and detect where does it stick
350 my %top = (); # print_z => [ expolygons ]
351 return \%top if ($self->object_config->support_material_buildplate_only);
352
353 # Sum of unsupported contact areas above the current $layer->print_z.
354 my $projection = [];
355 foreach my $layer (reverse @{$object->layers}) {
356 if (my @top = map @{$_->slices->filter_by_type(S_TYPE_TOP)}, @{$layer->regions}) {
357 # compute projection of the contact areas above this top layer
358 # first add all the 'new' contact areas to the current projection
359 # ('new' means all the areas that are lower than the last top layer
360 # we considered)
361 my $min_top = min(keys %top) // max(keys %$contact);
362 # use <= instead of just < because otherwise we'd ignore any contact regions
363 # having the same Z of top layers
364 push @$projection, map @{$contact->{$_}}, grep { $_ > $layer->print_z && $_ <= $min_top } keys %$contact;
365
366 # Now find whether any projection of the contact surfaces above $layer->print_z not yet supported by any top surfaces above $layer->z falls onto this top surface.
367 # $touching are the contact surfaces supported exclusively by this @top surfaaces.
368 my $touching = intersection($projection, [ map $_->p, @top ]);
369 if (@$touching) {
370 # grow top surfaces so that interface and support generation are generated
371 # with some spacing from object - it looks we don't need the actual
372 # top shapes so this can be done here
373 $top{ $layer->print_z } = offset($touching, $self->flow->scaled_width);
374 }
375
376 # remove the areas that touched from the projection that will continue on
377 # next, lower, top surfaces
378 $projection = diff($projection, $touching);
379 }
380 }
381
382 return \%top;
383 }
384
385 sub support_layers_z {
386 my ($self, $contact_z, $top_z, $max_object_layer_height) = @_;
387
388 # quick table to check whether a given Z is a top surface
389 my %top = map { $_ => 1 } @$top_z;
390
391 # determine layer height for any non-contact layer
392 # we use max() to prevent many ultra-thin layers to be inserted in case
393 # layer_height > nozzle_diameter * 0.75
394 my $nozzle_diameter = $self->print_config->get_at('nozzle_diameter', $self->object_config->support_material_extruder-1);
395 my $support_material_height = max($max_object_layer_height, $nozzle_diameter * 0.75);
396 my $contact_distance = $self->contact_distance($support_material_height, $nozzle_diameter);
397
398 # initialize known, fixed, support layers
399 my @z = sort { $a <=> $b }
400 @$contact_z,
401 # TODO: why we have this?
402 # Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z.
403 @$top_z,
404 # Top surfaces of the bottom interface layers.
405 (map $_ + $contact_distance, @$top_z);
406
407 # enforce first layer height
408 my $first_layer_height = $self->object_config->get_value('first_layer_height');
409 shift @z while @z && $z[0] <= $first_layer_height;
410 unshift @z, $first_layer_height;
411
412 # add raft layers by dividing the space between first layer and
413 # first contact layer evenly
414 if ($self->object_config->raft_layers > 1 && @z >= 2) {
415 # $z[1] is last raft layer (contact layer for the first layer object)
416 my $height = ($z[1] - $z[0]) / ($self->object_config->raft_layers - 1);
417 # since we already have two raft layers ($z[0] and $z[1]) we need to insert
418 # raft_layers-2 more
419 splice @z, 1, 0,
420 map { sprintf "%.2f", $_ }
421 map { $z[0] + $height * $_ }
422 1..($self->object_config->raft_layers - 2);
423 }
424
425 # create other layers (skip raft layers as they're already done and use thicker layers)
426 for (my $i = $#z; $i >= $self->object_config->raft_layers; $i--) {
427 my $target_height = $support_material_height;
428 if ($i > 0 && $top{ $z[$i-1] }) {
429 # Bridge flow?
430 #FIXME We want to enforce not only the bridge flow height, but also the interface gap!
431 # This will introduce an additional layer if the gap is set to an extreme value!
432 $target_height = $nozzle_diameter;
433 }
434
435 # enforce first layer height
436 #FIXME better to split the layers regularly, than to bite a constant height one at a time,
437 # and then be left with a very thin layer at the end.
438 if (($i == 0 && $z[$i] > $target_height + $first_layer_height)
439 || ($z[$i] - $z[$i-1] > $target_height + Slic3r::Geometry::epsilon)) {
440 splice @z, $i, 0, ($z[$i] - $target_height);
441 $i++;
442 }
443 }
444
445 # remove duplicates and make sure all 0.x values have the leading 0
446 {
447 my %sl = map { 1 * $_ => 1 } @z;
448 @z = sort { $a <=> $b } keys %sl;
449 }
450
451 return \@z;
452 }
453
454 sub generate_top_interface_layers {
455 my ($self, $support_z, $contact, $top) = @_;
456
457 # If no interface layers are allowed, don't generate top interface layers.
458 return if $self->object_config->support_material_interface_layers == 0;
459
460 # let's now generate interface layers below contact areas
461 my %interface = (); # layer_id => [ polygons ]
462 my $interface_layers_num = $self->object_config->support_material_interface_layers;
463 for my $layer_id (0 .. $#$support_z) {
464 my $z = $support_z->[$layer_id];
465 my $this = $contact->{$z} // next;
466
467 # count contact layer as interface layer
468 for (my $i = $layer_id-1; $i >= 0 && $i > $layer_id-$interface_layers_num; $i--) {
469 $z = $support_z->[$i];
470 my @overlapping_layers = $self->overlapping_layers($i, $support_z);
471 my @overlapping_z = map $support_z->[$_], @overlapping_layers;
472
473 # Compute interface area on this layer as diff of upper contact area
474 # (or upper interface area) and layer slices.
475 # This diff is responsible of the contact between support material and
476 # the top surfaces of the object. We should probably offset the top
477 # surfaces vertically before performing the diff, but this needs
478 # investigation.
479 $this = $interface{$i} = diff(
480 [
481 @$this, # clipped projection of the current contact regions
482 @{ $interface{$i} || [] }, # interface regions already applied to this layer
483 ],
484 [
485 (map @$_, map $top->{$_}, grep exists $top->{$_}, @overlapping_z), # top slices on this layer
486 (map @$_, map $contact->{$_}, grep exists $contact->{$_}, @overlapping_z), # contact regions on this layer
487 ],
488 1,
489 );
490 }
491 }
492
493 return \%interface;
494 }
495
496 sub generate_bottom_interface_layers {
497 my ($self, $support_z, $base, $top, $interface) = @_;
498
499 # If no interface layers are allowed, don't generate bottom interface layers.
500 return if $self->object_config->support_material_interface_layers == 0;
501
502 my $area_threshold = $self->interface_flow->scaled_spacing ** 2;
503
504 # loop through object's top surfaces
505 foreach my $top_z (sort keys %$top) {
506 my $this = $top->{$top_z};
507
508 # keep a count of the interface layers we generated for this top surface
509 my $interface_layers = 0;
510
511 # loop through support layers until we find the one(s) right above the top
512 # surface
513 foreach my $layer_id (0 .. $#$support_z) {
514 my $z = $support_z->[$layer_id];
515 next unless $z > $top_z;
516
517 if ($base->{$layer_id}) {
518 # get the support material area that should be considered interface
519 my $interface_area = intersection(
520 $base->{$layer_id},
521 $this,
522 );
523
524 # discard too small areas
525 $interface_area = [ grep abs($_->area) >= $area_threshold, @$interface_area ];
526
527 # subtract new interface area from base
528 $base->{$layer_id} = diff(
529 $base->{$layer_id},
530 $interface_area,
531 );
532
533 # add new interface area to interface
534 push @{$interface->{$layer_id}}, @$interface_area;
535 }
536
537 $interface_layers++;
538 last if $interface_layers == $self->object_config->support_material_interface_layers;
539 }
540 }
541 }
542
543 sub generate_base_layers {
544 my ($self, $support_z, $contact, $interface, $top) = @_;
545
546 # let's now generate support layers under interface layers
547 my $base = {}; # layer_id => [ polygons ]
548 {
549 my $fillet_radius_scaled = scale($self->object_config->support_material_spacing);
550 for my $i (reverse 0 .. $#$support_z-1) {
551 my $z = $support_z->[$i];
552 my @overlapping_layers = $self->overlapping_layers($i, $support_z);
553 my @overlapping_z = map $support_z->[$_], @overlapping_layers;
554
555 # in case we have no interface layers, look at upper contact
556 # (1 interface layer means we only have contact layer, so $interface->{$i+1} is empty)
557 my @upper_contact = ();
558 if ($self->object_config->support_material_interface_layers <= 1) {
559 @upper_contact = @{ $contact->{$support_z->[$i+1]} || [] };
560 }
561
562 my $trim_polygons = [
563 (map @$_, map $top->{$_}, grep exists $top->{$_}, @overlapping_z), # top slices on this layer
564 (map @$_, map $interface->{$_}, grep exists $interface->{$_}, @overlapping_layers), # interface regions on this layer
565 (map @$_, map $contact->{$_}, grep exists $contact->{$_}, @overlapping_z), # contact regions on this layer
566 ];
567
568 $base->{$i} = diff(
569 [
570 @{ $base->{$i+1} || [] }, # support regions on upper layer
571 @{ $interface->{$i+1} || [] }, # interface regions on upper layer
572 @upper_contact, # contact regions on upper layer
573 ],
574 $trim_polygons,
575 1, # safety offset to merge the touching source polygons
576 );
577
578 if (0) {
579 # Fillet the base polygons and trim them again with the top, interface and contact layers.
580 $base->{$i} = diff(
581 offset2(
582 $base->{$i},
583 $fillet_radius_scaled,
584 -$fillet_radius_scaled,
585 # Use a geometric offsetting for filleting.
586 CLIPPER_OFFSET_SCALE,
587 JT_ROUND,
588 0.2*$fillet_radius_scaled*CLIPPER_OFFSET_SCALE),
589 $trim_polygons,
590 0); # don't apply the safety offset.
591 }
592 }
593 }
594
595 return $base;
596 }
597
598 # This method removes object silhouette from support material
599 # (it's used with interface and base only). It removes a bit more,
600 # leaving a thin gap between object and support in the XY plane.
601 sub clip_with_object {
602 my ($self, $support, $support_z, $object) = @_;
603
604 foreach my $i (keys %$support) {
605 next if !@{$support->{$i}};
606
607 my $zmax = $support_z->[$i];
608 my $zmin = ($i == 0) ? 0 : $support_z->[$i-1];
609 my @layers = grep { $_->print_z > $zmin && ($_->print_z - $_->height) < $zmax }
610 @{$object->layers};
611
612 # $layer->slices contains the full shape of layer, thus including
613 # perimeter's width. $support contains the full shape of support
614 # material, thus including the width of its foremost extrusion.
615 # We leave a gap equal to a full extrusion width.
616 $support->{$i} = diff(
617 $support->{$i},
618 offset([ map @$_, map @{$_->slices}, @layers ], +$self->flow->scaled_width),
619 );
620 }
621 }
622
623 sub generate_toolpaths {
624 my ($self, $object, $overhang, $contact, $interface, $base) = @_;
625
626 my $flow = $self->flow;
627 my $interface_flow = $self->interface_flow;
628
629 # shape of contact area
630 my $contact_loops = 1;
631 my $circle_radius = 1.5 * $interface_flow->scaled_width;
632 my $circle_distance = 3 * $circle_radius;
633 my $circle = Slic3r::Polygon->new(map [ $circle_radius * cos $_, $circle_radius * sin $_ ],
634 (5*PI/3, 4*PI/3, PI, 2*PI/3, PI/3, 0));
635
636 Slic3r::debugf "Generating patterns\n";
637
638 # prepare fillers
639 my $pattern = $self->object_config->support_material_pattern;
640 my $with_sheath = $self->object_config->support_material_with_sheath;
641 my @angles = ($self->object_config->support_material_angle);
642 if ($pattern eq 'rectilinear-grid') {
643 $pattern = 'rectilinear';
644 push @angles, $angles[0] + 90;
645 } elsif ($pattern eq 'pillars') {
646 $pattern = 'honeycomb';
647 }
648
649 my $interface_angle = $self->object_config->support_material_angle + 90;
650 my $interface_spacing = $self->object_config->support_material_interface_spacing + $interface_flow->spacing;
651 my $interface_density = $interface_spacing == 0 ? 1 : $interface_flow->spacing / $interface_spacing;
652 my $support_spacing = $self->object_config->support_material_spacing + $flow->spacing;
653 my $support_density = $support_spacing == 0 ? 1 : $flow->spacing / $support_spacing;
654
655 my $process_layer = sub {
656 my ($layer_id) = @_;
657 my $layer = $object->support_layers->[$layer_id];
658 my $z = $layer->print_z;
659
660 # we redefine flows locally by applying this layer's height
661 my $_flow = $flow->clone;
662 my $_interface_flow = $interface_flow->clone;
663 $_flow->set_height($layer->height);
664 $_interface_flow->set_height($layer->height);
665
666 my $overhang = $overhang->{$z} || [];
667 my $contact = $contact->{$z} || [];
668 my $interface = $interface->{$layer_id} || [];
669 my $base = $base->{$layer_id} || [];
670
671 if (DEBUG_CONTACT_ONLY) {
672 $interface = [];
673 $base = [];
674 }
675
676 if (0) {
677 require "Slic3r/SVG.pm";
678 Slic3r::SVG::output(Slic3r::DEBUG_OUT_PATH_PREFIX . "layer_" . $z . ".svg",
679 blue_expolygons => union_ex($base),
680 red_expolygons => union_ex($contact),
681 green_expolygons => union_ex($interface),
682 );
683 }
684
685 # islands
686 $layer->support_islands->append(@{union_ex([ @$interface, @$base, @$contact ])});
687
688 # contact
689 my $contact_infill = [];
690 if ($self->object_config->support_material_interface_layers == 0) {
691 # if no interface layers were requested we treat the contact layer
692 # exactly as a generic base layer
693 push @$base, @$contact;
694 } elsif (@$contact && $contact_loops > 0) {
695 # generate the outermost loop
696
697 # find centerline of the external loop (or any other kind of extrusions should the loop be skipped)
698 $contact = offset($contact, -$_interface_flow->scaled_width/2);
699
700 my @loops0 = ();
701 {
702 # find centerline of the external loop of the contours
703 my @external_loops = @$contact;
704
705 # only consider the loops facing the overhang
706 {
707 my $overhang_with_margin = offset($overhang, +$_interface_flow->scaled_width/2);
708 @external_loops = grep {
709 @{intersection_pl(
710 [ $_->split_at_first_point ],
711 $overhang_with_margin,
712 )}
713 } @external_loops;
714 }
715
716 # apply a pattern to the loop
717 my @positions = map @{Slic3r::Polygon->new(@$_)->equally_spaced_points($circle_distance)}, @external_loops;
718 @loops0 = @{diff(
719 [ @external_loops ],
720 [ map { my $c = $circle->clone; $c->translate(@$_); $c } @positions ],
721 )};
722 }
723
724 # make more loops
725 my @loops = @loops0;
726 for my $i (2..$contact_loops) {
727 my $d = ($i-1) * $_interface_flow->scaled_spacing;
728 push @loops, @{offset2(\@loops0, -$d -0.5*$_interface_flow->scaled_spacing, +0.5*$_interface_flow->scaled_spacing)};
729 }
730
731 # clip such loops to the side oriented towards the object
732 @loops = @{intersection_pl(
733 [ map $_->split_at_first_point, @loops ],
734 offset($overhang, +scale MARGIN),
735 )};
736
737 # add the contact infill area to the interface area
738 # note that growing loops by $circle_radius ensures no tiny
739 # extrusions are left inside the circles; however it creates
740 # a very large gap between loops and contact_infill, so maybe another
741 # solution should be found to achieve both goals
742 $contact_infill = diff(
743 $contact,
744 [ map @{$_->grow($circle_radius*1.1)}, @loops ],
745 );
746
747 # transform loops into ExtrusionPath objects
748 my $mm3_per_mm = $_interface_flow->mm3_per_mm;
749 @loops = map Slic3r::ExtrusionPath->new(
750 polyline => $_,
751 role => EXTR_ROLE_SUPPORTMATERIAL_INTERFACE,
752 mm3_per_mm => $mm3_per_mm,
753 width => $_interface_flow->width,
754 height => $layer->height,
755 ), @loops;
756
757 $layer->support_interface_fills->append(@loops);
758 }
759
760 # Allocate the fillers exclusively in the worker threads! Don't allocate them at the main thread,
761 # as Perl copies the C++ pointers by default, so then the C++ objects are shared between threads!
762 my %fillers = (
763 interface => Slic3r::Filler->new_from_type('rectilinear'),
764 support => Slic3r::Filler->new_from_type($pattern),
765 );
766 my $bounding_box = $object->bounding_box;
767 $fillers{interface}->set_bounding_box($object->bounding_box);
768 $fillers{support}->set_bounding_box($object->bounding_box);
769
770 # interface and contact infill
771 if (@$interface || @$contact_infill) {
772 $fillers{interface}->set_angle($interface_angle);
773 $fillers{interface}->set_spacing($_interface_flow->spacing);
774
775 # find centerline of the external loop
776 $interface = offset2($interface, +scaled_epsilon, -(scaled_epsilon + $_interface_flow->scaled_width/2));
777
778 # join regions by offsetting them to ensure they're merged
779 $interface = offset([ @$interface, @$contact_infill ], scaled_epsilon);
780
781 # turn base support into interface when it's contained in our holes
782 # (this way we get wider interface anchoring)
783 {
784 my @p = @$interface;
785 @$interface = ();
786 foreach my $p (@p) {
787 if ($p->is_clockwise) {
788 my $p2 = $p->clone;
789 $p2->make_counter_clockwise;
790 next if !@{diff([$p2], $base, 1)};
791 }
792 push @$interface, $p;
793 }
794 }
795 $base = diff($base, $interface);
796
797 my @paths = ();
798 foreach my $expolygon (@{union_ex($interface)}) {
799 my $polylines = $fillers{interface}->fill_surface(
800 Slic3r::Surface->new(expolygon => $expolygon, surface_type => S_TYPE_INTERNAL),
801 density => $interface_density,
802 layer_height => $layer->height,
803 complete => 1,
804 );
805 my $mm3_per_mm = $_interface_flow->mm3_per_mm;
806
807 push @paths, map Slic3r::ExtrusionPath->new(
808 polyline => Slic3r::Polyline->new(@$_),
809 role => EXTR_ROLE_SUPPORTMATERIAL_INTERFACE,
810 mm3_per_mm => $mm3_per_mm,
811 width => $_interface_flow->width,
812 height => $layer->height,
813 ), @$polylines,
814 }
815
816 $layer->support_interface_fills->append(@paths);
817 }
818
819 # support or flange
820 if (@$base) {
821 my $filler = $fillers{support};
822 $filler->set_angle($angles[ ($layer_id) % @angles ]);
823
824 # We don't use $base_flow->spacing because we need a constant spacing
825 # value that guarantees that all layers are correctly aligned.
826 $filler->set_spacing($flow->spacing);
827
828 my $density = $support_density;
829 my $base_flow = $_flow;
830
831 # find centerline of the external loop/extrusions
832 my $to_infill = offset2_ex($base, +scaled_epsilon, -(scaled_epsilon + $_flow->scaled_width/2));
833
834 if (0) {
835 require "Slic3r/SVG.pm";
836 Slic3r::SVG::output(Slic3r::DEBUG_OUT_PATH_PREFIX . "to_infill_base" . $z . ".svg",
837 red_expolygons => union_ex($contact),
838 green_expolygons => union_ex($interface),
839 blue_expolygons => $to_infill,
840 );
841 }
842
843 my @paths = ();
844
845 # base flange
846 if ($layer_id == 0) {
847 $filler = $fillers{interface};
848 $filler->set_angle($self->object_config->support_material_angle + 90);
849 $density = 0.5;
850 $base_flow = $self->first_layer_flow;
851
852 # use the proper spacing for first layer as we don't need to align
853 # its pattern to the other layers
854 $filler->set_spacing($base_flow->spacing);
855 } elsif ($with_sheath) {
856 # draw a perimeter all around support infill
857 # TODO: use brim ordering algorithm
858 my $mm3_per_mm = $_flow->mm3_per_mm;
859 push @paths, map Slic3r::ExtrusionPath->new(
860 polyline => $_->split_at_first_point,
861 role => EXTR_ROLE_SUPPORTMATERIAL,
862 mm3_per_mm => $mm3_per_mm,
863 width => $_flow->width,
864 height => $layer->height,
865 ), map @$_, @$to_infill;
866
867 # TODO: use offset2_ex()
868 $to_infill = offset_ex([ map @$_, @$to_infill ], -$_flow->scaled_spacing);
869 }
870
871 foreach my $expolygon (@$to_infill) {
872 my $polylines = $filler->fill_surface(
873 Slic3r::Surface->new(expolygon => $expolygon, surface_type => S_TYPE_INTERNAL),
874 density => $density,
875 layer_height => $layer->height,
876 complete => 1,
877 );
878
879 push @paths, map Slic3r::ExtrusionPath->new(
880 polyline => Slic3r::Polyline->new(@$_),
881 role => EXTR_ROLE_SUPPORTMATERIAL,
882 mm3_per_mm => $base_flow->mm3_per_mm,
883 width => $base_flow->width,
884 height => $layer->height,
885 ), @$polylines;
886 }
887
888 $layer->support_fills->append(@paths);
889 }
890
891 if (0) {
892 require "Slic3r/SVG.pm";
893 Slic3r::SVG::output("islands_" . $z . ".svg",
894 red_expolygons => union_ex($contact),
895 green_expolygons => union_ex($interface),
896 green_polylines => [ map $_->unpack->polyline, @{$layer->support_contact_fills} ],
897 polylines => [ map $_->unpack->polyline, @{$layer->support_fills} ],
898 );
899 }
900 };
901
902 Slic3r::parallelize(
903 threads => $self->print_config->threads,
904 items => [ 0 .. $#{$object->support_layers} ],
905 thread_cb => sub {
906 my $q = shift;
907 while (defined (my $layer_id = $q->dequeue)) {
908 $process_layer->($layer_id);
909 }
910 },
911 no_threads_cb => sub {
912 $process_layer->($_) for 0 .. $#{$object->support_layers};
913 },
914 );
915 }
916
917 sub generate_pillars_shape {
918 my ($self, $contact, $support_z, $shape) = @_;
919
920 # this prevents supplying an empty point set to BoundingBox constructor
921 return if !%$contact;
922
923 my $pillar_size = scale PILLAR_SIZE;
924 my $pillar_spacing = scale PILLAR_SPACING;
925
926 # A regular grid of pillars, filling the 2D bounding box.
927 # arrayref of polygons
928 my $grid; # arrayref of polygons
929 {
930 # Rectangle with a side of 2.5x2.5mm.
931 my $pillar = Slic3r::Polygon->new(
932 [0,0],
933 [$pillar_size, 0],
934 [$pillar_size, $pillar_size],
935 [0, $pillar_size],
936 );
937
938 # A regular grid of pillars, filling the 2D bounding box.
939 my @pillars = ();
940 # 2D bounding box of the projection of all contact polygons.
941 my $bb = Slic3r::Geometry::BoundingBox->new_from_points([ map @$_, map @$_, values %$contact ]);
942 for (my $x = $bb->x_min; $x <= $bb->x_max-$pillar_size; $x += $pillar_spacing) {
943 for (my $y = $bb->y_min; $y <= $bb->y_max-$pillar_size; $y += $pillar_spacing) {
944 push @pillars, my $p = $pillar->clone;
945 $p->translate($x, $y);
946 }
947 }
948 $grid = union(\@pillars);
949 }
950
951 # add pillars to every layer
952 for my $i (0..$#$support_z) {
953 $shape->[$i] = [ @$grid ];
954 }
955
956 # build capitals
957 for my $i (0..$#$support_z) {
958 my $z = $support_z->[$i];
959
960 my $capitals = intersection(
961 $grid,
962 $contact->{$z} // [],
963 );
964
965 # work on one pillar at time (if any) to prevent the capitals from being merged
966 # but store the contact area supported by the capital because we need to make
967 # sure nothing is left
968 my $contact_supported_by_capitals = [];
969 foreach my $capital (@$capitals) {
970 # enlarge capital tops
971 $capital = offset([$capital], +($pillar_spacing - $pillar_size)/2);
972 push @$contact_supported_by_capitals, @$capital;
973
974 for (my $j = $i-1; $j >= 0; $j--) {
975 my $jz = $support_z->[$j];
976 $capital = offset($capital, -$self->interface_flow->scaled_width/2);
977 last if !@$capitals;
978 push @{ $shape->[$j] }, @$capital;
979 }
980 }
981
982 # Capitals will not generally cover the whole contact area because there will be
983 # remainders. For now we handle this situation by projecting such unsupported
984 # areas to the ground, just like we would do with a normal support.
985 my $contact_not_supported_by_capitals = diff(
986 $contact->{$z} // [],
987 $contact_supported_by_capitals,
988 );
989 if (@$contact_not_supported_by_capitals) {
990 for (my $j = $i-1; $j >= 0; $j--) {
991 push @{ $shape->[$j] }, @$contact_not_supported_by_capitals;
992 }
993 }
994 }
995 }
996
997 sub clip_with_shape {
998 my ($self, $support, $shape) = @_;
999
1000 foreach my $i (keys %$support) {
1001 # don't clip bottom layer with shape so that we
1002 # can generate a continuous base flange
1003 # also don't clip raft layers
1004 next if $i == 0;
1005 next if $i < $self->object_config->raft_layers;
1006 $support->{$i} = intersection(
1007 $support->{$i},
1008 $shape->[$i],
1009 );
1010 }
1011 }
1012
1013 # this method returns the indices of the layers overlapping with the given one
1014 sub overlapping_layers {
1015 my ($self, $i, $support_z) = @_;
1016
1017 my $zmax = $support_z->[$i];
1018 my $zmin = ($i == 0) ? 0 : $support_z->[$i-1];
1019
1020 return grep {
1021 my $zmax2 = $support_z->[$_];
1022 my $zmin2 = ($_ == 0) ? 0 : $support_z->[$_-1];
1023 $zmax > $zmin2 && $zmin < $zmax2;
1024 } 0..$#$support_z;
1025 }
1026
1027 sub contact_distance {
1028 my ($self, $layer_height, $nozzle_diameter) = @_;
1029
1030 my $extra = $self->object_config->support_material_contact_distance;
1031 if ($extra == 0) {
1032 return $layer_height;
1033 } else {
1034 return $nozzle_diameter + $extra;
1035 }
1036 }
1037
1038 1;
0 # The slicing work horse.
1 # Extends C++ class Slic3r::Print
2 package Slic3r::Print;
3 use strict;
4 use warnings;
5
6 use File::Basename qw(basename fileparse);
7 use File::Spec;
8 use List::Util qw(min max first sum);
9 use Slic3r::ExtrusionLoop ':roles';
10 use Slic3r::ExtrusionPath ':roles';
11 use Slic3r::Flow ':roles';
12 use Slic3r::Geometry qw(X Y Z X1 Y1 X2 Y2 MIN MAX PI scale unscale convex_hull);
13 use Slic3r::Geometry::Clipper qw(diff_ex union_ex intersection_ex intersection offset
14 offset2 union union_pt_chained JT_ROUND JT_SQUARE);
15 use Slic3r::Print::State ':steps';
16
17 our $status_cb;
18
19 sub set_status_cb {
20 my ($class, $cb) = @_;
21 $status_cb = $cb;
22 }
23
24 sub status_cb {
25 return $status_cb // sub {};
26 }
27
28 # this value is not supposed to be compared with $layer->id
29 # since they have different semantics
30 sub total_layer_count {
31 my $self = shift;
32 return max(map $_->total_layer_count, @{$self->objects});
33 }
34
35 sub size {
36 my $self = shift;
37 return $self->bounding_box->size;
38 }
39
40 sub process {
41 my ($self) = @_;
42
43 $_->make_perimeters for @{$self->objects};
44 $_->infill for @{$self->objects};
45 $_->generate_support_material for @{$self->objects};
46 $self->make_skirt;
47 $self->make_brim; # must come after make_skirt
48
49 # time to make some statistics
50 if (0) {
51 eval "use Devel::Size";
52 print "MEMORY USAGE:\n";
53 printf " meshes = %.1fMb\n", List::Util::sum(map Devel::Size::total_size($_->meshes), @{$self->objects})/1024/1024;
54 printf " layer slices = %.1fMb\n", List::Util::sum(map Devel::Size::total_size($_->slices), map @{$_->layers}, @{$self->objects})/1024/1024;
55 printf " region slices = %.1fMb\n", List::Util::sum(map Devel::Size::total_size($_->slices), map @{$_->regions}, map @{$_->layers}, @{$self->objects})/1024/1024;
56 printf " perimeters = %.1fMb\n", List::Util::sum(map Devel::Size::total_size($_->perimeters), map @{$_->regions}, map @{$_->layers}, @{$self->objects})/1024/1024;
57 printf " fills = %.1fMb\n", List::Util::sum(map Devel::Size::total_size($_->fills), map @{$_->regions}, map @{$_->layers}, @{$self->objects})/1024/1024;
58 printf " print object = %.1fMb\n", Devel::Size::total_size($self)/1024/1024;
59 }
60 if (0) {
61 eval "use Slic3r::Test::SectionCut";
62 Slic3r::Test::SectionCut->new(print => $self)->export_svg("section_cut.svg");
63 }
64 }
65
66 sub export_gcode {
67 my $self = shift;
68 my %params = @_;
69
70 # prerequisites
71 $self->process;
72
73 # output everything to a G-code file
74 my $output_file = $self->expanded_output_filepath($params{output_file});
75 $self->status_cb->(90, "Exporting G-code" . ($output_file ? " to $output_file" : ""));
76 $self->write_gcode($params{output_fh} || $output_file);
77
78 # run post-processing scripts
79 if (@{$self->config->post_process}) {
80 $self->status_cb->(95, "Running post-processing scripts");
81 $self->config->setenv;
82 for my $script (@{$self->config->post_process}) {
83 Slic3r::debugf " '%s' '%s'\n", $script, $output_file;
84 # -x doesn't return true on Windows except for .exe files
85 if (($^O eq 'MSWin32') ? !(-e $script) : !(-x $script)) {
86 die "The configured post-processing script is not executable: check permissions. ($script)\n";
87 }
88 system($script, $output_file);
89 }
90 }
91 }
92
93 # Export SVG slices for the offline SLA printing.
94 sub export_svg {
95 my $self = shift;
96 my %params = @_;
97
98 $_->slice for @{$self->objects};
99
100 my $fh = $params{output_fh};
101 if (!$fh) {
102 my $output_file = $self->expanded_output_filepath($params{output_file});
103 $output_file =~ s/\.gcode$/.svg/i;
104 Slic3r::open(\$fh, ">", $output_file) or die "Failed to open $output_file for writing\n";
105 print "Exporting to $output_file..." unless $params{quiet};
106 }
107
108 my $print_bb = $self->bounding_box;
109 my $print_size = $print_bb->size;
110 print $fh sprintf <<"EOF", unscale($print_size->[X]), unscale($print_size->[Y]);
111 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
112 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
113 <svg width="%s" height="%s" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:slic3r="http://slic3r.org/namespaces/slic3r">
114 <!--
115 Generated using Slic3r $Slic3r::VERSION
116 http://slic3r.org/
117 -->
118 EOF
119
120 my $print_polygon = sub {
121 my ($polygon, $type) = @_;
122 printf $fh qq{ <polygon slic3r:type="%s" points="%s" style="fill: %s" />\n},
123 $type, (join ' ', map { join ',', map unscale $_, @$_ } @$polygon),
124 ($type eq 'contour' ? 'white' : 'black');
125 };
126
127 my @layers = sort { $a->print_z <=> $b->print_z }
128 map { @{$_->layers}, @{$_->support_layers} }
129 @{$self->objects};
130
131 my $layer_id = -1;
132 my @previous_layer_slices = ();
133 for my $layer (@layers) {
134 $layer_id++;
135 if ($layer->slice_z == -1) {
136 printf $fh qq{ <g id="layer%d">\n}, $layer_id;
137 } else {
138 printf $fh qq{ <g id="layer%d" slic3r:z="%s">\n}, $layer_id, unscale($layer->slice_z);
139 }
140
141 my @current_layer_slices = ();
142 # sort slices so that the outermost ones come first
143 my @slices = sort { $a->contour->contains_point($b->contour->first_point) ? 0 : 1 } @{$layer->slices};
144 foreach my $copy (@{$layer->object->_shifted_copies}) {
145 foreach my $slice (@slices) {
146 my $expolygon = $slice->clone;
147 $expolygon->translate(@$copy);
148 $expolygon->translate(-$print_bb->x_min, -$print_bb->y_min);
149 $print_polygon->($expolygon->contour, 'contour');
150 $print_polygon->($_, 'hole') for @{$expolygon->holes};
151 push @current_layer_slices, $expolygon;
152 }
153 }
154 # generate support material
155 if ($self->has_support_material && $layer->id > 0) {
156 my (@supported_slices, @unsupported_slices) = ();
157 foreach my $expolygon (@current_layer_slices) {
158 my $intersection = intersection_ex(
159 [ map @$_, @previous_layer_slices ],
160 [ @$expolygon ],
161 );
162 @$intersection
163 ? push @supported_slices, $expolygon
164 : push @unsupported_slices, $expolygon;
165 }
166 my @supported_points = map @$_, @$_, @supported_slices;
167 foreach my $expolygon (@unsupported_slices) {
168 # look for the nearest point to this island among all
169 # supported points
170 my $contour = $expolygon->contour;
171 my $support_point = $contour->first_point->nearest_point(\@supported_points)
172 or next;
173 my $anchor_point = $support_point->nearest_point([ @$contour ]);
174 printf $fh qq{ <line x1="%s" y1="%s" x2="%s" y2="%s" style="stroke-width: 2; stroke: white" />\n},
175 map @$_, $support_point, $anchor_point;
176 }
177 }
178 print $fh qq{ </g>\n};
179 @previous_layer_slices = @current_layer_slices;
180 }
181
182 print $fh "</svg>\n";
183 close $fh;
184 print "Done.\n" unless $params{quiet};
185 }
186
187 sub make_skirt {
188 my $self = shift;
189
190 # prerequisites
191 $_->make_perimeters for @{$self->objects};
192 $_->infill for @{$self->objects};
193 $_->generate_support_material for @{$self->objects};
194
195 return if $self->step_done(STEP_SKIRT);
196 $self->set_step_started(STEP_SKIRT);
197
198 # since this method must be idempotent, we clear skirt paths *before*
199 # checking whether we need to generate them
200 $self->skirt->clear;
201
202 if (!$self->has_skirt) {
203 $self->set_step_done(STEP_SKIRT);
204 return;
205 }
206 $self->status_cb->(88, "Generating skirt");
207
208 # First off we need to decide how tall the skirt must be.
209 # The skirt_height option from config is expressed in layers, but our
210 # object might have different layer heights, so we need to find the print_z
211 # of the highest layer involved.
212 # Note that unless has_infinite_skirt() == true
213 # the actual skirt might not reach this $skirt_height_z value since the print
214 # order of objects on each layer is not guaranteed and will not generally
215 # include the thickest object first. It is just guaranteed that a skirt is
216 # prepended to the first 'n' layers (with 'n' = skirt_height).
217 # $skirt_height_z in this case is the highest possible skirt height for safety.
218 my $skirt_height_z = -1;
219 foreach my $object (@{$self->objects}) {
220 my $skirt_height = $self->has_infinite_skirt
221 ? $object->layer_count
222 : min($self->config->skirt_height, $object->layer_count);
223 my $highest_layer = $object->get_layer($skirt_height - 1);
224 $skirt_height_z = max($skirt_height_z, $highest_layer->print_z);
225 }
226
227 # collect points from all layers contained in skirt height
228 my @points = ();
229 foreach my $object (@{$self->objects}) {
230 my @object_points = ();
231
232 # get object layers up to $skirt_height_z
233 foreach my $layer (@{$object->layers}) {
234 last if $layer->print_z > $skirt_height_z;
235 push @object_points, map @$_, map @$_, @{$layer->slices};
236 }
237
238 # get support layers up to $skirt_height_z
239 foreach my $layer (@{$object->support_layers}) {
240 last if $layer->print_z > $skirt_height_z;
241 push @object_points, map @{$_->polyline}, @{$layer->support_fills} if $layer->support_fills;
242 push @object_points, map @{$_->polyline}, @{$layer->support_interface_fills} if $layer->support_interface_fills;
243 }
244
245 # repeat points for each object copy
246 foreach my $copy (@{$object->_shifted_copies}) {
247 my @copy_points = map $_->clone, @object_points;
248 $_->translate(@$copy) for @copy_points;
249 push @points, @copy_points;
250 }
251 }
252 return if @points < 3; # at least three points required for a convex hull
253
254 # find out convex hull
255 my $convex_hull = convex_hull(\@points);
256
257 my @extruded_length = (); # for each extruder
258
259 # skirt may be printed on several layers, having distinct layer heights,
260 # but loops must be aligned so can't vary width/spacing
261 # TODO: use each extruder's own flow
262 my $first_layer_height = $self->skirt_first_layer_height;
263 my $flow = $self->skirt_flow;
264 my $spacing = $flow->spacing;
265 my $mm3_per_mm = $flow->mm3_per_mm;
266
267 my @extruders_e_per_mm = ();
268 my $extruder_idx = 0;
269
270 my $skirts = $self->config->skirts;
271 $skirts ||= 1 if $self->has_infinite_skirt;
272
273 # draw outlines from outside to inside
274 # loop while we have less skirts than required or any extruder hasn't reached the min length if any
275 my $distance = scale max($self->config->skirt_distance, $self->config->brim_width);
276 for (my $i = $skirts; $i > 0; $i--) {
277 $distance += scale $spacing;
278 my $loop = offset([$convex_hull], $distance, 1, JT_ROUND, scale(0.1))->[0];
279 my $eloop = Slic3r::ExtrusionLoop->new_from_paths(
280 Slic3r::ExtrusionPath->new(
281 polyline => Slic3r::Polygon->new(@$loop)->split_at_first_point,
282 role => EXTR_ROLE_SKIRT,
283 mm3_per_mm => $mm3_per_mm, # this will be overridden at G-code export time
284 width => $flow->width,
285 height => $first_layer_height, # this will be overridden at G-code export time
286 ),
287 );
288 $eloop->role(EXTRL_ROLE_SKIRT);
289 $self->skirt->append($eloop);
290
291 if ($self->config->min_skirt_length > 0) {
292 $extruded_length[$extruder_idx] ||= 0;
293 if (!$extruders_e_per_mm[$extruder_idx]) {
294 my $config = Slic3r::Config::GCode->new;
295 $config->apply_static($self->config);
296 my $extruder = Slic3r::Extruder->new($extruder_idx, $config);
297 $extruders_e_per_mm[$extruder_idx] = $extruder->e_per_mm($mm3_per_mm);
298 }
299 $extruded_length[$extruder_idx] += unscale $loop->length * $extruders_e_per_mm[$extruder_idx];
300 $i++ if defined first { ($extruded_length[$_] // 0) < $self->config->min_skirt_length } 0 .. $#{$self->extruders};
301 if ($extruded_length[$extruder_idx] >= $self->config->min_skirt_length) {
302 if ($extruder_idx < $#{$self->extruders}) {
303 $extruder_idx++;
304 next;
305 }
306 }
307 }
308 }
309
310 $self->skirt->reverse;
311
312 $self->set_step_done(STEP_SKIRT);
313 }
314
315 sub make_brim {
316 my $self = shift;
317
318 # prerequisites
319 $_->make_perimeters for @{$self->objects};
320 $_->infill for @{$self->objects};
321 $_->generate_support_material for @{$self->objects};
322 $self->make_skirt;
323
324 return if $self->step_done(STEP_BRIM);
325 $self->set_step_started(STEP_BRIM);
326
327 # since this method must be idempotent, we clear brim paths *before*
328 # checking whether we need to generate them
329 $self->brim->clear;
330
331 if ($self->config->brim_width == 0) {
332 $self->set_step_done(STEP_BRIM);
333 return;
334 }
335 $self->status_cb->(88, "Generating brim");
336
337 # brim is only printed on first layer and uses perimeter extruder
338 my $first_layer_height = $self->skirt_first_layer_height;
339 my $flow = $self->brim_flow;
340 my $mm3_per_mm = $flow->mm3_per_mm;
341
342 my $grow_distance = $flow->scaled_width / 2;
343 my @islands = (); # array of polygons
344 foreach my $obj_idx (0 .. ($self->object_count - 1)) {
345 my $object = $self->objects->[$obj_idx];
346 my $layer0 = $object->get_layer(0);
347 my @object_islands = (
348 (map $_->contour, @{$layer0->slices}),
349 );
350 if (@{ $object->support_layers }) {
351 my $support_layer0 = $object->support_layers->[0];
352 push @object_islands,
353 (map @{$_->polyline->grow($grow_distance)}, @{$support_layer0->support_fills})
354 if $support_layer0->support_fills;
355 push @object_islands,
356 (map @{$_->polyline->grow($grow_distance)}, @{$support_layer0->support_interface_fills})
357 if $support_layer0->support_interface_fills;
358 }
359 foreach my $copy (@{$object->_shifted_copies}) {
360 push @islands, map { $_->translate(@$copy); $_ } map $_->clone, @object_islands;
361 }
362 }
363
364 my @loops = ();
365 my $num_loops = sprintf "%.0f", $self->config->brim_width / $flow->width;
366 for my $i (reverse 1 .. $num_loops) {
367 # JT_SQUARE ensures no vertex is outside the given offset distance
368 # -0.5 because islands are not represented by their centerlines
369 # (first offset more, then step back - reverse order than the one used for
370 # perimeters because here we're offsetting outwards)
371 push @loops, @{offset2(\@islands, ($i + 0.5) * $flow->scaled_spacing, -1.0 * $flow->scaled_spacing, 100000, JT_SQUARE)};
372 }
373
374 $self->brim->append(map Slic3r::ExtrusionLoop->new_from_paths(
375 Slic3r::ExtrusionPath->new(
376 polyline => Slic3r::Polygon->new(@$_)->split_at_first_point,
377 role => EXTR_ROLE_SKIRT,
378 mm3_per_mm => $mm3_per_mm,
379 width => $flow->width,
380 height => $first_layer_height,
381 ),
382 ), reverse @{union_pt_chained(\@loops)});
383
384 $self->set_step_done(STEP_BRIM);
385 }
386
387 sub write_gcode {
388 my $self = shift;
389 my ($file) = @_;
390
391 # open output gcode file if we weren't supplied a file-handle
392 my $fh;
393 if (ref $file eq 'IO::Scalar') {
394 $fh = $file;
395 } else {
396 Slic3r::open(\$fh, ">", $file)
397 or die "Failed to open $file for writing\n";
398
399 # enable UTF-8 output since user might have entered Unicode characters in fields like notes
400 binmode $fh, ':utf8';
401 }
402
403 my $exporter = Slic3r::Print::GCode->new(
404 print => $self,
405 fh => $fh,
406 );
407 $exporter->export;
408
409 # close our gcode file
410 close $fh;
411 }
412
413 # this method will return the supplied input file path after expanding its
414 # format variables with their values
415 sub expanded_output_filepath {
416 my $self = shift;
417 my ($path) = @_;
418
419 return undef if !@{$self->objects};
420 my $input_file = first { defined $_ } map $_->model_object->input_file, @{$self->objects};
421 return undef if !defined $input_file;
422
423 my $filename = my $filename_base = basename($input_file);
424 $filename_base =~ s/\.[^.]+$//; # without suffix
425
426 # set filename in placeholder parser so that it's available also in custom G-code
427 $self->placeholder_parser->set(input_filename => $filename);
428 $self->placeholder_parser->set(input_filename_base => $filename_base);
429
430 # set other variables from model object
431 $self->placeholder_parser->set_multiple(
432 scale => [ map $_->model_object->instances->[0]->scaling_factor * 100 . "%", @{$self->objects} ],
433 );
434
435 if ($path && -d $path) {
436 # if output path is an existing directory, we take that and append
437 # the specified filename format
438 $path = File::Spec->join($path, $self->config->output_filename_format);
439 } elsif (!$path) {
440 # if no explicit output file was defined, we take the input
441 # file directory and append the specified filename format
442 $path = (fileparse($input_file))[1] . $self->config->output_filename_format;
443 } else {
444 # path is a full path to a file so we use it as it is
445 }
446
447 # make sure we use an up-to-date timestamp
448 $self->placeholder_parser->update_timestamp;
449 return $self->placeholder_parser->process($path);
450 }
451
452 # Wrapper around the C++ Slic3r::Print::validate()
453 # to produce a Perl exception without a hang-up on some Strawberry perls.
454 sub validate
455 {
456 my $self = shift;
457 my $err = $self->_validate;
458 die $err . "\n" if (defined($err) && $err ne '');
459 }
460
461 1;
0 package Slic3r::SVG;
1 use strict;
2 use warnings;
3
4 use SVG;
5
6 use constant X => 0;
7 use constant Y => 1;
8
9 our $filltype = 'evenodd';
10
11 sub factor {
12 return &Slic3r::SCALING_FACTOR * 10;
13 }
14
15 sub svg {
16 my $svg = SVG->new(width => 200 * 10, height => 200 * 10);
17 my $marker_end = $svg->marker(
18 id => "endArrow",
19 viewBox => "0 0 10 10",
20 refX => "1",
21 refY => "5",
22 markerUnits => "strokeWidth",
23 orient => "auto",
24 markerWidth => "10",
25 markerHeight => "8",
26 );
27 $marker_end->polyline(
28 points => "0,0 10,5 0,10 1,5",
29 fill => "darkblue",
30 );
31
32 return $svg;
33 }
34
35 sub output {
36 my ($filename, @things) = @_;
37
38 my $svg = svg();
39 my $arrows = 1;
40
41 while (my $type = shift @things) {
42 my $value = shift @things;
43
44 if ($type eq 'no_arrows') {
45 $arrows = 0;
46 } elsif ($type =~ /^(?:(.+?)_)?expolygons$/) {
47 my $colour = $1;
48 $value = [ map $_->pp, @$value ];
49
50 my $g = $svg->group(
51 style => {
52 'stroke-width' => 0,
53 'stroke' => $colour || 'black',
54 'fill' => ($type !~ /polygons/ ? 'none' : ($colour || 'grey')),
55 'fill-type' => $filltype,
56 },
57 );
58 foreach my $expolygon (@$value) {
59 my $points = join ' ', map "M $_ z", map join(" ", reverse map $_->[0]*factor() . " " . $_->[1]*factor(), @$_), @$expolygon;
60 $g->path(
61 d => $points,
62 );
63 }
64 } elsif ($type =~ /^(?:(.+?)_)?(polygon|polyline)s$/) {
65 my ($colour, $method) = ($1, $2);
66 $value = [ map $_->pp, @$value ];
67
68 my $g = $svg->group(
69 style => {
70 'stroke-width' => ($method eq 'polyline') ? 1 : 0,
71 'stroke' => $colour || 'black',
72 'fill' => ($type !~ /polygons/ ? 'none' : ($colour || 'grey')),
73 },
74 );
75 foreach my $polygon (@$value) {
76 my $path = $svg->get_path(
77 'x' => [ map($_->[X] * factor(), @$polygon) ],
78 'y' => [ map($_->[Y] * factor(), @$polygon) ],
79 -type => 'polygon',
80 );
81 $g->$method(
82 %$path,
83 'marker-end' => !$arrows ? "" : "url(#endArrow)",
84 );
85 }
86 } elsif ($type =~ /^(?:(.+?)_)?points$/) {
87 my $colour = $1 // 'black';
88 my $r = $colour eq 'black' ? 1 : 3;
89 $value = [ map $_->pp, @$value ];
90
91 my $g = $svg->group(
92 style => {
93 'stroke-width' => 2,
94 'stroke' => $colour,
95 'fill' => $colour,
96 },
97 );
98 foreach my $point (@$value) {
99 $g->circle(
100 cx => $point->[X] * factor(),
101 cy => $point->[Y] * factor(),
102 r => $r,
103 );
104 }
105 } elsif ($type =~ /^(?:(.+?)_)?lines$/) {
106 my $colour = $1;
107 $value = [ map $_->pp, @$value ];
108
109 my $g = $svg->group(
110 style => {
111 'stroke-width' => 2,
112 },
113 );
114 foreach my $line (@$value) {
115 $g->line(
116 x1 => $line->[0][X] * factor(),
117 y1 => $line->[0][Y] * factor(),
118 x2 => $line->[1][X] * factor(),
119 y2 => $line->[1][Y] * factor(),
120 style => {
121 'stroke' => $colour || 'black',
122 },
123 'marker-end' => !$arrows ? "" : "url(#endArrow)",
124 );
125 }
126 }
127 }
128
129 write_svg($svg, $filename);
130 }
131
132 sub write_svg {
133 my ($svg, $filename) = @_;
134
135 Slic3r::open(\my $fh, '>', $filename);
136 print $fh $svg->xmlify;
137 close $fh;
138 printf "SVG written to %s\n", $filename;
139 }
140
141 1;
0 package Slic3r::Surface;
1 use strict;
2 use warnings;
3
4 require Exporter;
5 our @ISA = qw(Exporter);
6 our @EXPORT_OK = qw(S_TYPE_TOP S_TYPE_BOTTOM S_TYPE_BOTTOMBRIDGE S_TYPE_INTERNAL S_TYPE_INTERNALSOLID S_TYPE_INTERNALBRIDGE S_TYPE_INTERNALVOID);
7 our %EXPORT_TAGS = (types => \@EXPORT_OK);
8
9 sub p {
10 my $self = shift;
11 return @{$self->polygons};
12 }
13
14 1;
0 # 2D cut in the XZ plane through the toolpaths.
1 # For debugging purposes.
2
3 package Slic3r::Test::SectionCut;
4 use Moo;
5
6 use List::Util qw(first min max);
7 use Slic3r::Geometry qw(unscale);
8 use Slic3r::Geometry::Clipper qw(intersection_pl);
9 use SVG;
10 use Slic3r::SVG;
11
12 has 'print' => (is => 'ro', required => 1);
13 has 'scale' => (is => 'ro', default => sub { 30 });
14 has 'y_percent' => (is => 'ro', default => sub { 0.5 }); # Y coord of section line expressed as factor
15 has 'line' => (is => 'rw');
16 has '_height' => (is => 'rw');
17 has '_svg' => (is => 'rw');
18 has '_svg_style' => (is => 'rw', default => sub { {} });
19
20 sub BUILD {
21 my $self = shift;
22
23 # calculate the Y coordinate of the section line
24 my $bb = $self->print->bounding_box;
25 my $y = ($bb->y_min + $bb->y_max) * $self->y_percent;
26
27 # store our section line
28 $self->line(Slic3r::Line->new([ $bb->x_min, $y ], [ $bb->x_max, $y ]));
29 }
30
31 sub export_svg {
32 my $self = shift;
33 my ($filename) = @_;
34
35 # get bounding box of print and its height
36 # (Print should return a BoundingBox3 object instead)
37 my $bb = $self->print->bounding_box;
38 my $print_size = $bb->size;
39 $self->_height(max(map $_->print_z, map @{$_->layers}, @{$self->print->objects}));
40
41 # initialize the SVG canvas
42 $self->_svg(my $svg = SVG->new(
43 width => $self->scale * unscale($print_size->x),
44 height => $self->scale * $self->_height,
45 ));
46
47 # set default styles
48 $self->_svg_style->{'stroke-width'} = 1;
49 $self->_svg_style->{'fill-opacity'} = 0.5;
50 $self->_svg_style->{'stroke-opacity'} = 0.2;
51
52 # plot perimeters
53 $self->_svg_style->{'stroke'} = '#EE0000';
54 $self->_svg_style->{'fill'} = '#FF0000';
55 $self->_plot_group(sub { map @{$_->perimeters}, @{$_[0]->regions} });
56
57 # plot infill
58 $self->_svg_style->{'stroke'} = '#444444';
59 $self->_svg_style->{'fill'} = '#454545';
60 $self->_plot_group(sub { map @{$_->fills}, @{$_[0]->regions} });
61
62 # plot support material
63 $self->_svg_style->{'stroke'} = '#12EF00';
64 $self->_svg_style->{'fill'} = '#22FF00';
65 $self->_plot_group(sub { $_[0]->isa('Slic3r::Layer::Support') ? ($_[0]->support_fills, $_[0]->support_interface_fills) : () });
66
67 Slic3r::open(\my $fh, '>', $filename);
68 print $fh $svg->xmlify;
69 close $fh;
70 printf "Section cut SVG written to %s\n", $filename;
71 }
72
73 sub _plot_group {
74 my $self = shift;
75 my ($filter) = @_;
76
77 my $bb = $self->print->bounding_box;
78 my $g = $self->_svg->group(style => { %{$self->_svg_style} });
79
80 foreach my $object (@{$self->print->objects}) {
81 foreach my $copy (@{$object->_shifted_copies}) {
82 foreach my $layer (@{$object->layers}, @{$object->support_layers}) {
83 # get all ExtrusionPath objects
84 my @paths = map $_->clone,
85 map { ($_->isa('Slic3r::ExtrusionLoop') || $_->isa('Slic3r::ExtrusionPath::Collection')) ? @$_ : $_ }
86 grep defined $_,
87 $filter->($layer);
88
89 # move paths to location of copy
90 $_->polyline->translate(@$copy) for @paths;
91
92 if (0) {
93 # export plan with section line and exit
94 require "Slic3r/SVG.pm";
95 Slic3r::SVG::output(
96 "line.svg",
97 no_arrows => 1,
98 lines => [ $self->line ],
99 red_polylines => [ map $_->polyline, @paths ],
100 );
101 exit;
102 }
103
104 foreach my $path (@paths) {
105 foreach my $line (@{$path->lines}) {
106 my @intersections = @{intersection_pl(
107 [ $self->line->as_polyline ],
108 $line->grow(Slic3r::Geometry::scale $path->width/2),
109 )};
110
111 die "Intersection has more than two points!\n"
112 if defined first { @$_ > 2 } @intersections;
113
114 # turn intersections to lines
115 my @lines = map Slic3r::Line->new(@$_), @intersections;
116
117 # align intersections to canvas
118 $_->translate(-$bb->x_min, 0) for @lines;
119
120 # we want lines oriented from left to right in order to draw
121 # rectangles correctly
122 foreach my $line (@lines) {
123 $line->reverse if $line->a->x > $line->b->x;
124 }
125
126 if ($path->is_bridge) {
127 foreach my $line (@lines) {
128 my $radius = $path->width / 2;
129 my $width = unscale abs($line->b->x - $line->a->x);
130 if ((10 * $radius) < $width) {
131 # we're cutting the path in the longitudinal direction, so we've got a rectangle
132 $g->rectangle(
133 'x' => $self->scale * unscale($line->a->x),
134 'y' => $self->scale * $self->_y($layer->print_z),
135 'width' => $self->scale * $width,
136 'height' => $self->scale * $radius * 2,
137 'rx' => $self->scale * $radius * 0.35,
138 'ry' => $self->scale * $radius * 0.35,
139 );
140 } else {
141 $g->circle(
142 'cx' => $self->scale * (unscale($line->a->x) + $radius),
143 'cy' => $self->scale * $self->_y($layer->print_z - $radius),
144 'r' => $self->scale * $radius,
145 );
146 }
147 }
148 } else {
149 foreach my $line (@lines) {
150 my $height = $path->height;
151 $height = $layer->height if $height == -1;
152 $g->rectangle(
153 'x' => $self->scale * unscale($line->a->x),
154 'y' => $self->scale * $self->_y($layer->print_z),
155 'width' => $self->scale * unscale($line->b->x - $line->a->x),
156 'height' => $self->scale * $height,
157 'rx' => $self->scale * $height * 0.5,
158 'ry' => $self->scale * $height * 0.5,
159 );
160 }
161 }
162 }
163 }
164 }
165 }
166 }
167 }
168
169 sub _y {
170 my $self = shift;
171 my ($y) = @_;
172
173 return $self->_height - $y;
174 }
175
176 1;
0 package Slic3r::Test;
1 use strict;
2 use warnings;
3
4 require Exporter;
5 our @ISA = qw(Exporter);
6 our @EXPORT_OK = qw(_eq);
7
8 use IO::Scalar;
9 use List::Util qw(first);
10 use Slic3r::Geometry qw(epsilon X Y Z);
11
12 my %cuboids = (
13 '20mm_cube' => [20,20,20],
14 '2x20x10' => [2, 20,10],
15 );
16
17 sub mesh {
18 my ($name, %params) = @_;
19
20 my ($vertices, $facets);
21 if ($cuboids{$name}) {
22 my ($x, $y, $z) = @{ $cuboids{$name} };
23 $vertices = [
24 [$x,$y,0], [$x,0,0], [0,0,0], [0,$y,0], [$x,$y,$z], [0,$y,$z], [0,0,$z], [$x,0,$z],
25 ];
26 $facets = [
27 [0,1,2], [0,2,3], [4,5,6], [4,6,7], [0,4,7], [0,7,1], [1,7,6], [1,6,2], [2,6,5], [2,5,3], [4,0,3], [4,3,5],
28 ],
29 } elsif ($name eq 'cube_with_hole') {
30 $vertices = [
31 [0,0,0],[0,0,10],[0,20,0],[0,20,10],[20,0,0],[20,0,10],[5,5,0],[15,5,0],[5,15,0],[20,20,0],[15,15,0],[20,20,10],[5,5,10],[5,15,10],[15,5,10],[15,15,10]
32 ];
33 $facets = [
34 [0,1,2],[2,1,3],[1,0,4],[5,1,4],[6,7,4],[8,2,9],[0,2,8],[10,8,9],[0,8,6],[0,6,4],[4,7,9],[7,10,9],[2,3,9],[9,3,11],[12,1,5],[13,3,12],[14,12,5],[3,1,12],[11,3,13],[11,15,5],[11,13,15],[15,14,5],[5,4,9],[11,5,9],[8,13,12],[6,8,12],[10,15,13],[8,10,13],[15,10,14],[14,10,7],[14,7,12],[12,7,6]
35 ],
36 } elsif ($name eq 'cube_with_concave_hole') {
37 $vertices = [
38 [-10,-10,-5],[-10,-10,5],[-10,10,-5],[-10,10,5],[10,-10,-5],[10,-10,5],[-5,-5,-5],[5,-5,-5],[5,5,-5],[5,10,-5],[-5,5,-5],[3.06161699911402e-16,5,-5],[5,0,-5],[0,0,-5],[10,5,-5],[5,10,5],[-5,-5,5],[5,0,5],[5,-5,5],[-5,5,5],[10,5,5],[5,5,5],[3.06161699911402e-16,5,5],[0,0,5]
39 ];
40 $facets = [
41 [0,1,2],[2,1,3],[1,0,4],[5,1,4],[6,7,4],[8,2,9],[10,2,11],[11,12,13],[0,2,10],[0,10,6],[0,6,4],[11,2,8],[4,7,12],[4,12,8],[12,11,8],[14,4,8],[2,3,9],[9,3,15],[16,1,5],[17,18,5],[19,3,16],[20,21,5],[18,16,5],[3,1,16],[22,3,19],[21,3,22],[21,17,5],[21,22,17],[21,15,3],[23,17,22],[5,4,14],[20,5,14],[20,14,21],[21,14,8],[9,15,21],[8,9,21],[10,19,16],[6,10,16],[11,22,19],[10,11,19],[13,23,11],[11,23,22],[23,13,12],[17,23,12],[17,12,18],[18,12,7],[18,7,16],[16,7,6]
42 ],
43 } elsif ($name eq 'V') {
44 $vertices = [
45 [-14,0,20],[-14,15,20],[0,0,0],[0,15,0],[-4,0,20],[-4,15,20],[5,0,7.14286],[10,0,0],[24,0,20],[14,0,20],[10,15,0],[5,15,7.14286],[14,15,20],[24,15,20]
46 ];
47 $facets = [
48 [0,1,2],[2,1,3],[1,0,4],[5,1,4],[4,0,2],[6,4,2],[7,6,2],[8,9,7],[9,6,7],[2,3,7],[7,3,10],[1,5,3],[3,5,11],[11,12,13],[11,13,3],[3,13,10],[5,4,6],[11,5,6],[6,9,11],[11,9,12],[12,9,8],[13,12,8],[8,7,10],[13,8,10]
49 ],
50 } elsif ($name eq 'L') {
51 $vertices = [
52 [0,10,0],[0,10,10],[0,20,0],[0,20,10],[10,10,0],[10,10,10],[20,20,0],[20,0,0],[10,0,0],[20,20,10],[10,0,10],[20,0,10]
53 ];
54 $facets = [
55 [0,1,2],[2,1,3],[4,5,1],[0,4,1],[0,2,4],[4,2,6],[4,6,7],[4,7,8],[2,3,6],[6,3,9],[3,1,5],[9,3,5],[10,11,5],[11,9,5],[5,4,10],[10,4,8],[10,8,7],[11,10,7],[11,7,6],[9,11,6]
56 ],
57 } elsif ($name eq 'overhang') {
58 $vertices = [
59 [1364.68505859375,614.398010253906,20.002498626709],[1389.68505859375,614.398010253906,20.002498626709],[1377.18505859375,589.398986816406,20.002498626709],[1389.68505859375,589.398986816406,20.002498626709],[1389.68505859375,564.398986816406,20.0014991760254],[1364.68505859375,589.398986816406,20.002498626709],[1364.68505859375,564.398986816406,20.0014991760254],[1360.93505859375,589.398986816406,17.0014991760254],[1360.93505859375,585.64697265625,17.0014991760254],[1357.18505859375,564.398986816406,17.0014991760254],[1364.68505859375,589.398986816406,17.0014991760254],[1364.68505859375,571.899963378906,17.0014991760254],[1364.68505859375,564.398986816406,17.0014991760254],[1348.43603515625,564.398986816406,17.0014991760254],[1352.80908203125,589.398986816406,17.0014991760254],[1357.18408203125,589.398986816406,17.0014991760254],[1357.18310546875,614.398010253906,17.0014991760254],[1364.68505859375,606.89599609375,17.0014991760254],[1364.68505859375,614.398010253906,17.0014991760254],[1352.18603515625,564.398986816406,20.0014991760254],[1363.65405273438,589.398986816406,23.3004989624023],[1359.46704101562,589.398986816406,23.3004989624023],[1358.37109375,564.398986816406,23.3004989624023],[1385.56103515625,564.398986816406,23.3004989624023],[1373.06311035156,589.398986816406,23.3004989624023],[1368.80810546875,564.398986816406,23.3004989624023],[1387.623046875,589.398986816406,23.3004989624023],[1387.623046875,585.276000976562,23.3004989624023],[1389.68505859375,589.398986816406,23.3004989624023],[1389.68505859375,572.64599609375,23.3004989624023],[1389.68505859375,564.398986816406,23.3004989624023],[1367.77709960938,589.398986816406,23.3004989624023],[1366.7470703125,564.398986816406,23.3004989624023],[1354.31201171875,589.398986816406,23.3004989624023],[1352.18603515625,564.398986816406,23.3004989624023],[1389.68505859375,614.398010253906,23.3004989624023],[1377.31701660156,614.398010253906,23.3004989624023],[1381.43908691406,589.398986816406,23.3004989624023],[1368.80700683594,614.398010253906,23.3004989624023],[1368.80810546875,589.398986816406,23.3004989624023],[1356.43908691406,614.398010253906,23.3004989624023],[1357.40502929688,589.398986816406,23.3004989624023],[1360.56201171875,614.398010253906,23.3004989624023],[1348.705078125,614.398010253906,23.3004989624023],[1350.44506835938,589.398986816406,23.3004989624023],[1389.68505859375,606.153015136719,23.3004989624023],[1347.35205078125,589.398986816406,23.3004989624023],[1346.56005859375,589.398986816406,23.3004989624023],[1346.56005859375,594.159912109375,17.0014991760254],[1346.56005859375,589.398986816406,17.0014991760254],[1346.56005859375,605.250427246094,23.3004989624023],[1346.56005859375,614.398010253906,23.3004989624023],[1346.56005859375,614.398010253906,20.8258285522461],[1346.56005859375,614.398010253906,17.0014991760254],[1346.56005859375,564.398986816406,19.10133934021],[1346.56005859375,567.548583984375,23.3004989624023],[1346.56005859375,564.398986816406,17.0020332336426],[1346.56005859375,564.398986816406,23.0018501281738],[1346.56005859375,564.398986816406,23.3004989624023],[1346.56005859375,575.118957519531,17.0014991760254],[1346.56005859375,574.754028320312,23.3004989624023]
60 ];
61 $facets = [
62 [0,1,2],[2,3,4],[2,5,0],[4,6,2],[2,6,5],[2,1,3],[7,8,9],[10,9,8],[11,9,10],[12,9,11],[9,13,14],[7,15,16],[10,17,0],[10,0,5],[12,11,6],[18,16,0],[6,19,13],[6,13,9],[9,12,6],[17,18,0],[11,10,5],[11,5,6],[14,16,15],[17,7,18],[16,18,7],[14,15,9],[7,9,15],[7,17,8],[10,8,17],[20,21,22],[23,24,25],[26,23,27],[28,27,23],[29,28,23],[30,29,23],[25,31,32],[22,33,34],[35,36,37],[24,38,39],[21,40,41],[38,42,20],[33,43,44],[6,4,23],[6,23,25],[36,35,1],[1,0,38],[1,38,36],[29,30,4],[25,32,6],[40,42,0],[35,45,1],[4,3,28],[4,28,29],[3,1,45],[3,45,28],[22,34,19],[19,6,32],[19,32,22],[42,38,0],[30,23,4],[0,16,43],[0,43,40],[24,37,36],[38,24,36],[24,23,37],[37,23,26],[22,32,20],[20,32,31],[33,41,40],[43,33,40],[45,35,26],[37,26,35],[33,44,34],[44,43,46],[20,42,21],[40,21,42],[31,39,38],[20,31,38],[33,22,41],[21,41,22],[31,25,39],[24,39,25],[26,27,45],[28,45,27],[47,48,49],[47,50,48],[51,48,50],[52,48,51],[53,48,52],[54,55,56],[57,55,54],[58,55,57],[49,59,47],[60,56,55],[59,56,60],[60,47,59],[48,53,16],[56,13,19],[54,56,19],[56,59,13],[59,49,14],[59,14,13],[49,48,16],[49,16,14],[44,46,60],[44,60,55],[51,50,43],[19,34,58],[19,58,57],[53,52,16],[43,16,52],[43,52,51],[57,54,19],[47,60,46],[55,58,34],[55,34,44],[50,47,46],[50,46,43]
63 ],
64 } elsif ($name eq '40x10') {
65 $vertices = [
66 [12.8680295944214,29.5799007415771,12],[11.7364797592163,29.8480796813965,12],[11.1571502685547,29.5300102233887,12],[10.5814504623413,29.9830799102783,12],[10,29.6000003814697,12],[9.41855144500732,29.9830799102783,12],[8.84284687042236,29.5300102233887,12],[8.26351833343506,29.8480796813965,12],[7.70256900787354,29.3210391998291,12],[7.13196802139282,29.5799007415771,12],[6.59579277038574,28.9761600494385,12],[6.03920221328735,29.1821594238281,12],[5.53865718841553,28.5003795623779,12],[5,28.6602592468262,12],[4.54657793045044,27.9006500244141,12],[4.02841377258301,28.0212306976318,12],[3.63402199745178,27.1856994628906,12],[3.13758301734924,27.2737407684326,12],[2.81429696083069,26.3659801483154,12],[2.33955597877502,26.4278793334961,12],[2.0993549823761,25.4534206390381,12],[1.64512205123901,25.4950904846191,12],[1.49962198734283,24.4613399505615,12],[1.0636739730835,24.4879894256592,12],[1.02384400367737,23.4042091369629,12],[0.603073298931122,23.4202003479004,12],[0.678958415985107,22.2974300384521,12],[0.269550800323486,22.3061599731445,12],[0.469994693994522,21.1571502685547,12],[0.067615881562233,21.1609306335449,12],[0.399999290704727,20,12],[0,20,12],[0.399999290704727,5,12],[0,5,12],[0.456633001565933,4.2804012298584,12],[0.0615576282143593,4.21782684326172,12],[0.625140011310577,3.5785219669342,12],[0.244717106223106,3.45491504669189,12],[0.901369392871857,2.91164398193359,12],[0.544967114925385,2.73004698753357,12],[1.27852201461792,2.29618692398071,12],[0.954914808273315,2.06107401847839,12],[1.74730801582336,1.74730801582336,12],[1.46446597576141,1.46446597576141,12],[2.29618692398071,1.27852201461792,12],[2.06107401847839,0.954914808273315,12],[2.91164398193359,0.901369392871857,12],[2.73004698753357,0.544967114925385,12],[3.5785219669342,0.625140011310577,12],[3.45491504669189,0.244717106223106,12],[4.2804012298584,0.456633001565933,12],[4.21782684326172,0.0615576282143593,12],[5,0.399999290704727,12],[5,0,12],[19.6000003814697,0.399999290704727,12],[20,0,12],[19.6000003814697,20,12],[20,20,12],[19.5300102233887,21.1571502685547,12],[19.9323806762695,21.1609306335449,12],[19.3210391998291,22.2974300384521,12],[19.7304496765137,22.3061599731445,12],[18.9761600494385,23.4042091369629,12],[19.3969306945801,23.4202003479004,12],[18.5003795623779,24.4613399505615,12],[18.9363307952881,24.4879894256592,12],[17.9006500244141,25.4534206390381,12],[18.3548793792725,25.4950904846191,12],[17.1856994628906,26.3659801483154,12],[17.6604404449463,26.4278793334961,12],[16.3659801483154,27.1856994628906,12],[16.862419128418,27.2737407684326,12],[15.4534196853638,27.9006500244141,12],[15.9715900421143,28.0212306976318,12],[14.4613399505615,28.5003795623779,12],[15,28.6602592468262,12],[13.4042100906372,28.9761600494385,12],[13.9608001708984,29.1821594238281,12],[12.2974300384521,29.3210391998291,12],[7.13196802139282,29.5799007415771,0],[8.26351833343506,29.8480796813965,0],[8.84284687042236,29.5300102233887,0],[9.41855144500732,29.9830799102783,0],[10,29.6000003814697,0],[10.5814504623413,29.9830799102783,0],[11.1571502685547,29.5300102233887,0],[11.7364797592163,29.8480796813965,0],[12.2974300384521,29.3210391998291,0],[12.8680295944214,29.5799007415771,0],[13.4042100906372,28.9761600494385,0],[13.9608001708984,29.1821594238281,0],[14.4613399505615,28.5003795623779,0],[15,28.6602592468262,0],[15.4534196853638,27.9006500244141,0],[15.9715900421143,28.0212306976318,0],[16.3659801483154,27.1856994628906,0],[16.862419128418,27.2737407684326,0],[17.1856994628906,26.3659801483154,0],[17.6604404449463,26.4278793334961,0],[17.9006500244141,25.4534206390381,0],[18.3548793792725,25.4950904846191,0],[18.5003795623779,24.4613399505615,0],[18.9363307952881,24.4879894256592,0],[18.9761600494385,23.4042091369629,0],[19.3969306945801,23.4202003479004,0],[19.3210391998291,22.2974300384521,0],[19.7304496765137,22.3061599731445,0],[19.5300102233887,21.1571502685547,0],[19.9323806762695,21.1609306335449,0],[19.6000003814697,20,0],[20,20,0],[19.6000003814697,0.399999290704727,0],[20,0,0],[5,0.399999290704727,0],[5,0,0],[4.2804012298584,0.456633001565933,0],[4.21782684326172,0.0615576282143593,0],[3.5785219669342,0.625140011310577,0],[3.45491504669189,0.244717106223106,0],[2.91164398193359,0.901369392871857,0],[2.73004698753357,0.544967114925385,0],[2.29618692398071,1.27852201461792,0],[2.06107401847839,0.954914808273315,0],[1.74730801582336,1.74730801582336,0],[1.46446597576141,1.46446597576141,0],[1.27852201461792,2.29618692398071,0],[0.954914808273315,2.06107401847839,0],[0.901369392871857,2.91164398193359,0],[0.544967114925385,2.73004698753357,0],[0.625140011310577,3.5785219669342,0],[0.244717106223106,3.45491504669189,0],[0.456633001565933,4.2804012298584,0],[0.0615576282143593,4.21782684326172,0],[0.399999290704727,5,0],[0,5,0],[0.399999290704727,20,0],[0,20,0],[0.469994693994522,21.1571502685547,0],[0.067615881562233,21.1609306335449,0],[0.678958415985107,22.2974300384521,0],[0.269550800323486,22.3061599731445,0],[1.02384400367737,23.4042091369629,0],[0.603073298931122,23.4202003479004,0],[1.49962198734283,24.4613399505615,0],[1.0636739730835,24.4879894256592,0],[2.0993549823761,25.4534206390381,0],[1.64512205123901,25.4950904846191,0],[2.81429696083069,26.3659801483154,0],[2.33955597877502,26.4278793334961,0],[3.63402199745178,27.1856994628906,0],[3.13758301734924,27.2737407684326,0],[4.54657793045044,27.9006500244141,0],[4.02841377258301,28.0212306976318,0],[5.53865718841553,28.5003795623779,0],[5,28.6602592468262,0],[6.59579277038574,28.9761600494385,0],[6.03920221328735,29.1821594238281,0],[7.70256900787354,29.3210391998291,0]
67 ];
68 $facets = [
69 [0,1,2],[2,1,3],[2,3,4],[4,3,5],[4,5,6],[6,5,7],[6,7,8],[8,7,9],[8,9,10],[10,9,11],[10,11,12],[12,11,13],[12,13,14],[14,13,15],[14,15,16],[16,15,17],[16,17,18],[18,17,19],[18,19,20],[20,19,21],[20,21,22],[22,21,23],[22,23,24],[24,23,25],[24,25,26],[26,25,27],[26,27,28],[28,27,29],[28,29,30],[30,29,31],[30,31,32],[32,31,33],[32,33,34],[34,33,35],[34,35,36],[36,35,37],[36,37,38],[38,37,39],[38,39,40],[40,39,41],[40,41,42],[42,41,43],[42,43,44],[44,43,45],[44,45,46],[46,45,47],[46,47,48],[48,47,49],[48,49,50],[50,49,51],[50,51,52],[52,51,53],[52,53,54],[54,53,55],[54,55,56],[56,55,57],[56,57,58],[58,57,59],[58,59,60],[60,59,61],[60,61,62],[62,61,63],[62,63,64],[64,63,65],[64,65,66],[66,65,67],[66,67,68],[68,67,69],[68,69,70],[70,69,71],[70,71,72],[72,71,73],[72,73,74],[74,73,75],[74,75,76],[76,75,77],[76,77,78],[78,77,0],[78,0,2],[79,80,81],[81,80,82],[81,82,83],[83,82,84],[83,84,85],[85,84,86],[85,86,87],[87,86,88],[87,88,89],[89,88,90],[89,90,91],[91,90,92],[91,92,93],[93,92,94],[93,94,95],[95,94,96],[95,96,97],[97,96,98],[97,98,99],[99,98,100],[99,100,101],[101,100,102],[101,102,103],[103,102,104],[103,104,105],[105,104,106],[105,106,107],[107,106,108],[107,108,109],[109,108,110],[109,110,111],[111,110,112],[111,112,113],[113,112,114],[113,114,115],[115,114,116],[115,116,117],[117,116,118],[117,118,119],[119,118,120],[119,120,121],[121,120,122],[121,122,123],[123,122,124],[123,124,125],[125,124,126],[125,126,127],[127,126,128],[127,128,129],[129,128,130],[129,130,131],[131,130,132],[131,132,133],[133,132,134],[133,134,135],[135,134,136],[135,136,137],[137,136,138],[137,138,139],[139,138,140],[139,140,141],[141,140,142],[141,142,143],[143,142,144],[143,144,145],[145,144,146],[145,146,147],[147,146,148],[147,148,149],[149,148,150],[149,150,151],[151,150,152],[151,152,153],[153,152,154],[153,154,155],[155,154,156],[155,156,157],[157,156,79],[157,79,81],[57,110,108],[57,108,59],[59,108,106],[59,106,61],[61,106,104],[61,104,63],[63,104,102],[63,102,65],[65,102,100],[65,100,67],[67,100,98],[67,98,69],[69,98,96],[69,96,71],[71,96,94],[71,94,73],[73,94,92],[73,92,75],[75,92,90],[75,90,77],[77,90,88],[77,88,0],[0,88,86],[0,86,1],[1,86,84],[1,84,3],[3,84,82],[3,82,5],[5,82,80],[5,80,7],[7,80,79],[7,79,9],[9,79,156],[9,156,11],[11,156,154],[11,154,13],[13,154,152],[13,152,15],[15,152,150],[15,150,17],[17,150,148],[17,148,19],[19,148,146],[19,146,21],[21,146,144],[21,144,23],[23,144,142],[23,142,25],[25,142,140],[25,140,27],[27,140,138],[27,138,29],[29,138,136],[29,136,31],[33,31,134],[134,31,136],[33,134,132],[33,132,35],[35,132,130],[35,130,37],[37,130,128],[37,128,39],[39,128,126],[39,126,41],[41,126,124],[41,124,43],[43,124,122],[43,122,45],[45,122,120],[45,120,47],[47,120,118],[47,118,49],[49,118,116],[49,116,51],[51,116,114],[51,114,53],[55,53,112],[112,53,114],[57,55,110],[110,55,112],[30,135,137],[30,137,28],[28,137,139],[28,139,26],[26,139,141],[26,141,24],[24,141,143],[24,143,22],[22,143,145],[22,145,20],[20,145,147],[20,147,18],[18,147,149],[18,149,16],[16,149,151],[16,151,14],[14,151,153],[14,153,12],[12,153,155],[12,155,10],[10,155,157],[10,157,8],[8,157,81],[8,81,6],[6,81,83],[6,83,4],[4,83,85],[4,85,2],[2,85,87],[2,87,78],[78,87,89],[78,89,76],[76,89,91],[76,91,74],[74,91,93],[74,93,72],[72,93,95],[72,95,70],[70,95,97],[70,97,68],[68,97,99],[68,99,66],[66,99,101],[66,101,64],[64,101,103],[64,103,62],[62,103,105],[62,105,60],[60,105,107],[60,107,58],[58,107,109],[58,109,56],[30,32,135],[135,32,133],[52,113,115],[52,115,50],[50,115,117],[50,117,48],[48,117,119],[48,119,46],[46,119,121],[46,121,44],[44,121,123],[44,123,42],[42,123,125],[42,125,40],[40,125,127],[40,127,38],[38,127,129],[38,129,36],[36,129,131],[36,131,34],[34,131,133],[34,133,32],[52,54,113],[113,54,111],[54,56,111],[111,56,109]
70 ],
71 } elsif ($name eq 'sloping_hole') {
72 $vertices = [
73 [-20,-20,-5],[-20,-20,5],[-20,20,-5],[-20,20,5],[20,-20,-5],[20,-20,5],[4.46294021606445,7.43144989013672,-5],[20,20,-5],[-19.1420993804932,0,-5],[-18.8330993652344,-2.07911992073059,-5],[-17.9195003509521,-4.06736993789673,-5],[-16.4412002563477,-5.87785005569458,-5],[-14.4629001617432,-7.43144989013672,-5],[-12.0711002349854,-8.66024971008301,-5],[-9.37016010284424,-9.51056003570557,-5],[-3.5217399597168,-9.94521999359131,-5],[-6.4782600402832,-9.94521999359131,-5],[-0.629840016365051,-9.51056003570557,-5],[2.07106995582581,-8.66024971008301,-5],[6.44122982025146,-5.87785005569458,-5],[4.46294021606445,-7.43144989013672,-5],[-12.0711002349854,8.66024971008301,-5],[-9.37016010284424,9.51056003570557,-5],[7.91947984695435,-4.06736993789673,-5],[8.83310031890869,-2.07911992073059,-5],[-6.4782600402832,9.94521999359131,-5],[-0.629840016365051,9.51056003570557,-5],[2.07106995582581,8.66024971008301,-5],[9.14214038848877,0,-5],[8.83310031890869,2.07911992073059,-5],[-3.5217399597168,9.94521999359131,-5],[7.91947984695435,4.06736993789673,-5],[6.44122982025146,5.87785005569458,-5],[-14.4629001617432,7.43144989013672,-5],[-16.4412002563477,5.87785005569458,-5],[-17.9195003509521,4.06736993789673,-5],[-18.8330993652344,2.07911992073059,-5],[20,20,5],[3.5217399597168,-9.94521999359131,5],[-8.83310031890869,-2.07911992073059,5],[-9.14214038848877,0,5],[-8.83310031890869,2.07911992073059,5],[6.4782600402832,-9.94521999359131,5],[-7.91947984695435,4.06736993789673,5],[-6.44122982025146,5.87785005569458,5],[-4.46294021606445,7.43144989013672,5],[-2.07106995582581,8.66024971008301,5],[0.629840016365051,9.51056003570557,5],[12.0711002349854,-8.66024971008301,5],[9.37016010284424,-9.51056003570557,5],[3.5217399597168,9.94521999359131,5],[6.4782600402832,9.94521999359131,5],[9.37016010284424,9.51056003570557,5],[12.0711002349854,8.66024971008301,5],[14.4629001617432,7.43144989013672,5],[16.4412002563477,-5.87785005569458,5],[14.4629001617432,-7.43144989013672,5],[16.4412002563477,5.87785005569458,5],[17.9195003509521,4.06736993789673,5],[18.8330993652344,-2.07911992073059,5],[17.9195003509521,-4.06736993789673,5],[18.8330993652344,2.07911992073059,5],[19.1420993804932,0,5],[0.629840016365051,-9.51056003570557,5],[-2.07106995582581,-8.66024971008301,5],[-4.46294021606445,-7.43144989013672,5],[-6.44122982025146,-5.87785005569458,5],[-7.91947984695435,-4.06736993789673,5]
74 ];
75 $facets = [
76 [0,1,2],[2,1,3],[1,0,4],[5,1,4],[6,2,7],[0,2,8],[0,8,9],[0,9,10],[0,10,11],[0,11,12],[0,12,13],[0,13,4],[13,14,4],[15,4,16],[17,4,15],[18,4,17],[19,4,20],[18,20,4],[21,2,22],[4,19,23],[4,23,7],[23,24,7],[22,2,25],[26,2,27],[28,29,7],[25,2,30],[29,31,7],[30,2,26],[31,32,7],[27,2,6],[32,6,7],[28,7,24],[33,2,21],[34,2,33],[35,2,34],[36,2,35],[8,2,36],[16,4,14],[2,3,7],[7,3,37],[38,1,5],[3,1,39],[3,39,40],[3,40,41],[42,38,5],[3,41,43],[3,43,44],[37,3,45],[37,45,46],[37,46,47],[48,49,5],[37,47,50],[49,42,5],[37,50,51],[37,51,52],[37,52,53],[37,53,54],[55,56,5],[37,54,57],[37,57,58],[59,60,5],[37,58,61],[37,62,5],[37,61,62],[62,59,5],[60,55,5],[63,1,38],[64,1,63],[65,1,64],[66,1,65],[67,1,66],[39,1,67],[44,45,3],[56,48,5],[5,4,7],[37,5,7],[41,40,36],[36,40,8],[39,9,40],[40,9,8],[43,41,35],[35,41,36],[44,43,34],[34,43,35],[33,45,44],[34,33,44],[21,46,45],[33,21,45],[22,47,46],[21,22,46],[25,50,47],[22,25,47],[30,51,50],[25,30,50],[26,52,51],[30,26,51],[27,53,52],[26,27,52],[6,54,53],[27,6,53],[32,57,54],[6,32,54],[31,58,57],[32,31,57],[29,61,58],[31,29,58],[28,62,61],[29,28,61],[59,62,28],[24,59,28],[60,59,24],[23,60,24],[55,60,23],[19,55,23],[55,19,56],[56,19,20],[56,20,48],[48,20,18],[48,18,49],[49,18,17],[49,17,42],[42,17,15],[42,15,38],[38,15,16],[38,16,63],[63,16,14],[63,14,64],[64,14,13],[64,13,65],[65,13,12],[65,12,66],[66,12,11],[66,11,67],[67,11,10],[67,10,39],[39,10,9]
77 ],
78 } elsif ($name eq 'ipadstand') {
79 $vertices = [
80 [17.4344673156738,-2.69879599481136e-16,9.5],[14.2814798355103,10,9.5],[0,0,9.5],[31.7159481048584,10,9.5],[62.2344741821289,2.06667568800577e-16,20],[31.7159481048584,10,20],[17.4344673156738,-2.69879599481136e-16,20],[62.2344741821289,10,20],[98.2079696655273,10,0],[98.2079696655273,8.56525380796383e-16,10],[98.2079696655273,0,0],[98.2079696655273,10,20],[98.2079696655273,0,20],[81.6609649658203,-4.39753856997999e-16,10],[90.0549850463867,10,10],[78.5079803466797,10,10],[93.2079696655273,8.56525380796383e-16,10],[14.2814798355103,10,20],[0,0,20],[87.4344711303711,2.81343962782118e-15,20],[84.2814788818359,10,20],[0,10,20],[0,0,0],[0,10,0],[62.2344741821289,2.06667568800577e-16,30],[66.9609756469727,10,30],[62.2344741821289,10,30],[70.1139602661133,8.5525763717214e-16,30],[67.7053375244141,10,28.7107200622559],[71.6787109375,1.24046736339707e-15,27.2897701263428]
81 ];
82 $facets = [
83 [0,1,2],[1,0,3],[4,5,6],[5,4,7],[8,9,10],[9,11,12],[11,9,8],[13,14,15],[14,13,16],[17,2,1],[2,17,18],[19,11,20],[11,19,12],[17,21,18],[21,2,18],[2,21,22],[22,21,23],[8,22,23],[22,8,10],[24,25,26],[25,24,27],[23,1,8],[1,23,21],[1,21,17],[5,15,3],[15,5,7],[15,7,28],[28,7,26],[28,26,25],[8,14,11],[14,8,3],[3,8,1],[14,3,15],[11,14,20],[26,4,24],[4,26,7],[12,16,9],[16,12,19],[29,4,13],[4,29,24],[24,29,27],[9,22,10],[22,9,0],[0,9,16],[0,16,13],[0,13,6],[6,13,4],[2,22,0],[19,14,16],[14,19,20],[15,29,13],[29,25,27],[25,29,15],[25,15,28],[6,3,0],[3,6,5]
84 ];
85 } elsif ($name eq 'A') {
86 $vertices = [
87 [513.075988769531,51.6074333190918,36.0009002685547],[516.648803710938,51.7324333190918,36.0009002685547],[513.495178222656,51.7324333190918,36.0009002685547],[489.391204833984,51.4824333190918,24.0011005401611],[488.928588867188,51.7324333190918,24.0011005401611],[492.06201171875,51.7324333190918,24.0011005401611],[496.840393066406,51.2324333190918,24.0011005401611],[495.195404052734,51.7324333190918,24.0011005401611],[498.981994628906,51.7324333190918,24.0011005401611],[506.966613769531,51.6074333190918,24.0011005401611],[510.342010498047,51.7324333190918,24.0011005401611],[507.163818359375,51.6074333190918,24.0011005401611],[512.515380859375,54.7190322875977,36.0009002685547],[514.161987304688,54.5058326721191,36.0009002685547],[493.06201171875,54.7190322875977,36.0009002685547],[495.195404052734,51.7324333190918,36.0009002685547],[496.195404052734,54.7190322875977,36.0009002685547],[497.195404052734,57.7058334350586,36.0009002685547],[500.851989746094,60.2658309936523,36.0009002685547],[498.915405273438,62.8258323669434,36.0009002685547],[506.701995849609,62.8258323669434,36.0009002685547],[503.648590087891,60.2658309936523,36.0009002685547],[508.381805419922,57.7058334350586,36.0009002685547],[496.418792724609,60.052433013916,36.0009002685547],[506.515197753906,72.2124328613281,36.0009002685547],[502.808807373047,74.5324325561523,36.0009002685547],[503.781982421875,71.6058349609375,36.0009002685547],[515.358764648438,55.4658317565918,36.0009002685547],[499.375183105469,76.9058380126953,36.0009002685547],[501.168792724609,78.0658340454102,36.0009002685547],[504.568786621094,78.0658340454102,36.0009002685547],[506.32861328125,81.599235534668,36.0009002685547],[502.928588867188,81.599235534668,36.0009002685547],[499.528594970703,81.599235534668,36.0009002685547],[498.20361328125,77.8658294677734,36.0009002685547],[495.195404052734,51.7324333190918,30.0011005401611],[498.981994628906,51.7324333190918,27.0011005401611],[506.555206298828,51.7324333190918,33.0009002685547],[506.555206298828,51.7324333190918,36.0009002685547],[510.342010498047,51.7324333190918,36.0009002685547],[512.515380859375,54.7190322875977,24.0011005401611],[509.361999511719,54.7190322875977,24.0011005401611],[508.381805419922,57.7058334350586,24.0011005401611],[506.701995849609,62.8258323669434,24.0011005401611],[509.188812255859,60.052433013916,24.0011005401611],[493.06201171875,54.7190322875977,24.0011005401611],[503.648590087891,60.2658309936523,24.0011005401611],[500.851989746094,60.2658309936523,24.0011005401611],[498.915405273438,62.8258323669434,24.0011005401611],[502.808807373047,62.8258323669434,24.0011005401611],[491.425201416016,54.5058326721191,24.0011005401611],[506.421813964844,76.9058380126953,24.0011005401611],[502.808807373047,74.5324325561523,24.0011005401611],[504.568786621094,78.0658340454102,24.0011005401611],[506.32861328125,81.599235534668,24.0011005401611],[507.618804931641,77.8658294677734,24.0011005401611],[499.221801757812,72.2124328613281,24.0011005401611],[501.835388183594,71.6058349609375,24.0011005401611],[501.168792724609,78.0658340454102,24.0011005401611],[499.528594970703,81.599235534668,24.0011005401611],[502.048583984375,79.8324356079102,24.0011005401611],[490.253601074219,55.4658317565918,24.0011005401611],[488.928588867188,51.7324333190918,30.0011005401611],[488.928588867188,51.7324333190918,36.0009002685547],[490.253601074219,55.4658317565918,31.5009002685547],[498.20361328125,77.8658294677734,34.5009002685547],[508.381805419922,57.7058334350586,30.0011005401611],[505.585388183594,57.7058334350586,27.0011005401611],[502.788818359375,57.7058334350586,36.0009002685547],[499.992004394531,57.7058334350586,33.0009002685547],[509.851989746094,53.2258338928223,33.0009002685547],[509.361999511719,54.7190322875977,36.0009002685547],[508.871795654297,56.2124328613281,27.0011005401611],[496.695404052734,56.2124328613281,33.0009002685547],[495.695404052734,53.2258338928223,27.0011005401611],[506.32861328125,81.599235534668,30.0011005401611],[507.618804931641,77.8658294677734,25.5011005401611],[515.358764648438,55.4658317565918,34.5009002685547],[501.228607177734,81.599235534668,33.0009002685547],[504.628601074219,81.599235534668,27.0011005401611],[503.781982421875,71.6058349609375,33.0009002685547],[502.808807373047,74.5324325561523,30.0011005401611],[498.915405273438,62.8258323669434,30.0011005401611],[500.861999511719,62.8258323669434,27.0011005401611],[502.808807373047,62.8258323669434,36.0009002685547],[504.755187988281,62.8258323669434,33.0009002685547],[501.835388183594,71.6058349609375,33.0009002685547],[499.888793945312,65.7524337768555,33.0009002685547],[499.888793945312,65.7524337768555,36.0009002685547],[513.128601074219,51.4824333190918,36.0009002685547],[513.075988769531,51.6074333190918,24.0011005401611],[516.648803710938,51.7324333190918,24.0011005401611],[513.128601074219,51.4824333190918,24.0011005401611],[513.495178222656,51.7324333190918,24.0011005401611],[506.966613769531,51.6074333190918,36.0009002685547],[507.163818359375,51.6074333190918,36.0009002685547],[490.337799072266,51.4824333190918,24.0011005401611],[489.391204833984,51.4824333190918,36.0009002685547],[492.06201171875,51.7324333190918,36.0009002685547],[490.337799072266,51.4824333190918,36.0009002685547],[513.233764648438,51.2324333190918,24.0011005401611],[513.233764648438,51.2324333190918,36.0009002685547],[504.773803710938,51.4824333190918,36.0009002685547],[504.773803710938,51.4824333190918,24.0011005401611],[489.266998291016,51.2324333190918,24.0011005401611],[489.266998291016,51.2324333190918,36.0009002685547],[490.253601074219,55.4658317565918,25.5011005401611],[499.528594970703,81.599235534668,30.0011005401611],[498.20361328125,77.8658294677734,31.5009002685547],[515.358764648438,55.4658317565918,28.5011005401611],[515.358764648438,55.4658317565918,25.5011005401611],[495.246795654297,61.0124320983887,36.0009002685547],[490.253601074219,55.4658317565918,34.5009002685547],[490.253601074219,55.4658317565918,36.0009002685547],[494.228607177734,66.6658325195312,24.0011005401611],[499.068786621094,67.5192337036133,24.0011005401611],[498.20361328125,77.8658294677734,25.5011005401611],[498.20361328125,77.8658294677734,24.0011005401611],[506.608795166016,67.5192337036133,36.0009002685547],[509.09521484375,64.7458343505859,36.0009002685547],[507.618804931641,77.8658294677734,34.5009002685547],[507.618804931641,77.8658294677734,36.0009002685547],[510.385406494141,61.0124320983887,24.0011005401611],[515.358764648438,55.4658317565918,24.0011005401611],[489.32861328125,47.7324333190918,31.5009002685547],[492.95361328125,47.7324333190918,33.5634994506836],[489.32861328125,47.7324333190918,34.5009002685547],[489.32861328125,47.7324333190918,28.5011005401611],[489.32861328125,47.7324333190918,25.5011005401611],[492.95361328125,47.7324333190918,26.4385013580322],[492.95361328125,47.7324333190918,30.5635013580322],[492.95361328125,47.7324333190918,32.0634994506836],[492.95361328125,47.7324333190918,31.3135013580322],[492.95361328125,47.7324333190918,35.4384994506836],[489.32861328125,47.7324333190918,36.0009002685547],[492.95361328125,47.7324333190918,34.3134994506836],[492.95361328125,47.7324333190918,34.6884994506836],[492.95361328125,47.7324333190918,27.9385013580322],[492.95361328125,47.7324333190918,28.6885013580322],[492.95361328125,47.7324333190918,29.0635013580322],[489.32861328125,47.7324333190918,24.0011005401611],[492.95361328125,47.7324333190918,24.5635013580322],[492.95361328125,47.7324333190918,25.6885013580322],[492.95361328125,47.7324333190918,25.3135013580322],[492.95361328125,47.7324333190918,24.1885013580322],[492.95361328125,47.7324333190918,24.0011005401611],[513.443786621094,50.7324333190918,24.0011005401611],[492.95361328125,47.7324333190918,35.8134994506836],[492.95361328125,47.7324333190918,36.0009002685547],[513.443786621094,50.7324333190918,36.0009002685547],[506.350402832031,51.4824333190918,36.0009002685547],[506.350402832031,51.4824333190918,24.0011005401611],[492.743804931641,48.2324333190918,24.0011005401611],[492.638793945312,48.4824333190918,24.0011005401611],[492.743804931641,48.2324333190918,36.0009002685547],[492.638793945312,48.4824333190918,36.0009002685547],[490.089599609375,50.9824333190918,36.0009002685547],[490.089599609375,50.9824333190918,24.0011005401611],[510.342010498047,51.7324333190918,30.0011005401611],[499.068786621094,67.5192337036133,36.0009002685547],[494.228607177734,66.6658325195312,36.0009002685547],[499.375183105469,76.9058380126953,24.0011005401611],[506.421813964844,76.9058380126953,36.0009002685547],[506.608795166016,67.5192337036133,24.0011005401611],[505.728607177734,65.7524337768555,24.0011005401611],[509.09521484375,64.7458343505859,24.0011005401611],[506.701995849609,62.8258323669434,30.0011005401611],[505.728607177734,65.7524337768555,27.0011005401611],[501.835388183594,71.6058349609375,27.0011005401611],[499.888793945312,65.7524337768555,27.0011005401611],[494.228607177734,66.6658325195312,30.0011005401611],[495.553588867188,70.3992309570312,28.5011005401611],[492.903594970703,62.9324340820312,28.5011005401611],[495.553588867188,70.3992309570312,31.5009002685547],[492.903594970703,62.9324340820312,31.5009002685547],[511.488800048828,66.6658325195312,24.0011005401611],[511.488800048828,66.6658325195312,30.0011005401611],[512.778564453125,62.9324340820312,28.5011005401611],[515.358764648438,55.4658317565918,31.5009002685547],[507.618804931641,77.8658294677734,31.5009002685547],[510.198791503906,70.3992309570312,28.5011005401611],[511.488800048828,66.6658325195312,36.0009002685547],[512.778564453125,62.9324340820312,31.5009002685547],[510.198791503906,70.3992309570312,31.5009002685547],[502.788818359375,57.7058334350586,24.0011005401611],[497.195404052734,57.7058334350586,30.0011005401611],[492.903594970703,62.9324340820312,34.5009002685547],[492.903594970703,62.9324340820312,36.0009002685547],[495.553588867188,70.3992309570312,24.0011005401611],[496.725189208984,69.4392318725586,24.0011005401611],[495.553588867188,70.3992309570312,25.5011005401611],[495.246795654297,61.0124320983887,24.0011005401611],[492.903594970703,62.9324340820312,25.5011005401611],[492.903594970703,62.9324340820312,24.0011005401611],[495.553588867188,70.3992309570312,36.0009002685547],[496.725189208984,69.4392318725586,36.0009002685547],[495.553588867188,70.3992309570312,34.5009002685547],[510.198791503906,70.3992309570312,36.0009002685547],[509.002014160156,69.4392318725586,36.0009002685547],[510.198791503906,70.3992309570312,34.5009002685547],[512.778564453125,62.9324340820312,25.5011005401611],[512.778564453125,62.9324340820312,24.0011005401611],[510.198791503906,70.3992309570312,24.0011005401611],[509.002014160156,69.4392318725586,24.0011005401611],[510.198791503906,70.3992309570312,25.5011005401611],[510.385406494141,61.0124320983887,36.0009002685547],[512.778564453125,62.9324340820312,34.5009002685547],[512.778564453125,62.9324340820312,36.0009002685547],[496.840393066406,51.2324333190918,36.0009002685547],[498.981994628906,51.7324333190918,36.0009002685547],[498.981994628906,51.7324333190918,33.0009002685547],[506.555206298828,51.7324333190918,24.0011005401611],[506.555206298828,51.7324333190918,27.0011005401611],[503.82861328125,47.7324333190918,30.7509002685547],[507.45361328125,47.7324333190918,32.8134994506836],[503.82861328125,47.7324333190918,33.7509002685547],[503.82861328125,47.7324333190918,29.2511005401611],[503.82861328125,47.7324333190918,26.2511005401611],[507.45361328125,47.7324333190918,27.1885013580322],[493.921813964844,57.2792320251465,36.0009002685547],[491.425201416016,54.5058326721191,36.0009002685547],[497.195404052734,57.7058334350586,24.0011005401611],[496.418792724609,60.052433013916,24.0011005401611],[509.188812255859,60.052433013916,36.0009002685547],[511.675415039062,57.2792320251465,24.0011005401611],[514.161987304688,54.5058326721191,24.0011005401611],[507.45361328125,47.7324333190918,34.3134994506836],[503.82861328125,47.7324333190918,35.2509002685547],[507.45361328125,47.7324333190918,25.6885013580322],[503.82861328125,47.7324333190918,24.7511005401611],[500.20361328125,47.7324333190918,31.6885013580322],[500.20361328125,47.7324333190918,28.3135013580322],[500.20361328125,47.7324333190918,30.1885013580322],[507.45361328125,47.7324333190918,29.8135013580322],[507.45361328125,47.7324333190918,31.3135013580322],[507.45361328125,47.7324333190918,30.5635013580322],[503.82861328125,47.7324333190918,36.0009002685547],[507.45361328125,47.7324333190918,35.4384994506836],[507.45361328125,47.7324333190918,35.0634994506836],[507.45361328125,47.7324333190918,28.6885013580322],[507.45361328125,47.7324333190918,29.4385013580322],[503.82861328125,47.7324333190918,24.0011005401611],[507.45361328125,47.7324333190918,24.5635013580322],[507.45361328125,47.7324333190918,24.9385013580322],[500.20361328125,47.7324333190918,34.6884994506836],[500.20361328125,47.7324333190918,33.1884994506836],[500.20361328125,47.7324333190918,33.9384994506836],[500.20361328125,47.7324333190918,25.3135013580322],[500.20361328125,47.7324333190918,26.8135013580322],[500.20361328125,47.7324333190918,26.0635013580322],[500.20361328125,47.7324333190918,30.9385013580322],[500.20361328125,47.7324333190918,35.0634994506836],[500.20361328125,47.7324333190918,35.4384994506836],[500.20361328125,47.7324333190918,29.0635013580322],[500.20361328125,47.7324333190918,29.4385013580322],[500.20361328125,47.7324333190918,24.9385013580322],[500.20361328125,47.7324333190918,24.5635013580322],[507.45361328125,47.7324333190918,24.1885013580322],[507.45361328125,47.7324333190918,24.0011005401611],[513.86376953125,49.7324333190918,24.0011005401611],[507.45361328125,47.7324333190918,35.8134994506836],[507.45361328125,47.7324333190918,36.0009002685547],[513.86376953125,49.7324333190918,36.0009002685547],[500.20361328125,47.7324333190918,24.1885013580322],[500.20361328125,47.7324333190918,24.0011005401611],[502.988800048828,49.7324333190918,24.0011005401611],[500.20361328125,47.7324333190918,35.8134994506836],[500.20361328125,47.7324333190918,36.0009002685547],[502.988800048828,49.7324333190918,36.0009002685547],[504.755187988281,62.8258323669434,27.0011005401611],[499.205383300781,51.2324333190918,36.0009002685547],[498.786193847656,51.1074333190918,36.0009002685547],[502.358795166016,51.2324333190918,36.0009002685547],[499.205383300781,51.2324333190918,24.0011005401611],[502.358795166016,51.2324333190918,24.0011005401611],[498.786193847656,51.1074333190918,24.0011005401611],[502.568786621094,50.7324333190918,24.0011005401611],[505.931213378906,51.3574333190918,24.0011005401611],[509.503601074219,51.4824333190918,24.0011005401611],[502.568786621094,50.7324333190918,36.0009002685547],[505.931213378906,51.3574333190918,36.0009002685547],[509.503601074219,51.4824333190918,36.0009002685547],[499.048583984375,50.4824333190918,36.0009002685547],[492.428588867188,48.9824333190918,36.0009002685547],[499.048583984375,50.4824333190918,24.0011005401611],[492.428588867188,48.9824333190918,24.0011005401611],[506.088806152344,50.9824333190918,24.0011005401611],[506.036010742188,51.1074333190918,24.0011005401611],[506.088806152344,50.9824333190918,36.0009002685547],[506.036010742188,51.1074333190918,36.0009002685547],[498.891204833984,50.8574333190918,36.0009002685547],[498.943786621094,50.7324333190918,36.0009002685547],[498.891204833984,50.8574333190918,24.0011005401611],[498.943786621094,50.7324333190918,24.0011005401611],[499.573608398438,49.2324333190918,24.0011005401611],[499.783813476562,48.7324333190918,24.0011005401611],[499.573608398438,49.2324333190918,36.0009002685547],[499.783813476562,48.7324333190918,36.0009002685547],[506.403594970703,50.2324333190918,24.0011005401611],[506.298797607422,50.4824333190918,24.0011005401611],[506.403594970703,50.2324333190918,36.0009002685547],[506.298797607422,50.4824333190918,36.0009002685547],[501.228607177734,81.599235534668,27.0011005401611],[502.928588867188,81.599235534668,24.0011005401611],[499.2587890625,49.9824333190918,36.0009002685547],[499.363800048828,49.7324333190918,36.0009002685547],[499.2587890625,49.9824333190918,24.0011005401611],[499.363800048828,49.7324333190918,24.0011005401611],[496.695404052734,56.2124328613281,27.0011005401611],[496.195404052734,54.7190322875977,24.0011005401611],[509.851989746094,53.2258338928223,27.0011005401611],[493.464782714844,51.1074333190918,36.0009002685547],[493.464782714844,51.1074333190918,24.0011005401611],[502.768798828125,51.7324333190918,24.0011005401611],[500.215789794922,51.3574333190918,24.0011005401611],[497.628601074219,51.2324333190918,24.0011005401611],[502.768798828125,51.7324333190918,36.0009002685547],[500.215789794922,51.3574333190918,36.0009002685547],[497.628601074219,51.2324333190918,36.0009002685547],[507.033813476562,48.7324333190918,24.0011005401611],[506.823791503906,49.2324333190918,24.0011005401611],[507.033813476562,48.7324333190918,36.0009002685547],[506.823791503906,49.2324333190918,36.0009002685547],[494.4501953125,51.1074333190918,24.0011005401611],[494.4501953125,51.1074333190918,36.0009002685547],[500.807006835938,51.3574333190918,36.0009002685547],[503.591186523438,51.4824333190918,36.0009002685547],[503.591186523438,51.4824333190918,24.0011005401611],[500.807006835938,51.3574333190918,24.0011005401611],[505.728607177734,65.7524337768555,36.0009002685547],[505.728607177734,65.7524337768555,33.0009002685547],[499.221801757812,72.2124328613281,36.0009002685547],[501.835388183594,71.6058349609375,36.0009002685547],[506.515197753906,72.2124328613281,24.0011005401611],[503.781982421875,71.6058349609375,24.0011005401611],[503.781982421875,71.6058349609375,27.0011005401611],[499.888793945312,65.7524337768555,24.0011005401611],[495.695404052734,53.2258338928223,33.0009002685547],[516.648803710938,51.7324333190918,30.0011005401611],[498.20361328125,77.8658294677734,28.5011005401611],[505.585388183594,57.7058334350586,33.0009002685547],[508.871795654297,56.2124328613281,33.0009002685547],[499.992004394531,57.7058334350586,27.0011005401611],[504.628601074219,81.599235534668,33.0009002685547],[500.861999511719,62.8258323669434,33.0009002685547],[496.878601074219,74.1324310302734,27.0011005401611],[496.878601074219,74.1324310302734,33.0009002685547],[491.57861328125,59.199031829834,27.0011005401611],[490.253601074219,55.4658317565918,28.5011005401611],[491.57861328125,59.199031829834,33.0009002685547],[514.068786621094,59.199031829834,27.0011005401611],[514.068786621094,59.199031829834,33.0009002685547],[508.908813476562,74.1324310302734,27.0011005401611],[507.618804931641,77.8658294677734,28.5011005401611],[508.908813476562,74.1324310302734,33.0009002685547],[491.271789550781,50.9824333190918,36.0009002685547],[490.877807617188,50.9824333190918,36.0009002685547],[491.271789550781,50.9824333190918,24.0011005401611],[490.877807617188,50.9824333190918,24.0011005401611],[495.213806152344,50.9824333190918,36.0009002685547],[493.636993408203,50.9824333190918,36.0009002685547],[495.213806152344,50.9824333190918,24.0011005401611],[493.636993408203,50.9824333190918,24.0011005401611],[503.985412597656,51.4824333190918,36.0009002685547],[503.985412597656,51.4824333190918,24.0011005401611],[511.675415039062,57.2792320251465,36.0009002685547],[493.921813964844,57.2792320251465,24.0011005401611],[502.768798828125,51.7324333190918,30.0011005401611],[506.555206298828,51.7324333190918,30.0011005401611],[498.981994628906,51.7324333190918,30.0011005401611],[492.848815917969,50.9824333190918,24.0011005401611],[492.848815917969,50.9824333190918,36.0009002685547],[500.861999511719,68.6792297363281,36.0009002685547],[500.861999511719,68.6792297363281,24.0011005401611],[496.878601074219,74.1324310302734,24.0011005401611],[496.878601074219,74.1324310302734,36.0009002685547],[504.755187988281,68.6792297363281,24.0011005401611],[504.755187988281,68.6792297363281,36.0009002685547],[508.908813476562,74.1324310302734,36.0009002685547],[508.908813476562,74.1324310302734,24.0011005401611],[505.728607177734,65.7524337768555,30.0011005401611],[504.755187988281,68.6792297363281,30.0011005401611],[503.781982421875,71.6058349609375,30.0011005401611],[500.861999511719,68.6792297363281,30.0011005401611],[499.888793945312,65.7524337768555,30.0011005401611],[501.835388183594,71.6058349609375,30.0011005401611],[491.57861328125,59.199031829834,24.0011005401611],[491.57861328125,59.199031829834,36.0009002685547],[514.068786621094,59.199031829834,36.0009002685547],[514.068786621094,59.199031829834,24.0011005401611],[511.07861328125,47.7324333190918,34.8759002685547],[511.07861328125,47.7324333190918,31.8759002685547],[514.70361328125,47.7324333190918,33.9384994506836],[511.07861328125,47.7324333190918,25.1261005401611],[514.70361328125,47.7324333190918,26.0635013580322],[511.07861328125,47.7324333190918,28.1261005401611],[502.788818359375,57.7058334350586,30.0011005401611],[502.048583984375,79.8324356079102,36.0009002685547],[514.70361328125,47.7324333190918,30.9385013580322],[511.07861328125,47.7324333190918,30.3759002685547],[514.70361328125,47.7324333190918,29.0635013580322],[511.07861328125,47.7324333190918,29.6261005401611],[496.57861328125,47.7324333190918,31.1259002685547],[496.57861328125,47.7324333190918,32.6259002685547],[496.57861328125,47.7324333190918,34.1259002685547],[496.57861328125,47.7324333190918,28.8761005401611],[496.57861328125,47.7324333190918,27.3761005401611],[496.57861328125,47.7324333190918,25.8761005401611],[496.57861328125,47.7324333190918,29.6261005401611],[514.70361328125,47.7324333190918,35.4384994506836],[511.07861328125,47.7324333190918,35.6259002685547],[514.70361328125,47.7324333190918,24.5635013580322],[511.07861328125,47.7324333190918,24.3761005401611],[496.57861328125,47.7324333190918,34.8759002685547],[496.57861328125,47.7324333190918,25.1261005401611],[496.57861328125,47.7324333190918,35.6259002685547],[496.57861328125,47.7324333190918,24.3761005401611],[511.07861328125,47.7324333190918,36.0009002685547],[511.07861328125,47.7324333190918,24.0011005401611],[514.70361328125,47.7324333190918,30.1885013580322],[514.70361328125,47.7324333190918,35.8134994506836],[514.70361328125,47.7324333190918,29.8135013580322],[514.70361328125,47.7324333190918,24.1885013580322],[496.57861328125,47.7324333190918,36.0009002685547],[496.57861328125,47.7324333190918,24.0011005401611],[510.238800048828,49.7324333190918,24.0011005401611],[510.238800048828,49.7324333190918,36.0009002685547],[514.70361328125,47.7324333190918,24.0011005401611],[514.70361328125,47.7324333190918,36.0009002685547],[496.158813476562,48.7324333190918,36.0009002685547],[496.158813476562,48.7324333190918,24.0011005401611],[502.808807373047,62.8258323669434,30.0011005401611],[509.608795166016,51.2324333190918,24.0011005401611],[509.608795166016,51.2324333190918,36.0009002685547],[491.641204833984,50.8574333190918,24.0011005401611],[495.423797607422,50.4824333190918,36.0009002685547],[495.423797607422,50.4824333190918,24.0011005401611],[491.641204833984,50.8574333190918,36.0009002685547],[495.528594970703,50.2324333190918,24.0011005401611],[492.0087890625,49.9824333190918,24.0011005401611],[509.818786621094,50.7324333190918,24.0011005401611],[495.948608398438,49.2324333190918,36.0009002685547],[495.528594970703,50.2324333190918,36.0009002685547],[495.948608398438,49.2324333190918,24.0011005401611],[509.818786621094,50.7324333190918,36.0009002685547],[492.0087890625,49.9824333190918,36.0009002685547],[491.956207275391,50.1074333190918,24.0011005401611],[491.956207275391,50.1074333190918,36.0009002685547],[502.928588867188,81.599235534668,30.0011005401611],[491.851013183594,50.3574333190918,36.0009002685547],[491.851013183594,50.3574333190918,24.0011005401611],[496.195404052734,54.7190322875977,30.0011005401611],[509.361999511719,54.7190322875977,30.0011005401611],[488.632598876953,51.7256317138672,30.0011005401611],[488.632598876953,51.7256317138672,29.5091018676758],[488.632598876953,51.7188339233398,24.0011005401611],[488.632598876953,51.7256317138672,27.4929008483887],[488.632598876953,51.7324333190918,30.0011005401611],[488.632598876953,51.7324333190918,29.0175018310547],[488.632598876953,51.7324333190918,24.9847011566162],[488.632598876953,51.7324333190918,24.0011005401611],[488.632598876953,51.7188339233398,30.0011005401611],[488.632598876953,51.7176322937012,24.0011005401611],[488.632598876953,51.7182312011719,30.0011005401611],[488.632598876953,51.7176322937012,30.0011005401611],[488.632598876953,51.715030670166,24.0011005401611],[488.632598876953,51.7162322998047,30.0011005401611],[488.632598876953,50.761833190918,24.0011005401611],[488.632598876953,50.7578315734863,24.0011005401611],[488.632598876953,50.7598342895508,30.0011005401611],[488.632598876953,50.7522315979004,24.0011005401611],[488.632598876953,49.7838325500488,24.0011005401611],[488.632598876953,50.2680320739746,30.0011005401611],[488.632598876953,51.7046318054199,24.0011005401611],[488.632598876953,51.709831237793,30.0011005401611],[488.632598876953,50.9120330810547,24.0011005401611],[488.632598876953,50.8882331848145,24.0011005401611],[488.632598876953,50.9002304077148,30.0011005401611],[488.632598876953,47.7324333190918,24.0370998382568],[488.632598876953,48.5612335205078,30.0011005401611],[488.632598876953,47.7324333190918,24.0011005401611],[488.632598876953,47.7324333190918,24.1091003417969],[488.632598876953,48.5612335205078,30.0189018249512],[488.632598876953,47.7324333190918,25.3211002349854],[488.632598876953,48.5612335205078,30.0551013946533],[488.632598876953,47.7324333190918,25.4651012420654],[488.632598876953,48.5612335205078,30.6609001159668],[488.632598876953,47.7324333190918,25.5371017456055],[488.632598876953,48.5612335205078,30.7329006195068],[488.632598876953,47.7324333190918,25.6091003417969],[488.632598876953,48.5612335205078,30.7689018249512],[488.632598876953,47.7324333190918,25.8971004486084],[488.632598876953,48.5612335205078,30.8051013946533],[488.632598876953,47.7324333190918,28.321102142334],[488.632598876953,48.5612335205078,30.9491004943848],[488.632598876953,47.7324333190918,28.4651012420654],[488.632598876953,48.5612335205078,32.1609001159668],[488.632598876953,47.7324333190918,28.5371017456055],[488.632598876953,48.5612335205078,32.2329025268555],[488.632598876953,47.7324333190918,28.6811008453369],[488.632598876953,48.5612335205078,32.2689018249512],[488.632598876953,47.7324333190918,31.1049003601074],[488.632598876953,48.5612335205078,32.3411026000977],[488.632598876953,47.7324333190918,31.3929004669189],[488.632598876953,49.3900299072266,36.0009002685547],[488.632598876953,47.7324333190918,31.536901473999],[488.632598876953,47.7324333190918,31.6809005737305],[488.632598876953,47.7324333190918,34.1049003601074],[488.632598876953,47.7324333190918,34.3929023742676],[488.632598876953,47.7324333190918,34.464900970459],[488.632598876953,47.7324333190918,34.5369033813477],[488.632598876953,47.7324333190918,34.6809005737305],[488.632598876953,47.7324333190918,35.8929023742676],[488.632598876953,47.7324333190918,35.964900970459],[488.632598876953,47.7324333190918,36.0009002685547],[488.632598876953,50.8816299438477,24.0011005401611],[488.632598876953,50.8850326538086,30.0011005401611],[488.632598876953,49.7480316162109,24.0011005401611],[488.632598876953,49.7426300048828,24.0011005401611],[488.632598876953,49.745231628418,30.0011005401611],[488.632598876953,49.7592315673828,24.0011005401611],[488.632598876953,49.7536315917969,30.0011005401611],[488.632598876953,49.3900299072266,24.0011005401611],[488.632598876953,49.5664329528809,30.0011005401611],[488.632598876953,50.8786315917969,24.0011005401611],[488.632598876953,50.7764320373535,24.0011005401611],[488.632598876953,50.8274307250977,30.0011005401611],[488.632598876953,50.7550315856934,30.0011005401611],[488.632598876953,50.7692337036133,30.0011005401611],[488.632598876953,50.9284324645996,24.0011005401611],[488.632598876953,50.9202308654785,30.0011005401611],[488.632598876953,51.1788330078125,24.0011005401611],[488.632598876953,51.139232635498,24.0011005401611],[488.632598876953,51.1590309143066,30.0011005401611],[488.632598876953,51.2324333190918,24.0011005401611],[488.632598876953,51.2056312561035,30.0011005401611],[488.632598876953,51.4340324401855,24.0011005401611],[488.632598876953,51.3946304321289,24.0011005401611],[488.632598876953,51.4142303466797,30.0011005401611],[488.632598876953,51.4498329162598,24.0011005401611],[488.632598876953,51.5772323608398,30.0011005401611],[488.632598876953,51.4418334960938,30.0011005401611],[488.632598876953,51.3136329650879,30.0011005401611],[488.632598876953,49.7714309692383,30.0011005401611],[488.632598876953,51.0338325500488,30.0011005401611],[488.632598876953,50.8816299438477,30.0011005401611],[488.632598876953,50.8800315856934,30.0011005401611],[488.632598876953,51.7188339233398,36.0009002685547],[488.632598876953,51.7176322937012,36.0009002685547],[488.632598876953,49.3900299072266,30.0011005401611],[488.632598876953,50.7522315979004,30.0011005401611],[488.632598876953,50.7522315979004,36.0009002685547],[488.632598876953,49.7426300048828,30.0011005401611],[488.632598876953,49.7426300048828,36.0009002685547],[488.632598876953,49.7480316162109,30.0011005401611],[488.632598876953,49.7480316162109,36.0009002685547],[488.632598876953,51.715030670166,30.0011005401611],[488.632598876953,51.715030670166,36.0009002685547],[488.632598876953,50.7578315734863,30.0011005401611],[488.632598876953,50.7578315734863,36.0009002685547],[488.632598876953,50.761833190918,30.0011005401611],[488.632598876953,50.761833190918,36.0009002685547],[488.632598876953,50.8882331848145,30.0011005401611],[488.632598876953,50.8882331848145,36.0009002685547],[488.632598876953,49.7592315673828,30.0011005401611],[488.632598876953,49.7592315673828,36.0009002685547],[488.632598876953,51.1788330078125,30.0011005401611],[488.632598876953,51.1788330078125,36.0009002685547],[488.632598876953,50.9120330810547,30.0011005401611],[488.632598876953,50.9120330810547,36.0009002685547],[488.632598876953,51.4498329162598,30.0011005401611],[488.632598876953,51.4498329162598,36.0009002685547],[488.632598876953,51.7046318054199,30.0011005401611],[488.632598876953,51.7046318054199,36.0009002685547],[488.632598876953,51.2324333190918,30.0011005401611],[488.632598876953,51.2324333190918,36.0009002685547],[488.632598876953,51.3946304321289,30.0011005401611],[488.632598876953,51.3946304321289,36.0009002685547],[488.632598876953,51.4340324401855,30.0011005401611],[488.632598876953,51.4340324401855,36.0009002685547],[488.632598876953,49.7838325500488,30.0011005401611],[488.632598876953,49.7838325500488,36.0009002685547],[488.632598876953,50.7764320373535,30.0011005401611],[488.632598876953,50.7764320373535,36.0009002685547],[488.632598876953,51.139232635498,30.0011005401611],[488.632598876953,51.139232635498,36.0009002685547],[488.632598876953,50.9284324645996,30.0011005401611],[488.632598876953,50.9284324645996,36.0009002685547],[488.632598876953,50.8816299438477,36.0009002685547],[488.632598876953,50.8786315917969,30.0011005401611],[488.632598876953,50.8786315917969,36.0009002685547],[488.632598876953,51.7324333190918,35.0173034667969],[488.632598876953,51.7324333190918,36.0009002685547],[488.632598876953,51.7324333190918,30.9847011566162],[517.188415527344,51.7140884399414,24.0011005401611],[517.188415527344,51.7140884399414,36.0009002685547],[517.188415527344,50.4475173950195,24.0011005401611],[517.188415527344,51.7324333190918,35.3734130859375],[517.188415527344,51.7324333190918,36.0009002685547],[517.188415527344,51.7324333190918,34.1185760498047],[517.188415527344,51.7324333190918,31.88330078125],[517.188415527344,51.7324333190918,30.0011005401611],[517.188415527344,51.7324333190918,28.1187744140625],[517.188415527344,51.7324333190918,25.8834266662598],[517.188415527344,51.7324333190918,24.6285915374756],[517.188415527344,51.7324333190918,24.0011005401611],[517.188415527344,47.7324333190918,24.0600452423096],[517.188415527344,47.7324333190918,24.0011005401611],[517.188415527344,50.4475173950195,36.0009002685547],[517.188415527344,47.7324333190918,24.1779975891113],[517.188415527344,47.7324333190918,24.6498031616211],[517.188415527344,47.7324333190918,28.7625770568848],[517.188415527344,47.7324333190918,29.7061901092529],[517.188415527344,47.7324333190918,29.9420928955078],[517.188415527344,47.7324333190918,30.0600452423096],[517.188415527344,47.7324333190918,30.2959480285645],[517.188415527344,47.7324333190918,31.2395629882812],[517.188415527344,47.7324333190918,35.3521995544434],[517.188415527344,47.7324333190918,35.8240051269531],[517.188415527344,47.7324333190918,35.9419555664062],[517.188415527344,47.7324333190918,36.0009002685547]
88 ];
89 $facets = [
90 [0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,2,1],[12,1,13],[14,15,16],[17,18,19],[20,21,22],[17,19,23],[24,25,26],[27,13,1],[28,25,29],[30,31,32],[28,33,34],[35,36,7],[37,38,39],[40,10,41],[42,43,44],[45,5,4],[46,47,48],[46,48,49],[45,4,50],[51,52,53],[51,54,55],[56,52,57],[58,59,60],[61,50,4],[62,63,64],[65,34,33],[66,67,42],[68,17,69],[70,71,22],[66,42,72],[73,16,15],[35,7,74],[75,76,54],[77,27,1],[78,32,31],[75,54,79],[80,26,25],[81,80,25],[82,83,48],[84,20,85],[81,25,86],[87,88,19],[0,89,1],[90,91,92],[90,10,93],[38,94,39],[94,95,39],[3,7,96],[97,15,98],[97,99,15],[92,91,100],[89,101,1],[102,39,95],[103,11,10],[104,96,7],[105,15,99],[106,61,4],[107,108,33],[76,55,54],[109,91,110],[111,23,19],[112,63,113],[114,115,48],[116,59,117],[118,20,119],[120,31,121],[122,44,43],[110,91,123],[124,125,126],[127,128,129],[127,130,124],[131,124,132],[126,133,134],[135,136,126],[137,138,127],[139,127,138],[128,140,141],[142,128,143],[144,140,145],[100,91,146],[147,148,134],[101,149,1],[102,150,39],[103,10,151],[145,140,152],[152,140,153],[148,154,134],[154,155,134],[156,15,105],[157,104,7],[36,8,7],[158,37,39],[159,19,88],[160,19,159],[161,59,58],[161,117,59],[162,31,30],[162,121,31],[163,43,164],[163,165,43],[166,167,43],[167,164,43],[168,57,52],[82,48,169],[114,170,171],[108,65,33],[64,63,112],[114,172,170],[160,173,170],[171,170,173],[172,174,170],[160,170,174],[175,176,177],[178,77,1],[179,31,120],[175,180,176],[181,182,176],[177,176,182],[180,183,176],[181,176,183],[184,42,67],[185,69,17],[160,111,19],[186,187,160],[188,189,114],[190,188,114],[114,48,191],[192,114,193],[194,160,195],[196,160,194],[197,198,181],[199,197,181],[122,43,165],[200,201,175],[202,175,203],[204,175,202],[205,119,20],[206,181,207],[208,209,15],[210,15,209],[211,10,9],[212,10,211],[213,214,215],[216,217,218],[219,14,17],[113,63,220],[221,222,48],[191,48,222],[22,223,20],[205,20,223],[224,40,42],[123,91,225],[214,226,215],[227,215,226],[218,217,228],[229,228,217],[215,230,213],[125,135,126],[217,216,231],[129,128,142],[216,213,232],[130,132,124],[213,216,233],[234,213,235],[236,227,237],[238,237,227],[239,240,216],[233,216,240],[241,242,229],[243,229,242],[215,227,244],[245,215,246],[217,247,229],[248,249,217],[232,213,250],[230,250,213],[133,147,134],[244,227,251],[236,252,227],[251,227,252],[231,216,253],[254,253,216],[141,140,144],[247,255,229],[241,229,256],[255,256,229],[257,241,258],[259,146,91],[260,261,236],[262,1,149],[263,264,241],[265,241,264],[266,236,267],[268,267,236],[49,48,83],[166,43,269],[270,271,272],[273,274,275],[276,274,277],[278,151,10],[279,280,272],[281,39,150],[272,282,279],[155,283,134],[274,276,284],[153,140,285],[286,276,287],[265,276,286],[288,289,279],[268,288,279],[290,291,272],[271,290,272],[292,274,293],[275,274,292],[294,265,295],[276,265,294],[296,297,268],[279,296,268],[241,265,298],[298,265,299],[236,300,268],[300,301,268],[107,33,78],[302,303,59],[304,305,279],[282,304,279],[306,276,307],[284,276,306],[185,17,73],[308,309,221],[158,39,70],[310,41,10],[15,311,208],[7,6,312],[313,314,6],[315,6,314],[316,208,317],[318,317,208],[258,241,319],[319,241,320],[261,321,236],[321,322,236],[6,315,323],[208,324,318],[270,325,318],[326,318,325],[327,328,315],[273,315,328],[118,329,20],[330,20,329],[331,332,25],[86,25,332],[333,334,52],[335,52,334],[115,336,48],[169,48,336],[62,106,4],[35,15,210],[35,337,15],[158,10,212],[158,310,10],[338,178,1],[339,59,116],[107,302,59],[66,22,340],[66,341,22],[185,221,342],[185,308,221],[75,31,179],[75,343,31],[166,20,330],[166,85,20],[81,52,335],[81,168,52],[82,19,344],[82,87,19],[108,339,345],[346,108,345],[64,347,348],[349,347,64],[178,109,350],[351,178,350],[179,352,353],[354,352,179],[355,208,356],[356,208,311],[357,358,6],[358,312,6],[68,22,21],[68,340,22],[221,48,47],[184,342,221],[359,270,360],[318,360,270],[361,362,273],[315,273,362],[272,102,270],[363,270,102],[274,273,103],[364,103,273],[21,19,18],[21,20,84],[184,46,42],[43,42,46],[12,22,71],[365,22,12],[14,98,15],[14,220,63],[40,93,10],[40,225,91],[45,221,309],[366,221,45],[313,367,212],[212,367,368],[36,369,367],[313,36,367],[316,37,367],[37,368,367],[210,367,369],[316,367,210],[362,370,315],[370,323,315],[360,318,371],[371,318,324],[372,331,159],[159,195,160],[373,115,56],[115,114,189],[52,56,161],[374,161,56],[25,28,331],[375,331,28],[376,333,163],[163,203,175],[377,118,24],[118,181,198],[25,24,162],[378,162,24],[52,51,333],[379,333,51],[167,380,381],[376,167,381],[377,381,330],[330,381,380],[335,381,382],[376,381,335],[373,383,169],[169,383,384],[168,385,383],[373,168,383],[372,87,383],[87,384,383],[377,80,381],[80,382,381],[86,383,385],[372,383,86],[106,348,347],[386,106,347],[375,65,346],[108,346,65],[64,112,349],[387,349,112],[171,190,114],[346,345,171],[374,190,345],[171,345,190],[349,172,347],[172,114,192],[386,347,192],[172,192,347],[173,160,196],[171,173,346],[375,346,196],[173,196,346],[172,349,174],[174,186,160],[387,186,349],[174,349,186],[64,348,62],[106,62,348],[108,107,339],[59,339,107],[374,345,116],[339,116,345],[76,353,352],[379,76,352],[388,77,351],[178,351,77],[179,120,354],[378,354,120],[177,200,175],[351,350,177],[389,200,350],[177,350,200],[354,180,352],[180,175,204],[379,352,204],[180,204,352],[182,181,206],[177,182,351],[388,351,206],[182,206,351],[180,354,183],[183,199,181],[378,199,354],[183,354,199],[91,109,338],[178,338,109],[76,75,353],[179,353,75],[389,350,110],[109,110,350],[390,391,392],[393,394,395],[224,122,389],[122,175,201],[365,388,205],[205,207,181],[66,340,396],[68,396,340],[184,396,342],[185,342,396],[66,396,67],[184,67,396],[68,69,396],[185,396,69],[219,111,387],[111,160,187],[366,386,191],[191,193,114],[150,272,280],[102,272,150],[151,277,274],[103,151,274],[161,374,117],[116,117,374],[366,61,386],[106,386,61],[111,187,387],[186,387,187],[56,188,374],[190,374,188],[191,386,193],[192,193,386],[331,375,194],[196,194,375],[28,34,375],[65,375,34],[219,387,113],[112,113,387],[224,389,123],[110,123,389],[51,55,379],[76,379,55],[24,197,378],[199,378,197],[122,201,389],[200,389,201],[333,379,202],[204,202,379],[205,388,207],[206,207,388],[365,27,388],[77,388,27],[162,378,121],[120,121,378],[162,30,25],[30,29,25],[51,53,54],[303,60,59],[28,29,33],[29,397,33],[161,58,52],[53,52,58],[21,84,19],[84,344,19],[46,49,43],[49,269,43],[208,316,209],[210,209,316],[327,313,211],[212,211,313],[36,35,369],[210,369,35],[37,158,368],[212,368,158],[6,8,313],[36,313,8],[326,38,316],[37,316,38],[392,391,398],[399,398,391],[394,400,395],[401,395,400],[390,214,391],[214,213,234],[393,395,218],[218,239,216],[402,230,403],[230,215,245],[125,124,131],[404,125,403],[405,406,231],[231,248,217],[129,137,127],[407,406,129],[130,127,139],[402,130,408],[194,195,331],[159,331,195],[115,189,56],[188,56,189],[14,219,220],[113,220,219],[45,50,366],[61,366,50],[221,366,222],[191,222,366],[17,23,219],[111,219,23],[118,198,24],[197,24,198],[202,203,333],[163,333,203],[40,224,225],[123,225,224],[12,13,365],[27,365,13],[22,365,223],[205,223,365],[42,44,224],[122,224,44],[399,391,234],[214,234,391],[401,239,395],[218,395,239],[214,390,226],[226,238,227],[218,228,393],[228,229,243],[401,399,233],[233,235,213],[392,409,390],[410,390,409],[394,393,411],[412,411,393],[402,403,131],[125,131,403],[405,137,406],[129,406,137],[405,408,139],[130,139,408],[230,245,403],[404,403,245],[231,406,248],[407,248,406],[232,254,216],[402,408,232],[413,404,244],[244,246,215],[414,247,407],[247,217,249],[133,126,136],[415,133,413],[141,143,128],[416,414,141],[410,238,390],[226,390,238],[412,393,243],[228,243,393],[233,399,235],[234,235,399],[237,260,236],[238,410,237],[417,260,410],[237,410,260],[239,401,240],[233,240,401],[242,241,257],[243,242,412],[418,412,257],[242,257,412],[401,419,399],[398,399,419],[417,410,420],[409,420,410],[400,421,401],[419,401,421],[418,422,412],[411,412,422],[413,135,404],[125,404,135],[414,407,142],[129,142,407],[130,402,132],[131,132,402],[133,136,413],[135,413,136],[423,147,415],[133,415,147],[137,405,138],[139,138,405],[141,414,143],[142,143,414],[424,416,144],[141,144,416],[405,254,408],[232,408,254],[244,404,246],[245,246,404],[247,249,407],[248,407,249],[232,250,402],[230,402,250],[415,413,251],[244,251,413],[252,236,266],[251,252,415],[423,415,266],[252,266,415],[231,253,405],[254,405,253],[416,255,414],[247,414,255],[256,263,241],[255,416,256],[424,263,416],[256,416,263],[257,258,418],[425,418,258],[260,417,261],[426,261,417],[422,418,427],[427,259,91],[420,428,417],[428,1,262],[147,423,148],[429,148,423],[263,424,264],[264,295,265],[266,267,423],[267,268,297],[144,145,424],[430,424,145],[49,431,269],[166,269,431],[82,431,83],[49,83,431],[84,85,431],[166,431,85],[82,344,431],[84,431,344],[432,278,90],[10,90,278],[433,0,281],[39,281,0],[362,361,434],[435,271,359],[270,359,271],[436,361,275],[273,275,361],[360,437,359],[277,287,276],[151,278,277],[280,279,289],[150,280,281],[436,438,439],[439,285,140],[90,92,432],[440,432,92],[282,272,291],[441,282,442],[284,293,274],[443,438,284],[278,432,286],[286,299,265],[281,288,433],[288,268,301],[0,433,89],[444,89,433],[435,445,442],[445,134,283],[439,446,436],[361,436,446],[442,290,435],[271,435,290],[438,436,292],[275,292,436],[445,435,447],[359,447,435],[286,287,278],[277,278,287],[288,281,289],[280,289,281],[145,152,430],[443,430,152],[148,429,154],[441,154,429],[424,430,294],[294,307,276],[423,296,429],[296,279,305],[425,440,100],[92,100,440],[290,442,291],[282,291,442],[292,293,438],[284,438,293],[298,320,241],[432,440,298],[300,236,322],[433,300,444],[426,101,444],[89,444,101],[107,448,302],[302,79,54],[78,31,343],[107,78,448],[75,79,448],[302,448,79],[78,343,448],[75,448,343],[427,418,259],[425,259,418],[428,262,417],[426,417,262],[437,449,359],[447,359,449],[434,361,450],[446,450,361],[32,33,397],[78,33,32],[53,303,54],[302,54,303],[152,153,443],[438,443,153],[429,304,441],[282,441,304],[430,443,306],[284,306,443],[154,441,155],[442,155,441],[298,299,432],[286,432,299],[300,433,301],[288,301,433],[185,451,308],[308,74,7],[73,15,337],[185,73,451],[35,74,451],[308,451,74],[73,337,451],[35,451,337],[158,452,310],[310,72,42],[70,22,341],[158,70,452],[66,72,452],[310,452,72],[70,341,452],[66,452,341],[313,327,314],[315,314,327],[316,317,326],[318,326,317],[15,156,311],[356,311,156],[7,312,157],[358,157,312],[211,9,327],[364,327,9],[38,326,94],[363,94,326],[294,295,424],[264,424,295],[296,423,297],[267,297,423],[262,149,426],[101,426,149],[258,319,425],[440,425,319],[261,426,321],[444,321,426],[259,425,146],[100,146,425],[306,307,430],[294,430,307],[304,429,305],[296,305,429],[319,320,440],[298,440,320],[321,444,322],[300,322,444],[445,283,442],[155,442,283],[439,438,285],[153,285,438],[17,68,18],[21,18,68],[46,184,47],[221,47,184],[102,95,363],[94,363,95],[9,11,364],[103,364,11],[6,323,357],[370,357,323],[371,324,355],[208,355,324],[270,363,325],[326,325,363],[327,364,328],[273,328,364],[0,2,39],[12,39,2],[90,93,91],[40,91,93],[14,16,17],[73,17,16],[45,309,7],[308,7,309],[12,71,39],[70,39,71],[40,41,42],[310,42,41],[97,98,63],[14,63,98],[3,5,7],[45,7,5],[118,377,329],[330,329,377],[331,372,332],[86,332,372],[333,376,334],[335,334,376],[115,373,336],[169,336,373],[167,166,380],[330,380,166],[80,81,382],[335,382,81],[86,385,81],[168,81,385],[169,384,82],[87,82,384],[159,88,372],[87,372,88],[163,164,376],[167,376,164],[24,26,377],[80,377,26],[56,57,373],[168,373,57],[32,397,30],[29,30,397],[58,60,53],[303,53,60],[205,181,119],[118,119,181],[163,175,165],[122,165,175],[453,454,455],[454,456,455],[457,455,456],[458,455,457],[459,455,458],[460,455,459],[461,462,463],[464,465,466],[467,468,469],[470,471,472],[465,473,474],[475,476,477],[478,479,480],[481,482,478],[483,484,481],[485,486,483],[487,488,485],[489,490,487],[491,492,489],[493,494,491],[495,496,493],[497,498,495],[499,500,497],[501,502,499],[503,504,501],[505,504,503],[506,504,505],[507,504,506],[508,504,507],[509,504,508],[510,504,509],[511,504,510],[512,504,511],[513,504,512],[514,504,513],[476,515,516],[517,518,519],[520,517,521],[518,522,523],[522,480,479],[524,525,526],[468,470,527],[525,467,528],[529,475,530],[531,532,533],[534,531,535],[536,537,538],[473,539,540],[539,536,541],[537,534,542],[471,520,543],[532,529,544],[545,524,546],[453,461,547],[463,464,548],[523,549,504],[527,550,551],[519,552,553],[521,554,555],[466,556,557],[469,558,559],[528,560,561],[477,562,563],[543,564,565],[535,566,567],[530,568,569],[540,570,571],[474,572,573],[542,574,575],[538,576,577],[541,578,579],[472,580,581],[526,582,583],[533,584,585],[544,586,587],[516,545,588],[588,589,590],[455,460,4],[591,592,63],[462,455,4],[592,547,63],[547,548,63],[465,462,4],[548,557,63],[127,124,501],[127,501,499],[505,503,124],[124,126,507],[124,507,506],[509,508,126],[126,134,512],[126,512,511],[510,509,126],[128,127,493],[128,493,491],[497,495,127],[489,487,128],[140,128,483],[140,483,481],[487,485,128],[478,480,140],[480,522,140],[514,513,134],[504,514,134],[551,581,437],[471,470,434],[445,447,555],[445,555,553],[134,445,553],[134,553,504],[446,439,518],[446,518,517],[439,140,522],[439,522,518],[515,476,358],[563,588,356],[557,573,63],[473,465,4],[437,360,559],[437,559,551],[360,371,561],[360,561,559],[362,434,470],[362,470,468],[370,362,468],[370,468,467],[499,497,127],[506,505,124],[495,493,127],[513,512,134],[481,478,140],[447,449,565],[447,565,555],[450,446,517],[450,517,520],[356,156,569],[356,569,563],[157,358,476],[157,476,475],[357,370,467],[357,467,525],[371,355,583],[371,583,561],[460,459,4],[63,62,593],[63,593,591],[62,4,459],[62,459,458],[532,531,104],[531,534,104],[567,585,105],[575,567,105],[4,3,539],[4,539,473],[536,539,3],[97,63,573],[97,573,571],[571,579,97],[99,97,579],[99,579,577],[105,99,577],[105,577,575],[96,104,534],[96,534,537],[3,96,537],[3,537,536],[503,501,124],[508,507,126],[491,489,128],[511,510,126],[485,483,128],[434,450,520],[434,520,471],[449,437,581],[449,581,565],[156,105,585],[156,585,587],[587,569,156],[104,157,529],[104,529,532],[475,529,157],[590,583,355],[355,356,588],[355,588,590],[358,357,524],[358,524,515],[525,524,357],[458,457,62],[457,593,62],[479,478,482],[479,504,549],[479,482,504],[482,481,484],[472,551,550],[581,551,472],[482,484,504],[484,483,486],[523,553,552],[504,553,523],[540,573,572],[571,573,540],[544,585,584],[587,585,544],[542,577,576],[575,577,542],[526,590,589],[583,590,526],[535,575,574],[567,575,535],[533,567,566],[585,567,533],[538,579,578],[577,579,538],[543,581,580],[565,581,543],[477,569,568],[563,569,477],[530,587,586],[569,587,530],[541,571,570],[579,571,541],[528,583,582],[561,583,528],[591,453,592],[547,592,453],[521,565,564],[555,565,521],[474,557,556],[573,557,474],[516,563,562],[588,563,516],[519,555,554],[553,555,519],[527,559,558],[551,559,527],[469,561,560],[559,561,469],[462,461,455],[453,455,461],[461,463,547],[548,547,463],[465,464,462],[463,462,464],[464,466,548],[557,548,466],[469,560,467],[528,467,560],[472,550,470],[527,470,550],[474,556,465],[466,465,556],[477,568,475],[530,475,568],[516,562,476],[477,476,562],[519,554,517],[521,517,554],[521,564,520],[543,520,564],[523,552,518],[519,518,552],[479,549,522],[523,522,549],[526,589,524],[589,546,524],[527,558,468],[469,468,558],[528,582,525],[526,525,582],[530,586,529],[544,529,586],[533,566,531],[535,531,566],[535,574,534],[542,534,574],[538,578,536],[541,536,578],[540,572,473],[474,473,572],[541,570,539],[540,539,570],[542,576,537],[538,537,576],[543,580,471],[472,471,580],[544,584,532],[533,532,584],[524,545,515],[516,515,545],[545,546,588],[589,588,546],[453,591,454],[593,454,591],[484,486,504],[486,485,488],[486,488,504],[488,487,490],[488,490,504],[490,489,492],[490,492,504],[492,491,494],[492,494,504],[494,493,496],[494,496,504],[496,495,498],[496,498,504],[498,497,500],[498,500,504],[500,499,502],[500,502,504],[501,504,502],[454,593,456],[457,456,593],[594,595,596],[597,598,594],[599,597,594],[600,599,594],[601,600,594],[602,601,594],[603,602,594],[604,603,594],[605,604,594],[606,607,608],[609,606,608],[610,609,608],[611,610,608],[612,611,608],[613,612,608],[614,613,608],[615,614,608],[616,615,608],[617,616,608],[618,617,608],[619,618,608],[620,619,608],[596,608,607],[595,594,598],[608,596,595],[605,594,91],[91,338,602],[91,602,603],[598,597,1],[594,596,91],[608,595,1],[595,598,1],[616,617,392],[610,611,394],[419,421,613],[419,613,614],[422,427,607],[422,607,606],[427,91,596],[427,596,607],[428,420,619],[428,619,620],[1,428,620],[1,620,608],[420,409,618],[420,618,619],[411,422,606],[411,606,609],[398,419,614],[398,614,615],[421,400,612],[421,612,613],[409,392,617],[409,617,618],[394,411,609],[394,609,610],[604,605,91],[338,1,599],[338,599,600],[392,398,615],[392,615,616],[400,394,611],[400,611,612],[603,604,91],[601,602,338],[597,599,1],[600,601,338]
91 ];
92 } elsif ($name eq 'gt2_teeth') {
93 $vertices = [
94 [15.8899993896484,19.444055557251,2.67489433288574],[15.9129991531372,19.1590557098389,2.67489433288574],[15.9039993286133,19.1500549316406,2.67489433288574],[15.9489994049072,19.2490558624268,2.67489433288574],[15.9579992294312,19.3570556640625,2.67489433288574],[15.8819999694824,18.690055847168,2.67489433288574],[15.8319997787476,17.7460556030273,2.67489433288574],[15.8489999771118,18.819055557251,2.67489433288574],[15.8589992523193,17.7190551757812,2.67489433288574],[15.8769998550415,19.0490550994873,2.67489433288574],[15.7529993057251,17.8080558776855,2.67489433288574],[15.7869997024536,19.5010547637939,2.67489433288574],[14.0329990386963,18.7170543670654,2.67489433288574],[13.9599990844727,18.7460556030273,2.67489433288574],[13.9869995117188,20.2840557098389,2.67489433288574],[14.2029991149902,20.149055480957,2.67489433288574],[14.1939992904663,19.9560546875,2.67489433288574],[14.1939992904663,20.1670551300049,2.67489433288574],[14.2119998931885,20.0590553283691,2.67489433288574],[12.1899995803833,19.1840553283691,2.67489433288574],[12.096999168396,19.1950550079346,2.67489433288574],[12.1099996566772,20.6690559387207,2.67489433288574],[11.382999420166,19.9750556945801,2.67489433288574],[11.2599992752075,19.2490558624268,2.67489433288574],[11.2369995117188,19.9320545196533,2.67489433288574],[11.5349998474121,20.0640544891357,2.67489433288574],[11.6259994506836,20.1550559997559,2.67489433288574],[11.6829986572266,20.2390556335449,2.67489433288574],[11.7369995117188,20.3570556640625,2.67489433288574],[11.8449993133545,20.645055770874,2.67489433288574],[11.7729988098145,20.4640560150146,2.67489433288574],[11.7799987792969,20.5370559692383,9.41389465332031],[11.7639999389648,20.4470558166504,2.67489433288574],[11.9559993743896,20.6810550689697,2.67489433288574],[12.3079996109009,20.6020545959473,2.67489433288574],[12.1959991455078,19.1860542297363,2.67489433288574],[12.2059993743896,20.6540546417236,2.67489433288574],[12.3489990234375,20.3740558624268,2.67489433288574],[12.3579998016357,20.2750549316406,2.67489433288574],[12.3669996261597,20.266056060791,2.67489433288574],[12.3849992752075,20.1670551300049,2.67489433288574],[12.4269990921021,20.0680541992188,2.67489433288574],[12.5029993057251,19.9540557861328,2.67489433288574],[12.6169996261597,19.8550548553467,2.67489433288574],[12.7449989318848,19.7800559997559,2.67489433288574],[12.7629995346069,19.7800559997559,2.67489433288574],[12.8799991607666,19.7350559234619,2.67489433288574],[13.0369997024536,19.7250556945801,2.67489433288574],[13.0149993896484,19.0340557098389,2.67489433288574],[11.1699991226196,19.2580547332764,2.67489433288574],[11.0959987640381,19.2580547332764,2.67489433288574],[11.1209993362427,19.9230556488037,2.67489433288574],[13.0599994659424,19.024055480957,2.67489433288574],[14.9049997329712,18.3170547485352,2.67489433288574],[14.8779993057251,18.3400554656982,2.67489433288574],[14.8779993057251,19.149055480957,2.67489433288574],[13.3039989471436,19.77805519104,2.67489433288574],[13.1589994430542,18.9890556335449,2.67489433288574],[13.1559991836548,19.7350559234619,2.67489433288574],[13.4269990921021,19.8600559234619,2.67489433288574],[13.5339994430542,19.9700546264648,2.67389440536499],[13.6359996795654,20.1220550537109,2.67489433288574],[13.6359996795654,20.1400547027588,2.67489433288574],[13.6719989776611,20.2210559844971,2.67489433288574],[13.6899995803833,20.2300548553467,2.67489433288574],[13.7509994506836,20.3010559082031,2.67489433288574],[13.8539991378784,20.3180541992188,2.67489433288574],[14.8329992294312,18.3580551147461,2.67489433288574],[14.1849994659424,19.8530559539795,2.67489433288574],[14.0769996643066,18.7000541687012,2.67489433288574],[14.1099996566772,20.2400550842285,2.67489433288574],[14.2009992599487,19.6230545043945,2.67489433288574],[14.2729997634888,19.4670543670654,2.67489433288574],[14.3379993438721,19.3790550231934,2.67489433288574],[14.4549999237061,19.2770557403564,2.67489433288574],[14.5899991989136,19.2040557861328,2.67489433288574],[14.6079998016357,19.2040557861328,2.67489433288574],[14.7209997177124,19.1600551605225,2.67489433288574],[15.1379995346069,19.210054397583,2.67489433288574],[14.9949998855591,18.2680549621582,2.67489433288574],[15.0029993057251,19.1580543518066,2.67489433288574],[15.2369995117188,19.2760543823242,2.67489433288574],[15.3779993057251,19.4060554504395,2.67489433288574],[15.4539995193481,19.520055770874,2.67489433288574],[15.471999168396,19.52805519104,2.67489433288574],[15.5449991226196,19.5830554962158,2.67489433288574],[15.6529998779297,19.573055267334,2.67489433288574],[15.7059993743896,17.8360557556152,2.67489433288574],[15.9449996948242,18.5560550689697,2.67489433288574],[15.8589992523193,18.9380550384521,2.67489433288574],[14.9589996337891,18.2950553894043,2.67489433288574],[15.7779998779297,19.5100555419922,2.67489433288574],[14.0049991607666,20.2750549316406,2.67489433288574],[12.3489990234375,20.5000553131104,2.67489433288574],[13.0689992904663,19.0150547027588,2.67489433288574],[13.0999994277954,19.0100555419922,2.67489433288574],[15.9489994049072,19.3670558929443,9.41489505767822],[15.9489994049072,19.2490558624268,9.41489505767822],[15.75,17.8080558776855,9.41489505767822],[15.6639995574951,19.5710544586182,9.41489505767822],[15.5709991455078,17.9260559082031,9.41489505767822],[15.8769998550415,18.690055847168,9.41489505767822],[15.8499994277954,18.8170547485352,9.41489505767822],[15.9459991455078,18.5520553588867,9.41489505767822],[15.914999961853,17.6890544891357,9.41489505767822],[15.3999996185303,19.4290542602539,9.41489505767822],[15.3099994659424,19.339054107666,9.41489505767822],[15.3729991912842,18.0440559387207,9.41489505767822],[15.4579992294312,19.5170555114746,9.41489505767822],[15.5469999313354,19.5820541381836,9.41489505767822],[13.2309989929199,19.7610549926758,9.41489505767822],[13.168999671936,19.7360553741455,9.41489505767822],[13.096999168396,19.0140552520752,9.41489505767822],[13.1999988555908,18.9870548248291,9.41489505767822],[15.1399993896484,19.2080554962158,9.41489505767822],[15.0159997940063,19.1600551605225,9.41489505767822],[14.9859991073608,18.2770557403564,9.41489505767822],[15.1749992370605,18.1690559387207,9.41489505767822],[15.9039993286133,19.1320552825928,9.41489505767822],[15.8949995040894,19.4460544586182,9.41489505767822],[15.8769998550415,19.0420551300049,9.41489505767822],[12.2169990539551,20.6500549316406,9.41489505767822],[11.9379997253418,20.6810550689697,9.41489505767822],[11.8629989624023,19.2130546569824,9.41489505767822],[12.096999168396,19.1950550079346,9.41489505767822],[14.1669998168945,18.6640548706055,9.41489505767822],[14.1039991378784,20.2460556030273,9.41489505767822],[13.9849996566772,18.7360553741455,9.41489505767822],[14.7349996566772,19.1590557098389,9.41489505767822],[14.5849990844727,19.2050552368164,9.41489505767822],[14.5719995498657,18.4850559234619,9.41489505767822],[14.1939992904663,19.6760559082031,9.41489505767822],[14.1849994659424,19.9330558776855,9.41489505767822],[14.1759996414185,18.6640548706055,9.41489505767822],[14.261999130249,19.4890556335449,9.41489505767822],[14.3539991378784,19.3610553741455,9.41489505767822],[14.3559989929199,18.5830554962158,9.41489505767822],[11.6039991378784,20.1250553131104,9.41489505767822],[11.5209999084473,20.0520553588867,9.41489505767822],[11.4209995269775,19.2480545043945,9.41489505767822],[11.6989994049072,20.2690544128418,9.41389465332031],[11.7609996795654,20.4310550689697,9.41489505767822],[11.8359994888306,19.2130546569824,9.41489505767822],[14.1889991760254,20.1710548400879,9.41489505767822],[13.9689998626709,20.2840557098389,9.41489505767822],[13.8739995956421,20.315055847168,9.41489505767822],[13.7799997329712,18.8080558776855,9.41489505767822],[13.9869995117188,20.2750549316406,9.41489505767822],[12.3129997253418,20.5980548858643,9.41489505767822],[12.3399991989136,20.5090560913086,9.41489505767822],[12.3489990234375,20.3830547332764,9.41489505767822],[12.3599996566772,20.2680549621582,9.41489505767822],[12.3849992752075,20.1850547790527,9.41489505767822],[12.3849992752075,20.1670551300049,9.41489505767822],[12.4249992370605,20.065055847168,9.41489505767822],[12.4729995727539,19.1350555419922,9.41489505767822],[14.4399995803833,19.2900543212891,9.41489505767822],[14.3649997711182,18.5740547180176,9.41489505767822],[13.5729999542236,20.0310554504395,9.41489505767822],[13.4889993667603,19.9140548706055,9.41489505767822],[13.5639991760254,18.8710556030273,9.41489505767822],[13.6389999389648,20.1310558319092,9.41489505767822],[13.6719989776611,20.2130546569824,9.41489505767822],[13.75,20.3020553588867,9.41489505767822],[12.7399997711182,19.7810554504395,9.41489505767822],[12.6189994812012,19.8520545959473,9.41489505767822],[12.5799999237061,19.1200542449951,9.41489505767822],[12.8349990844727,19.069055557251,9.41489505767822],[11.2669992446899,19.9350547790527,9.41489505767822],[11.1029987335205,19.9230556488037,9.41489505767822],[11.0209999084473,19.2600555419922,9.41489505767822],[11.3819999694824,19.9710559844971,9.41489505767822],[13.418999671936,19.8530559539795,9.41489505767822],[13.4329996109009,18.9160556793213,9.41489505767822],[11.8399991989136,20.6430549621582,9.41489505767822],[13.3119993209839,19.7800559997559,9.41489505767822],[15.2189998626709,19.2600555419922,9.41489505767822],[15.1839990615845,18.1600551605225,9.41489505767822],[15.3639993667603,18.0520553588867,9.41489505767822],[13.0189990997314,19.7250556945801,9.41489505767822],[12.8949995040894,19.7350559234619,9.41489505767822],[15.9039993286133,19.1500549316406,9.41489505767822],[15.7699995040894,19.5140552520752,9.41489505767822],[15.8589992523193,18.9340553283691,9.41489505767822],[14.1939992904663,19.9510555267334,9.41489505767822],[14.2119998931885,20.0630550384521,9.41489505767822],[14.8589992523193,19.149055480957,9.41489505767822],[14.8159999847412,18.3670558929443,9.41489505767822],[14.8959999084473,18.3220558166504,9.41489505767822],[12.5189990997314,19.9360542297363,9.41489505767822],[11.0209999084473,19.9290542602539,9.41489505767822],[11.0209999084473,19.2530555725098,2.67489433288574],[11.0209999084473,19.9300556182861,2.67489433288574],[15.9799995422363,18.505931854248,5.58724021911621],[15.9799995422363,18.5044555664062,9.41489505767822],[15.9799995422363,18.5041732788086,2.67489433288574],[15.9799995422363,18.1684837341309,2.67489433288574],[15.9799995422363,18.1288299560547,9.41489505767822],[15.9799995422363,17.9876575469971,2.67489433288574],[15.9799995422363,17.6247596740723,3.91620373725891],[15.9799995422363,17.6247596740723,2.67489433288574],[15.9799995422363,17.6254329681396,4.32245063781738],[15.9799995422363,17.8920269012451,9.41489505767822],[15.9799995422363,17.8795108795166,2.67489433288574],[15.9799995422363,17.629810333252,4.58585262298584],[15.9799995422363,17.6336059570312,5.27938556671143],[15.9799995422363,17.8311748504639,2.67489433288574],[15.9799995422363,17.638355255127,9.41489505767822],[15.9799995422363,17.6346111297607,5.98653984069824],[15.9799995422363,17.8728256225586,2.67489433288574],[15.9799995422363,18.2221603393555,2.67489433288574]
95 ];
96 $facets = [
97 [0,1,2],[0,3,1],[0,4,3],[5,6,7],[8,6,5],[2,9,0],[6,10,11],[12,13,14],[15,16,17],[18,16,15],[19,20,21],[22,23,24],[25,23,22],[26,23,25],[27,23,26],[28,23,27],[29,30,31],[29,32,30],[29,28,32],[33,28,29],[33,23,28],[21,23,33],[20,23,21],[34,35,36],[37,35,34],[38,35,37],[39,35,38],[40,35,39],[41,35,40],[42,35,41],[43,35,42],[44,35,43],[45,35,44],[46,35,45],[47,35,46],[48,35,47],[49,50,51],[52,48,47],[23,49,24],[53,54,55],[56,57,58],[59,57,56],[60,57,59],[61,57,60],[62,57,61],[63,57,62],[64,57,63],[65,57,64],[66,57,65],[13,57,66],[54,67,55],[68,69,70],[71,69,68],[72,69,71],[73,69,72],[74,69,73],[75,69,74],[76,69,75],[77,69,76],[67,69,77],[70,16,68],[70,17,16],[78,79,80],[81,79,78],[82,79,81],[83,79,82],[84,79,83],[85,79,84],[86,79,85],[87,79,86],[88,8,5],[11,7,6],[11,89,7],[11,9,89],[11,0,9],[55,90,53],[55,79,90],[55,80,79],[91,11,10],[92,69,12],[92,70,69],[34,93,37],[47,94,52],[47,95,94],[47,57,95],[47,58,57],[51,24,49],[21,35,19],[21,36,35],[14,92,12],[86,10,87],[86,91,10],[77,55,67],[66,14,13],[96,97,4],[98,99,100],[101,102,98],[103,101,98],[104,103,98],[105,106,107],[108,105,107],[109,108,107],[100,109,107],[110,111,112],[113,110,112],[114,115,116],[117,114,116],[118,119,120],[121,122,123],[124,121,123],[125,126,127],[128,129,130],[131,132,133],[71,131,133],[134,71,133],[135,134,133],[136,135,133],[137,138,139],[140,137,139],[141,140,139],[142,31,141],[142,141,139],[143,126,132],[144,145,146],[147,144,146],[127,147,146],[148,121,124],[149,148,124],[150,149,124],[151,150,124],[152,151,124],[153,152,124],[154,153,124],[155,154,124],[129,156,157],[130,129,157],[158,159,160],[161,158,160],[162,161,160],[163,162,160],[146,163,160],[164,165,166],[167,164,166],[168,169,170],[171,168,170],[139,171,170],[159,172,173],[123,174,142],[175,110,113],[173,175,113],[106,176,177],[178,106,177],[179,180,167],[112,179,167],[175,173,172],[119,118,181],[119,181,97],[119,97,96],[182,98,102],[182,102,183],[182,183,120],[182,120,119],[143,132,184],[184,185,143],[147,127,126],[174,123,122],[159,173,160],[126,125,133],[126,133,132],[186,187,188],[186,188,116],[186,116,115],[99,98,182],[109,100,99],[106,178,107],[114,117,177],[114,177,176],[128,130,187],[128,187,186],[135,136,157],[135,157,156],[163,146,145],[164,167,180],[179,112,111],[171,139,138],[189,155,166],[189,166,165],[149,150,93],[154,155,189],[31,142,174],[114,176,78],[81,78,176],[7,89,183],[89,9,120],[89,120,183],[78,80,114],[176,106,81],[88,5,103],[183,102,7],[118,120,9],[9,2,181],[9,181,118],[115,114,80],[82,81,106],[101,103,5],[102,101,5],[5,7,102],[97,181,2],[2,1,97],[1,3,97],[80,55,115],[172,159,59],[59,56,172],[3,4,97],[4,0,96],[105,108,82],[186,115,55],[82,106,105],[83,82,108],[60,59,159],[175,172,56],[119,96,0],[0,11,119],[108,109,84],[84,83,108],[55,77,186],[56,58,110],[56,110,175],[60,159,158],[11,91,182],[182,119,11],[91,86,182],[85,84,109],[86,85,99],[128,186,77],[58,111,110],[158,161,60],[26,25,137],[138,137,25],[99,182,86],[109,99,85],[77,76,128],[58,47,111],[61,60,161],[137,140,26],[27,26,140],[25,22,138],[129,128,76],[76,75,129],[75,74,129],[74,73,156],[73,72,135],[68,16,184],[68,184,132],[16,18,185],[161,162,62],[62,61,161],[179,111,47],[171,138,22],[156,129,74],[135,156,73],[134,135,72],[72,71,134],[68,132,131],[185,184,16],[18,15,185],[63,62,162],[28,27,140],[22,24,171],[71,68,131],[15,17,143],[15,143,185],[17,70,143],[70,92,126],[162,163,64],[64,63,162],[180,179,47],[47,46,180],[140,141,28],[168,171,24],[126,143,70],[92,14,147],[147,126,92],[14,66,144],[14,144,147],[65,64,163],[66,65,145],[46,45,180],[32,28,141],[24,51,168],[145,144,66],[163,145,65],[164,180,45],[45,44,164],[44,43,164],[43,42,165],[38,37,151],[150,151,37],[37,93,150],[141,31,30],[30,32,141],[169,168,51],[165,164,43],[189,165,42],[42,41,189],[40,39,152],[40,152,153],[151,152,39],[39,38,151],[93,34,149],[154,189,41],[153,154,41],[41,40,153],[148,149,34],[34,36,148],[36,21,121],[31,174,29],[121,148,36],[21,33,122],[21,122,121],[33,29,122],[174,122,29],[116,188,53],[104,98,10],[87,10,98],[98,100,87],[79,87,100],[79,100,107],[90,79,107],[90,107,178],[178,177,90],[53,90,177],[53,177,117],[117,116,53],[54,53,188],[54,188,187],[67,54,187],[67,187,130],[69,67,130],[69,130,157],[12,69,157],[12,157,136],[136,133,12],[12,133,125],[125,127,12],[13,12,127],[127,146,13],[57,13,146],[57,146,160],[95,57,160],[95,160,173],[173,113,95],[94,95,113],[113,112,94],[52,94,112],[48,52,112],[112,167,48],[35,48,167],[35,167,166],[19,35,166],[139,170,50],[50,49,139],[166,155,19],[20,19,155],[155,124,20],[23,20,124],[23,124,123],[49,23,123],[49,123,142],[142,139,49],[190,191,170],[192,191,190],[191,192,51],[191,51,50],[170,169,190],[169,51,192],[169,192,190],[170,191,50],[193,194,195],[196,197,198],[199,200,201],[198,202,203],[204,201,200],[205,204,200],[206,207,208],[206,208,205],[206,205,200],[207,206,209],[207,209,203],[207,203,202],[202,198,197],[197,196,210],[197,210,195],[197,195,194],[8,88,195],[8,195,210],[210,196,8],[196,198,8],[198,203,8],[203,209,8],[209,206,8],[206,200,8],[202,197,104],[207,202,104],[103,104,197],[103,197,194],[193,195,88],[88,103,194],[88,194,193],[200,199,8],[199,201,8],[204,205,6],[6,8,201],[6,201,204],[10,6,205],[10,205,208],[104,10,208],[104,208,207]
98 ];
99 } elsif ($name eq 'pyramid') {
100 $vertices = [
101 [10,10,40],[0,0,0],[20,0,0],[20,20,0],[0,20,0],
102 ];
103 $facets = [
104 [0,1,2],[0,3,4],[3,1,4],[1,3,2],[3,0,2],[4,1,0],
105 ];
106 } elsif ($name eq 'two_hollow_squares') {
107 $vertices = [
108 [66.7133483886719,104.286666870117,0],[66.7133483886719,95.7133331298828,0],[65.6666870117188,94.6666717529297,0],[75.2866821289062,95.7133331298828,0],[76.3333435058594,105.333335876465,0],[76.3333435058594,94.6666717529297,0],[65.6666870117188,105.33332824707,0],[75.2866821289062,104.286666870117,0],[71.1066818237305,104.58666229248,2.79999995231628],[66.4133529663086,104.58666229248,2.79999995231628],[75.5866851806641,104.58666229248,2.79999995231628],[66.4133529663086,99.8933334350586,2.79999995231628],[66.4133529663086,95.4133377075195,2.79999995231628],[71.1066818237305,95.4133377075195,2.79999995231628],[75.5866851806641,95.4133377075195,2.79999995231628],[75.5866851806641,100.106666564941,2.79999995231628],[74.5400161743164,103.540000915527,2.79999995231628],[70.0320129394531,103.540000915527,2.79999995231628],[67.4600067138672,103.540000915527,2.79999995231628],[67.4600067138672,100.968002319336,2.79999995231628],[67.4600067138672,96.4599990844727,2.79999995231628],[74.5400161743164,99.0319976806641,2.79999995231628],[74.5400161743164,96.4599990844727,2.79999995231628],[70.0320129394531,96.4599990844727,2.79999995231628],[123.666717529297,94.6666717529297,0],[134.333312988281,94.6666717529297,0],[124.413360595703,95.4133377075195,2.79999995231628],[129.106674194336,95.4133377075195,2.79999995231628],[133.586669921875,95.4133377075195,2.79999995231628],[123.666717529297,105.33332824707,0],[124.413360595703,104.58666229248,2.79999995231628],[124.413360595703,99.8933334350586,2.79999995231628],[134.333312988281,105.33332824707,0],[129.106674194336,104.58666229248,2.79999995231628],[133.586669921875,104.58666229248,2.79999995231628],[133.586669921875,100.106666564941,2.79999995231628],[124.713317871094,104.286666870117,0],[124.713317871094,95.7133331298828,0],[133.286712646484,95.7133331298828,0],[133.286712646484,104.286666870117,0],[132.540023803711,103.540000915527,2.79999995231628],[128.032028198242,103.540008544922,2.79999995231628],[125.460006713867,103.540000915527,2.79999995231628],[125.460006713867,100.968002319336,2.79999995231628],[125.460006713867,96.4599990844727,2.79999995231628],[132.540023803711,99.0319976806641,2.79999995231628],[132.540023803711,96.4599990844727,2.79999995231628],[128.032028198242,96.4599990844727,2.79999995231628],
109 ];
110 $facets = [
111 [0,1,2],[3,4,5],[6,4,0],[6,0,2],[2,1,5],[7,4,3],[1,3,5],[0,4,7],[4,6,8],[6,9,8],[4,8,10],[6,2,9],[2,11,9],[2,12,11],[2,5,12],[5,13,12],[5,14,13],[4,10,15],[5,4,14],[4,15,14],[7,16,17],[0,7,18],[7,17,18],[1,19,20],[1,0,19],[0,18,19],[7,3,21],[3,22,21],[7,21,16],[3,23,22],[3,1,23],[1,20,23],[24,25,26],[25,27,26],[25,28,27],[29,24,30],[24,31,30],[24,26,31],[32,29,33],[29,30,33],[32,33,34],[32,34,35],[25,32,28],[32,35,28],[36,37,24],[38,32,25],[29,32,36],[29,36,24],[24,37,25],[39,32,38],[37,38,25],[36,32,39],[39,40,41],[36,39,42],[39,41,42],[37,43,44],[37,36,43],[36,42,43],[39,38,45],[38,46,45],[39,45,40],[38,47,46],[38,37,47],[37,44,47],[16,8,9],[16,10,8],[10,16,15],[15,16,21],[22,15,21],[15,22,14],[22,23,14],[23,20,14],[17,16,9],[18,17,9],[19,18,9],[19,9,11],[19,11,20],[13,14,20],[20,11,12],[13,20,12],[41,40,30],[42,41,30],[43,42,30],[43,30,31],[43,31,44],[27,28,44],[44,31,26],[27,44,26],[40,33,30],[40,34,33],[34,40,35],[35,40,45],[46,35,45],[35,46,28],[46,47,28],[47,44,28],
112 ];
113 } elsif ($name eq 'small_dorito') {
114 $vertices = [
115 [6.00058937072754,-22.9982089996338,0],[22.0010242462158,-49.9998741149902,0],[-9.99957847595215,-49.999870300293,0],[6.00071382522583,-32.2371635437012,28.0019245147705],[11.1670551300049,-37.9727020263672,18.9601669311523],[6.00060224533081,-26.5392456054688,10.7321853637695]
116 ];
117 $facets = [
118 [0,1,2],[3,4,5],[2,1,4],[2,4,3],[2,3,5],[2,5,0],[5,4,1],[5,1,0]
119 ];
120 } elsif ($name eq 'bridge') {
121 $vertices = [
122 [75,84.5,8],[125,84.5,8],[75,94.5,8],[120,84.5,5],[125,94.5,8],[75,84.5,0],[80,84.5,5],[125,84.5,0],[125,94.5,0],[80,94.5,5],[75,94.5,0],[120,94.5,5],[120,84.5,0],[80,94.5,0],[80,84.5,0],[120,94.5,0]
123 ];
124 $facets = [
125 [0,1,2],[1,0,3],[2,1,4],[2,5,0],[0,6,3],[1,3,7],[1,8,4],[4,9,2],[10,5,2],[5,6,0],[6,11,3],[3,12,7],[7,8,1],[4,8,11],[4,11,9],[9,10,2],[10,13,5],[14,6,5],[9,11,6],[11,12,3],[12,8,7],[11,8,15],[13,10,9],[5,13,14],[14,13,6],[6,13,9],[15,12,11],[15,8,12]
126 ];
127 } else {
128 return undef;
129 }
130
131 my $mesh = Slic3r::TriangleMesh->new;
132 $mesh->ReadFromPerl($vertices, $facets);
133 $mesh->repair;
134 $mesh->scale_xyz(Slic3r::Pointf3->new(@{$params{scale_xyz}})) if $params{scale_xyz};
135 $mesh->translate(@{$params{translate}}) if $params{translate};
136 return $mesh;
137 }
138
139 sub model {
140 my ($model_name, %params) = @_;
141
142 my $input_file = "${model_name}.stl";
143 my $mesh = mesh($model_name, %params);
144 # $mesh->write_ascii("out/$input_file");
145
146 my $model = Slic3r::Model->new;
147 my $object = $model->add_object(input_file => $input_file);
148 $model->set_material($model_name);
149 $object->add_volume(mesh => $mesh, material_id => $model_name);
150 $object->add_instance(
151 offset => Slic3r::Pointf->new(0,0),
152 rotation => $params{rotation} // 0,
153 scaling_factor => $params{scale} // 1,
154 );
155 return $model;
156 }
157
158 sub init_print {
159 my ($models, %params) = @_;
160
161 my $config = Slic3r::Config->new;
162 $config->apply($params{config}) if $params{config};
163 $config->set('gcode_comments', 1) if $ENV{SLIC3R_TESTS_GCODE};
164
165 my $print = Slic3r::Print->new;
166 $print->apply_config($config);
167
168 $models = [$models] if ref($models) ne 'ARRAY';
169 $models = [ map { ref($_) ? $_ : model($_, %params) } @$models ];
170 for my $model (@$models) {
171 die "Unknown model in test" if !defined $model;
172 if (defined $params{duplicate} && $params{duplicate} > 1) {
173 $model->duplicate($params{duplicate} // 1, $print->config->min_object_distance);
174 }
175 $model->arrange_objects($print->config->min_object_distance);
176 $model->center_instances_around_point($params{print_center} ? Slic3r::Pointf->new(@{$params{print_center}}) : Slic3r::Pointf->new(100,100));
177 foreach my $model_object (@{$model->objects}) {
178 $print->auto_assign_extruders($model_object);
179 $print->add_model_object($model_object);
180 }
181 }
182 $print->validate;
183
184 # We return a proxy object in order to keep $models alive as required by the Print API.
185 return Slic3r::Test::Print->new(
186 print => $print,
187 models => $models,
188 );
189 }
190
191 sub gcode {
192 my ($print) = @_;
193
194 $print = $print->print if $print->isa('Slic3r::Test::Print');
195
196 my $fh = IO::Scalar->new(\my $gcode);
197 $print->process;
198 $print->export_gcode(output_fh => $fh, quiet => 1);
199 $fh->close;
200
201 return $gcode;
202 }
203
204 sub _eq {
205 my ($a, $b) = @_;
206 return abs($a - $b) < epsilon;
207 }
208
209 sub add_facet {
210 my ($facet, $vertices, $facets) = @_;
211
212 push @$facets, [];
213 for my $i (0..2) {
214 my $v = first { $vertices->[$_][X] == $facet->[$i][X] && $vertices->[$_][Y] == $facet->[$i][Y] && $vertices->[$_][Z] == $facet->[$i][Z] } 0..$#$vertices;
215 if (!defined $v) {
216 push @$vertices, [ @{$facet->[$i]}[X,Y,Z] ];
217 $v = $#$vertices;
218 }
219 $facets->[-1][$i] = $v;
220 }
221 }
222
223 package Slic3r::Test::Print;
224 use Moo;
225
226 has 'print' => (is => 'ro', required => 1, handles => [qw(process apply_config)]);
227 has 'models' => (is => 'ro', required => 1);
228
229 1;
0 # This package loads all the non-GUI Slic3r perl packages.
1 # In addition, it implements utility functions for file handling and threading.
2
3 package Slic3r;
4
5 # Copyright holder: Alessandro Ranellucci
6 # This application is licensed under the GNU Affero General Public License, version 3
7
8 use strict;
9 use warnings;
10 require v5.10;
11
12 our $VERSION = VERSION();
13 our $FORK_NAME = FORK_NAME();
14
15 our $debug = 0;
16 sub debugf {
17 printf @_ if $debug;
18 }
19
20 # load threads before Moo as required by it
21 our $have_threads;
22 BEGIN {
23 # Test, whether the perl was compiled with ithreads support and ithreads actually work.
24 use Config;
25 $have_threads = $Config{useithreads} && eval "use threads; use threads::shared; use Thread::Queue; 1";
26 warn "threads.pm >= 1.96 is required, please update\n" if $have_threads && $threads::VERSION < 1.96;
27
28 ### temporarily disable threads if using the broken Moo version
29 use Moo;
30 $have_threads = 0 if $Moo::VERSION == 1.003000;
31
32 # Disable multi threading completely by an environment value.
33 # This is useful for debugging as the Perl debugger does not work
34 # in multi-threaded context at all.
35 # A good interactive perl debugger is the ActiveState Komodo IDE
36 # or the EPIC http://www.epic-ide.org/
37 $have_threads = 0 if (defined($ENV{'SLIC3R_SINGLETHREADED'}) && $ENV{'SLIC3R_SINGLETHREADED'} == 1);
38 print "Threading disabled\n" if !$have_threads;
39
40 $debug = 1 if (defined($ENV{'SLIC3R_DEBUGOUT'}) && $ENV{'SLIC3R_DEBUGOUT'} == 1);
41 print "Debugging output enabled\n" if $debug;
42 }
43
44 warn "Running Slic3r under Perl 5.16 is neither supported nor recommended\n"
45 if $^V == v5.16;
46
47 use FindBin;
48 # Path to the images.
49 our $var = sub { decode_path($FindBin::Bin) . "/var/" . $_[0] };
50
51 use Moo 1.003001;
52
53 use Slic3r::XS; # import all symbols (constants etc.) before they get parsed
54 use Slic3r::Config;
55 use Slic3r::ExPolygon;
56 use Slic3r::ExtrusionLoop;
57 use Slic3r::ExtrusionPath;
58 use Slic3r::Flow;
59 use Slic3r::Format::AMF;
60 use Slic3r::Format::OBJ;
61 use Slic3r::Format::STL;
62 use Slic3r::GCode::ArcFitting;
63 use Slic3r::GCode::CoolingBuffer;
64 use Slic3r::GCode::MotionPlanner;
65 use Slic3r::GCode::PressureRegulator;
66 use Slic3r::GCode::Reader;
67 use Slic3r::GCode::SpiralVase;
68 use Slic3r::Geometry qw(PI);
69 use Slic3r::Geometry::Clipper;
70 use Slic3r::Layer;
71 use Slic3r::Line;
72 use Slic3r::Model;
73 use Slic3r::Point;
74 use Slic3r::Polygon;
75 use Slic3r::Polyline;
76 use Slic3r::Print;
77 use Slic3r::Print::GCode;
78 use Slic3r::Print::Object;
79 use Slic3r::Print::Simple;
80 use Slic3r::Print::SupportMaterial;
81 use Slic3r::Surface;
82 our $build = eval "use Slic3r::Build; 1";
83 use Thread::Semaphore;
84 use Encode::Locale 1.05;
85 use Encode;
86 use Unicode::Normalize;
87
88 # Scaling between the float and integer coordinates.
89 # Floats are in mm.
90 use constant SCALING_FACTOR => 0.000001;
91 use constant LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER => 0.15;
92
93 # Following constants are used by the infill algorithms and integration tests.
94 # Resolution to simplify perimeters to. These constants are now used in C++ code only. Better to publish them to Perl from the C++ code.
95 # use constant RESOLUTION => 0.0125;
96 # use constant SCALED_RESOLUTION => RESOLUTION / SCALING_FACTOR;
97 use constant INFILL_OVERLAP_OVER_SPACING => 0.3;
98
99 # Keep track of threads we created. Each thread keeps its own list of threads it spwaned.
100 my @my_threads = ();
101 my @threads : shared = ();
102 my $pause_sema = Thread::Semaphore->new;
103 my $parallel_sema;
104 my $paused = 0;
105
106 sub spawn_thread {
107 my ($cb) = @_;
108
109 my $parent_tid = threads->tid;
110 lock @threads;
111
112 @_ = ();
113 my $thread = threads->create(sub {
114 @my_threads = ();
115
116 Slic3r::debugf "Starting thread %d (parent: %d)...\n", threads->tid, $parent_tid;
117 local $SIG{'KILL'} = sub {
118 Slic3r::debugf "Exiting thread %d...\n", threads->tid;
119 $parallel_sema->up if $parallel_sema;
120 kill_all_threads();
121 Slic3r::thread_cleanup();
122 threads->exit();
123 };
124 local $SIG{'STOP'} = sub {
125 $pause_sema->down;
126 $pause_sema->up;
127 };
128 $cb->();
129 });
130 push @my_threads, $thread->tid;
131 push @threads, $thread->tid;
132 return $thread;
133 }
134
135 # If the threading is enabled, spawn a set of threads.
136 # Otherwise run the task on the current thread.
137 # Used for
138 # Slic3r::Print::Object->layers->make_perimeters : This is a pure C++ function.
139 # Slic3r::Print::Object->layers->make_fill : This is a pure C++ function.
140 # Slic3r::Print::SupportMaterial::generate_toolpaths
141 sub parallelize {
142 my %params = @_;
143
144 lock @threads;
145 if (!$params{disable} && $Slic3r::have_threads && $params{threads} > 1) {
146 my @items = (ref $params{items} eq 'CODE') ? $params{items}->() : @{$params{items}};
147 my $q = Thread::Queue->new;
148 $q->enqueue(@items, (map undef, 1..$params{threads}));
149
150 $parallel_sema = Thread::Semaphore->new(-$params{threads});
151 $parallel_sema->up;
152 my $thread_cb = sub {
153 # execute thread callback
154 $params{thread_cb}->($q);
155
156 # signal the parent thread that we're done
157 $parallel_sema->up;
158
159 # cleanup before terminating thread
160 Slic3r::thread_cleanup();
161
162 # This explicit exit avoids an untrappable
163 # "Attempt to free unreferenced scalar" error
164 # triggered on Ubuntu 12.04 32-bit when we're running
165 # from the Wx plater and
166 # we're reusing the same plater object more than once.
167 # The downside to using this exit is that we can't return
168 # any value to the main thread but we're not doing that
169 # anymore anyway.
170 threads->exit;
171 };
172
173 @_ = ();
174 my @my_threads = map spawn_thread($thread_cb), 1..$params{threads};
175
176 # We use a semaphore instead of $th->join because joined threads are
177 # not listed by threads->list or threads->object anymore, thus can't
178 # be signalled.
179 $parallel_sema->down;
180 $_->detach for @my_threads;
181 } else {
182 $params{no_threads_cb}->();
183 }
184 }
185
186 # call this at the very end of each thread (except the main one)
187 # so that it does not try to free existing objects.
188 # at that stage, existing objects are only those that we
189 # inherited at the thread creation (thus shared) and those
190 # that we are returning: destruction will be handled by the
191 # main thread in both cases.
192 # reminder: do not destroy inherited objects in other threads,
193 # as the main thread will still try to destroy them when they
194 # go out of scope; in other words, if you're undef()'ing an
195 # object in a thread, make sure the main thread still holds a
196 # reference so that it won't be destroyed in thread.
197 sub thread_cleanup {
198 return if !$Slic3r::have_threads;
199
200 if (threads->tid == 0) {
201 warn "Calling thread_cleanup() from main thread\n";
202 return;
203 }
204
205 # prevent destruction of shared objects
206 no warnings 'redefine';
207 *Slic3r::BridgeDetector::DESTROY = sub {};
208 *Slic3r::Config::DESTROY = sub {};
209 *Slic3r::Config::Full::DESTROY = sub {};
210 *Slic3r::Config::GCode::DESTROY = sub {};
211 *Slic3r::Config::Print::DESTROY = sub {};
212 *Slic3r::Config::PrintObject::DESTROY = sub {};
213 *Slic3r::Config::PrintRegion::DESTROY = sub {};
214 *Slic3r::Config::Static::DESTROY = sub {};
215 *Slic3r::ExPolygon::DESTROY = sub {};
216 *Slic3r::ExPolygon::Collection::DESTROY = sub {};
217 *Slic3r::Extruder::DESTROY = sub {};
218 *Slic3r::ExtrusionLoop::DESTROY = sub {};
219 *Slic3r::ExtrusionPath::DESTROY = sub {};
220 *Slic3r::ExtrusionPath::Collection::DESTROY = sub {};
221 *Slic3r::ExtrusionSimulator::DESTROY = sub {};
222 *Slic3r::Flow::DESTROY = sub {};
223 # Fillers are only being allocated in worker threads, which are not going to be forked.
224 # Therefore the Filler instances shall be released at the end of the thread.
225 # *Slic3r::Filler::DESTROY = sub {};
226 *Slic3r::GCode::DESTROY = sub {};
227 *Slic3r::GCode::AvoidCrossingPerimeters::DESTROY = sub {};
228 *Slic3r::GCode::OozePrevention::DESTROY = sub {};
229 *Slic3r::GCode::PlaceholderParser::DESTROY = sub {};
230 *Slic3r::GCode::Sender::DESTROY = sub {};
231 *Slic3r::GCode::Wipe::DESTROY = sub {};
232 *Slic3r::GCode::Writer::DESTROY = sub {};
233 *Slic3r::Geometry::BoundingBox::DESTROY = sub {};
234 *Slic3r::Geometry::BoundingBoxf::DESTROY = sub {};
235 *Slic3r::Geometry::BoundingBoxf3::DESTROY = sub {};
236 *Slic3r::Layer::PerimeterGenerator::DESTROY = sub {};
237 *Slic3r::Line::DESTROY = sub {};
238 *Slic3r::Linef3::DESTROY = sub {};
239 *Slic3r::Model::DESTROY = sub {};
240 *Slic3r::Model::Object::DESTROY = sub {};
241 *Slic3r::Point::DESTROY = sub {};
242 *Slic3r::Pointf::DESTROY = sub {};
243 *Slic3r::Pointf3::DESTROY = sub {};
244 *Slic3r::Polygon::DESTROY = sub {};
245 *Slic3r::Polyline::DESTROY = sub {};
246 *Slic3r::Polyline::Collection::DESTROY = sub {};
247 *Slic3r::Print::DESTROY = sub {};
248 *Slic3r::Print::Object::DESTROY = sub {};
249 *Slic3r::Print::Region::DESTROY = sub {};
250 *Slic3r::Surface::DESTROY = sub {};
251 *Slic3r::Surface::Collection::DESTROY = sub {};
252 *Slic3r::Print::SupportMaterial2::DESTROY = sub {};
253 *Slic3r::TriangleMesh::DESTROY = sub {};
254 return undef; # this prevents a "Scalars leaked" warning
255 }
256
257 sub get_running_threads {
258 return grep defined($_), map threads->object($_), @_;
259 }
260
261 sub kill_all_threads {
262 # if we're the main thread, we send SIGKILL to all the running threads
263 if (threads->tid == 0) {
264 lock @threads;
265 foreach my $thread (get_running_threads(@threads)) {
266 Slic3r::debugf "Thread %d killing %d...\n", threads->tid, $thread->tid;
267 $thread->kill('KILL');
268 }
269
270 # unlock semaphore before we block on wait
271 # otherwise we'd get a deadlock if threads were paused
272 resume_all_threads();
273 }
274
275 # in any thread we wait for our children
276 foreach my $thread (get_running_threads(@my_threads)) {
277 Slic3r::debugf " Thread %d waiting for %d...\n", threads->tid, $thread->tid;
278 $thread->join; # block until threads are killed
279 Slic3r::debugf " Thread %d finished waiting for %d...\n", threads->tid, $thread->tid;
280 }
281 @my_threads = ();
282 }
283
284 sub pause_all_threads {
285 return if $paused;
286 lock @threads;
287 $paused = 1;
288 $pause_sema->down;
289 $_->kill('STOP') for get_running_threads(@threads);
290 }
291
292 sub resume_all_threads {
293 return unless $paused;
294 lock @threads;
295 $paused = 0;
296 $pause_sema->up;
297 }
298
299 # Convert a Unicode path to a file system locale.
300 # The encoding is (from Encode::Locale POD):
301 # Alias | Windows | Mac OS X | POSIX
302 # locale_fs | ANSI | UTF-8 | nl_langinfo
303 # where nl_langinfo is en-US.UTF-8 on a modern Linux as well.
304 # So this conversion seems to make the most sense on Windows.
305 sub encode_path {
306 my ($path) = @_;
307
308 $path = Unicode::Normalize::NFC($path);
309 $path = Encode::encode(locale_fs => $path);
310
311 return $path;
312 }
313
314 # Convert a path coded by a file system locale to Unicode.
315 sub decode_path {
316 my ($path) = @_;
317
318 $path = Encode::decode(locale_fs => $path)
319 unless utf8::is_utf8($path);
320
321 # The filesystem might force a normalization form (like HFS+ does) so
322 # if we rely on the filename being comparable after the open() + readdir()
323 # roundtrip (like when creating and then selecting a preset), we need to
324 # restore our normalization form.
325 $path = Unicode::Normalize::NFC($path);
326
327 return $path;
328 }
329
330 # Open a file by converting $filename to local file system locales.
331 sub open {
332 my ($fh, $mode, $filename) = @_;
333 return CORE::open $$fh, $mode, encode_path($filename);
334 }
335
336 # this package declaration prevents an ugly fatal warning to be emitted when
337 # spawning a new thread
338 package GLUquadricObjPtr;
339
340 1;
0 #!/usr/bin/env perl
1
2 use strict;
3 use warnings;
4
5 BEGIN {
6 use FindBin;
7 use lib "$FindBin::Bin/lib";
8 }
9
10 use File::Basename qw(basename);
11 use Getopt::Long qw(:config no_auto_abbrev);
12 use List::Util qw(first);
13 use POSIX qw(setlocale LC_NUMERIC);
14 use Slic3r;
15 use Time::HiRes qw(gettimeofday tv_interval);
16 $|++;
17 binmode STDOUT, ':utf8';
18
19 our %opt = ();
20 my %cli_options = ();
21 {
22 my %options = (
23 'help' => sub { usage() },
24 'version' => sub { print "$Slic3r::VERSION\n"; exit 0 },
25
26 'debug' => \$Slic3r::debug,
27 'gui' => \$opt{gui},
28 'o|output=s' => \$opt{output},
29
30 'save=s' => \$opt{save},
31 'load=s@' => \$opt{load},
32 'autosave=s' => \$opt{autosave},
33 'ignore-nonexistent-config' => \$opt{ignore_nonexistent_config},
34 'no-controller' => \$opt{no_controller},
35 'no-plater' => \$opt{no_plater},
36 'gui-mode=s' => \$opt{gui_mode},
37 'datadir=s' => \$opt{datadir},
38 'export-svg' => \$opt{export_svg},
39 'merge|m' => \$opt{merge},
40 'repair' => \$opt{repair},
41 'cut=f' => \$opt{cut},
42 'split' => \$opt{split},
43 'info' => \$opt{info},
44
45 'scale=f' => \$opt{scale},
46 'rotate=i' => \$opt{rotate},
47 'duplicate=i' => \$opt{duplicate},
48 'duplicate-grid=s' => \$opt{duplicate_grid},
49 'print-center=s' => \$opt{print_center},
50 'dont-arrange' => \$opt{dont_arrange},
51 );
52 foreach my $opt_key (keys %{$Slic3r::Config::Options}) {
53 my $cli = $Slic3r::Config::Options->{$opt_key}->{cli} or next;
54 # allow both the dash-separated option name and the full opt_key
55 $options{ "$opt_key|$cli" } = \$cli_options{$opt_key};
56 }
57
58 @ARGV = grep !/^-psn_\d/, @ARGV if $^O eq 'darwin';
59 GetOptions(%options) or usage(1);
60 }
61
62 # load configuration files
63 my @external_configs = ();
64 if ($opt{load}) {
65 foreach my $configfile (@{$opt{load}}) {
66 $configfile = Slic3r::decode_path($configfile);
67 if (-e $configfile) {
68 push @external_configs, Slic3r::Config->load($configfile);
69 } elsif (-e "$FindBin::Bin/$configfile") {
70 printf STDERR "Loading $FindBin::Bin/$configfile\n";
71 push @external_configs, Slic3r::Config->load("$FindBin::Bin/$configfile");
72 } else {
73 $opt{ignore_nonexistent_config} or die "Cannot find specified configuration file ($configfile).\n";
74 }
75 }
76 }
77
78 # process command line options
79 my $cli_config = Slic3r::Config->new;
80 foreach my $c (@external_configs, Slic3r::Config->new_from_cli(%cli_options)) {
81 $c->normalize; # expand shortcuts before applying, otherwise destination values would be already filled with defaults
82 $cli_config->apply($c);
83 }
84
85 # save configuration
86 if ($opt{save}) {
87 if (@{$cli_config->get_keys} > 0) {
88 $cli_config->save($opt{save});
89 } else {
90 Slic3r::Config->new_from_defaults->save($opt{save});
91 }
92 }
93
94 # apply command line config on top of default config
95 my $config = Slic3r::Config->new_from_defaults;
96 $config->apply($cli_config);
97
98 # launch GUI
99 my $gui;
100 if ((!@ARGV || $opt{gui}) && !$opt{save} && eval "require Slic3r::GUI; 1") {
101 {
102 no warnings 'once';
103 $Slic3r::GUI::datadir = Slic3r::decode_path($opt{datadir} // '');
104 $Slic3r::GUI::no_controller = $opt{no_controller};
105 $Slic3r::GUI::no_plater = $opt{no_plater};
106 $Slic3r::GUI::mode = $opt{gui_mode};
107 $Slic3r::GUI::autosave = $opt{autosave};
108 }
109 $gui = Slic3r::GUI->new;
110 setlocale(LC_NUMERIC, 'C');
111 $gui->{mainframe}->load_config_file($_) for @{$opt{load}};
112 $gui->{mainframe}->load_config($cli_config);
113 foreach my $input_file (@ARGV) {
114 $input_file = Slic3r::decode_path($input_file);
115 $gui->{mainframe}{plater}->load_file($input_file) unless $opt{no_plater};
116 }
117 $gui->MainLoop;
118 exit;
119 }
120 die $@ if $@ && $opt{gui};
121
122 if (@ARGV) { # slicing from command line
123 $config->validate;
124
125 if ($opt{repair}) {
126 foreach my $file (@ARGV) {
127 $file = Slic3r::decode_path($file);
128 die "Repair is currently supported only on STL files\n"
129 if $file !~ /\.stl$/i;
130
131 my $output_file = $file;
132 $output_file =~ s/\.(stl)$/_fixed.obj/i;
133 my $tmesh = Slic3r::TriangleMesh->new;
134 $tmesh->ReadSTLFile($file);
135 $tmesh->repair;
136 $tmesh->WriteOBJFile($output_file);
137 }
138 exit;
139 }
140
141 if ($opt{cut}) {
142 foreach my $file (@ARGV) {
143 $file = Slic3r::decode_path($file);
144 my $model = Slic3r::Model->read_from_file($file);
145 $model->add_default_instances;
146 my $mesh = $model->mesh;
147 $mesh->translate(0, 0, -$mesh->bounding_box->z_min);
148 my $upper = Slic3r::TriangleMesh->new;
149 my $lower = Slic3r::TriangleMesh->new;
150 $mesh->cut($opt{cut}, $upper, $lower);
151 $upper->repair;
152 $lower->repair;
153 $upper->write_ascii("${file}_upper.stl")
154 if $upper->facets_count > 0;
155 $lower->write_ascii("${file}_lower.stl")
156 if $lower->facets_count > 0;
157 }
158 exit;
159 }
160
161 if ($opt{split}) {
162 foreach my $file (@ARGV) {
163 $file = Slic3r::decode_path($file);
164 my $model = Slic3r::Model->read_from_file($file);
165 $model->add_default_instances;
166 my $mesh = $model->mesh;
167 $mesh->repair;
168
169 my $part_count = 0;
170 foreach my $new_mesh (@{$mesh->split}) {
171 my $output_file = sprintf '%s_%02d.stl', $file, ++$part_count;
172 printf "Writing to %s\n", basename($output_file);
173 Slic3r::Format::STL->write_file($output_file, $new_mesh, binary => 1);
174 }
175 }
176 exit;
177 }
178
179 while (my $input_file = shift @ARGV) {
180 $input_file = Slic3r::decode_path($input_file);
181 my $model;
182 if ($opt{merge}) {
183 my @models = map Slic3r::Model->read_from_file($_), $input_file, (splice @ARGV, 0);
184 $model = Slic3r::Model->merge(@models);
185 } else {
186 $model = Slic3r::Model->read_from_file($input_file);
187 }
188
189 if ($opt{info}) {
190 $model->print_info;
191 next;
192 }
193
194 if (defined $opt{duplicate_grid}) {
195 $opt{duplicate_grid} = [ split /[,x]/, $opt{duplicate_grid}, 2 ];
196 }
197 if (defined $opt{print_center}) {
198 $opt{print_center} = Slic3r::Pointf->new(split /[,x]/, $opt{print_center}, 2);
199 }
200
201 my $sprint = Slic3r::Print::Simple->new(
202 scale => $opt{scale} // 1,
203 rotate => $opt{rotate} // 0,
204 duplicate => $opt{duplicate} // 1,
205 duplicate_grid => $opt{duplicate_grid} // [1,1],
206 print_center => $opt{print_center} // Slic3r::Pointf->new(100,100),
207 dont_arrange => $opt{dont_arrange} // 0,
208 status_cb => sub {
209 my ($percent, $message) = @_;
210 printf "=> %s\n", $message;
211 },
212 output_file => $opt{output},
213 );
214
215 $sprint->apply_config($config);
216 $sprint->set_model($model);
217
218 if ($opt{export_svg}) {
219 $sprint->export_svg;
220 } else {
221 my $t0 = [gettimeofday];
222 $sprint->export_gcode;
223
224 # output some statistics
225 {
226 my $duration = tv_interval($t0);
227 printf "Done. Process took %d minutes and %.3f seconds\n",
228 int($duration/60), ($duration - int($duration/60)*60); # % truncates to integer
229 }
230 printf "Filament required: %.1fmm (%.1fcm3)\n",
231 $sprint->total_used_filament, $sprint->total_extruded_volume/1000;
232 }
233 }
234 } else {
235 usage(1) unless $opt{save};
236 }
237
238 sub usage {
239 my ($exit_code) = @_;
240
241 my $config = Slic3r::Config->new_from_defaults->as_hash;
242
243 my $j = '';
244 if ($Slic3r::have_threads) {
245 $j = <<"EOF";
246 -j, --threads <num> Number of threads to use (1+, default: $config->{threads})
247 EOF
248 }
249
250 print <<"EOF";
251 Slic3r $Slic3r::VERSION is a STL-to-GCODE translator for RepRap 3D printers
252 written by Alessandro Ranellucci <aar\@cpan.org> - http://slic3r.org/
253
254 Usage: slic3r.pl [ OPTIONS ] [ file.stl ] [ file2.stl ] ...
255
256 --help Output this usage screen and exit
257 --version Output the version of Slic3r and exit
258 --save <file> Save configuration to the specified file
259 --load <file> Load configuration from the specified file. It can be used
260 more than once to load options from multiple files.
261 -o, --output <file> File to output gcode to (by default, the file will be saved
262 into the same directory as the input file using the
263 --output-filename-format to generate the filename.) If a
264 directory is specified for this option, the output will
265 be saved under that directory, and the filename will be
266 generated by --output-filename-format.
267
268 Non-slicing actions (no G-code will be generated):
269 --repair Repair given STL files and save them as <name>_fixed.obj
270 --cut <z> Cut given input files at given Z (relative) and export
271 them as <name>_upper.stl and <name>_lower.stl
272 --split Split the shells contained in given STL file into several STL files
273 --info Output information about the supplied file(s) and exit
274
275 $j
276 GUI options:
277 --gui Forces the GUI launch instead of command line slicing (if you
278 supply a model file, it will be loaded into the plater)
279 --no-plater Disable the plater tab
280 --gui-mode Overrides the configured mode (simple/expert)
281 --autosave <file> Automatically export current configuration to the specified file
282
283 Output options:
284 --output-filename-format
285 Output file name format; all config options enclosed in brackets
286 will be replaced by their values, as well as [input_filename_base]
287 and [input_filename] (default: $config->{output_filename_format})
288 --post-process Generated G-code will be processed with the supplied script;
289 call this more than once to process through multiple scripts.
290 --export-svg Export a SVG file containing slices instead of G-code.
291 -m, --merge If multiple files are supplied, they will be composed into a single
292 print rather than processed individually.
293
294 Printer options:
295 --nozzle-diameter Diameter of nozzle in mm (default: $config->{nozzle_diameter}->[0])
296 --print-center Coordinates in mm of the point to center the print around
297 (default: 100,100)
298 --z-offset Additional height in mm to add to vertical coordinates
299 (+/-, default: $config->{z_offset})
300 --gcode-flavor The type of G-code to generate (reprap/teacup/makerware/sailfish/mach3/machinekit/no-extrusion,
301 default: $config->{gcode_flavor})
302 --use-relative-e-distances Enable this to get relative E values (default: no)
303 --use-firmware-retraction Enable firmware-controlled retraction using G10/G11 (default: no)
304 --use-volumetric-e Express E in cubic millimeters and prepend M200 (default: no)
305 --gcode-arcs Use G2/G3 commands for native arcs (experimental, not supported
306 by all firmwares)
307 --gcode-comments Make G-code verbose by adding comments (default: no)
308 --pressure-advance Adjust pressure using the experimental advance algorithm (K constant,
309 set zero to disable; default: $config->{pressure_advance})
310
311 Filament options:
312 --filament-diameter Diameter in mm of your raw filament (default: $config->{filament_diameter}->[0])
313 --extrusion-multiplier
314 Change this to alter the amount of plastic extruded. There should be
315 very little need to change this value, which is only useful to
316 compensate for filament packing (default: $config->{extrusion_multiplier}->[0])
317 --temperature Extrusion temperature in degree Celsius, set 0 to disable (default: $config->{temperature}->[0])
318 --first-layer-temperature Extrusion temperature for the first layer, in degree Celsius,
319 set 0 to disable (default: same as --temperature)
320 --bed-temperature Heated bed temperature in degree Celsius, set 0 to disable (default: $config->{bed_temperature})
321 --first-layer-bed-temperature Heated bed temperature for the first layer, in degree Celsius,
322 set 0 to disable (default: same as --bed-temperature)
323
324 Speed options:
325 --travel-speed Speed of non-print moves in mm/s (default: $config->{travel_speed})
326 --perimeter-speed Speed of print moves for perimeters in mm/s (default: $config->{perimeter_speed})
327 --small-perimeter-speed
328 Speed of print moves for small perimeters in mm/s or % over perimeter speed
329 (default: $config->{small_perimeter_speed})
330 --external-perimeter-speed
331 Speed of print moves for the external perimeter in mm/s or % over perimeter speed
332 (default: $config->{external_perimeter_speed})
333 --infill-speed Speed of print moves in mm/s (default: $config->{infill_speed})
334 --solid-infill-speed Speed of print moves for solid surfaces in mm/s or % over infill speed
335 (default: $config->{solid_infill_speed})
336 --top-solid-infill-speed Speed of print moves for top surfaces in mm/s or % over solid infill speed
337 (default: $config->{top_solid_infill_speed})
338 --support-material-speed
339 Speed of support material print moves in mm/s (default: $config->{support_material_speed})
340 --support-material-interface-speed
341 Speed of support material interface print moves in mm/s or % over support material
342 speed (default: $config->{support_material_interface_speed})
343 --bridge-speed Speed of bridge print moves in mm/s (default: $config->{bridge_speed})
344 --gap-fill-speed Speed of gap fill print moves in mm/s (default: $config->{gap_fill_speed})
345 --first-layer-speed Speed of print moves for bottom layer, expressed either as an absolute
346 value or as a percentage over normal speeds (default: $config->{first_layer_speed})
347
348 Acceleration options:
349 --perimeter-acceleration
350 Overrides firmware's default acceleration for perimeters. (mm/s^2, set zero
351 to disable; default: $config->{perimeter_acceleration})
352 --infill-acceleration
353 Overrides firmware's default acceleration for infill. (mm/s^2, set zero
354 to disable; default: $config->{infill_acceleration})
355 --bridge-acceleration
356 Overrides firmware's default acceleration for bridges. (mm/s^2, set zero
357 to disable; default: $config->{bridge_acceleration})
358 --first-layer-acceleration
359 Overrides firmware's default acceleration for first layer. (mm/s^2, set zero
360 to disable; default: $config->{first_layer_acceleration})
361 --default-acceleration
362 Acceleration will be reset to this value after the specific settings above
363 have been applied. (mm/s^2, set zero to disable; default: $config->{default_acceleration})
364
365 Accuracy options:
366 --layer-height Layer height in mm (default: $config->{layer_height})
367 --first-layer-height Layer height for first layer (mm or %, default: $config->{first_layer_height})
368 --infill-every-layers
369 Infill every N layers (default: $config->{infill_every_layers})
370 --solid-infill-every-layers
371 Force a solid layer every N layers (default: $config->{solid_infill_every_layers})
372
373 Print options:
374 --perimeters Number of perimeters/horizontal skins (range: 0+, default: $config->{perimeters})
375 --top-solid-layers Number of solid layers to do for top surfaces (range: 0+, default: $config->{top_solid_layers})
376 --bottom-solid-layers Number of solid layers to do for bottom surfaces (range: 0+, default: $config->{bottom_solid_layers})
377 --solid-layers Shortcut for setting the two options above at once
378 --fill-density Infill density (range: 0%-100%, default: $config->{fill_density}%)
379 --fill-angle Infill angle in degrees (range: 0-90, default: $config->{fill_angle})
380 --fill-pattern Pattern to use to fill non-solid layers (default: $config->{fill_pattern})
381 --external-fill-pattern Pattern to use to fill solid layers (default: $config->{external_fill_pattern})
382 --start-gcode Load initial G-code from the supplied file. This will overwrite
383 the default command (home all axes [G28]).
384 --end-gcode Load final G-code from the supplied file. This will overwrite
385 the default commands (turn off temperature [M104 S0],
386 home X axis [G28 X], disable motors [M84]).
387 --before-layer-gcode Load before-layer-change G-code from the supplied file (default: nothing).
388 --layer-gcode Load layer-change G-code from the supplied file (default: nothing).
389 --toolchange-gcode Load tool-change G-code from the supplied file (default: nothing).
390 --seam-position Position of loop starting points (random/nearest/aligned, default: $config->{seam_position}).
391 --external-perimeters-first Reverse perimeter order. (default: no)
392 --spiral-vase Experimental option to raise Z gradually when printing single-walled vases
393 (default: no)
394 --only-retract-when-crossing-perimeters
395 Disable retraction when travelling between infill paths inside the same island.
396 (default: no)
397 --solid-infill-below-area
398 Force solid infill when a region has a smaller area than this threshold
399 (mm^2, default: $config->{solid_infill_below_area})
400 --infill-only-where-needed
401 Only infill under ceilings (default: no)
402 --infill-first Make infill before perimeters (default: no)
403
404 Quality options (slower slicing):
405 --extra-perimeters Add more perimeters when needed (default: yes)
406 --ensure-vertical-shell-thickness Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers). (default: no)
407 --avoid-crossing-perimeters Optimize travel moves so that no perimeters are crossed (default: no)
408 --thin-walls Detect single-width walls (default: yes)
409 --overhangs Experimental option to use bridge flow, speed and fan for overhangs
410 (default: yes)
411
412 Support material options:
413 --support-material Generate support material for overhangs
414 --support-material-threshold
415 Overhang threshold angle (range: 0-90, set 0 for automatic detection,
416 default: $config->{support_material_threshold})
417 --support-material-pattern
418 Pattern to use for support material (default: $config->{support_material_pattern})
419 --support-material-with-sheath
420 Add a sheath (a single perimeter line) around the base support.
421 This makes the support more reliable, but also more difficult to remove. (default: yes)
422 --support-material-spacing
423 Spacing between pattern lines (mm, default: $config->{support_material_spacing})
424 --support-material-angle
425 Support material angle in degrees (range: 0-90, default: $config->{support_material_angle})
426 --support-material-contact-distance
427 Vertical distance between object and support material (0+, default: $config->{support_material_contact_distance})
428 --support-material-interface-layers
429 Number of perpendicular layers between support material and object (0+, default: $config->{support_material_interface_layers})
430 --support-material-interface-spacing
431 Spacing between interface pattern lines (mm, set 0 to get a solid layer, default: $config->{support_material_interface_spacing})
432 --raft-layers Number of layers to raise the printed objects by (range: 0+, default: $config->{raft_layers})
433 --support-material-enforce-layers
434 Enforce support material on the specified number of layers from bottom,
435 regardless of --support-material and threshold (0+, default: $config->{support_material_enforce_layers})
436 --support-material-buildplate-only
437 Only create support if it lies on a build plate. Don't create support on a print. (default: no)
438 --dont-support-bridges
439 Experimental option for preventing support material from being generated under bridged areas (default: yes)
440
441 Retraction options:
442 --retract-length Length of retraction in mm when pausing extrusion (default: $config->{retract_length}[0])
443 --retract-speed Speed for retraction in mm/s (default: $config->{retract_speed}[0])
444 --retract-restart-extra
445 Additional amount of filament in mm to push after
446 compensating retraction (default: $config->{retract_restart_extra}[0])
447 --retract-before-travel
448 Only retract before travel moves of this length in mm (default: $config->{retract_before_travel}[0])
449 --retract-lift Lift Z by the given distance in mm when retracting (default: $config->{retract_lift}[0])
450 --retract-lift-above Only lift Z when above the specified height (default: $config->{retract_lift_above}[0])
451 --retract-lift-below Only lift Z when below the specified height (default: $config->{retract_lift_below}[0])
452 --retract-layer-change
453 Enforce a retraction before each Z move (default: no)
454 --wipe Wipe the nozzle while doing a retraction (default: no)
455
456 Retraction options for multi-extruder setups:
457 --retract-length-toolchange
458 Length of retraction in mm when disabling tool (default: $config->{retract_length_toolchange}[0])
459 --retract-restart-extra-toolchange
460 Additional amount of filament in mm to push after
461 switching tool (default: $config->{retract_restart_extra_toolchange}[0])
462
463 Cooling options:
464 --cooling Enable fan and cooling control
465 --min-fan-speed Minimum fan speed (default: $config->{min_fan_speed}%)
466 --max-fan-speed Maximum fan speed (default: $config->{max_fan_speed}%)
467 --bridge-fan-speed Fan speed to use when bridging (default: $config->{bridge_fan_speed}%)
468 --fan-below-layer-time Enable fan if layer print time is below this approximate number
469 of seconds (default: $config->{fan_below_layer_time})
470 --slowdown-below-layer-time Slow down if layer print time is below this approximate number
471 of seconds (default: $config->{slowdown_below_layer_time})
472 --min-print-speed Minimum print speed (mm/s, default: $config->{min_print_speed})
473 --disable-fan-first-layers Disable fan for the first N layers (default: $config->{disable_fan_first_layers})
474 --fan-always-on Keep fan always on at min fan speed, even for layers that don't need
475 cooling
476
477 Skirt options:
478 --skirts Number of skirts to draw (0+, default: $config->{skirts})
479 --skirt-distance Distance in mm between innermost skirt and object
480 (default: $config->{skirt_distance})
481 --skirt-height Height of skirts to draw (expressed in layers, 0+, default: $config->{skirt_height})
482 --min-skirt-length Generate no less than the number of loops required to consume this length
483 of filament on the first layer, for each extruder (mm, 0+, default: $config->{min_skirt_length})
484 --brim-width Width of the brim that will get added to each object to help adhesion
485 (mm, default: $config->{brim_width})
486
487 Transform options:
488 --scale Factor for scaling input object (default: 1)
489 --rotate Rotation angle in degrees (0-360, default: 0)
490 --duplicate Number of items with auto-arrange (1+, default: 1)
491 --duplicate-grid Number of items with grid arrangement (default: 1,1)
492 --duplicate-distance Distance in mm between copies (default: $config->{duplicate_distance})
493 --dont-arrange Don't arrange the objects on the build plate. The model coordinates
494 define the absolute positions on the build plate.
495 The option --print-center will be ignored.
496 --xy-size-compensation
497 Grow/shrink objects by the configured absolute distance (mm, default: $config->{xy_size_compensation})
498
499 Sequential printing options:
500 --complete-objects When printing multiple objects and/or copies, complete each one before
501 starting the next one; watch out for extruder collisions (default: no)
502 --extruder-clearance-radius Radius in mm above which extruder won't collide with anything
503 (default: $config->{extruder_clearance_radius})
504 --extruder-clearance-height Maximum vertical extruder depth; i.e. vertical distance from
505 extruder tip and carriage bottom (default: $config->{extruder_clearance_height})
506
507 Miscellaneous options:
508 --notes Notes to be added as comments to the output file
509 --resolution Minimum detail resolution (mm, set zero for full resolution, default: $config->{resolution})
510
511 Flow options (advanced):
512 --extrusion-width Set extrusion width manually; it accepts either an absolute value in mm
513 (like 0.65) or a percentage over layer height (like 200%)
514 --first-layer-extrusion-width
515 Set a different extrusion width for first layer
516 --perimeter-extrusion-width
517 Set a different extrusion width for perimeters
518 --external-perimeter-extrusion-width
519 Set a different extrusion width for external perimeters
520 --infill-extrusion-width
521 Set a different extrusion width for infill
522 --solid-infill-extrusion-width
523 Set a different extrusion width for solid infill
524 --top-infill-extrusion-width
525 Set a different extrusion width for top infill
526 --support-material-extrusion-width
527 Set a different extrusion width for support material
528 --infill-overlap Overlap between infill and perimeters (default: $config->{infill_overlap})
529 --bridge-flow-ratio Multiplier for extrusion when bridging (> 0, default: $config->{bridge_flow_ratio})
530
531 Multiple extruder options:
532 --extruder-offset Offset of each extruder, if firmware doesn't handle the displacement
533 (can be specified multiple times, default: 0x0)
534 --perimeter-extruder
535 Extruder to use for perimeters and brim (1+, default: $config->{perimeter_extruder})
536 --infill-extruder Extruder to use for infill (1+, default: $config->{infill_extruder})
537 --solid-infill-extruder Extruder to use for solid infill (1+, default: $config->{solid_infill_extruder})
538 --support-material-extruder
539 Extruder to use for support material, raft and skirt (1+, default: $config->{support_material_extruder})
540 --support-material-interface-extruder
541 Extruder to use for support material interface (1+, default: $config->{support_material_interface_extruder})
542 --ooze-prevention Drop temperature and park extruders outside a full skirt for automatic wiping
543 (default: no)
544 --standby-temperature-delta
545 Temperature difference to be applied when an extruder is not active and
546 --ooze-prevention is enabled (default: $config->{standby_temperature_delta})
547
548 EOF
549 exit ($exit_code || 0);
550 }
551
552 __END__
0 {
1 "build_systems":
2 [
3 {
4 "name": "List",
5 //"file_regex": " at ([^-\\s]*) line ([0-9]*)",
6 // "file_regex": " at (D\\:\\/src\\/Slic3r\\/.*?) line ([0-9]*)",
7 "shell_cmd": "ls -l"
8 },
9 {
10 "name": "Run",
11 "working_dir": "$project_path",
12 "file_regex": " at (.*?) line ([0-9]*)",
13 "shell_cmd": "chdir & perl slic3r.pl --DataDir \"C:\\Users\\Public\\Documents\\Prusa3D\\Slic3r settings MK2\" --gui \"..\\Slic3r-tests\\gap fill torture 20 -rt.stl\""
14 },
15 {
16 "name": "full",
17 "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
18 "shell_cmd": "chdir & perl Build.pl"
19 },
20 {
21 "name": "xs",
22 "working_dir": "$project_path/xs",
23 // for Visual Studio:
24 "file_regex": "^(..[^:]*)\\(([0-9]+)\\)(.*)$",
25 // For GCC:
26 // "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
27 "shell_cmd": "chdir & perl Build install",
28 "env": {
29 // "PATH": "C:\\Program Files (x86)\\MSBuild\\12.0\\bin\\amd64;C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\BIN\\amd64;C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\IDE;C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\Tools;%PATH%;c:\\wperl64d\\site\\bin;c:\\wperl64d\\bin",
30 // "PERL_CPANM_HOME": "c:\\wperl64d\\cpanm",
31 // "WXDIR": "D:\\src-perl\\wxWidgets-3.0.3-beta1",
32 // "BOOST_DIR": "D:\\src-perl\\boost_1_61_0",
33 // "BOOST_INCLUDEDIR": "D:\\src-perl\\boost_1_61_0",
34 // "BOOST_LIBRARYDIR": "D:\\src-perl\\boost_1_61_0\\stage\\x64\\lib",
35 // "SLIC3R_STATIC": "1"
36 }
37 },
38 {
39 "name": "xs & run",
40 "working_dir": "$project_path/xs",
41 "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
42 "shell_cmd": "chdir & perl Build install & cd .. & perl slic3r.pl --gui \"..\\Slic3r-tests\\star3-big2.stl\""
43 }
44 ],
45 "folders":
46 [
47 {
48 "path": ".",
49 // "folder_exclude_patterns": [".svn", "._d", ".metadata", ".settings"],
50 "file_exclude_patterns": ["XS.c"]
51 }
52 ],
53
54 "settings":
55 {
56 "sublimegdb_workingdir": "${folder:${project_path:run}}",
57 // NOTE: You MUST provide --interpreter=mi for the plugin to work
58 // "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi -ex 'target localhost:2345'",
59 // "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi perl --args perl slic3r.pl",
60 // "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi perl --args slic3r.pl ",
61 // "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi -e C:\\Strawberry\\perl\\bin\\perl.exe -s C:\\Strawberry\\perl\\site\\lib\\auto\\Slic3r\\XS\\XS.xs.dll --args perl slic3r.pl -j 1 --gui D:\\src\\Slic3r-tests\\star3-big.stl",
62 "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi perl.exe --args perl slic3r.pl -j 1 --gui", // D:\\src\\Slic3r-tests\\star3-big.stl",
63 // "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi -x slic3r.gdb",
64 // "arguments": "slic3r -j 1 --gui ../Slic3r-tests/star3-big.stl",
65 // "arguments": "../slic3r.pl -j 1 --gui",
66 // "sublimegdb_exec_cmd": "-exec-continue",
67
68 // Add "pending breakpoints" for symbols that are dynamically loaded from
69 // external shared libraries
70 "debug_ext" : true,
71 "run_after_init": false,
72 "close_views": false
73 }
74 }
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan tests => 34;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Slic3r;
12 use Slic3r::Geometry qw(rad2deg_dir angle3points PI);
13
14 #==========================================================
15
16 {
17 is line_atan([ [0, 0], [10, 0] ]), (0), 'E atan2';
18 is line_atan([ [10, 0], [0, 0] ]), (PI), 'W atan2';
19 is line_atan([ [0, 0], [0, 10] ]), (PI/2), 'N atan2';
20 is line_atan([ [0, 10], [0, 0] ]), -(PI/2), 'S atan2';
21
22 is line_atan([ [10, 10], [0, 0] ]), -(PI*3/4), 'SW atan2';
23 is line_atan([ [0, 0], [10, 10] ]), (PI*1/4), 'NE atan2';
24 is line_atan([ [0, 10], [10, 0] ]), -(PI*1/4), 'SE atan2';
25 is line_atan([ [10, 0], [0, 10] ]), (PI*3/4), 'NW atan2';
26 }
27
28 #==========================================================
29
30 {
31 is line_orientation([ [0, 0], [10, 0] ]), (0), 'E orientation';
32 is line_orientation([ [0, 0], [0, 10] ]), (PI/2), 'N orientation';
33 is line_orientation([ [10, 0], [0, 0] ]), (PI), 'W orientation';
34 is line_orientation([ [0, 10], [0, 0] ]), (PI*3/2), 'S orientation';
35
36 is line_orientation([ [0, 0], [10, 10] ]), (PI*1/4), 'NE orientation';
37 is line_orientation([ [10, 0], [0, 10] ]), (PI*3/4), 'NW orientation';
38 is line_orientation([ [10, 10], [0, 0] ]), (PI*5/4), 'SW orientation';
39 is line_orientation([ [0, 10], [10, 0] ]), (PI*7/4), 'SE orientation';
40 }
41
42 #==========================================================
43
44 {
45 is line_direction([ [0, 0], [10, 0] ]), (0), 'E direction';
46 is line_direction([ [10, 0], [0, 0] ]), (0), 'W direction';
47 is line_direction([ [0, 0], [0, 10] ]), (PI/2), 'N direction';
48 is line_direction([ [0, 10], [0, 0] ]), (PI/2), 'S direction';
49
50 is line_direction([ [10, 10], [0, 0] ]), (PI*1/4), 'SW direction';
51 is line_direction([ [0, 0], [10, 10] ]), (PI*1/4), 'NE direction';
52 is line_direction([ [0, 10], [10, 0] ]), (PI*3/4), 'SE direction';
53 is line_direction([ [10, 0], [0, 10] ]), (PI*3/4), 'NW direction';
54 }
55
56 #==========================================================
57
58 {
59 is rad2deg_dir(0), 90, 'E (degrees)';
60 is rad2deg_dir(PI), 270, 'W (degrees)';
61 is rad2deg_dir(PI/2), 0, 'N (degrees)';
62 is rad2deg_dir(-(PI/2)), 180, 'S (degrees)';
63 is rad2deg_dir(PI*1/4), 45, 'NE (degrees)';
64 is rad2deg_dir(PI*3/4), 135, 'NW (degrees)';
65 is rad2deg_dir(PI/6), 60, '30°';
66 is rad2deg_dir(PI/6*2), 30, '60°';
67 }
68
69 #==========================================================
70
71 {
72 is angle3points([0,0], [10,0], [0,10]), PI/2, 'CW angle3points';
73 is angle3points([0,0], [0,10], [10,0]), PI/2*3, 'CCW angle3points';
74 }
75
76 #==========================================================
77
78 sub line_atan {
79 my ($l) = @_;
80 return Slic3r::Line->new(@$l)->atan2_;
81 }
82
83 sub line_orientation {
84 my ($l) = @_;
85 return Slic3r::Line->new(@$l)->orientation;
86 }
87
88 sub line_direction {
89 my ($l) = @_;
90 return Slic3r::Line->new(@$l)->direction;
91 }
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan tests => 24;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Slic3r;
12 use Slic3r::ExtrusionPath ':roles';
13 use Slic3r::Geometry qw(scaled_epsilon epsilon scale unscale X Y deg2rad);
14
15 {
16 my $angle = deg2rad(4);
17 foreach my $ccw (1, 0) {
18 my $polyline = Slic3r::Polyline->new_scale([0,0], [0,10]);
19 {
20 my $p3 = Slic3r::Point->new_scale(0, 20);
21 $p3->rotate($angle * ($ccw ? 1 : -1), $polyline->[-1]);
22 is $ccw, ($p3->[X] < $polyline->[-1][X]) ? 1 : 0, 'third point is rotated correctly';
23 $polyline->append($p3);
24 }
25 ok abs($polyline->length - scale(20)) < scaled_epsilon, 'curved polyline length';
26 is $ccw, ($polyline->[2]->ccw(@$polyline[0,1]) > 0) ? 1 : 0, 'curved polyline has wanted orientation';
27
28 ok my $arc = Slic3r::GCode::ArcFitting::polyline_to_arc($polyline), 'arc is detected';
29 is $ccw, $arc->is_ccw, 'arc orientation is correct';
30
31 ok abs($arc->angle - $angle) < epsilon, 'arc relative angle is correct';
32
33 ok $arc->start->coincides_with($polyline->[0]), 'arc start point is correct';
34 ok $arc->end->coincides_with($polyline->[-1]), 'arc end point is correct';
35
36 # since first polyline segment is vertical we expect arc center to have same Y as its first point
37 is $arc->center->[Y], 0, 'arc center has correct Y';
38
39 my $s1 = Slic3r::Line->new(@$polyline[0,1]);
40 my $s2 = Slic3r::Line->new(@$polyline[1,2]);
41 ok abs($arc->center->distance_to($s1->midpoint) - $arc->center->distance_to($s2->midpoint)) < scaled_epsilon,
42 'arc center is equidistant from both segments\' midpoints';
43 }
44 }
45
46 #==========================================================
47
48 {
49 my $path = Slic3r::Polyline->new_scale(
50 [13.532242,2.665496], [18.702911,9.954623], [22.251514,9.238193], [25.800116,9.954623],
51 [28.697942,11.908391], [30.65171,14.806217], [31.36814,18.35482],
52 [30.65171,21.903423], [28.697942,24.801249], [25.800116,26.755017], [22.251514,27.471447],
53 [18.702911,26.755017], [15.805085,24.801249], [13.851317,21.903423], [13.134887,18.35482],
54 [86948.77,175149.09], [119825.35,100585],
55 );
56
57 if (0) {
58 require "Slic3r::SVG";
59 Slic3r::SVG::output(
60 "arc.svg",
61 polylines => [$path],
62 );
63 }
64
65 my $af = Slic3r::GCode::ArcFitting->new(max_relative_angle => deg2rad(30));
66 my @chunks = $af->detect_arcs($path);
67
68 is scalar(@chunks), 3, 'path collection now contains three paths';
69 isa_ok $chunks[0], 'Slic3r::Polyline', 'first one is polyline';
70 isa_ok $chunks[1], 'Slic3r::GCode::ArcFitting::Arc', 'second one is arc';
71 isa_ok $chunks[2], 'Slic3r::Polyline', 'third one is polyline';
72 }
73
74 exit;
75
76 #==========================================================
77
78 {
79 my @points = map [ scale $_->[0], scale $_->[1] ], (
80 [10,20], [10.7845909572784,19.9691733373313], [11.5643446504023,19.8768834059514],
81 [12.3344536385591,19.7236992039768], [13.0901699437495,19.5105651629515],
82 [13.8268343236509,19.2387953251129], [14.5399049973955,18.9100652418837],
83 [15.2249856471595,18.5264016435409], [15.8778525229247,18.0901699437495],
84 [16.4944804833018,17.6040596560003]
85 );
86 my $path1 = Slic3r::ExtrusionPath->new(
87 polyline => Slic3r::Polyline->new(@points),
88 role => EXTR_ROLE_FILL,
89 mm3_per_mm => 0.5,
90 );
91 my $path2 = Slic3r::ExtrusionPath->new(
92 polyline => Slic3r::Polyline->new(reverse @points),
93 role => EXTR_ROLE_FILL,
94 mm3_per_mm => 0.5,
95 );
96
97 my @paths1 = $path1->detect_arcs(10, scale 1);
98 my @paths2 = $path2->detect_arcs(10, scale 1);
99
100 is scalar(@paths1), 1, 'path collection now contains one path';
101 is scalar(@paths2), 1, 'path collection now contains one path';
102
103 isa_ok $paths1[0], 'Slic3r::ExtrusionPath::Arc', 'path';
104 isa_ok $paths2[0], 'Slic3r::ExtrusionPath::Arc', 'path';
105
106 my $expected_length = scale 7.06858347057701;
107 ok abs($paths1[0]->length - $expected_length) < scaled_epsilon, 'cw oriented arc has correct length';
108 ok abs($paths2[0]->length - $expected_length) < scaled_epsilon, 'ccw oriented arc has correct length';
109
110 is $paths1[0]->orientation, 'cw', 'cw orientation was correctly detected';
111 is $paths2[0]->orientation, 'ccw', 'ccw orientation was correctly detected';
112 is $paths1[0]->flow_spacing, $path1->flow_spacing, 'flow spacing was correctly preserved';
113
114 my $center1 = [ map sprintf('%.0f', $_), @{ $paths1[0]->center } ];
115 ok abs($center1->[X] - scale 10) < scaled_epsilon && abs($center1->[Y] - scale 10) < scaled_epsilon, 'center was correctly detected';
116
117 my $center2 = [ map sprintf('%.0f', $_), @{ $paths2[0]->center } ];
118 ok abs($center2->[X] - scale 10) < scaled_epsilon && abs($center1->[Y] - scale 10) < scaled_epsilon, 'center was correctly detected';
119 }
120
121 #==========================================================
0 use Test::More tests => 1;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first sum);
10 use Slic3r;
11 use Slic3r::Test;
12
13 {
14 my $config = Slic3r::Config->new_from_defaults;
15 $config->set('avoid_crossing_perimeters', 2);
16 my $print = Slic3r::Test::init_print('20mm_cube', config => $config, duplicate => 2);
17 ok my $gcode = Slic3r::Test::gcode($print), "no crash with avoid_crossing_perimeters and multiple objects";
18 }
19
20 __END__
0 use Test::More tests => 16;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first sum);
10 use Slic3r;
11 use Slic3r::Geometry qw(scale epsilon deg2rad rad2deg PI);
12 use Slic3r::Test;
13
14 {
15 my $test = sub {
16 my ($bridge_size, $rotate, $expected_angle, $tolerance) = @_;
17
18 my ($x, $y) = @$bridge_size;
19 my $lower = Slic3r::ExPolygon->new(
20 Slic3r::Polygon->new_scale([-2,-2], [$x+2,-2], [$x+2,$y+2], [-2,$y+2]),
21 Slic3r::Polygon->new_scale([0,0], [0,$y], [$x,$y], [$x,0]),
22 );
23 $lower->translate(scale 20, scale 20); # avoid negative coordinates for easier SVG preview
24 $lower->rotate(deg2rad($rotate), [$x/2,$y/2]);
25 my $bridge = $lower->[1]->clone;
26 $bridge->reverse;
27 $bridge = Slic3r::ExPolygon->new($bridge);
28
29 ok check_angle([$lower], $bridge, $expected_angle, $tolerance), 'correct bridge angle for O-shaped overhang';
30 };
31
32 $test->([20,10], 0, 90);
33 $test->([10,20], 0, 0);
34 $test->([20,10], 45, 135, 20);
35 $test->([20,10], 135, 45, 20);
36 }
37
38 {
39 my $bridge = Slic3r::ExPolygon->new(
40 Slic3r::Polygon->new_scale([0,0], [20,0], [20,10], [0,10]),
41 );
42 my $lower = [
43 Slic3r::ExPolygon->new(
44 Slic3r::Polygon->new_scale([-2,0], [0,0], [0,10], [-2,10]),
45 ),
46 ];
47 $_->translate(scale 20, scale 20) for $bridge, @$lower; # avoid negative coordinates for easier SVG preview
48
49 $lower->[1] = $lower->[0]->clone;
50 $lower->[1]->translate(scale 22, 0);
51
52 ok check_angle($lower, $bridge, 0), 'correct bridge angle for two-sided bridge';
53 }
54
55 {
56 my $bridge = Slic3r::ExPolygon->new(
57 Slic3r::Polygon->new_scale([0,0], [20,0], [10,10], [0,10]),
58 );
59 my $lower = [
60 Slic3r::ExPolygon->new(
61 Slic3r::Polygon->new_scale([0,0], [0,10], [10,10], [10,12], [-2,12], [-2,-2], [22,-2], [22,0]),
62 ),
63 ];
64 $_->translate(scale 20, scale 20) for $bridge, @$lower; # avoid negative coordinates for easier SVG preview
65
66 ok check_angle($lower, $bridge, 135), 'correct bridge angle for C-shaped overhang';
67 }
68
69 {
70 my $bridge = Slic3r::ExPolygon->new(
71 Slic3r::Polygon->new_scale([10,10],[20,10],[20,20], [10,20]),
72 );
73 my $lower = [
74 Slic3r::ExPolygon->new(
75 Slic3r::Polygon->new_scale([10,10],[10,20],[20,20],[30,30],[0,30],[0,0]),
76 ),
77 ];
78 $_->translate(scale 20, scale 20) for $bridge, @$lower; # avoid negative coordinates for easier SVG preview
79
80 ok check_angle($lower, $bridge, 45, undef, $bridge->area/2), 'correct bridge angle for square overhang with L-shaped anchors';
81 }
82
83 sub check_angle {
84 my ($lower, $bridge, $expected, $tolerance, $expected_coverage) = @_;
85
86 if (ref($lower) eq 'ARRAY') {
87 $lower = Slic3r::ExPolygon::Collection->new(@$lower);
88 }
89
90 $expected_coverage //= -1;
91 $expected_coverage = $bridge->area if $expected_coverage == -1;
92
93 my $bd = Slic3r::BridgeDetector->new($bridge, $lower, scale 0.5);
94
95 $tolerance //= rad2deg($bd->resolution) + epsilon;
96 $bd->detect_angle;
97 my $result = $bd->angle;
98 my $coverage = $bd->coverage;
99 is sum(map $_->area, @$coverage), $expected_coverage, 'correct coverage area';
100
101 # our epsilon is equal to the steps used by the bridge detection algorithm
102 ###use XXX; YYY [ rad2deg($result), $expected ];
103 # returned value must be non-negative, check for that too
104 my $delta=rad2deg($result) - $expected;
105 $delta-=180 if $delta>=180 - epsilon;
106 return defined $result && $result>=0 && abs($delta) < $tolerance;
107 }
108
109 {
110 my $config = Slic3r::Config->new_from_defaults;
111 $config->set('top_solid_layers', 0); # to prevent bridging on sparse infill
112 $config->set('bridge_speed', 99);
113
114 my $print = Slic3r::Test::init_print('bridge', config => $config);
115
116 my %extrusions = (); # angle => length
117 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
118 my ($self, $cmd, $args, $info) = @_;
119
120 if ($cmd eq 'G1' && ($args->{F} // $self->F)/60 == $config->bridge_speed) {
121 my $line = Slic3r::Line->new_scale(
122 [ $self->X, $self->Y ],
123 [ $info->{new_X}, $info->{new_Y} ],
124 );
125 my $angle = $line->direction;
126 $extrusions{$angle} //= 0;
127 $extrusions{$angle} += $line->length;
128 }
129 });
130 ok !!%extrusions, "bridge is generated";
131 my ($main_angle) = sort { $extrusions{$b} <=> $extrusions{$a} } keys %extrusions;
132 is $main_angle, 0, "bridge has the expected direction";
133 }
134
135 __END__
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan tests => 6;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Slic3r;
12
13 {
14 my $polyline = Slic3r::Polyline->new(
15 [0,0],[1,0],[2,0],[2,1],[2,2],[1,2],[0,2],[0,1],[0,0],
16 );
17 $polyline->simplify(1);
18 is_deeply $polyline->pp, [ [0, 0], [2, 0], [2, 2], [0, 2], [0, 0] ], 'Douglas-Peucker';
19 }
20
21 {
22 my $polyline = Slic3r::Polyline->new(
23 [0,0], [50,50], [100,0], [125,-25], [150,50],
24 );
25 $polyline->simplify(25);
26 is_deeply $polyline->pp, [ [0, 0], [50, 50], [125, -25], [150, 50] ], 'Douglas-Peucker';
27 }
28
29 {
30 my $gear = Slic3r::Polygon->new_scale(
31 [144.9694,317.1543], [145.4181,301.5633], [146.3466,296.921], [131.8436,294.1643], [131.7467,294.1464],
32 [121.7238,291.5082], [117.1631,290.2776], [107.9198,308.2068], [100.1735,304.5101], [104.9896,290.3672],
33 [106.6511,286.2133], [93.453,279.2327], [81.0065,271.4171], [67.7886,286.5055], [60.7927,280.1127],
34 [69.3928,268.2566], [72.7271,264.9224], [61.8152,253.9959], [52.2273,242.8494], [47.5799,245.7224],
35 [34.6577,252.6559], [30.3369,245.2236], [42.1712,236.3251], [46.1122,233.9605], [43.2099,228.4876],
36 [35.0862,211.5672], [33.1441,207.0856], [13.3923,212.1895], [10.6572,203.3273], [6.0707,204.8561],
37 [7.2775,204.4259], [29.6713,196.3631], [25.9815,172.1277], [25.4589,167.2745], [19.8337,167.0129],
38 [5.0625,166.3346], [5.0625,156.9425], [5.3701,156.9282], [21.8636,156.1628], [25.3713,156.4613],
39 [25.4243,155.9976], [29.3432,155.8157], [30.3838,149.3549], [26.3596,147.8137], [27.1085,141.2604],
40 [29.8466,126.8337], [24.5841,124.9201], [10.6664,119.8989], [13.4454,110.9264], [33.1886,116.0691],
41 [38.817,103.1819], [45.8311,89.8133], [30.4286,76.81], [35.7686,70.0812], [48.0879,77.6873],
42 [51.564,81.1635], [61.9006,69.1791], [72.3019,58.7916], [60.5509,42.5416], [68.3369,37.1532],
43 [77.9524,48.1338], [80.405,52.2215], [92.5632,44.5992], [93.0123,44.3223], [106.3561,37.2056],
44 [100.8631,17.4679], [108.759,14.3778], [107.3148,11.1283], [117.0002,32.8627], [140.9109,27.3974],
45 [145.7004,26.4994], [145.1346,6.1011], [154.502,5.4063], [156.9398,25.6501], [171.0557,26.2017],
46 [181.3139,27.323], [186.2377,27.8532], [191.6031,8.5474], [200.6724,11.2756], [197.2362,30.2334],
47 [220.0789,39.1906], [224.3261,41.031], [236.3506,24.4291], [243.6897,28.6723], [234.2956,46.7747],
48 [245.6562,55.1643], [257.2523,65.0901], [261.4374,61.5679], [273.1709,52.8031], [278.555,59.5164],
49 [268.4334,69.8001], [264.1615,72.3633], [268.2763,77.9442], [278.8488,93.5305], [281.4596,97.6332],
50 [286.4487,95.5191], [300.2821,90.5903], [303.4456,98.5849], [286.4523,107.7253], [293.7063,131.1779],
51 [294.9748,135.8787], [314.918,133.8172], [315.6941,143.2589], [300.9234,146.1746], [296.6419,147.0309],
52 [297.1839,161.7052], [296.6136,176.3942], [302.1147,177.4857], [316.603,180.3608], [317.1658,176.7341],
53 [315.215,189.6589], [315.1749,189.6548], [294.9411,187.5222], [291.13,201.7233], [286.2615,215.5916],
54 [291.1944,218.2545], [303.9158,225.1271], [299.2384,233.3694], [285.7165,227.6001], [281.7091,225.1956],
55 [273.8981,237.6457], [268.3486,245.2248], [267.4538,246.4414], [264.8496,250.0221], [268.6392,253.896],
56 [278.5017,265.2131], [272.721,271.4403], [257.2776,258.3579], [234.4345,276.5687], [242.6222,294.8315],
57 [234.9061,298.5798], [227.0321,286.2841], [225.2505,281.8301], [211.5387,287.8187], [202.3025,291.0935],
58 [197.307,292.831], [199.808,313.1906], [191.5298,315.0787], [187.3082,299.8172], [186.4201,295.3766],
59 [180.595,296.0487], [161.7854,297.4248], [156.8058,297.6214], [154.3395,317.8592],
60 );
61
62 my $num_points = scalar @$gear;
63 my $simplified = $gear->simplify(1000);
64 ok @$simplified == 1, 'gear simplified to a single polygon';
65 ###note sprintf "original points: %d\nnew points: %d", $num_points, scalar(@{$simplified->[0]});
66 ok @{$simplified->[0]} < $num_points, 'gear was further simplified using Douglas-Peucker';
67 }
68
69 {
70
71 my $hole_in_square = Slic3r::Polygon->new( # cw
72 [140, 140],
73 [140, 160],
74 [160, 160],
75 [160, 140],
76 );
77 my $simplified = $hole_in_square->simplify(2);
78 is scalar(@$simplified), 1, 'hole simplification returns one polygon';
79 ok $simplified->[0]->is_counter_clockwise, 'hole simplification turns cw polygon into ccw polygon';
80 }
81
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan tests => 6;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use List::Util qw(sum);
12 use Slic3r;
13 use Slic3r::Geometry::Clipper qw(intersection_ex union_ex diff_ex diff_pl);
14
15 {
16 my $square = [ # ccw
17 [10, 10],
18 [20, 10],
19 [20, 20],
20 [10, 20],
21 ];
22 my $hole_in_square = [ # cw
23 [14, 14],
24 [14, 16],
25 [16, 16],
26 [16, 14],
27 ];
28 my $square2 = [ # ccw
29 [5, 12],
30 [25, 12],
31 [25, 18],
32 [5, 18],
33 ];
34 my $intersection = intersection_ex([ $square, $hole_in_square ], [ $square2 ]);
35
36 is sum(map $_->area, @$intersection), Slic3r::ExPolygon->new(
37 [
38 [20, 18],
39 [10, 18],
40 [10, 12],
41 [20, 12],
42 ],
43 [
44 [14, 16],
45 [16, 16],
46 [16, 14],
47 [14, 14],
48 ],
49 )->area, 'hole is preserved after intersection';
50 }
51
52 #==========================================================
53
54 {
55 my $contour1 = [ [0,0], [40,0], [40,40], [0,40] ]; # ccw
56 my $contour2 = [ [10,10], [30,10], [30,30], [10,30] ]; # ccw
57 my $hole = [ [15,15], [15,25], [25,25], [25,15] ]; # cw
58
59 my $union = union_ex([ $contour1, $contour2, $hole ]);
60
61 is_deeply [ map $_->pp, @$union ], [[ [ [40,40], [0,40], [0,0], [40,0] ] ]],
62 'union of two ccw and one cw is a contour with no holes';
63
64 my $diff = diff_ex([ $contour1, $contour2 ], [ $hole ]);
65 is sum(map $_->area, @$diff),
66 Slic3r::ExPolygon->new([ [40,40], [0,40], [0,0], [40,0] ], [ [15,25], [25,25], [25,15], [15,15] ])->area,
67 'difference of a cw from two ccw is a contour with one hole';
68 }
69
70 #==========================================================
71
72 {
73 my $square = Slic3r::Polygon->new_scale( # ccw
74 [10, 10],
75 [20, 10],
76 [20, 20],
77 [10, 20],
78 );
79 my $square_pl = $square->split_at_first_point;
80
81 my $res = diff_pl([$square_pl], []);
82 is scalar(@$res), 1, 'no-op diff_pl returns the right number of polylines';
83 isa_ok $res->[0], 'Slic3r::Polyline', 'no-op diff_pl result';
84 is scalar(@{$res->[0]}), scalar(@$square_pl), 'no-op diff_pl returns the unmodified input polyline';
85 }
86
87 __END__
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan tests => 11;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Slic3r;
12 use Slic3r::Geometry qw(collinear);
13
14 #==========================================================
15
16 {
17 my @lines = (
18 Slic3r::Line->new([0,4], [4,2]),
19 Slic3r::Line->new([2,3], [8,0]),
20 Slic3r::Line->new([6,1], [8,0]),
21 );
22 is collinear($lines[0], $lines[1]), 1, 'collinear';
23 is collinear($lines[1], $lines[2]), 1, 'collinear';
24 is collinear($lines[0], $lines[2]), 1, 'collinear';
25 }
26
27 #==========================================================
28
29 {
30 # horizontal
31 my @lines = (
32 Slic3r::Line->new([0,1], [5,1]),
33 Slic3r::Line->new([2,1], [8,1]),
34 );
35 is collinear($lines[0], $lines[1]), 1, 'collinear';
36 }
37
38 #==========================================================
39
40 {
41 # vertical
42 my @lines = (
43 Slic3r::Line->new([1,0], [1,5]),
44 Slic3r::Line->new([1,2], [1,8]),
45 );
46 is collinear($lines[0], $lines[1]), 1, 'collinear';
47 }
48
49 #==========================================================
50
51 {
52 # non overlapping
53 my @lines = (
54 Slic3r::Line->new([0,1], [5,1]),
55 Slic3r::Line->new([7,1], [10,1]),
56 );
57 is collinear($lines[0], $lines[1], 1), 0, 'non overlapping';
58 is collinear($lines[0], $lines[1], 0), 1, 'overlapping';
59 }
60
61 #==========================================================
62
63 {
64 # with one common point
65 my @lines = (
66 Slic3r::Line->new([0,4], [4,2]),
67 Slic3r::Line->new([4,2], [8,0]),
68 );
69 is collinear($lines[0], $lines[1], 1), 1, 'one common point';
70 is collinear($lines[0], $lines[1], 0), 1, 'one common point';
71 }
72
73 #==========================================================
74
75 {
76 # not collinear
77 my @lines = (
78 Slic3r::Line->new([290000000,690525600], [285163380,684761540]),
79 Slic3r::Line->new([285163380,684761540], [193267599,575244400]),
80 );
81 is collinear($lines[0], $lines[1], 0), 0, 'not collinear';
82 is collinear($lines[0], $lines[1], 1), 0, 'not collinear';
83 }
84
85 #==========================================================
0 use Test::More;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first);
10 use Slic3r;
11 use Slic3r::Surface ':types';
12 use Slic3r::Test;
13
14 plan tests => 8;
15
16 {
17 my $test = sub {
18 my ($config) = @_;
19
20 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
21 ok my $gcode = Slic3r::Test::gcode($print), "infill_every_layers does not crash";
22
23 my $tool = undef;
24 my %layers = (); # layer_z => 1
25 my %layer_infill = (); # layer_z => has_infill
26 Slic3r::GCode::Reader->new->parse($gcode, sub {
27 my ($self, $cmd, $args, $info) = @_;
28
29 if ($cmd =~ /^T(\d+)/) {
30 $tool = $1;
31 } elsif ($cmd eq 'G1' && $info->{extruding} && $info->{dist_XY} > 0 && $tool != $config->support_material_extruder-1) {
32 $layer_infill{$self->Z} //= 0;
33 if ($tool == $config->infill_extruder-1) {
34 $layer_infill{$self->Z} = 1;
35 }
36 }
37 $layers{$args->{Z}} = 1 if $cmd eq 'G1' && $info->{dist_Z} > 0;
38 });
39
40 my $layers_with_perimeters = scalar(keys %layer_infill);
41 my $layers_with_infill = grep $_ > 0, values %layer_infill;
42 is scalar(keys %layers), $layers_with_perimeters+$config->raft_layers, 'expected number of layers';
43
44 # first infill layer is never combined, so we don't consider it
45 $layers_with_infill--;
46 $layers_with_perimeters--;
47
48 # we expect that infill is generated for half the number of combined layers
49 # plus for each single layer that was not combined (remainder)
50 is $layers_with_infill,
51 int($layers_with_perimeters/$config->infill_every_layers) + ($layers_with_perimeters % $config->infill_every_layers),
52 'infill is only present in correct number of layers';
53 };
54
55 my $config = Slic3r::Config->new_from_defaults;
56 $config->set('layer_height', 0.2);
57 $config->set('first_layer_height', 0.2);
58 $config->set('nozzle_diameter', [0.5]);
59 $config->set('infill_every_layers', 2);
60 $config->set('perimeter_extruder', 1);
61 $config->set('infill_extruder', 2);
62 $config->set('support_material_extruder', 3);
63 $config->set('support_material_interface_extruder', 3);
64 $config->set('top_solid_layers', 0);
65 $config->set('bottom_solid_layers', 0);
66 $test->($config);
67
68 $config->set('skirts', 0); # prevent usage of perimeter_extruder in raft layers
69 $config->set('raft_layers', 5);
70 $test->($config);
71 }
72
73 {
74 my $config = Slic3r::Config->new_from_defaults;
75 $config->set('layer_height', 0.2);
76 $config->set('first_layer_height', 0.2);
77 $config->set('nozzle_diameter', [0.5]);
78 $config->set('infill_every_layers', 2);
79
80 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
81 $print->process;
82
83 ok defined(first { @{$_->get_region(0)->fill_surfaces->filter_by_type(S_TYPE_INTERNALVOID)} > 0 }
84 @{$print->print->get_object(0)->layers}),
85 'infill combination produces internal void surfaces';
86
87 # we disable combination after infill has been generated
88 $config->set('infill_every_layers', 1);
89 $print->apply_config($config);
90 $print->process;
91
92 ok !(defined first { @{$_->get_region(0)->fill_surfaces} == 0 }
93 @{$print->print->get_object(0)->layers}),
94 'infill combination is idempotent';
95 }
96
97 # the following needs to be adapted to the new API
98 if (0) {
99 my $config = Slic3r::Config->new_from_defaults;
100 $config->set('skirts', 0);
101 $config->set('solid_layers', 0);
102 $config->set('bottom_solid_layers', 0);
103 $config->set('top_solid_layers', 0);
104 $config->set('infill_every_layers', 6);
105 $config->set('layer_height', 0.06);
106 $config->set('perimeters', 1);
107
108 my $test = sub {
109 my ($shift) = @_;
110
111 my $self = Slic3r::Test::init_print('20mm_cube', config => $config);
112
113 $shift /= &Slic3r::SCALING_FACTOR;
114 my $scale = 4; # make room for fat infill lines with low layer height
115
116 # Put a slope on the box's sides by shifting x and y coords by $tilt * (z / boxheight).
117 # The test here is to put such a slight slope on the walls that it should
118 # not trigger any extra fill on fill layers that should be empty when
119 # combine infill is enabled.
120 $_->[0] += $shift * ($_->[2] / (20 / &Slic3r::SCALING_FACTOR)) for @{$self->objects->[0]->meshes->[0]->vertices};
121 $_->[1] += $shift * ($_->[2] / (20 / &Slic3r::SCALING_FACTOR)) for @{$self->objects->[0]->meshes->[0]->vertices};
122 $_ = [$_->[0]*$scale, $_->[1]*$scale, $_->[2]] for @{$self->objects->[0]->meshes->[0]->vertices};
123
124 # copy of Print::export_gcode() up to the point
125 # after fill surfaces are combined
126 $_->slice for @{$self->objects};
127 $_->make_perimeters for @{$self->objects};
128 $_->detect_surfaces_type for @{$self->objects};
129 $_->prepare_fill_surfaces for map @{$_->regions}, map @{$_->layers}, @{$self->objects};
130 $_->process_external_surfaces for map @{$_->regions}, map @{$_->layers}, @{$self->objects};
131 $_->discover_horizontal_shells for @{$self->objects};
132 $_->combine_infill for @{$self->objects};
133
134 # Only layers with id % 6 == 0 should have fill.
135 my $spurious_infill = 0;
136 foreach my $layer (map @{$_->layers}, @{$self->objects}) {
137 ++$spurious_infill if ($layer->id % 6 && grep @{$_->fill_surfaces} > 0, @{$layer->regions});
138 }
139
140 $spurious_infill -= scalar(@{$self->objects->[0]->layers} - 1) % 6;
141
142 fail "spurious fill surfaces found on layers that should have none (walls " . sprintf("%.4f", Slic3r::Geometry::rad2deg(atan2($shift, 20/&Slic3r::SCALING_FACTOR))) . " degrees off vertical)"
143 unless $spurious_infill == 0;
144 1;
145 };
146
147 # Test with mm skew offsets for the top of the 20mm-high box
148 for my $shift (0, 0.0001, 1) {
149 ok $test->($shift), "no spurious fill surfaces with box walls " . sprintf("%.4f",Slic3r::Geometry::rad2deg(atan2($shift, 20))) . " degrees off of vertical";
150 }
151 }
152
153 __END__
0 use Test::More tests => 1;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use Slic3r;
10 use Slic3r::Test;
11
12 {
13 my $config = Slic3r::Config->new_from_defaults;
14 $config->set('perimeter_extrusion_width', '250%');
15 ok $config->validate, 'percent extrusion width is validated';
16 }
17
18 __END__
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan tests => 11;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Slic3r;
12 use Slic3r::Test;
13
14 sub buffer {
15 my $config = shift || Slic3r::Config->new;
16
17 my $print_config = Slic3r::Config::Print->new;
18 $print_config->apply_dynamic($config);
19
20 my $gcodegen = Slic3r::GCode->new;
21 $gcodegen->apply_print_config($print_config);
22 $gcodegen->set_layer_count(10);
23 my $buffer = Slic3r::GCode::CoolingBuffer->new(
24 config => $print_config,
25 gcodegen => $gcodegen,
26 );
27 return $buffer;
28 }
29
30 my $config = Slic3r::Config->new_from_defaults;
31 $config->set('disable_fan_first_layers', 0);
32
33 {
34 my $buffer = buffer($config);
35 $buffer->gcodegen->set_elapsed_time($buffer->config->slowdown_below_layer_time + 1);
36 my $gcode = $buffer->append('G1 F3000;_EXTRUDE_SET_SPEED\nG1 X100 E1', 0, 0, 0.4) . $buffer->flush;
37 like $gcode, qr/F3000/, 'speed is not altered when elapsed time is greater than slowdown threshold';
38 }
39
40 {
41 my $buffer = buffer($config);
42 $buffer->gcodegen->set_elapsed_time($buffer->config->slowdown_below_layer_time - 1);
43 my $gcode = $buffer->append(
44 "G1 X50 F2500\n" .
45 "G1 F3000;_EXTRUDE_SET_SPEED\n" .
46 "G1 X100 E1\n" .
47 "G1 E4 F400",
48 0, 0, 0.4
49 ) . $buffer->flush;
50 unlike $gcode, qr/F3000/, 'speed is altered when elapsed time is lower than slowdown threshold';
51 like $gcode, qr/F2500/, 'speed is not altered for travel moves';
52 like $gcode, qr/F400/, 'speed is not altered for extruder-only moves';
53 }
54
55 {
56 my $buffer = buffer($config);
57 $buffer->gcodegen->set_elapsed_time($buffer->config->fan_below_layer_time + 1);
58 my $gcode = $buffer->append('G1 X100 E1 F3000', 0, 0, 0.4) . $buffer->flush;
59 unlike $gcode, qr/M106/, 'fan is not activated when elapsed time is greater than fan threshold';
60 }
61
62 {
63 my $buffer = buffer($config);
64 my $gcode = "";
65 for my $obj_id (0 .. 1) {
66 # use an elapsed time which is < the slowdown threshold but greater than it when summed twice
67 $buffer->gcodegen->set_elapsed_time($buffer->config->slowdown_below_layer_time - 1);
68 $gcode .= $buffer->append("G1 X100 E1 F3000\n", $obj_id, 0, 0.4);
69 }
70 $gcode .= $buffer->flush;
71 like $gcode, qr/F3000/, 'slowdown is computed on all objects printing at same Z';
72 }
73
74 {
75 my $buffer = buffer($config);
76 my $gcode = "";
77 for my $layer_id (0 .. 1) {
78 for my $obj_id (0 .. 1) {
79 # use an elapsed time which is < the threshold but greater than it when summed twice
80 $buffer->gcodegen->set_elapsed_time($buffer->config->fan_below_layer_time - 1);
81 $gcode .= $buffer->append("G1 X100 E1 F3000\n", $obj_id, $layer_id, 0.4 + 0.4*$layer_id + 0.1*$obj_id); # print same layer at distinct heights
82 }
83 }
84 $gcode .= $buffer->flush;
85 unlike $gcode, qr/M106/, 'fan activation is computed on all objects printing at different Z';
86 }
87
88 {
89 my $buffer = buffer($config);
90 my $gcode = "";
91 for my $layer_id (0 .. 1) {
92 for my $obj_id (0 .. 1) {
93 # use an elapsed time which is < the threshold even when summed twice
94 $buffer->gcodegen->set_elapsed_time($buffer->config->fan_below_layer_time/2 - 1);
95 $gcode .= $buffer->append("G1 X100 E1 F3000\n", $obj_id, $layer_id, 0.4 + 0.4*$layer_id + 0.1*$obj_id); # print same layer at distinct heights
96 }
97 }
98 $gcode .= $buffer->flush;
99 like $gcode, qr/M106/, 'fan activation is computed on all objects printing at different Z';
100 }
101
102 {
103 my $config = Slic3r::Config->new_from_defaults;
104 $config->set('cooling', 1);
105 $config->set('bridge_fan_speed', 100);
106 $config->set('fan_below_layer_time', 0);
107 $config->set('slowdown_below_layer_time', 0);
108 $config->set('bridge_speed', 99);
109 $config->set('top_solid_layers', 1); # internal bridges use solid_infil speed
110 $config->set('bottom_solid_layers', 1); # internal bridges use solid_infil speed
111
112 my $print = Slic3r::Test::init_print('overhang', config => $config);
113 my $fan = 0;
114 my $fan_with_incorrect_speeds = my $fan_with_incorrect_print_speeds = 0;
115 my $bridge_with_no_fan = 0;
116 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
117 my ($self, $cmd, $args, $info) = @_;
118
119 if ($cmd eq 'M106') {
120 $fan = $args->{S};
121 $fan_with_incorrect_speeds++ if $fan != 255;
122 } elsif ($cmd eq 'M107') {
123 $fan = 0;
124 } elsif ($info->{extruding} && $info->{dist_XY} > 0) {
125 $fan_with_incorrect_print_speeds++
126 if ($fan > 0) && ($args->{F} // $self->F) != 60*$config->bridge_speed;
127 $bridge_with_no_fan++
128 if !$fan && ($args->{F} // $self->F) == 60*$config->bridge_speed;
129 }
130 });
131 ok !$fan_with_incorrect_speeds, 'bridge fan speed is applied correctly';
132 ok !$fan_with_incorrect_print_speeds, 'bridge fan is only turned on for bridges';
133 ok !$bridge_with_no_fan, 'bridge fan is turned on for all bridges';
134 }
135
136 __END__
0 use Test::More tests => 15;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first);
10 use Slic3r;
11 use Slic3r::Test;
12
13 {
14 my $config = Slic3r::Config->new_from_defaults;
15
16 my $test = sub {
17 my ($conf) = @_;
18 $conf ||= $config;
19
20 my $print = Slic3r::Test::init_print('2x20x10', config => $conf);
21
22 my $last_move_was_z_change = 0;
23 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
24 my ($self, $cmd, $args, $info) = @_;
25
26 if ($last_move_was_z_change && $cmd ne $config->layer_gcode) {
27 fail 'custom layer G-code was not applied after Z change';
28 }
29 if (!$last_move_was_z_change && $cmd eq $config->layer_gcode) {
30 fail 'custom layer G-code was not applied after Z change';
31 }
32
33 $last_move_was_z_change = (defined $info->{dist_Z} && $info->{dist_Z} > 0);
34 });
35
36 1;
37 };
38
39 $config->set('start_gcode', '_MY_CUSTOM_START_GCODE_'); # to avoid dealing with the nozzle lift in start G-code
40 $config->set('layer_gcode', '_MY_CUSTOM_LAYER_GCODE_');
41 ok $test->(), "custom layer G-code is applied after Z move and before other moves";
42 }
43
44 #==========================================================
45
46 {
47 my $parser = Slic3r::GCode::PlaceholderParser->new;
48 $parser->apply_config(my $config = Slic3r::Config->new_from_defaults);
49 $parser->set('foo' => '0');
50 is $parser->process('[temperature_[foo]]'),
51 $config->temperature->[0],
52 "nested config options";
53 }
54
55 {
56 my $config = Slic3r::Config->new_from_defaults;
57 $config->set('output_filename_format', 'ts_[travel_speed]_lh_[layer_height].gcode');
58 $config->set('start_gcode', "TRAVEL:[travel_speed] HEIGHT:[layer_height]\n");
59 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
60
61 my $output_file = $print->print->expanded_output_filepath;
62 my ($t, $h) = map $config->$_, qw(travel_speed layer_height);
63 ok $output_file =~ /ts_${t}_/, 'print config options are replaced in output filename';
64 ok $output_file =~ /lh_$h\./, 'region config options are replaced in output filename';
65
66 my $gcode = Slic3r::Test::gcode($print);
67 ok $gcode =~ /TRAVEL:$t/, 'print config options are replaced in custom G-code';
68 ok $gcode =~ /HEIGHT:$h/, 'region config options are replaced in custom G-code';
69 }
70
71 {
72 my $config = Slic3r::Config->new;
73 $config->set('extruder', 2);
74 $config->set('first_layer_temperature', [200,205]);
75
76 {
77 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
78 my $gcode = Slic3r::Test::gcode($print);
79 ok $gcode =~ /M104 S205 T1/, 'temperature set correctly for non-zero yet single extruder';
80 ok $gcode !~ /M104 S\d+ T0/, 'unused extruder correctly ignored';
81 }
82
83 $config->set('infill_extruder', 1);
84 {
85 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
86 my $gcode = Slic3r::Test::gcode($print);
87 ok $gcode =~ /M104 S200 T0/, 'temperature set correctly for first extruder';
88 ok $gcode =~ /M104 S205 T1/, 'temperature set correctly for second extruder';
89 }
90
91 $config->set('start_gcode', qq!
92 ;__temp0:[first_layer_temperature_0]__
93 ;__temp1:[first_layer_temperature_1]__
94 ;__temp2:[first_layer_temperature_2]__
95 !);
96 {
97 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
98 my $gcode = Slic3r::Test::gcode($print);
99 # we use the [infill_extruder] placeholder to make sure this test doesn't
100 # catch a false positive caused by the unparsed start G-code option itself
101 # being embedded in the G-code
102 ok $gcode =~ /temp0:200/, 'temperature placeholder for first extruder correctly populated';
103 ok $gcode =~ /temp1:205/, 'temperature placeholder for second extruder correctly populated';
104 ok $gcode =~ /temp2:200/, 'temperature placeholder for unused extruder populated with first value';
105 }
106 }
107
108 {
109 my $config = Slic3r::Config->new_from_defaults;
110 $config->set('before_layer_gcode', ';BEFORE [layer_num]');
111 $config->set('layer_gcode', ';CHANGE [layer_num]');
112 $config->set('support_material', 1);
113 $config->set('layer_height', 0.2);
114 my $print = Slic3r::Test::init_print('overhang', config => $config);
115 my $gcode = Slic3r::Test::gcode($print);
116
117 my @before = ();
118 my @change = ();
119 foreach my $line (split /\R+/, $gcode) {
120 if ($line =~ /;BEFORE (\d+)/) {
121 push @before, $1;
122 } elsif ($line =~ /;CHANGE (\d+)/) {
123 push @change, $1;
124 fail 'inconsistent layer_num before and after layer change'
125 if $1 != $before[-1];
126 }
127 }
128 is_deeply \@before, \@change, 'layer_num is consistent before and after layer changes';
129 ok !defined(first { $change[$_] != $change[$_-1]+1 } 1..$#change),
130 'layer_num grows continously'; # i.e. no duplicates or regressions
131 }
132
133 __END__
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan skip_all => 'variable-width paths are currently disabled';
5 plan tests => 20;
6
7 BEGIN {
8 use FindBin;
9 use lib "$FindBin::Bin/../lib";
10 }
11
12 use List::Util qw(first);
13 use Slic3r;
14 use Slic3r::Geometry qw(X Y scale epsilon);
15 use Slic3r::Surface ':types';
16
17 sub scale_points (@) { map [scale $_->[X], scale $_->[Y]], @_ }
18
19 {
20 my $square = Slic3r::ExPolygon->new([
21 scale_points [0,0], [10,0], [10,10], [0,10],
22 ]);
23
24 my @offsets = @{$square->noncollapsing_offset_ex(- scale 5)};
25 is scalar @offsets, 1, 'non-collapsing offset';
26 }
27
28 {
29 local $Slic3r::Config = Slic3r::Config->new(
30 perimeters => 3,
31 );
32 my $w = 0.7;
33 my $perimeter_flow = Slic3r::Flow->new(
34 nozzle_diameter => 0.5,
35 layer_height => 0.4,
36 width => $w,
37 );
38
39 my $print = Slic3r::Print->new;
40 my $region = Slic3r::Print::Region->new(
41 print => $print,
42 flows => { perimeter => $perimeter_flow },
43 );
44 push @{$print->regions}, $region;
45 my $object = Slic3r::Print::Object->new(
46 print => $print,
47 size => [1,1],
48 );
49 my $make_layer = sub {
50 my ($width) = @_;
51 my $layer = Slic3r::Layer->new(
52 object => $object,
53 id => 1,
54 slices => [
55 Slic3r::Surface->new(
56 surface_type => S_TYPE_INTERNAL,
57 expolygon => Slic3r::ExPolygon->new([ scale_points [0,0], [50,0], [50,$width], [0,$width] ]),
58 ),
59 ],
60 thin_walls => [],
61 );
62 my $layerm = $layer->region(0);
63 $layer->make_perimeters;
64 return $layerm;
65 };
66
67 my %widths = (
68 1 * $w => { perimeters => 1, gaps => 0 },
69 1.3 * $w => { perimeters => 1, gaps => 1, gap_flow_spacing => $perimeter_flow->clone(width => 0.2 * $w)->spacing },
70 1.5 * $w => { perimeters => 1, gaps => 1, gap_flow_spacing => $perimeter_flow->clone(width => 0.5 * $w)->spacing },
71 2 * $w => { perimeters => 1, gaps => 1, gap_flow_spacing => $perimeter_flow->spacing },
72 2.5 * $w => { perimeters => 1, gaps => 1, gap_flow_spacing => $perimeter_flow->clone(width => 1.5 * $w)->spacing },
73 3 * $w => { perimeters => 2, gaps => 0 },
74 4 * $w => { perimeters => 2, gaps => 1, gap_flow_spacing => $perimeter_flow->spacing },
75 );
76
77 foreach my $width (sort keys %widths) {
78 my $layerm = $make_layer->($width);
79 is scalar @{$layerm->perimeters}, $widths{$width}{perimeters}, 'right number of perimeters';
80 is scalar @{$layerm->thin_fills} ? 1 : 0, $widths{$width}{gaps},
81 ($widths{$width}{gaps} ? 'gaps were filled' : 'no gaps detected'); # TODO: we should check the exact number of gaps, but we need a better medial axis algorithm
82
83 my @gaps = map $_, @{$layerm->thin_fills};
84 if (@gaps) {
85 ok +(!first { abs($_->flow_spacing - $widths{$width}{gap_flow_spacing}) > epsilon } @gaps),
86 'flow spacing was dynamically adjusted';
87 }
88 }
89 }
90
91 __END__
0 use Test::More;
1 use strict;
2 use warnings;
3
4 #plan tests => 43;
5 # Test of a 100% coverage is off.
6 plan tests => 19;
7
8 BEGIN {
9 use FindBin;
10 use lib "$FindBin::Bin/../lib";
11 }
12
13 use List::Util qw(first sum);
14 use Slic3r;
15 use Slic3r::Geometry qw(X Y scale unscale convex_hull);
16 use Slic3r::Geometry::Clipper qw(union diff diff_ex offset offset2_ex);
17 use Slic3r::Surface qw(:types);
18 use Slic3r::Test;
19
20 sub scale_points (@) { map [scale $_->[X], scale $_->[Y]], @_ }
21
22 {
23 my $expolygon = Slic3r::ExPolygon->new([ scale_points [0,0], [50,0], [50,50], [0,50] ]);
24 my $filler = Slic3r::Filler->new_from_type('rectilinear');
25 $filler->set_bounding_box($expolygon->bounding_box);
26 $filler->set_angle(0);
27 my $surface = Slic3r::Surface->new(
28 surface_type => S_TYPE_TOP,
29 expolygon => $expolygon,
30 );
31 my $flow = Slic3r::Flow->new(
32 width => 0.69,
33 height => 0.4,
34 nozzle_diameter => 0.50,
35 );
36 $filler->set_spacing($flow->spacing);
37 foreach my $angle (0, 45) {
38 $surface->expolygon->rotate(Slic3r::Geometry::deg2rad($angle), [0,0]);
39 my $paths = $filler->fill_surface($surface, layer_height => 0.4, density => 0.4);
40 is scalar @$paths, 1, 'one continuous path';
41 }
42 }
43
44 SKIP:
45 {
46 skip "The FillRectilinear2 does not fill the surface completely", 1;
47
48 my $test = sub {
49 my ($expolygon, $flow_spacing, $angle, $density) = @_;
50
51 my $filler = Slic3r::Filler->new_from_type('rectilinear');
52 $filler->set_bounding_box($expolygon->bounding_box);
53 $filler->set_angle($angle // 0);
54 # Adjust line spacing to fill the region.
55 $filler->set_dont_adjust(0);
56 $filler->set_link_max_length(scale(1.2*$flow_spacing));
57 my $surface = Slic3r::Surface->new(
58 surface_type => S_TYPE_BOTTOM,
59 expolygon => $expolygon,
60 );
61 my $flow = Slic3r::Flow->new(
62 width => $flow_spacing,
63 height => 0.4,
64 nozzle_diameter => $flow_spacing,
65 );
66 $filler->set_spacing($flow->spacing);
67 my $paths = $filler->fill_surface(
68 $surface,
69 layer_height => $flow->height,
70 density => $density // 1,
71 );
72
73 # check whether any part was left uncovered
74 my @grown_paths = map @{Slic3r::Polyline->new(@$_)->grow(scale $filler->spacing/2)}, @$paths;
75 my $uncovered = diff_ex([ @$expolygon ], [ @grown_paths ], 1);
76
77 # ignore very small dots
78 my $uncovered_filtered = [ grep $_->area > (scale $flow_spacing)**2, @$uncovered ];
79
80 is scalar(@$uncovered_filtered), 0, 'solid surface is fully filled';
81
82 if (0 && @$uncovered_filtered) {
83 require "Slic3r/SVG.pm";
84 Slic3r::SVG::output("uncovered.svg",
85 no_arrows => 1,
86 expolygons => [ $expolygon ],
87 blue_expolygons => [ @$uncovered ],
88 red_expolygons => [ @$uncovered_filtered ],
89 polylines => [ @$paths ],
90 );
91 exit;
92 }
93 };
94
95 my $expolygon = Slic3r::ExPolygon->new([
96 [6883102, 9598327.01296997],
97 [6883102, 20327272.01297],
98 [3116896, 20327272.01297],
99 [3116896, 9598327.01296997],
100 ]);
101 $test->($expolygon, 0.55);
102
103 for (1..20) {
104 $expolygon->scale(1.05);
105 $test->($expolygon, 0.55);
106 }
107
108 $expolygon = Slic3r::ExPolygon->new(
109 [[59515297,5422499],[59531249,5578697],[59695801,6123186],[59965713,6630228],[60328214,7070685],[60773285,7434379],[61274561,7702115],[61819378,7866770],[62390306,7924789],[62958700,7866744],[63503012,7702244],[64007365,7434357],[64449960,7070398],[64809327,6634999],[65082143,6123325],[65245005,5584454],[65266967,5422499],[66267307,5422499],[66269190,8310081],[66275379,17810072],[66277259,20697500],[65267237,20697500],[65245004,20533538],[65082082,19994444],[64811462,19488579],[64450624,19048208],[64012101,18686514],[63503122,18415781],[62959151,18251378],[62453416,18198442],[62390147,18197355],[62200087,18200576],[61813519,18252990],[61274433,18415918],[60768598,18686517],[60327567,19047892],[59963609,19493297],[59695865,19994587],[59531222,20539379],[59515153,20697500],[58502480,20697500],[58502480,5422499]]
110 );
111 $test->($expolygon, 0.524341649025257);
112
113 $expolygon = Slic3r::ExPolygon->new([ scale_points [0,0], [98,0], [98,10], [0,10] ]);
114 $test->($expolygon, 0.5, 45, 0.99); # non-solid infill
115 }
116
117 {
118 my $collection = Slic3r::Polyline::Collection->new(
119 Slic3r::Polyline->new([0,15], [0,18], [0,20]),
120 Slic3r::Polyline->new([0,10], [0,8], [0,5]),
121 );
122 is_deeply
123 [ map $_->[Y], map @$_, @{$collection->chained_path_from(Slic3r::Point->new(0,30), 0)} ],
124 [20, 18, 15, 10, 8, 5],
125 'chained path';
126 }
127
128 {
129 my $collection = Slic3r::Polyline::Collection->new(
130 Slic3r::Polyline->new([4,0], [10,0], [15,0]),
131 Slic3r::Polyline->new([10,5], [15,5], [20,5]),
132 );
133 is_deeply
134 [ map $_->[X], map @$_, @{$collection->chained_path_from(Slic3r::Point->new(30,0), 0)} ],
135 [reverse 4, 10, 15, 10, 15, 20],
136 'chained path';
137 }
138
139 {
140 my $collection = Slic3r::ExtrusionPath::Collection->new(
141 map Slic3r::ExtrusionPath->new(polyline => $_, role => 0, mm3_per_mm => 1),
142 Slic3r::Polyline->new([0,15], [0,18], [0,20]),
143 Slic3r::Polyline->new([0,10], [0,8], [0,5]),
144 );
145 is_deeply
146 [ map $_->[Y], map @{$_->polyline}, @{$collection->chained_path_from(Slic3r::Point->new(0,30), 0)} ],
147 [20, 18, 15, 10, 8, 5],
148 'chained path';
149 }
150
151 {
152 my $collection = Slic3r::ExtrusionPath::Collection->new(
153 map Slic3r::ExtrusionPath->new(polyline => $_, role => 0, mm3_per_mm => 1),
154 Slic3r::Polyline->new([15,0], [10,0], [4,0]),
155 Slic3r::Polyline->new([10,5], [15,5], [20,5]),
156 );
157 is_deeply
158 [ map $_->[X], map @{$_->polyline}, @{$collection->chained_path_from(Slic3r::Point->new(30,0), 0)} ],
159 [reverse 4, 10, 15, 10, 15, 20],
160 'chained path';
161 }
162
163 for my $pattern (qw(rectilinear honeycomb hilbertcurve concentric)) {
164 my $config = Slic3r::Config->new_from_defaults;
165 $config->set('fill_pattern', $pattern);
166 $config->set('external_fill_pattern', $pattern);
167 $config->set('perimeters', 1);
168 $config->set('skirts', 0);
169 $config->set('fill_density', 20);
170 $config->set('layer_height', 0.05);
171 $config->set('perimeter_extruder', 1);
172 $config->set('infill_extruder', 2);
173 my $print = Slic3r::Test::init_print('20mm_cube', config => $config, scale => 2);
174 ok my $gcode = Slic3r::Test::gcode($print), "successful $pattern infill generation";
175 my $tool = undef;
176 my @perimeter_points = my @infill_points = ();
177 Slic3r::GCode::Reader->new->parse($gcode, sub {
178 my ($self, $cmd, $args, $info) = @_;
179
180 if ($cmd =~ /^T(\d+)/) {
181 $tool = $1;
182 } elsif ($cmd eq 'G1' && $info->{extruding} && $info->{dist_XY} > 0) {
183 if ($tool == $config->perimeter_extruder-1) {
184 push @perimeter_points, Slic3r::Point->new_scale($args->{X}, $args->{Y});
185 } elsif ($tool == $config->infill_extruder-1) {
186 push @infill_points, Slic3r::Point->new_scale($args->{X}, $args->{Y});
187 }
188 }
189 });
190 my $convex_hull = convex_hull(\@perimeter_points);
191 ok !(defined first { !$convex_hull->contains_point($_) } @infill_points), "infill does not exceed perimeters ($pattern)";
192 }
193
194 {
195 my $config = Slic3r::Config->new_from_defaults;
196 $config->set('infill_only_where_needed', 1);
197 $config->set('bottom_solid_layers', 0);
198 $config->set('infill_extruder', 2);
199 $config->set('infill_extrusion_width', 0.5);
200 $config->set('fill_density', 40);
201 $config->set('cooling', 0); # for preventing speeds from being altered
202 $config->set('first_layer_speed', '100%'); # for preventing speeds from being altered
203
204 my $test = sub {
205 my $print = Slic3r::Test::init_print('pyramid', config => $config);
206
207 my $tool = undef;
208 my @infill_extrusions = (); # array of polylines
209 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
210 my ($self, $cmd, $args, $info) = @_;
211
212 if ($cmd =~ /^T(\d+)/) {
213 $tool = $1;
214 } elsif ($cmd eq 'G1' && $info->{extruding} && $info->{dist_XY} > 0) {
215 if ($tool == $config->infill_extruder-1) {
216 push @infill_extrusions, Slic3r::Line->new_scale(
217 [ $self->X, $self->Y ],
218 [ $info->{new_X}, $info->{new_Y} ],
219 );
220 }
221 }
222 });
223 return 0 if !@infill_extrusions; # prevent calling convex_hull() with no points
224
225 my $convex_hull = convex_hull([ map $_->pp, map @$_, @infill_extrusions ]);
226 return unscale unscale sum(map $_->area, @{offset([$convex_hull], scale(+$config->infill_extrusion_width/2))});
227 };
228
229 my $tolerance = 5; # mm^2
230
231 $config->set('solid_infill_below_area', 0);
232 ok $test->() < $tolerance,
233 'no infill is generated when using infill_only_where_needed on a pyramid';
234
235 $config->set('solid_infill_below_area', 70);
236 ok abs($test->() - $config->solid_infill_below_area) < $tolerance,
237 'infill is only generated under the forced solid shells';
238 }
239
240 {
241 my $config = Slic3r::Config->new_from_defaults;
242 $config->set('skirts', 0);
243 $config->set('perimeters', 1);
244 $config->set('fill_density', 0);
245 $config->set('top_solid_layers', 0);
246 $config->set('bottom_solid_layers', 0);
247 $config->set('solid_infill_below_area', 20000000);
248 $config->set('solid_infill_every_layers', 2);
249 $config->set('perimeter_speed', 99);
250 $config->set('external_perimeter_speed', 99);
251 $config->set('cooling', 0);
252 $config->set('first_layer_speed', '100%');
253
254 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
255 my %layers_with_extrusion = ();
256 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
257 my ($self, $cmd, $args, $info) = @_;
258
259 if ($cmd eq 'G1' && $info->{dist_XY} > 0 && $info->{extruding}) {
260 if (($args->{F} // $self->F) != $config->perimeter_speed*60) {
261 $layers_with_extrusion{$self->Z} = ($args->{F} // $self->F);
262 }
263 }
264 });
265
266 ok !%layers_with_extrusion,
267 "solid_infill_below_area and solid_infill_every_layers are ignored when fill_density is 0";
268 }
269
270 {
271 my $config = Slic3r::Config->new_from_defaults;
272 $config->set('skirts', 0);
273 $config->set('perimeters', 3);
274 $config->set('fill_density', 0);
275 $config->set('layer_height', 0.2);
276 $config->set('first_layer_height', 0.2);
277 $config->set('nozzle_diameter', [0.35]);
278 $config->set('infill_extruder', 2);
279 $config->set('solid_infill_extruder', 2);
280 $config->set('infill_extrusion_width', 0.52);
281 $config->set('solid_infill_extrusion_width', 0.52);
282 $config->set('first_layer_extrusion_width', 0);
283
284 my $print = Slic3r::Test::init_print('A', config => $config);
285 my %infill = (); # Z => [ Line, Line ... ]
286 my $tool = undef;
287 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
288 my ($self, $cmd, $args, $info) = @_;
289
290 if ($cmd =~ /^T(\d+)/) {
291 $tool = $1;
292 } elsif ($cmd eq 'G1' && $info->{extruding} && $info->{dist_XY} > 0) {
293 if ($tool == $config->infill_extruder-1) {
294 my $z = 1 * $self->Z;
295 $infill{$z} ||= [];
296 push @{$infill{$z}}, Slic3r::Line->new_scale(
297 [ $self->X, $self->Y ],
298 [ $info->{new_X}, $info->{new_Y} ],
299 );
300 }
301 }
302 });
303 my $grow_d = scale($config->infill_extrusion_width)/2;
304 my $layer0_infill = union([ map @{$_->grow($grow_d)}, @{ $infill{0.2} } ]);
305 my $layer1_infill = union([ map @{$_->grow($grow_d)}, @{ $infill{0.4} } ]);
306 my $diff = diff($layer0_infill, $layer1_infill);
307 $diff = offset2_ex($diff, -$grow_d, +$grow_d);
308 $diff = [ grep { $_->area > 2*(($grow_d*2)**2) } @$diff ];
309 is scalar(@$diff), 0, 'no missing parts in solid shell when fill_density is 0';
310 }
311
312 __END__
0 use Test::More tests => 6;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first sum);
10 use Slic3r;
11 use Slic3r::Geometry qw(scale PI);
12 use Slic3r::Test;
13
14 {
15 my $config = Slic3r::Config->new_from_defaults;
16 $config->set('skirts', 1);
17 $config->set('brim_width', 2);
18 $config->set('perimeters', 3);
19 $config->set('fill_density', 0.4);
20 $config->set('bottom_solid_layers', 1);
21 $config->set('first_layer_extrusion_width', 2);
22 $config->set('first_layer_height', '100%');
23
24 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
25 my @E_per_mm = ();
26 Slic3r::GCode::Reader->new->parse(my $gcode = Slic3r::Test::gcode($print), sub {
27 my ($self, $cmd, $args, $info) = @_;
28
29 if ($self->Z == $config->layer_height) { # only consider first layer
30 if ($info->{extruding} && $info->{dist_XY} > 0) {
31 push @E_per_mm, $info->{dist_E} / $info->{dist_XY};
32 }
33 }
34 });
35 my $E_per_mm_avg = sum(@E_per_mm) / @E_per_mm;
36 # allow some tolerance because solid rectilinear infill might be adjusted/stretched
37 ok !(defined first { abs($_ - $E_per_mm_avg) > 0.015 } @E_per_mm),
38 'first_layer_extrusion_width applies to everything on first layer';
39 }
40
41 {
42 my $config = Slic3r::Config->new_from_defaults;
43 $config->set('bridge_speed', 99);
44 $config->set('bridge_flow_ratio', 1);
45 $config->set('cooling', 0); # to prevent speeds from being altered
46 $config->set('first_layer_speed', '100%'); # to prevent speeds from being altered
47
48 my $test = sub {
49 my $print = Slic3r::Test::init_print('overhang', config => $config);
50 my @E_per_mm = ();
51 Slic3r::GCode::Reader->new->parse(my $gcode = Slic3r::Test::gcode($print), sub {
52 my ($self, $cmd, $args, $info) = @_;
53
54 if ($info->{extruding} && $info->{dist_XY} > 0) {
55 if (($args->{F} // $self->F) == $config->bridge_speed*60) {
56 push @E_per_mm, $info->{dist_E} / $info->{dist_XY};
57 }
58 }
59 });
60 my $expected_mm3_per_mm = ($config->nozzle_diameter->[0]**2) * PI/4 * $config->bridge_flow_ratio;
61 my $expected_E_per_mm = $expected_mm3_per_mm / ((($config->filament_diameter->[0]/2)**2)*PI);
62 ok !(defined first { abs($_ - $expected_E_per_mm) > 0.01 } @E_per_mm),
63 'expected flow when using bridge_flow_ratio = ' . $config->bridge_flow_ratio;
64 };
65
66 $config->set('bridge_flow_ratio', 0.5);
67 $test->();
68 $config->set('bridge_flow_ratio', 2);
69 $test->();
70 $config->set('extrusion_width', 0.4);
71 $config->set('bridge_flow_ratio', 1);
72 $test->();
73 $config->set('bridge_flow_ratio', 0.5);
74 $test->();
75 $config->set('bridge_flow_ratio', 2);
76 $test->();
77 }
78
79 __END__
0 use Test::More tests => 1;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first);
10 use Slic3r;
11 use Slic3r::Flow ':roles';
12 use Slic3r::Geometry qw(PI scale unscale convex_hull);
13 use Slic3r::Geometry::Clipper qw();
14 use Slic3r::Surface ':types';
15 use Slic3r::Test;
16
17 {
18 my $config = Slic3r::Config->new_from_defaults;
19 $config->set('skirts', 0);
20 $config->set('perimeter_speed', 66);
21 $config->set('external_perimeter_speed', 66);
22 $config->set('small_perimeter_speed', 66);
23 $config->set('gap_fill_speed', 99);
24 $config->set('perimeters', 1);
25 $config->set('cooling', 0); # to prevent speeds from being altered
26 $config->set('first_layer_speed', '100%'); # to prevent speeds from being altered
27 $config->set('perimeter_extrusion_width', 0.35);
28 $config->set('first_layer_extrusion_width', 0.35);
29
30 my $print = Slic3r::Test::init_print('two_hollow_squares', config => $config);
31 my @perimeter_points = ();
32 my $last = ''; # perimeter | gap
33 my $gap_fills_outside_last_perimeters = 0;
34 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
35 my ($self, $cmd, $args, $info) = @_;
36
37 if ($info->{extruding} && $info->{dist_XY} > 0) {
38 my $F = $args->{F} // $self->F;
39 my $point = Slic3r::Point->new_scale($info->{new_X}, $info->{new_Y});
40 if ($F == $config->perimeter_speed*60) {
41 if ($last eq 'gap') {
42 @perimeter_points = ();
43 }
44 push @perimeter_points, $point;
45 $last = 'perimeter';
46 } elsif ($F == $config->gap_fill_speed*60) {
47 my $convex_hull = convex_hull(\@perimeter_points);
48 if (!$convex_hull->contains_point($point)) {
49 $gap_fills_outside_last_perimeters++;
50 }
51
52 $last = 'gap';
53 }
54 }
55 });
56 is $gap_fills_outside_last_perimeters, 0, 'gap fills are printed before leaving islands';
57 }
58
59 __END__
0 use Test::More tests => 23;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first);
10 use Slic3r;
11 use Slic3r::Geometry qw(scale convex_hull);
12 use Slic3r::Test;
13
14 {
15 my $gcodegen = Slic3r::GCode->new();
16 $gcodegen->set_layer_count(1);
17 $gcodegen->set_origin(Slic3r::Pointf->new(10, 10));
18 is_deeply $gcodegen->last_pos->arrayref, [scale -10, scale -10], 'last_pos is shifted correctly';
19 }
20
21 {
22 my $config = Slic3r::Config->new_from_defaults;
23 $config->set('wipe', [1]);
24 $config->set('retract_layer_change', [0]);
25
26 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
27 my $have_wipe = 0;
28 my @retract_speeds = ();
29 my $extruded_on_this_layer = 0;
30 my $wiping_on_new_layer = 0;
31 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
32 my ($self, $cmd, $args, $info) = @_;
33
34 if ($info->{travel} && $info->{dist_Z}) {
35 # changing layer
36 $extruded_on_this_layer = 0;
37 } elsif ($info->{extruding} && $info->{dist_XY}) {
38 $extruded_on_this_layer = 1;
39 } elsif ($info->{retracting} && $info->{dist_XY} > 0) {
40 $have_wipe = 1;
41 $wiping_on_new_layer = 1 if !$extruded_on_this_layer;
42 my $move_time = $info->{dist_XY} / ($args->{F} // $self->F);
43 push @retract_speeds, abs($info->{dist_E}) / $move_time;
44 }
45 });
46
47 ok $have_wipe, "wipe";
48 ok !defined (first { abs($_ - $config->retract_speed->[0]*60) < 5 } @retract_speeds), 'wipe moves don\'t retract faster than configured speed';
49 ok !$wiping_on_new_layer, 'no wiping after layer change';
50 }
51
52 {
53 my $config = Slic3r::Config->new_from_defaults;
54 $config->set('z_offset', 5);
55 $config->set('start_gcode', '');
56
57 my $test = sub {
58 my ($comment) = @_;
59 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
60 my $moves_below_z_offset = 0;
61 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
62 my ($self, $cmd, $args, $info) = @_;
63
64 if ($info->{travel} && exists $args->{Z}) {
65 $moves_below_z_offset++ if $args->{Z} < $config->z_offset;
66 }
67 });
68 is $moves_below_z_offset, 0, "no Z moves below Z offset ($comment)";
69 };
70
71 $test->("no lift");
72
73 $config->set('retract_lift', [3]);
74 $test->("lift < z_offset");
75
76 $config->set('retract_lift', [6]);
77 $test->("lift > z_offset");
78 }
79
80 {
81 # This tests the following behavior:
82 # - complete objects does not crash
83 # - no hard-coded "E" are generated
84 # - Z moves are correctly generated for both objects
85 # - no travel moves go outside skirt
86 # - temperatures are set correctly
87 my $config = Slic3r::Config->new_from_defaults;
88 $config->set('gcode_comments', 1);
89 $config->set('complete_objects', 1);
90 $config->set('extrusion_axis', 'A');
91 $config->set('start_gcode', ''); # prevent any default extra Z move
92 $config->set('layer_height', 0.4);
93 $config->set('first_layer_height', 0.4);
94 $config->set('temperature', [200]);
95 $config->set('first_layer_temperature', [210]);
96 my $print = Slic3r::Test::init_print('20mm_cube', config => $config, duplicate => 2);
97 ok my $gcode = Slic3r::Test::gcode($print), "complete_objects";
98 my @z_moves = ();
99 my @travel_moves = (); # array of scaled points
100 my @extrusions = (); # array of scaled points
101 my @temps = ();
102 Slic3r::GCode::Reader->new->parse($gcode, sub {
103 my ($self, $cmd, $args, $info) = @_;
104 fail 'unexpected E argument' if defined $args->{E};
105 if (defined $args->{Z}) {
106 push @z_moves, $args->{Z};
107 }
108
109 if ($info->{dist_XY}) {
110 if ($info->{extruding} || $args->{A}) {
111 push @extrusions, Slic3r::Point->new_scale($info->{new_X}, $info->{new_Y});
112 } else {
113 push @travel_moves, Slic3r::Point->new_scale($info->{new_X}, $info->{new_Y})
114 if @extrusions; # skip initial travel move to first skirt point
115 }
116 } elsif ($cmd eq 'M104' || $cmd eq 'M109') {
117 push @temps, $args->{S} if !@temps || $args->{S} != $temps[-1];
118 }
119 });
120 my $layer_count = 20/0.4; # cube is 20mm tall
121 is scalar(@z_moves), 2*$layer_count, 'complete_objects generates the correct number of Z moves';
122 is_deeply [ @z_moves[0..($layer_count-1)] ], [ @z_moves[$layer_count..$#z_moves] ], 'complete_objects generates the correct Z moves';
123
124 my $convex_hull = convex_hull(\@extrusions);
125 ok !(defined first { !$convex_hull->contains_point($_) } @travel_moves), 'all travel moves happen within skirt';
126
127 is_deeply \@temps, [210, 200, 210, 200, 0], 'expected temperature changes';
128 }
129
130 {
131 my $config = Slic3r::Config->new_from_defaults;
132 $config->set('retract_length', [1000000]);
133 $config->set('use_relative_e_distances', 1);
134 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
135 Slic3r::Test::gcode($print);
136 ok $print->print->total_used_filament > 0, 'final retraction is not considered in total used filament';
137 }
138
139 {
140 my $test = sub {
141 my ($print, $comment) = @_;
142
143 my @percent = ();
144 my $got_100 = 0;
145 my $extruding_after_100 = 0;
146 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
147 my ($self, $cmd, $args, $info) = @_;
148
149 if ($cmd eq 'M73') {
150 push @percent, $args->{P};
151 $got_100 = 1 if $args->{P} eq '100';
152 }
153 if ($info->{extruding} && $got_100) {
154 $extruding_after_100 = 1;
155 }
156 });
157 # the extruder heater is turned off when M73 P100 is reached
158 ok !(defined first { $_ > 100 } @percent), "M73 is never given more than 100% ($comment)";
159 ok !$extruding_after_100, "no extrusions after M73 P100 ($comment)";
160 };
161
162 {
163 my $config = Slic3r::Config->new_from_defaults;
164 $config->set('gcode_flavor', 'sailfish');
165 $config->set('raft_layers', 3);
166 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
167 $test->($print, 'single object');
168 }
169
170 {
171 my $config = Slic3r::Config->new_from_defaults;
172 $config->set('gcode_flavor', 'sailfish');
173 my $print = Slic3r::Test::init_print('20mm_cube', config => $config, duplicate => 2);
174 $test->($print, 'two copies of single object');
175 }
176
177 {
178 my $config = Slic3r::Config->new_from_defaults;
179 $config->set('gcode_flavor', 'sailfish');
180 my $print = Slic3r::Test::init_print(['20mm_cube','20mm_cube'], config => $config);
181 $test->($print, 'two objects');
182 }
183
184 {
185 my $config = Slic3r::Config->new_from_defaults;
186 $config->set('gcode_flavor', 'sailfish');
187 my $print = Slic3r::Test::init_print('20mm_cube', config => $config, scale_xyz => [1,1, 1/(20/$config->layer_height) ]);
188 $test->($print, 'one layer object');
189 }
190 }
191
192 {
193 my $config = Slic3r::Config->new_from_defaults;
194 $config->set('start_gcode', 'START:[input_filename]');
195 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
196 my $gcode = Slic3r::Test::gcode($print);
197 like $gcode, qr/START:20mm_cube/, '[input_filename] is also available in custom G-code';
198 }
199
200 {
201 my $config = Slic3r::Config->new_from_defaults;
202 $config->set('spiral_vase', 1);
203 my $print = Slic3r::Test::init_print('cube_with_hole', config => $config);
204
205 my $spiral = 0;
206 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
207 my ($self, $cmd, $args, $info) = @_;
208
209 if ($cmd eq 'G1' && exists $args->{E} && exists $args->{Z}) {
210 $spiral = 1;
211 }
212 });
213
214 ok !$spiral, 'spiral vase is correctly disabled on layers with multiple loops';
215 }
216
217 __END__
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan tests => 42;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Slic3r;
12 use Slic3r::Geometry qw(PI polygon_is_convex
13 chained_path_from epsilon scale);
14
15 {
16 # this test was failing on Windows (GH #1950)
17 my $polygon = Slic3r::Polygon->new(
18 [207802834,-57084522],[196528149,-37556190],[173626821,-25420928],[171285751,-21366123],
19 [118673592,-21366123],[116332562,-25420928],[93431208,-37556191],[82156517,-57084523],
20 [129714478,-84542120],[160244873,-84542120],
21 );
22 my $point = Slic3r::Point->new(95706562, -57294774);
23 ok $polygon->contains_point($point), 'contains_point';
24 }
25
26 #==========================================================
27
28 my $line1 = [ [5, 15], [30, 15] ];
29 my $line2 = [ [10, 20], [10, 10] ];
30 is_deeply Slic3r::Geometry::line_intersection($line1, $line2, 1)->arrayref, [10, 15], 'line_intersection';
31
32 #==========================================================
33
34 $line1 = [ [73.6310778185108/0.0000001, 371.74239268924/0.0000001], [73.6310778185108/0.0000001, 501.74239268924/0.0000001] ];
35 $line2 = [ [75/0.0000001, 437.9853/0.0000001], [62.7484/0.0000001, 440.4223/0.0000001] ];
36 isnt Slic3r::Geometry::line_intersection($line1, $line2, 1), undef, 'line_intersection';
37
38 #==========================================================
39
40 {
41 my $polygon = Slic3r::Polygon->new(
42 [45919000, 515273900], [14726100, 461246400], [14726100, 348753500], [33988700, 315389800],
43 [43749700, 343843000], [45422300, 352251500], [52362100, 362637800], [62748400, 369577600],
44 [75000000, 372014700], [87251500, 369577600], [97637800, 362637800], [104577600, 352251500],
45 [107014700, 340000000], [104577600, 327748400], [97637800, 317362100], [87251500, 310422300],
46 [82789200, 309534700], [69846100, 294726100], [254081000, 294726100], [285273900, 348753500],
47 [285273900, 461246400], [254081000, 515273900],
48 );
49
50 # this points belongs to $polyline
51 # note: it's actually a vertex, while we should better check an intermediate point
52 my $point = Slic3r::Point->new(104577600, 327748400);
53
54 local $Slic3r::Geometry::epsilon = 1E-5;
55 is_deeply Slic3r::Geometry::polygon_segment_having_point($polygon, $point)->pp,
56 [ [107014700, 340000000], [104577600, 327748400] ],
57 'polygon_segment_having_point';
58 }
59
60 #==========================================================
61
62 {
63 my $point = Slic3r::Point->new(736310778.185108, 5017423926.8924);
64 my $line = Slic3r::Line->new([627484000, 3695776000], [750000000, 3720147000]);
65 is Slic3r::Geometry::point_in_segment($point, $line), 0, 'point_in_segment';
66 }
67
68 #==========================================================
69
70 {
71 my $point = Slic3r::Point->new(736310778.185108, 5017423926.8924);
72 my $line = Slic3r::Line->new([627484000, 3695776000], [750000000, 3720147000]);
73 is Slic3r::Geometry::point_in_segment($point, $line), 0, 'point_in_segment';
74 }
75
76 #==========================================================
77
78 my $polygons = [
79 Slic3r::Polygon->new( # contour, ccw
80 [45919000, 515273900], [14726100, 461246400], [14726100, 348753500], [33988700, 315389800],
81 [43749700, 343843000], [45422300, 352251500], [52362100, 362637800], [62748400, 369577600],
82 [75000000, 372014700], [87251500, 369577600], [97637800, 362637800], [104577600, 352251500],
83 [107014700, 340000000], [104577600, 327748400], [97637800, 317362100], [87251500, 310422300],
84 [82789200, 309534700], [69846100, 294726100], [254081000, 294726100], [285273900, 348753500],
85 [285273900, 461246400], [254081000, 515273900],
86
87 ),
88 Slic3r::Polygon->new( # hole, cw
89 [75000000, 502014700], [87251500, 499577600], [97637800, 492637800], [104577600, 482251500],
90 [107014700, 470000000], [104577600, 457748400], [97637800, 447362100], [87251500, 440422300],
91 [75000000, 437985300], [62748400, 440422300], [52362100, 447362100], [45422300, 457748400],
92 [42985300, 470000000], [45422300, 482251500], [52362100, 492637800], [62748400, 499577600],
93 ),
94 ];
95
96 #==========================================================
97
98 {
99 my $p1 = [10, 10];
100 my $p2 = [10, 20];
101 my $p3 = [10, 30];
102 my $p4 = [20, 20];
103 my $p5 = [0, 20];
104
105 is Slic3r::Geometry::angle3points($p2, $p3, $p1), PI(), 'angle3points';
106 is Slic3r::Geometry::angle3points($p2, $p1, $p3), PI(), 'angle3points';
107 is Slic3r::Geometry::angle3points($p2, $p3, $p4), PI()/2*3, 'angle3points';
108 is Slic3r::Geometry::angle3points($p2, $p4, $p3), PI()/2, 'angle3points';
109 is Slic3r::Geometry::angle3points($p2, $p1, $p4), PI()/2, 'angle3points';
110 is Slic3r::Geometry::angle3points($p2, $p1, $p5), PI()/2*3, 'angle3points';
111 }
112
113 {
114 my $p1 = [30, 30];
115 my $p2 = [20, 20];
116 my $p3 = [10, 10];
117 my $p4 = [30, 10];
118
119 is Slic3r::Geometry::angle3points($p2, $p1, $p3), PI(), 'angle3points';
120 is Slic3r::Geometry::angle3points($p2, $p1, $p4), PI()/2*3, 'angle3points';
121 is Slic3r::Geometry::angle3points($p2, $p1, $p1), 2*PI(), 'angle3points';
122 }
123
124 #==========================================================
125
126 {
127 my $cw_square = [ [0,0], [0,10], [10,10], [10,0] ];
128 is polygon_is_convex($cw_square), 0, 'cw square is not convex';
129 is polygon_is_convex([ reverse @$cw_square ]), 1, 'ccw square is convex';
130
131 my $convex1 = [ [0,0], [10,0], [10,10], [0,10], [0,6], [4,6], [4,4], [0,4] ];
132 is polygon_is_convex($convex1), 0, 'concave polygon';
133 }
134
135 #==========================================================
136
137 {
138 my $polyline = Slic3r::Polyline->new([0, 0], [10, 0], [20, 0]);
139 is_deeply [ map $_->pp, @{$polyline->lines} ], [
140 [ [0, 0], [10, 0] ],
141 [ [10, 0], [20, 0] ],
142 ], 'polyline_lines';
143 }
144
145 #==========================================================
146
147 {
148 my $polygon = Slic3r::Polygon->new([0, 0], [10, 0], [5, 5]);
149 my $result = $polygon->split_at_index(1);
150 is ref($result), 'Slic3r::Polyline', 'split_at_index returns polyline';
151 is_deeply $result->pp, [ [10, 0], [5, 5], [0, 0], [10, 0] ], 'split_at_index';
152 }
153
154 #==========================================================
155
156 {
157 my $bb = Slic3r::Geometry::BoundingBox->new_from_points([ map Slic3r::Point->new(@$_), [0, 1], [10, 2], [20, 2] ]);
158 $bb->scale(2);
159 is_deeply [ $bb->min_point->pp, $bb->max_point->pp ], [ [0,2], [40,4] ], 'bounding box is scaled correctly';
160 }
161
162 #==========================================================
163
164 {
165 my $line = Slic3r::Line->new([10,10], [20,10]);
166 is $line->grow(5)->[0]->area, Slic3r::Polygon->new([10,5], [20,5], [20,15], [10,15])->area, 'grow line';
167 }
168
169 #==========================================================
170
171 {
172 # if chained_path() works correctly, these points should be joined with no diagonal paths
173 # (thus 26 units long)
174 my @points = map Slic3r::Point->new_scale(@$_), [26,26],[52,26],[0,26],[26,52],[26,0],[0,52],[52,52],[52,0];
175 my @ordered = @points[@{chained_path_from(\@points, $points[0])}];
176 ok !(grep { abs($ordered[$_]->distance_to($ordered[$_+1]) - scale 26) > epsilon } 0..$#ordered-1), 'chained_path';
177 }
178
179 #==========================================================
180
181 {
182 my $line = Slic3r::Line->new([0, 0], [20, 0]);
183 is +Slic3r::Point->new(10, 10)->distance_to_line($line), 10, 'distance_to';
184 is +Slic3r::Point->new(50, 0)->distance_to_line($line), 30, 'distance_to';
185 is +Slic3r::Point->new(0, 0)->distance_to_line($line), 0, 'distance_to';
186 is +Slic3r::Point->new(20, 0)->distance_to_line($line), 0, 'distance_to';
187 is +Slic3r::Point->new(10, 0)->distance_to_line($line), 0, 'distance_to';
188 }
189
190 #==========================================================
191
192 {
193 my $square = Slic3r::Polygon->new_scale(
194 [100,100],
195 [200,100],
196 [200,200],
197 [100,200],
198 );
199 is scalar(@{$square->concave_points(PI*4/3)}), 0, 'no concave vertices detected in ccw square';
200 is scalar(@{$square->convex_points(PI*2/3)}), 4, 'four convex vertices detected in ccw square';
201
202 $square->make_clockwise;
203 is scalar(@{$square->concave_points(PI*4/3)}), 4, 'fuor concave vertices detected in cw square';
204 is scalar(@{$square->convex_points(PI*2/3)}), 0, 'no convex vertices detected in cw square';
205 }
206
207 {
208 my $square = Slic3r::Polygon->new_scale(
209 [150,100],
210 [200,100],
211 [200,200],
212 [100,200],
213 [100,100],
214 );
215 is scalar(@{$square->concave_points(PI*4/3)}), 0, 'no concave vertices detected in convex polygon';
216 is scalar(@{$square->convex_points(PI*2/3)}), 4, 'four convex vertices detected in square';
217 }
218
219 {
220 my $square = Slic3r::Polygon->new_scale(
221 [200,200],
222 [100,200],
223 [100,100],
224 [150,100],
225 [200,100],
226 );
227 is scalar(@{$square->concave_points(PI*4/3)}), 0, 'no concave vertices detected in convex polygon';
228 is scalar(@{$square->convex_points(PI*2/3)}), 4, 'four convex vertices detected in square';
229 }
230
231 {
232 my $triangle = Slic3r::Polygon->new(
233 [16000170,26257364], [714223,461012], [31286371,461008],
234 );
235 is scalar(@{$triangle->concave_points(PI*4/3)}), 0, 'no concave vertices detected in triangle';
236 is scalar(@{$triangle->convex_points(PI*2/3)}), 3, 'three convex vertices detected in triangle';
237 }
238
239 {
240 my $triangle = Slic3r::Polygon->new(
241 [16000170,26257364], [714223,461012], [20000000,461012], [31286371,461012],
242 );
243 is scalar(@{$triangle->concave_points(PI*4/3)}), 0, 'no concave vertices detected in triangle having collinear point';
244 is scalar(@{$triangle->convex_points(PI*2/3)}), 3, 'three convex vertices detected in triangle having collinear point';
245 }
246
247 {
248 my $triangle = Slic3r::Polygon->new(
249 [16000170,26257364], [714223,461012], [31286371,461008],
250 );
251 my $simplified = $triangle->simplify(250000)->[0];
252 is scalar(@$simplified), 3, 'triangle is never simplified to less than 3 points';
253 }
254
255 __END__
0 use Test::More tests => 5;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first);
10 use Slic3r;
11 use Slic3r::Test qw(_eq);
12
13 {
14 my $config = Slic3r::Config->new_from_defaults;
15
16 my $test = sub {
17 my ($conf) = @_;
18 $conf ||= $config;
19
20 my $print = Slic3r::Test::init_print('20mm_cube', config => $conf);
21
22 my @z = ();
23 my @increments = ();
24 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
25 my ($self, $cmd, $args, $info) = @_;
26
27 if ($info->{dist_Z}) {
28 push @z, 1*$args->{Z};
29 push @increments, $info->{dist_Z};
30 }
31 });
32
33 fail 'wrong first layer height'
34 if $z[0] ne $config->get_value('first_layer_height') + $config->z_offset;
35
36 fail 'wrong second layer height'
37 if $z[1] ne $config->get_value('first_layer_height') + $config->get_value('layer_height') + $config->z_offset;
38
39 fail 'wrong layer height'
40 if first { !_eq($_, $config->layer_height) } @increments[1..$#increments];
41
42 1;
43 };
44
45 $config->set('start_gcode', ''); # to avoid dealing with the nozzle lift in start G-code
46 $config->set('layer_height', 0.3);
47 $config->set('first_layer_height', 0.2);
48 ok $test->(), "absolute first layer height";
49
50 $config->set('first_layer_height', '60%');
51 ok $test->(), "relative first layer height";
52
53 $config->set('z_offset', 0.9);
54 ok $test->(), "positive Z offset";
55
56 $config->set('z_offset', -0.8);
57 ok $test->(), "negative Z offset";
58 }
59
60 {
61 my $config = Slic3r::Config->new;
62 $config->set('fill_density', 0); # just for making the test faster
63 my $print = Slic3r::Test::init_print('20mm_cube', config => $config, scale => 2);
64
65 my @z = ();
66 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
67 my ($self, $cmd, $args, $info) = @_;
68
69 if ($info->{dist_Z}) {
70 push @z, 1*$args->{Z};
71 }
72 });
73 ok $z[-1] > 20*1.8 && $z[-1] < 20*2.2, 'resulting G-code has reasonable height';
74 }
75
76 __END__
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan skip_all => 'temporarily disabled';
5 plan tests => 4;
6
7 BEGIN {
8 use FindBin;
9 use lib "$FindBin::Bin/../lib";
10 }
11
12 use Slic3r;
13 use Slic3r::Test;
14
15 {
16 # We only need to slice at one height, so we'll build a non-manifold mesh
17 # that still produces complete loops at that height. Triangular walls are
18 # enough for this purpose.
19 # Basically we want to check what happens when three concentric loops happen
20 # to be at the same height, the two external ones being ccw and the other being
21 # a hole, thus cw.
22 my (@vertices, @facets) = ();
23 Slic3r::Test::add_facet($_, \@vertices, \@facets) for
24 # external surface below the slicing Z
25 [ [0,0,0], [20,0,10], [0,0,10] ],
26 [ [20,0,0], [20,20,10], [20,0,10] ],
27 [ [20,20,0], [0,20,10], [20,20,10] ],
28 [ [0,20,0], [0,0,10], [0,20,10] ],
29
30 # external insetted surface above the slicing Z
31 [ [2,2,10], [18,2,10], [2,2,20] ],
32 [ [18,2,10], [18,18,10], [18,2,20] ],
33 [ [18,18,10], [2,18,10], [18,18,20] ],
34 [ [2,18,10], [2,2,10], [2,18,20] ],
35
36 # insetted hole below the slicing Z
37 [ [15,5,0], [5,5,10], [15,5,10] ],
38 [ [15,15,0], [15,5,10], [15,15,10] ],
39 [ [5,15,0], [15,15,10], [5,15,10] ],
40 [ [5,5,0], [5,15,10], [5,5,10] ];
41
42 my $mesh = Slic3r::TriangleMesh->new;
43 $mesh->ReadFromPerl(\@vertices, \@facets);
44 $mesh->analyze;
45 my @lines = map $mesh->intersect_facet($_, 10), 0..$#facets;
46 my $loops = Slic3r::TriangleMesh::make_loops(\@lines);
47 is scalar(@$loops), 3, 'correct number of loops detected';
48 is scalar(grep $_->is_counter_clockwise, @$loops), 2, 'correct number of ccw loops detected';
49
50 my @surfaces = Slic3r::Layer::Region::_merge_loops($loops, 0);
51 is scalar(@surfaces), 1, 'one surface detected';
52 is scalar(@{$surfaces[0]->expolygon})-1, 1, 'surface has one hole';
53 }
54
55 __END__
0 use Test::More tests => 13;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first);
10 use Slic3r;
11 use Slic3r::Geometry qw(scale convex_hull);
12 use Slic3r::Geometry::Clipper qw(offset);
13 use Slic3r::Test;
14
15 {
16 my $config = Slic3r::Config->new_from_defaults;
17 $config->set('raft_layers', 2);
18 $config->set('infill_extruder', 2);
19 $config->set('solid_infill_extruder', 3);
20 $config->set('support_material_extruder', 4);
21 $config->set('ooze_prevention', 1);
22 $config->set('extruder_offset', [ [0,0], [20,0], [0,20], [20,20] ]);
23 $config->set('temperature', [200, 180, 170, 160]);
24 $config->set('first_layer_temperature', [206, 186, 166, 156]);
25 $config->set('toolchange_gcode', ';toolchange'); # test that it doesn't crash when this is supplied
26
27 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
28
29 my $tool = undef;
30 my @tool_temp = (0,0,0,0);
31 my @toolchange_points = ();
32 my @extrusion_points = ();
33 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
34 my ($self, $cmd, $args, $info) = @_;
35
36 if ($cmd =~ /^T(\d+)/) {
37 # ignore initial toolchange
38 if (defined $tool) {
39 my $expected_temp = $self->Z == ($config->get_value('first_layer_height') + $config->z_offset)
40 ? $config->first_layer_temperature->[$tool]
41 : $config->temperature->[$tool];
42 die 'standby temperature was not set before toolchange'
43 if $tool_temp[$tool] != $expected_temp + $config->standby_temperature_delta;
44
45 push @toolchange_points, my $point = Slic3r::Point->new_scale($self->X, $self->Y);
46 }
47 $tool = $1;
48 } elsif ($cmd eq 'M104' || $cmd eq 'M109') {
49 my $t = $args->{T} // $tool;
50 if ($tool_temp[$t] == 0) {
51 fail 'initial temperature is not equal to first layer temperature + standby delta'
52 unless $args->{S} == $config->first_layer_temperature->[$t] + $config->standby_temperature_delta;
53 }
54 $tool_temp[$t] = $args->{S};
55 } elsif ($cmd eq 'G1' && $info->{extruding} && $info->{dist_XY} > 0) {
56 push @extrusion_points, my $point = Slic3r::Point->new_scale($args->{X}, $args->{Y});
57 $point->translate(map +scale($_), @{ $config->extruder_offset->[$tool] });
58 }
59 });
60 my $convex_hull = convex_hull(\@extrusion_points);
61
62 my @t = ();
63 foreach my $point (@toolchange_points) {
64 foreach my $offset (@{$config->extruder_offset}) {
65 push @t, my $p = $point->clone;
66 $p->translate(map +scale($_), @$offset);
67 }
68 }
69 ok !(defined first { $convex_hull->contains_point($_) } @t), 'all nozzles are outside skirt at toolchange';
70
71 if (0) {
72 require "Slic3r/SVG.pm";
73 Slic3r::SVG::output(
74 "ooze_prevention_test.svg",
75 no_arrows => 1,
76 polygons => [$convex_hull],
77 red_points => \@t,
78 points => \@toolchange_points,
79 );
80 }
81
82 # offset the skirt by the maximum displacement between extruders plus a safety extra margin
83 my $delta = scale(20 * sqrt(2) + 1);
84 my $outer_convex_hull = offset([$convex_hull], +$delta)->[0];
85 ok !(defined first { !$outer_convex_hull->contains_point($_) } @toolchange_points), 'all toolchanges happen within expected area';
86 }
87
88 {
89 my $config = Slic3r::Config->new_from_defaults;
90 $config->set('support_material_extruder', 3);
91
92 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
93 ok Slic3r::Test::gcode($print), 'no errors when using non-consecutive extruders';
94 }
95
96 {
97 my $config = Slic3r::Config->new;
98 $config->set('extruder', 2);
99
100 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
101 like Slic3r::Test::gcode($print), qr/ T1/, 'extruder shortcut';
102 }
103
104 {
105 my $config = Slic3r::Config->new;
106 $config->set('perimeter_extruder', 2);
107 $config->set('infill_extruder', 2);
108 $config->set('support_material_extruder', 2);
109 $config->set('support_material_interface_extruder', 2);
110
111 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
112 ok Slic3r::Test::gcode($print), 'no errors when using multiple skirts with a single, non-zero, extruder';
113 }
114
115 {
116 my $model = stacked_cubes();
117 my $lower_config = $model->get_material('lower')->config;
118 my $upper_config = $model->get_material('upper')->config;
119
120 $lower_config->set('extruder', 1);
121 $lower_config->set('bottom_solid_layers', 0);
122 $lower_config->set('top_solid_layers', 1);
123 $upper_config->set('extruder', 2);
124 $upper_config->set('bottom_solid_layers', 1);
125 $upper_config->set('top_solid_layers', 0);
126 my $config = Slic3r::Config->new_from_defaults;
127 $config->set('fill_density', 0);
128 $config->set('solid_infill_speed', 99);
129 $config->set('top_solid_infill_speed', 99);
130 $config->set('cooling', 0); # for preventing speeds from being altered
131 $config->set('first_layer_speed', '100%'); # for preventing speeds from being altered
132
133 my $test = sub {
134 my $print = Slic3r::Test::init_print($model, config => $config);
135 my $tool = undef;
136 my %T0_shells = my %T1_shells = (); # Z => 1
137 Slic3r::GCode::Reader->new->parse(my $gcode = Slic3r::Test::gcode($print), sub {
138 my ($self, $cmd, $args, $info) = @_;
139
140 if ($cmd =~ /^T(\d+)/) {
141 $tool = $1;
142 } elsif ($cmd eq 'G1' && $info->{extruding} && $info->{dist_XY} > 0) {
143 if (($args->{F} // $self->F) == $config->solid_infill_speed*60) {
144 if ($tool == 0) {
145 $T0_shells{$self->Z} = 1;
146 } elsif ($tool == 1) {
147 $T1_shells{$self->Z} = 1;
148 }
149 }
150 }
151 });
152 return [ sort keys %T0_shells ], [ sort keys %T1_shells ];
153 };
154
155 {
156 my ($t0, $t1) = $test->();
157 is scalar(@$t0), 0, 'no interface shells';
158 is scalar(@$t1), 0, 'no interface shells';
159 }
160 {
161 $config->set('interface_shells', 1);
162 my ($t0, $t1) = $test->();
163 is scalar(@$t0), $lower_config->top_solid_layers, 'top interface shells';
164 is scalar(@$t1), $upper_config->bottom_solid_layers, 'bottom interface shells';
165 }
166 }
167
168 {
169 my $model = stacked_cubes();
170 my $object = $model->objects->[0];
171
172 my $config = Slic3r::Config->new_from_defaults;
173 $config->set('layer_height', 0.4);
174 $config->set('first_layer_height', '100%');
175 $config->set('skirts', 0);
176 my $print = Slic3r::Test::init_print($model, config => $config);
177
178 is $object->volumes->[0]->config->extruder, 1, 'auto_assign_extruders() assigned correct extruder to first volume';
179 is $object->volumes->[1]->config->extruder, 2, 'auto_assign_extruders() assigned correct extruder to second volume';
180
181 my $tool = undef;
182 my %T0 = my %T1 = (); # Z => 1
183 Slic3r::GCode::Reader->new->parse(my $gcode = Slic3r::Test::gcode($print), sub {
184 my ($self, $cmd, $args, $info) = @_;
185
186 if ($cmd =~ /^T(\d+)/) {
187 $tool = $1;
188 } elsif ($cmd eq 'G1' && $info->{extruding} && $info->{dist_XY} > 0) {
189 if ($tool == 0) {
190 $T0{$self->Z} = 1;
191 } elsif ($tool == 1) {
192 $T1{$self->Z} = 1;
193 }
194 }
195 });
196
197 ok !(defined first { $_ > 20 } keys %T0), 'T0 is never used for upper object';
198 ok !(defined first { $_ < 20 } keys %T1), 'T1 is never used for lower object';
199 }
200
201 sub stacked_cubes {
202 my $model = Slic3r::Model->new;
203 my $object = $model->add_object;
204 $object->add_volume(mesh => Slic3r::Test::mesh('20mm_cube'), material_id => 'lower');
205 $object->add_volume(mesh => Slic3r::Test::mesh('20mm_cube', translate => [0,0,20]), material_id => 'upper');
206 $object->add_instance(offset => Slic3r::Pointf->new(0,0));
207
208 return $model;
209 }
210
211 __END__
0 use Test::More tests => 59;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use Slic3r::ExtrusionLoop ':roles';
10 use Slic3r::ExtrusionPath ':roles';
11 use List::Util qw(first);
12 use Slic3r;
13 use Slic3r::Flow ':roles';
14 use Slic3r::Geometry qw(PI scale unscale);
15 use Slic3r::Geometry::Clipper qw(union_ex diff union offset);
16 use Slic3r::Surface ':types';
17 use Slic3r::Test;
18
19 {
20 my $flow = Slic3r::Flow->new(
21 width => 1,
22 height => 1,
23 nozzle_diameter => 1,
24 );
25
26 my $config = Slic3r::Config->new;
27 my $test = sub {
28 my ($expolygons, %expected) = @_;
29
30 my $slices = Slic3r::Surface::Collection->new;
31 $slices->append(Slic3r::Surface->new(
32 surface_type => S_TYPE_INTERNAL,
33 expolygon => $_,
34 )) for @$expolygons;
35
36 my ($region_config, $object_config, $print_config, $loops, $gap_fill, $perimeter_surfaces, $fill_surfaces);
37 my $g = Slic3r::Layer::PerimeterGenerator->new(
38 # input:
39 $slices,
40 1, # layer height
41 $flow,
42 ($region_config = Slic3r::Config::PrintRegion->new),
43 ($object_config = Slic3r::Config::PrintObject->new),
44 ($print_config = Slic3r::Config::Print->new),
45
46 # output:
47 ($loops = Slic3r::ExtrusionPath::Collection->new),
48 ($gap_fill = Slic3r::ExtrusionPath::Collection->new),
49 ($perimeter_surfaces = Slic3r::Surface::Collection->new),
50 ($fill_surfaces = Slic3r::Surface::Collection->new),
51 );
52 $g->config->apply_dynamic($config);
53 $g->process;
54
55 is scalar(@$loops),
56 scalar(@$expolygons), 'expected number of collections';
57 ok !defined(first { !$_->isa('Slic3r::ExtrusionPath::Collection') } @$loops),
58 'everything is returned as collections';
59
60 my $flattened_loops = $loops->flatten;
61 my @loops = @$flattened_loops;
62 is scalar(@loops),
63 $expected{total}, 'expected number of loops';
64 is scalar(grep $_->role == EXTR_ROLE_EXTERNAL_PERIMETER, map @$_, @loops),
65 $expected{external}, 'expected number of external loops';
66 is_deeply [ map { ($_->role == EXTR_ROLE_EXTERNAL_PERIMETER) || 0 } map @$_, @loops ],
67 $expected{ext_order}, 'expected external order';
68 is scalar(grep $_->role == EXTRL_ROLE_CONTOUR_INTERNAL_PERIMETER, @loops),
69 $expected{cinternal}, 'expected number of internal contour loops';
70 is scalar(grep $_->polygon->is_counter_clockwise, @loops),
71 $expected{ccw}, 'expected number of ccw loops';
72 is_deeply [ map $_->polygon->is_counter_clockwise, @loops ],
73 $expected{ccw_order}, 'expected ccw/cw order';
74
75 if ($expected{nesting}) {
76 foreach my $nesting (@{ $expected{nesting} }) {
77 for my $i (1..$#$nesting) {
78 ok $loops[$nesting->[$i-1]]->polygon->contains_point($loops[$nesting->[$i]]->first_point),
79 'expected nesting order';
80 }
81 }
82 }
83 };
84
85 $config->set('perimeters', 3);
86 $test->(
87 [
88 Slic3r::ExPolygon->new(
89 Slic3r::Polygon->new_scale([0,0], [100,0], [100,100], [0,100]),
90 ),
91 ],
92 total => 3,
93 external => 1,
94 ext_order => [0,0,1],
95 cinternal => 1,
96 ccw => 3,
97 ccw_order => [1,1,1],
98 nesting => [ [2,1,0] ],
99 );
100 $test->(
101 [
102 Slic3r::ExPolygon->new(
103 Slic3r::Polygon->new_scale([0,0], [100,0], [100,100], [0,100]),
104 Slic3r::Polygon->new_scale([40,40], [40,60], [60,60], [60,40]),
105 ),
106 ],
107 total => 6,
108 external => 2,
109 ext_order => [0,0,1,0,0,1],
110 cinternal => 1,
111 ccw => 3,
112 ccw_order => [0,0,0,1,1,1],
113 nesting => [ [5,4,3,0,1,2] ],
114 );
115 $test->(
116 [
117 Slic3r::ExPolygon->new(
118 Slic3r::Polygon->new_scale([0,0], [200,0], [200,200], [0,200]),
119 Slic3r::Polygon->new_scale([20,20], [20,180], [180,180], [180,20]),
120 ),
121 # nested:
122 Slic3r::ExPolygon->new(
123 Slic3r::Polygon->new_scale([50,50], [150,50], [150,150], [50,150]),
124 Slic3r::Polygon->new_scale([80,80], [80,120], [120,120], [120,80]),
125 ),
126 ],
127 total => 4*3,
128 external => 4,
129 ext_order => [0,0,1,0,0,1,0,0,1,0,0,1],
130 cinternal => 2,
131 ccw => 2*3,
132 ccw_order => [0,0,0,1,1,1,0,0,0,1,1,1],
133 );
134
135 $config->set('perimeters', 2);
136 $test->(
137 [
138 Slic3r::ExPolygon->new(
139 Slic3r::Polygon->new_scale([0,0], [50,0], [50,50], [0,50]),
140 Slic3r::Polygon->new_scale([7.5,7.5], [7.5,12.5], [12.5,12.5], [12.5,7.5]),
141 Slic3r::Polygon->new_scale([7.5,17.5], [7.5,22.5], [12.5,22.5], [12.5,17.5]),
142 Slic3r::Polygon->new_scale([7.5,27.5], [7.5,32.5], [12.5,32.5], [12.5,27.5]),
143 Slic3r::Polygon->new_scale([7.5,37.5], [7.5,42.5], [12.5,42.5], [12.5,37.5]),
144 Slic3r::Polygon->new_scale([17.5,7.5], [17.5,12.5], [22.5,12.5], [22.5,7.5]),
145 ),
146 ],
147 total => 12,
148 external => 6,
149 ext_order => [0,1,0,1,0,1,0,1,0,1,0,1],
150 cinternal => 1,
151 ccw => 2,
152 ccw_order => [0,0,0,0,0,0,0,0,0,0,1,1],
153 nesting => [ [0,1],[2,3],[4,5],[6,7],[8,9] ],
154 );
155 }
156
157 {
158 my $config = Slic3r::Config->new_from_defaults;
159 $config->set('skirts', 0);
160 $config->set('fill_density', 0);
161 $config->set('perimeters', 3);
162 $config->set('top_solid_layers', 0);
163 $config->set('bottom_solid_layers', 0);
164 $config->set('cooling', 0); # to prevent speeds from being altered
165 $config->set('first_layer_speed', '100%'); # to prevent speeds from being altered
166
167 {
168 my $print = Slic3r::Test::init_print('overhang', config => $config);
169 my $has_cw_loops = 0;
170 my $cur_loop;
171 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
172 my ($self, $cmd, $args, $info) = @_;
173
174 if ($info->{extruding} && $info->{dist_XY} > 0) {
175 $cur_loop ||= [ [$self->X, $self->Y] ];
176 push @$cur_loop, [ @$info{qw(new_X new_Y)} ];
177 } else {
178 if ($cur_loop) {
179 $has_cw_loops = 1 if Slic3r::Polygon->new(@$cur_loop)->is_clockwise;
180 $cur_loop = undef;
181 }
182 }
183 });
184 ok !$has_cw_loops, 'all perimeters extruded ccw';
185 }
186
187 foreach my $model (qw(cube_with_hole cube_with_concave_hole)) {
188 $config->set('external_perimeter_speed', 68);
189 my $print = Slic3r::Test::init_print(
190 $model,
191 config => $config,
192 duplicate => 2, # we test two copies to make sure ExtrusionLoop objects are not modified in-place (the second object would not detect cw loops and thus would calculate wrong inwards moves)
193 );
194 my $has_cw_loops = my $has_outwards_move = my $starts_on_convex_point = 0;
195 my $cur_loop;
196 my %external_loops = (); # print_z => count of external loops
197 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
198 my ($self, $cmd, $args, $info) = @_;
199
200 if ($info->{extruding} && $info->{dist_XY} > 0) {
201 $cur_loop ||= [ [$self->X, $self->Y] ];
202 push @$cur_loop, [ @$info{qw(new_X new_Y)} ];
203 } else {
204 if ($cur_loop) {
205 $has_cw_loops = 1 if Slic3r::Polygon->new_scale(@$cur_loop)->is_clockwise;
206 if ($self->F == $config->external_perimeter_speed*60) {
207 my $move_dest = Slic3r::Point->new_scale(@$info{qw(new_X new_Y)});
208
209 # reset counter for second object
210 $external_loops{$self->Z} = 0
211 if defined($external_loops{$self->Z}) && $external_loops{$self->Z} == 2;
212
213 $external_loops{$self->Z}++;
214 my $is_contour = $external_loops{$self->Z} == 2;
215 my $is_hole = $external_loops{$self->Z} == 1;
216
217 my $loop = Slic3r::Polygon->new_scale(@$cur_loop);
218 my $loop_contains_point = $loop->contains_point($move_dest);
219 $has_outwards_move = 1
220 if (!$loop_contains_point && $is_contour) # contour should include destination
221 || ($loop_contains_point && $is_hole); # hole should not
222
223 if ($model eq 'cube_with_concave_hole') {
224 # check that loop starts at a concave vertex
225 my $ccw_angle = $loop->first_point->ccw_angle(@$loop[-2,1]);
226 my $convex = ($ccw_angle > PI); # whether the angle on the *right* side is convex
227 $starts_on_convex_point = 1
228 if ($convex && $is_contour) || (!$convex && $is_hole);
229 }
230 }
231 $cur_loop = undef;
232 }
233 }
234 });
235 ok !$has_cw_loops, 'all perimeters extruded ccw';
236 ok !$has_outwards_move, 'move inwards after completing external loop';
237 ok !$starts_on_convex_point, 'loops start on concave point if any';
238 }
239
240 {
241 $config->set('perimeters', 1);
242 $config->set('perimeter_speed', 77);
243 $config->set('external_perimeter_speed', 66);
244 $config->set('bridge_speed', 99);
245 $config->set('cooling', 1);
246 $config->set('fan_below_layer_time', 0);
247 $config->set('slowdown_below_layer_time', 0);
248 $config->set('bridge_fan_speed', 100);
249 $config->set('bridge_flow_ratio', 33); # arbitrary value
250 $config->set('overhangs', 1);
251 my $print = Slic3r::Test::init_print('overhang', config => $config);
252 my %layer_speeds = (); # print Z => [ speeds ]
253 my $fan_speed = 0;
254 my $bridge_mm_per_mm = ($config->nozzle_diameter->[0]**2) / ($config->filament_diameter->[0]**2) * $config->bridge_flow_ratio;
255 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
256 my ($self, $cmd, $args, $info) = @_;
257
258 $fan_speed = 0 if $cmd eq 'M107';
259 $fan_speed = $args->{S} if $cmd eq 'M106';
260 if ($info->{extruding} && $info->{dist_XY} > 0) {
261 $layer_speeds{$self->Z} ||= {};
262 $layer_speeds{$self->Z}{my $feedrate = $args->{F} // $self->F} = 1;
263
264 fail 'wrong speed found'
265 if $feedrate != $config->perimeter_speed*60
266 && $feedrate != $config->external_perimeter_speed*60
267 && $feedrate != $config->bridge_speed*60;
268
269 if ($feedrate == $config->bridge_speed*60) {
270 fail 'printing overhang but fan is not enabled or running at wrong speed'
271 if $fan_speed != 255;
272 my $mm_per_mm = $info->{dist_E} / $info->{dist_XY};
273 fail 'wrong bridge flow' if abs($mm_per_mm - $bridge_mm_per_mm) > 0.01;
274 } else {
275 fail 'fan is running when not supposed to'
276 if $fan_speed > 0;
277 }
278 }
279 });
280 is scalar(grep { keys %$_ > 1 } values %layer_speeds), 1,
281 'only overhang layer has more than one speed';
282 }
283 }
284
285 {
286 my $config = Slic3r::Config->new_from_defaults;
287 $config->set('skirts', 0);
288 $config->set('perimeters', 3);
289 $config->set('layer_height', 0.4);
290 $config->set('first_layer_height', 0.35);
291 $config->set('extra_perimeters', 1);
292 $config->set('cooling', 0); # to prevent speeds from being altered
293 $config->set('first_layer_speed', '100%'); # to prevent speeds from being altered
294 $config->set('perimeter_speed', 99);
295 $config->set('external_perimeter_speed', 99);
296 $config->set('small_perimeter_speed', 99);
297 $config->set('thin_walls', 0);
298
299 my $print = Slic3r::Test::init_print('ipadstand', config => $config);
300 my %perimeters = (); # z => number of loops
301 my $in_loop = 0;
302 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
303 my ($self, $cmd, $args, $info) = @_;
304
305 if ($info->{extruding} && $info->{dist_XY} > 0 && ($args->{F} // $self->F) == $config->perimeter_speed*60) {
306 $perimeters{$self->Z}++ if !$in_loop;
307 $in_loop = 1;
308 } else {
309 $in_loop = 0;
310 }
311 });
312 ok !(grep { $_ % $config->perimeters } values %perimeters), 'no superfluous extra perimeters';
313 }
314
315 {
316 my $config = Slic3r::Config->new_from_defaults;
317 $config->set('nozzle_diameter', [0.4]);
318 $config->set('perimeters', 2);
319 $config->set('perimeter_extrusion_width', 0.4);
320 $config->set('infill_extrusion_width', 0.53);
321 $config->set('solid_infill_extrusion_width', 0.53);
322
323 # we just need a pre-filled Print object
324 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
325
326 # override a layer's slices
327 my $expolygon = Slic3r::ExPolygon->new([[-71974463,-139999376],[-71731792,-139987456],[-71706544,-139985616],[-71682119,-139982639],[-71441248,-139946912],[-71417487,-139942895],[-71379384,-139933984],[-71141800,-139874480],[-71105247,-139862895],[-70873544,-139779984],[-70838592,-139765856],[-70614943,-139660064],[-70581783,-139643567],[-70368368,-139515680],[-70323751,-139487872],[-70122160,-139338352],[-70082399,-139306639],[-69894800,-139136624],[-69878679,-139121327],[-69707992,-138933008],[-69668575,-138887343],[-69518775,-138685359],[-69484336,-138631632],[-69356423,-138418207],[-69250040,-138193296],[-69220920,-138128976],[-69137992,-137897168],[-69126095,-137860255],[-69066568,-137622608],[-69057104,-137582511],[-69053079,-137558751],[-69017352,-137317872],[-69014392,-137293456],[-69012543,-137268207],[-68999369,-137000000],[-63999999,-137000000],[-63705947,-136985551],[-63654984,-136977984],[-63414731,-136942351],[-63364756,-136929840],[-63129151,-136870815],[-62851950,-136771631],[-62585807,-136645743],[-62377483,-136520895],[-62333291,-136494415],[-62291908,-136463728],[-62096819,-136319023],[-62058644,-136284432],[-61878676,-136121328],[-61680968,-135903184],[-61650275,-135861807],[-61505591,-135666719],[-61354239,-135414191],[-61332211,-135367615],[-61228359,-135148063],[-61129179,-134870847],[-61057639,-134585262],[-61014451,-134294047],[-61000000,-134000000],[-61000000,-107999999],[-61014451,-107705944],[-61057639,-107414736],[-61129179,-107129152],[-61228359,-106851953],[-61354239,-106585808],[-61505591,-106333288],[-61680967,-106096816],[-61878675,-105878680],[-62096820,-105680967],[-62138204,-105650279],[-62333292,-105505591],[-62585808,-105354239],[-62632384,-105332207],[-62851951,-105228360],[-62900463,-105211008],[-63129152,-105129183],[-63414731,-105057640],[-63705947,-105014448],[-63999999,-105000000],[-68999369,-105000000],[-69012543,-104731792],[-69014392,-104706544],[-69017352,-104682119],[-69053079,-104441248],[-69057104,-104417487],[-69066008,-104379383],[-69125528,-104141799],[-69137111,-104105248],[-69220007,-103873544],[-69234136,-103838591],[-69339920,-103614943],[-69356415,-103581784],[-69484328,-103368367],[-69512143,-103323752],[-69661647,-103122160],[-69693352,-103082399],[-69863383,-102894800],[-69878680,-102878679],[-70066999,-102707992],[-70112656,-102668576],[-70314648,-102518775],[-70368367,-102484336],[-70581783,-102356424],[-70806711,-102250040],[-70871040,-102220919],[-71102823,-102137992],[-71139752,-102126095],[-71377383,-102066568],[-71417487,-102057104],[-71441248,-102053079],[-71682119,-102017352],[-71706535,-102014392],[-71731784,-102012543],[-71974456,-102000624],[-71999999,-102000000],[-104000000,-102000000],[-104025536,-102000624],[-104268207,-102012543],[-104293455,-102014392],[-104317880,-102017352],[-104558751,-102053079],[-104582512,-102057104],[-104620616,-102066008],[-104858200,-102125528],[-104894751,-102137111],[-105126455,-102220007],[-105161408,-102234136],[-105385056,-102339920],[-105418215,-102356415],[-105631632,-102484328],[-105676247,-102512143],[-105877839,-102661647],[-105917600,-102693352],[-106105199,-102863383],[-106121320,-102878680],[-106292007,-103066999],[-106331424,-103112656],[-106481224,-103314648],[-106515663,-103368367],[-106643575,-103581783],[-106749959,-103806711],[-106779080,-103871040],[-106862007,-104102823],[-106873904,-104139752],[-106933431,-104377383],[-106942896,-104417487],[-106946920,-104441248],[-106982648,-104682119],[-106985607,-104706535],[-106987456,-104731784],[-107000630,-105000000],[-112000000,-105000000],[-112294056,-105014448],[-112585264,-105057640],[-112870848,-105129184],[-112919359,-105146535],[-113148048,-105228360],[-113194624,-105250392],[-113414191,-105354239],[-113666711,-105505591],[-113708095,-105536279],[-113903183,-105680967],[-114121320,-105878679],[-114319032,-106096816],[-114349720,-106138200],[-114494408,-106333288],[-114645760,-106585808],[-114667792,-106632384],[-114771640,-106851952],[-114788991,-106900463],[-114870815,-107129151],[-114942359,-107414735],[-114985551,-107705943],[-115000000,-107999999],[-115000000,-134000000],[-114985551,-134294048],[-114942359,-134585263],[-114870816,-134870847],[-114853464,-134919359],[-114771639,-135148064],[-114645759,-135414192],[-114494407,-135666720],[-114319031,-135903184],[-114121320,-136121327],[-114083144,-136155919],[-113903184,-136319023],[-113861799,-136349712],[-113666711,-136494416],[-113458383,-136619264],[-113414192,-136645743],[-113148049,-136771631],[-112870848,-136870815],[-112820872,-136883327],[-112585264,-136942351],[-112534303,-136949920],[-112294056,-136985551],[-112000000,-137000000],[-107000630,-137000000],[-106987456,-137268207],[-106985608,-137293440],[-106982647,-137317872],[-106946920,-137558751],[-106942896,-137582511],[-106933991,-137620624],[-106874471,-137858208],[-106862888,-137894751],[-106779992,-138126463],[-106765863,-138161424],[-106660080,-138385055],[-106643584,-138418223],[-106515671,-138631648],[-106487855,-138676256],[-106338352,-138877839],[-106306647,-138917600],[-106136616,-139105199],[-106121320,-139121328],[-105933000,-139291999],[-105887344,-139331407],[-105685351,-139481232],[-105631632,-139515663],[-105418216,-139643567],[-105193288,-139749951],[-105128959,-139779072],[-104897175,-139862016],[-104860247,-139873904],[-104622616,-139933423],[-104582511,-139942896],[-104558751,-139946912],[-104317880,-139982656],[-104293463,-139985616],[-104268216,-139987456],[-104025544,-139999376],[-104000000,-140000000],[-71999999,-140000000]],[[-105000000,-138000000],[-105000000,-104000000],[-71000000,-104000000],[-71000000,-138000000]],[[-69000000,-132000000],[-69000000,-110000000],[-64991180,-110000000],[-64991180,-132000000]],[[-111008824,-132000000],[-111008824,-110000000],[-107000000,-110000000],[-107000000,-132000000]]);
328 my $object = $print->print->objects->[0];
329 $object->slice;
330 my $layer = $object->get_layer(1);
331 my $layerm = $layer->regions->[0];
332 $layerm->slices->clear;
333 $layerm->slices->append(Slic3r::Surface->new(surface_type => S_TYPE_INTERNAL, expolygon => $expolygon));
334
335 # make perimeters
336 $layer->make_perimeters;
337
338 # compute the covered area
339 my $pflow = $layerm->flow(FLOW_ROLE_PERIMETER);
340 my $iflow = $layerm->flow(FLOW_ROLE_INFILL);
341 my $covered_by_perimeters = union_ex([
342 (map @{$_->polygon->split_at_first_point->grow($pflow->scaled_width/2)}, map @$_, @{$layerm->perimeters}),
343 ]);
344 my $covered_by_infill = union_ex([
345 (map $_->p, @{$layerm->fill_surfaces}),
346 (map @{$_->polyline->grow($iflow->scaled_width/2)}, @{$layerm->thin_fills}),
347 ]);
348
349 # compute the non covered area
350 my $non_covered = diff(
351 [ map @{$_->expolygon}, @{$layerm->slices} ],
352 [ map @$_, (@$covered_by_perimeters, @$covered_by_infill) ],
353 );
354
355 if (0) {
356 printf "max non covered = %f\n", List::Util::max(map unscale unscale $_->area, @$non_covered);
357 require "Slic3r/SVG.pm";
358 Slic3r::SVG::output(
359 "gaps.svg",
360 expolygons => [ map $_->expolygon, @{$layerm->slices} ],
361 red_expolygons => union_ex([ map @$_, (@$covered_by_perimeters, @$covered_by_infill) ]),
362 green_expolygons => union_ex($non_covered),
363 no_arrows => 1,
364 polylines => [
365 map $_->polygon->split_at_first_point, map @$_, @{$layerm->perimeters},
366 ],
367 );
368 }
369 ok !(defined first { $_->area > ($iflow->scaled_width**2) } @$non_covered), 'no gap between perimeters and infill';
370 }
371
372 {
373 my $config = Slic3r::Config->new_from_defaults;
374 $config->set('skirts', 0);
375 $config->set('perimeters', 3);
376 $config->set('layer_height', 0.4);
377 $config->set('bridge_speed', 99);
378 $config->set('fill_density', 0); # to prevent bridging over sparse infill
379 $config->set('overhangs', 1);
380 $config->set('cooling', 0); # to prevent speeds from being altered
381 $config->set('first_layer_speed', '100%'); # to prevent speeds from being altered
382
383 my $test = sub {
384 my ($print) = @_;
385 my %z_with_bridges = (); # z => 1
386 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
387 my ($self, $cmd, $args, $info) = @_;
388
389 if ($info->{extruding} && $info->{dist_XY} > 0) {
390 $z_with_bridges{$self->Z} = 1 if ($args->{F} // $self->F) == $config->bridge_speed*60;
391 }
392 });
393 return scalar keys %z_with_bridges;
394 };
395 ok $test->(Slic3r::Test::init_print('V', config => $config)) == 1,
396 'no overhangs printed with bridge speed'; # except for the first internal solid layers above void
397 ok $test->(Slic3r::Test::init_print('V', config => $config, scale_xyz => [3,1,1])) > 1,
398 'overhangs printed with bridge speed';
399 }
400
401 {
402 my $config = Slic3r::Config->new_from_defaults;
403 $config->set('seam_position', 'random');
404 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
405 ok Slic3r::Test::gcode($print), 'successful generation of G-code with seam_position = random';
406 }
407
408 {
409 my $test = sub {
410 my ($model_name) = @_;
411 my $config = Slic3r::Config->new_from_defaults;
412 $config->set('seam_position', 'aligned');
413 $config->set('skirts', 0);
414 $config->set('perimeters', 1);
415 $config->set('fill_density', 0);
416 $config->set('top_solid_layers', 0);
417 $config->set('bottom_solid_layers', 0);
418 $config->set('retract_layer_change', [0]);
419
420 my $was_extruding = 0;
421 my @seam_points = ();
422 my $print = Slic3r::Test::init_print($model_name, config => $config);
423 Slic3r::GCode::Reader->new->parse(my $gcode = Slic3r::Test::gcode($print), sub {
424 my ($self, $cmd, $args, $info) = @_;
425
426 if ($info->{extruding}) {
427 if (!$was_extruding) {
428 push @seam_points, Slic3r::Point->new_scale($self->X, $self->Y);
429 }
430 $was_extruding = 1;
431 } else {
432 $was_extruding = 0;
433 }
434 });
435 my @dist = map unscale($_), map $seam_points[$_]->distance_to($seam_points[$_+1]), 0..($#seam_points-1);
436 ok !(defined first { $_ > 3 } @dist), 'seam is aligned';
437 };
438 $test->('20mm_cube');
439 $test->('small_dorito');
440 }
441
442 __END__
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan tests => 18;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Slic3r;
12 use Slic3r::Geometry::Clipper qw(intersection_pl);
13
14 #==========================================================
15
16 is Slic3r::Geometry::point_in_segment(Slic3r::Point->new(10, 10), Slic3r::Line->new([5, 10], [20, 10])), 1, 'point in horizontal segment';
17 is Slic3r::Geometry::point_in_segment(Slic3r::Point->new(30, 10), Slic3r::Line->new([5, 10], [20, 10])), 0, 'point not in horizontal segment';
18 is Slic3r::Geometry::point_in_segment(Slic3r::Point->new(10, 10), Slic3r::Line->new([10, 5], [10, 20])), 1, 'point in vertical segment';
19 is Slic3r::Geometry::point_in_segment(Slic3r::Point->new(10, 30), Slic3r::Line->new([10, 5], [10, 20])), 0, 'point not in vertical segment';
20 is Slic3r::Geometry::point_in_segment(Slic3r::Point->new(15, 15), Slic3r::Line->new([10, 10], [20, 20])), 1, 'point in diagonal segment';
21 is Slic3r::Geometry::point_in_segment(Slic3r::Point->new(20, 15), Slic3r::Line->new([10, 10], [20, 20])), 0, 'point not in diagonal segment';
22
23 #==========================================================
24
25 my $square = Slic3r::Polygon->new( # ccw
26 [100, 100],
27 [200, 100],
28 [200, 200],
29 [100, 200],
30 );
31
32 #==========================================================
33
34 {
35 my $hole_in_square = [ # cw
36 [140, 140],
37 [140, 160],
38 [160, 160],
39 [160, 140],
40 ];
41 my $expolygon = Slic3r::ExPolygon->new($square, $hole_in_square);
42 #is $expolygon->contains_point(Slic3r::Point->new(100, 100)), 1, 'corner point is recognized';
43 #is $expolygon->contains_point(Slic3r::Point->new(100, 180)), 1, 'point on contour is recognized';
44 #is $expolygon->contains_point(Slic3r::Point->new(140, 150)), 1, 'point on hole contour is recognized';
45 #is $expolygon->contains_point(Slic3r::Point->new(140, 140)), 1, 'point on hole corner is recognized';
46 {
47 my $intersection = intersection_pl([Slic3r::Polyline->new([150,180], [150,150])], \@$expolygon);
48 is $intersection->[0]->length, Slic3r::Line->new([150, 180], [150, 160])->length,
49 'line is clipped to square with hole';
50 }
51 {
52 my $intersection = intersection_pl([Slic3r::Polyline->new([150,150], [150,120])], \@$expolygon);
53 is $intersection->[0]->length, Slic3r::Line->new([150, 140], [150, 120])->length,
54 'line is clipped to square with hole';
55 }
56 {
57 my $intersection = intersection_pl([Slic3r::Polyline->new([120,180], [180,180])], \@$expolygon);
58 is $intersection->[0]->length, Slic3r::Line->new([120,180], [180,180])->length,
59 'line is clipped to square with hole';
60 }
61 {
62 my $intersection = intersection_pl([Slic3r::Polyline->new([50, 150], [300, 150])], \@$expolygon);
63 is $intersection->[0]->length, Slic3r::Line->new([100, 150], [140, 150])->length,
64 'line is clipped to square with hole';
65 is $intersection->[1]->length, Slic3r::Line->new([160, 150], [200, 150])->length,
66 'line is clipped to square with hole';
67 }
68 {
69 my $intersection = intersection_pl([Slic3r::Polyline->new([300, 150], [50, 150])], \@$expolygon);
70 is $intersection->[0]->length, Slic3r::Line->new([200, 150], [160, 150])->length,
71 'reverse line is clipped to square with hole';
72 is $intersection->[1]->length, Slic3r::Line->new([140, 150], [100, 150])->length,
73 'reverse line is clipped to square with hole';
74 }
75 {
76 my $intersection = intersection_pl([Slic3r::Polyline->new([100,180], [200,180])], \@$expolygon);
77 is $intersection->[0]->length, Slic3r::Line->new([100,180], [200,180])->length,
78 'tangent line is clipped to square with hole';
79 }
80 }
81
82 #==========================================================
83
84 {
85 my $large_circle = Slic3r::Polygon->new_scale( # ccw
86 [151.8639,288.1192], [133.2778,284.6011], [115.0091,279.6997], [98.2859,270.8606], [82.2734,260.7933],
87 [68.8974,247.4181], [56.5622,233.0777], [47.7228,216.3558], [40.1617,199.0172], [36.6431,180.4328],
88 [34.932,165.2312], [37.5567,165.1101], [41.0547,142.9903], [36.9056,141.4295], [40.199,124.1277],
89 [47.7776,106.7972], [56.6335,90.084], [68.9831,75.7557], [82.3712,62.3948], [98.395,52.3429],
90 [115.1281,43.5199], [133.4004,38.6374], [151.9884,35.1378], [170.8905,35.8571], [189.6847,37.991],
91 [207.5349,44.2488], [224.8662,51.8273], [240.0786,63.067], [254.407,75.4169], [265.6311,90.6406],
92 [275.6832,106.6636], [281.9225,124.52], [286.8064,142.795], [287.5061,161.696], [286.7874,180.5972],
93 [281.8856,198.8664], [275.6283,216.7169], [265.5604,232.7294], [254.3211,247.942], [239.9802,260.2776],
94 [224.757,271.5022], [207.4179,279.0635], [189.5605,285.3035], [170.7649,287.4188],
95 );
96 ok $large_circle->is_counter_clockwise, "contour is counter-clockwise";
97
98 my $small_circle = Slic3r::Polygon->new_scale( # cw
99 [158.227,215.9007], [164.5136,215.9007], [175.15,214.5007], [184.5576,210.6044], [190.2268,207.8743],
100 [199.1462,201.0306], [209.0146,188.346], [213.5135,177.4829], [214.6979,168.4866], [216.1025,162.3325],
101 [214.6463,151.2703], [213.2471,145.1399], [209.0146,134.9203], [199.1462,122.2357], [189.8944,115.1366],
102 [181.2504,111.5567], [175.5684,108.8205], [164.5136,107.3655], [158.2269,107.3655], [147.5907,108.7656],
103 [138.183,112.6616], [132.5135,115.3919], [123.5943,122.2357], [113.7259,134.92], [109.2269,145.7834],
104 [108.0426,154.7799], [106.638,160.9339], [108.0941,171.9957], [109.4933,178.1264], [113.7259,188.3463],
105 [123.5943,201.0306], [132.8461,208.1296], [141.4901,211.7094], [147.172,214.4458],
106 );
107 ok $small_circle->is_clockwise, "hole is clockwise";
108
109 my $expolygon = Slic3r::ExPolygon->new($large_circle, $small_circle);
110 my $line = Slic3r::Polyline->new_scale([152.742,288.086671142818], [152.742,34.166466971035]);
111
112 my $intersection = intersection_pl([$line], \@$expolygon);
113 is $intersection->[0]->length, Slic3r::Line->new([152742000, 288086661], [152742000, 215178843])->length,
114 'line is clipped to square with hole';
115 is $intersection->[1]->length, Slic3r::Line->new([152742000, 108087507], [152742000, 35166477])->length,
116 'line is clipped to square with hole';
117 }
118
119 #==========================================================
0 use Test::More tests => 1;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw();
10 use Slic3r;
11 use Slic3r::Geometry qw(epsilon);
12 use Slic3r::Test;
13
14 {
15 my $config = Slic3r::Config->new_from_defaults;
16 $config->set('pressure_advance', 10);
17 $config->set('retract_length', [1]);
18
19 my $print = Slic3r::Test::init_print('20mm_cube', config => $config, duplicate => 2);
20 my $retracted = $config->retract_length->[0];
21 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
22 my ($self, $cmd, $args, $info) = @_;
23
24 if ($info->{extruding} && !$info->{dist_XY}) {
25 $retracted += $info->{dist_E};
26 } elsif ($info->{retracting}) {
27 $retracted += $info->{dist_E};
28 }
29 });
30
31 ok abs($retracted) < 0.01, 'all retractions are compensated';
32 }
33
34
35 __END__
0 use Test::More tests => 6;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first);
10 use Slic3r;
11 use Slic3r::Geometry qw(epsilon unscale X Y);
12 use Slic3r::Test;
13
14 {
15 my $config = Slic3r::Config->new_from_defaults;
16 my $print_center = [100,100];
17 my $print = Slic3r::Test::init_print('20mm_cube', config => $config, print_center => $print_center);
18 my @extrusion_points = ();
19 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
20 my ($self, $cmd, $args, $info) = @_;
21
22 if ($cmd eq 'G1' && $info->{extruding} && $info->{dist_XY} > 0) {
23 push @extrusion_points, my $point = Slic3r::Point->new_scale($args->{X}, $args->{Y});
24 }
25 });
26 my $bb = Slic3r::Geometry::BoundingBox->new_from_points(\@extrusion_points);
27 my $center = $bb->center;
28 ok abs(unscale($center->[X]) - $print_center->[X]) < epsilon, 'print is centered around print_center (X)';
29 ok abs(unscale($center->[Y]) - $print_center->[Y]) < epsilon, 'print is centered around print_center (Y)';
30 }
31
32 {
33 # this represents the aggregate config from presets
34 my $config = Slic3r::Config->new_from_defaults;
35
36 # user adds one object to the plater
37 my $print = Slic3r::Test::init_print(my $model = Slic3r::Test::model('20mm_cube'), config => $config);
38
39 # user sets a per-region option
40 $print->print->objects->[0]->model_object->config->set('fill_density', 100);
41 $print->print->reload_object(0);
42 is $print->print->regions->[0]->config->fill_density, 100, 'region config inherits model object config';
43
44 # user exports G-code, thus the default config is reapplied
45 $print->print->apply_config($config);
46
47 is $print->print->regions->[0]->config->fill_density, 100, 'apply_config() does not override per-object settings';
48
49 # user assigns object extruders
50 $print->print->objects->[0]->model_object->config->set('extruder', 3);
51 $print->print->objects->[0]->model_object->config->set('perimeter_extruder', 2);
52 $print->print->reload_object(0);
53
54 is $print->print->regions->[0]->config->infill_extruder, 3, 'extruder setting is correctly expanded';
55 is $print->print->regions->[0]->config->perimeter_extruder, 2, 'extruder setting does not override explicitely specified extruders';
56 }
57
58 __END__
0 use Test::More tests => 26;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(any);
10 use Slic3r;
11 use Slic3r::Test qw(_eq);
12
13 {
14 my $config = Slic3r::Config->new_from_defaults;
15 my $duplicate = 1;
16
17 my $test = sub {
18 my ($conf) = @_;
19 $conf ||= $config;
20
21 my $print = Slic3r::Test::init_print('20mm_cube', config => $conf, duplicate => $duplicate);
22
23 my $tool = 0;
24 my @toolchange_count = (); # track first usages so that we don't expect retract_length_toolchange when extruders are used for the first time
25 my @retracted = (1); # ignore the first travel move from home to first point
26 my @retracted_length = (0);
27 my $lifted = 0;
28 my $lift_dist = 0; # track lifted distance for toolchanges and extruders with different retract_lift values
29 my $changed_tool = 0;
30 my $wait_for_toolchange = 0;
31 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
32 my ($self, $cmd, $args, $info) = @_;
33
34 if ($cmd =~ /^T(\d+)/) {
35 $tool = $1;
36 $changed_tool = 1;
37 $wait_for_toolchange = 0;
38 $toolchange_count[$tool] //= 0;
39 $toolchange_count[$tool]++;
40 } elsif ($cmd =~ /^G[01]$/ && !$args->{Z}) { # ignore lift taking place after retraction
41 fail 'toolchange happens right after retraction' if $wait_for_toolchange;
42 }
43
44 if ($info->{dist_Z}) {
45 # lift move or lift + change layer
46 if (_eq($info->{dist_Z}, $print->print->config->get_at('retract_lift', $tool))
47 || (_eq($info->{dist_Z}, $conf->layer_height + $print->print->config->get_at('retract_lift', $tool)) && $print->print->config->get_at('retract_lift', $tool) > 0)) {
48 fail 'only lifting while retracted' if !$retracted[$tool];
49 fail 'double lift' if $lifted;
50 $lifted = 1;
51 $lift_dist = $info->{dist_Z};
52 }
53 if ($info->{dist_Z} < 0) {
54 fail 'going down only after lifting' if !$lifted;
55 fail 'going down by the same amount of the lift or by the amount needed to get to next layer'
56 if !_eq($info->{dist_Z}, -$lift_dist)
57 && !_eq($info->{dist_Z}, -lift_dist + $conf->layer_height);
58 $lift_dist = 0;
59 $lifted = 0;
60 }
61 fail 'move Z at travel speed' if ($args->{F} // $self->F) != $conf->travel_speed * 60;
62 }
63 if ($info->{retracting}) {
64 $retracted[$tool] = 1;
65 $retracted_length[$tool] += -$info->{dist_E};
66 if (_eq($retracted_length[$tool], $print->print->config->get_at('retract_length', $tool))) {
67 # okay
68 } elsif (_eq($retracted_length[$tool], $print->print->config->get_at('retract_length_toolchange', $tool))) {
69 $wait_for_toolchange = 1;
70 } else {
71 fail 'retracted by the correct amount';
72 }
73 }
74 if ($info->{extruding}) {
75 fail 'only extruding while not lifted' if $lifted;
76 if ($retracted[$tool]) {
77 my $expected_amount = $retracted_length[$tool] + $print->print->config->get_at('retract_restart_extra', $tool);
78 if ($changed_tool && $toolchange_count[$tool] > 1) {
79 $expected_amount = $print->print->config->get_at('retract_length_toolchange', $tool) + $print->print->config->get_at('retract_restart_extra_toolchange', $tool);
80 $changed_tool = 0;
81 }
82 fail 'unretracted by the correct amount' && exit
83 if !_eq($info->{dist_E}, $expected_amount);
84 $retracted[$tool] = 0;
85 $retracted_length[$tool] = 0;
86 }
87 }
88 if ($info->{travel} && $info->{dist_XY} >= $print->print->config->get_at('retract_before_travel', $tool)) {
89 fail 'retracted before long travel move' if !$retracted[$tool];
90 }
91 });
92
93 1;
94 };
95
96 $config->set('first_layer_height', $config->layer_height);
97 $config->set('first_layer_speed', '100%');
98 $config->set('start_gcode', ''); # to avoid dealing with the nozzle lift in start G-code
99 $config->set('retract_length', [1.5]);
100 $config->set('retract_before_travel', [3]);
101 $config->set('only_retract_when_crossing_perimeters', 0);
102
103 my $retract_tests = sub {
104 my ($descr) = @_;
105
106 ok $test->(), "retraction$descr";
107
108 my $conf = $config->clone;
109 $conf->set('retract_restart_extra', [1]);
110 ok $test->($conf), "restart extra length$descr";
111
112 $conf->set('retract_restart_extra', [-1]);
113 ok $test->($conf), "negative restart extra length$descr";
114
115 $conf->set('retract_lift', [1, 2]);
116 ok $test->($conf), "lift$descr";
117 };
118
119 $retract_tests->('');
120
121 $duplicate = 2;
122 $retract_tests->(' (duplicate)');
123
124 $duplicate = 1;
125 $config->set('infill_extruder', 2);
126 $config->set('skirts', 4);
127 $config->set('skirt_height', 3);
128 $retract_tests->(' (dual extruder with multiple skirt layers)');
129 }
130
131 {
132 my $config = Slic3r::Config->new_from_defaults;
133 $config->set('start_gcode', ''); # prevent any default priming Z move from affecting our lift detection
134 $config->set('retract_length', [0]);
135 $config->set('retract_layer_change', [0]);
136 $config->set('retract_lift', [0.2]);
137
138 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
139 my $retracted = 0;
140 my $layer_changes_with_retraction = 0;
141 my $retractions = my $z_restores = 0;
142 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
143 my ($self, $cmd, $args, $info) = @_;
144
145 if ($info->{retracting}) {
146 $retracted = 1;
147 $retractions++;
148 } elsif ($info->{extruding} && $retracted) {
149 $retracted = 0;
150 }
151
152 if ($info->{dist_Z} && $retracted) {
153 $layer_changes_with_retraction++;
154 }
155 if ($info->{dist_Z} && $args->{Z} < $self->Z) {
156 $z_restores++;
157 }
158 });
159
160 is $layer_changes_with_retraction, 0, 'no retraction on layer change';
161 is $retractions, 0, 'no retractions';
162 is $z_restores, 0, 'no lift';
163 }
164
165 {
166 my $config = Slic3r::Config->new_from_defaults;
167 $config->set('use_firmware_retraction', 1);
168
169 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
170 my $retracted = 0;
171 my $double_retractions = my $double_unretractions = 0;
172 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
173 my ($self, $cmd, $args, $info) = @_;
174
175 if ($cmd eq 'G10') {
176 $double_retractions++ if $retracted;
177 $retracted = 1;
178 } elsif ($cmd eq 'G11') {
179 $double_unretractions++ if !$retracted;
180 $retracted = 0;
181 }
182 });
183
184 is $double_retractions, 0, 'no double retractions';
185 is $double_unretractions, 0, 'no double unretractions';
186 }
187
188 {
189 my $config = Slic3r::Config->new_from_defaults;
190 $config->set('use_firmware_retraction', 1);
191 $config->set('retract_length', [0]);
192
193 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
194 my $retracted = 0;
195 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
196 my ($self, $cmd, $args, $info) = @_;
197
198 if ($cmd eq 'G10') {
199 $retracted = 1;
200 }
201 });
202
203 ok $retracted, 'retracting also when --retract-length is 0 but --use-firmware-retraction is enabled';
204 }
205
206 {
207 my $config = Slic3r::Config->new_from_defaults;
208 $config->set('start_gcode', '');
209 $config->set('retract_lift', [3, 4]);
210
211 my @lifted_at = ();
212 my $test = sub {
213 my $print = Slic3r::Test::init_print('20mm_cube', config => $config, duplicate => 2);
214 @lifted_at = ();
215 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
216 my ($self, $cmd, $args, $info) = @_;
217
218 if ($cmd eq 'G1' && $info->{dist_Z} < 0) {
219 push @lifted_at, $info->{new_Z};
220 }
221 });
222 };
223
224 $config->set('retract_lift_above', [0, 0]);
225 $config->set('retract_lift_below', [0, 0]);
226 $test->();
227 ok !!@lifted_at, 'lift takes place when above/below == 0';
228
229 $config->set('retract_lift_above', [5, 6]);
230 $config->set('retract_lift_below', [15, 13]);
231 $test->();
232 ok !!@lifted_at, 'lift takes place when above/below != 0';
233 ok !(any { $_ < $config->get_at('retract_lift_above', 0) } @lifted_at),
234 'Z is not lifted below the configured value';
235 ok !(any { $_ > $config->get_at('retract_lift_below', 0) } @lifted_at),
236 'Z is not lifted above the configured value';
237
238 # check lifting with different values for 2. extruder
239 $config->set('perimeter_extruder', 2);
240 $config->set('infill_extruder', 2);
241 $config->set('retract_lift_above', [0, 0]);
242 $config->set('retract_lift_below', [0, 0]);
243 $test->();
244 ok !!@lifted_at, 'lift takes place when above/below == 0 for 2. extruder';
245
246 $config->set('retract_lift_above', [5, 6]);
247 $config->set('retract_lift_below', [15, 13]);
248 $test->();
249 ok !!@lifted_at, 'lift takes place when above/below != 0 for 2. extruder';
250 ok !(any { $_ < $config->get_at('retract_lift_above', 1) } @lifted_at),
251 'Z is not lifted below the configured value for 2. extruder';
252 ok !(any { $_ > $config->get_at('retract_lift_below', 1) } @lifted_at),
253 'Z is not lifted above the configured value for 2. extruder';
254 }
255
256 __END__
0 use Test::More tests => 21;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first sum);
10 use Slic3r;
11 use Slic3r::Geometry qw(epsilon);
12 use Slic3r::Test;
13
14 {
15 my $config = Slic3r::Config->new_from_defaults;
16 $config->set('skirts', 0);
17 $config->set('perimeters', 0);
18 $config->set('solid_infill_speed', 99);
19 $config->set('top_solid_infill_speed', 99);
20 $config->set('bridge_speed', 72);
21 $config->set('first_layer_speed', '100%');
22 $config->set('cooling', 0);
23
24 my $test = sub {
25 my ($conf) = @_;
26 $conf ||= $config;
27
28 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
29
30 my %z = (); # Z => 1
31 my %layers_with_solid_infill = (); # Z => $count
32 my %layers_with_bridge_infill = (); # Z => $count
33 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
34 my ($self, $cmd, $args, $info) = @_;
35
36 if ($self->Z > 0) {
37 $z{ $self->Z } = 1;
38 if ($info->{extruding} && $info->{dist_XY} > 0) {
39 my $F = $args->{F} // $self->F;
40 $layers_with_solid_infill{$self->Z} = 1
41 if $F == $config->solid_infill_speed*60;
42 $layers_with_bridge_infill{$self->Z} = 1
43 if $F == $config->bridge_speed*60;
44 }
45 }
46 });
47 my @z = sort { $a <=> $b } keys %z;
48 my @shells = map $layers_with_solid_infill{$_} || $layers_with_bridge_infill{$_}, @z;
49 fail "insufficient number of bottom solid layers"
50 unless !defined(first { !$_ } @shells[0..$config->bottom_solid_layers-1]);
51 fail "excessive number of bottom solid layers"
52 unless scalar(grep $_, @shells[0 .. $#shells/2]) == $config->bottom_solid_layers;
53 fail "insufficient number of top solid layers"
54 unless !defined(first { !$_ } @shells[-$config->top_solid_layers..-1]);
55 fail "excessive number of top solid layers"
56 unless scalar(grep $_, @shells[($#shells/2)..$#shells]) == $config->top_solid_layers;
57 if ($config->top_solid_layers > 0) {
58 fail "unexpected solid infill speed in first solid layer over sparse infill"
59 if $layers_with_solid_infill{ $z[-$config->top_solid_layers] };
60 die "bridge speed not used in first solid layer over sparse infill"
61 if !$layers_with_bridge_infill{ $z[-$config->top_solid_layers] };
62 }
63 1;
64 };
65
66 $config->set('top_solid_layers', 3);
67 $config->set('bottom_solid_layers', 3);
68 ok $test->(), "proper number of shells is applied";
69
70 $config->set('top_solid_layers', 0);
71 $config->set('bottom_solid_layers', 0);
72 ok $test->(), "no shells are applied when both top and bottom are set to zero";
73
74 $config->set('perimeters', 1);
75 $config->set('top_solid_layers', 3);
76 $config->set('bottom_solid_layers', 3);
77 $config->set('fill_density', 0);
78 ok $test->(), "proper number of shells is applied even when fill density is none";
79 }
80
81 # issue #1161
82 {
83 my $config = Slic3r::Config->new_from_defaults;
84 $config->set('layer_height', 0.3);
85 $config->set('first_layer_height', '100%');
86 $config->set('bottom_solid_layers', 0);
87 $config->set('top_solid_layers', 3);
88 $config->set('cooling', 0);
89 $config->set('bridge_speed', 99);
90 $config->set('solid_infill_speed', 99);
91 $config->set('top_solid_infill_speed', 99);
92 $config->set('first_layer_speed', '100%');
93
94 my $print = Slic3r::Test::init_print('V', config => $config);
95 my %layers_with_solid_infill = (); # Z => 1
96 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
97 my ($self, $cmd, $args, $info) = @_;
98
99 $layers_with_solid_infill{$self->Z} = 1
100 if $info->{extruding} && ($args->{F} // $self->F) == $config->solid_infill_speed*60;
101 });
102 is scalar(map $layers_with_solid_infill{$_}, grep $_ <= 7.2, keys %layers_with_solid_infill), 3,
103 "correct number of top solid shells is generated in V-shaped object";
104 }
105
106 {
107 my $config = Slic3r::Config->new_from_defaults;
108 # we need to check against one perimeter because this test is calibrated
109 # (shape, extrusion_width) so that perimeters cover the bottom surfaces of
110 # their lower layer - the test checks that shells are not generated on the
111 # above layers (thus 'across' the shadow perimeter)
112 # the test is actually calibrated to leave a narrow bottom region for each
113 # layer - we test that in case of fill_density = 0 such narrow shells are
114 # discarded instead of grown
115 $config->set('perimeters', 1);
116 $config->set('fill_density', 0);
117 $config->set('cooling', 0); # prevent speed alteration
118 $config->set('first_layer_speed', '100%'); # prevent speed alteration
119 $config->set('layer_height', 0.4);
120 $config->set('first_layer_height', '100%');
121 $config->set('extrusion_width', 0.55);
122 $config->set('bottom_solid_layers', 3);
123 $config->set('top_solid_layers', 0);
124 $config->set('solid_infill_speed', 99);
125
126 my $print = Slic3r::Test::init_print('V', config => $config);
127 my %layers = (); # Z => 1
128 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
129 my ($self, $cmd, $args, $info) = @_;
130 $layers{$self->Z} = 1
131 if $info->{extruding} && ($args->{F} // $self->F) == $config->solid_infill_speed*60;
132 });
133 is scalar(keys %layers), $config->bottom_solid_layers,
134 "shells are not propagated across perimeters of the neighbor layer";
135 }
136
137 {
138 my $config = Slic3r::Config->new_from_defaults;
139 $config->set('perimeters', 3);
140 $config->set('cooling', 0); # prevent speed alteration
141 $config->set('first_layer_speed', '100%'); # prevent speed alteration
142 $config->set('layer_height', 0.4);
143 $config->set('first_layer_height', '100%');
144 $config->set('bottom_solid_layers', 3);
145 $config->set('top_solid_layers', 3);
146 $config->set('solid_infill_speed', 99);
147 $config->set('top_solid_infill_speed', 99);
148 $config->set('bridge_speed', 99);
149
150 my $print = Slic3r::Test::init_print('sloping_hole', config => $config);
151 my %solid_layers = (); # Z => 1
152 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
153 my ($self, $cmd, $args, $info) = @_;
154 $solid_layers{$self->Z} = 1
155 if $info->{extruding} && ($args->{F} // $self->F) == $config->solid_infill_speed*60;
156 });
157 is scalar(keys %solid_layers), $config->bottom_solid_layers + $config->top_solid_layers,
158 "no superfluous shells are generated";
159 }
160
161 {
162 my $config = Slic3r::Config->new_from_defaults;
163 $config->set('perimeters', 1);
164 $config->set('fill_density', 0);
165 $config->set('top_solid_layers', 0);
166 $config->set('spiral_vase', 1);
167 $config->set('bottom_solid_layers', 0);
168 $config->set('skirts', 0);
169 $config->set('first_layer_height', '100%');
170 $config->set('start_gcode', '');
171 $config->set('temperature', [200]);
172 $config->set('first_layer_temperature', [205]);
173
174 # TODO: this needs to be tested with a model with sloping edges, where starting
175 # points of each layer are not aligned - in that case we would test that no
176 # travel moves are left to move to the new starting point - in a cube, end
177 # points coincide with next layer starting points (provided there's no clipping)
178 my $test = sub {
179 my ($model_name, $description) = @_;
180 my $print = Slic3r::Test::init_print($model_name, config => $config);
181 my $travel_moves_after_first_extrusion = 0;
182 my $started_extruding = 0;
183 my $first_layer_temperature_set = 0;
184 my $temperature_set = 0;
185 my @z_steps = ();
186 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
187 my ($self, $cmd, $args, $info) = @_;
188
189 if ($cmd eq 'G1') {
190 $started_extruding = 1 if $info->{extruding};
191 push @z_steps, $info->{dist_Z}
192 if $started_extruding && $info->{dist_Z} > 0;
193 $travel_moves_after_first_extrusion++
194 if $info->{travel} && $info->{dist_XY} > 0 && $started_extruding && !exists $args->{Z};
195 } elsif ($cmd eq 'M104') {
196 $first_layer_temperature_set = 1 if $args->{S} == 205;
197 $temperature_set = 1 if $args->{S} == 200;
198 }
199 });
200
201 ok $first_layer_temperature_set, 'first layer temperature is preserved';
202 ok $temperature_set, 'temperature is preserved';
203
204 # we allow one travel move after first extrusion: i.e. when moving to the first
205 # spiral point after moving to second layer (bottom layer had loop clipping, so
206 # we're slightly distant from the starting point of the loop)
207 ok $travel_moves_after_first_extrusion <= 1, "no gaps in spiral vase ($description)";
208 ok !(grep { $_ > $config->layer_height + epsilon } @z_steps), "no gaps in Z ($description)";
209 };
210
211 $test->('20mm_cube', 'solid model');
212
213 $config->set('z_offset', -10);
214 $test->('20mm_cube', 'solid model with negative z-offset');
215
216 ### Disabled because the current unreliable medial axis code doesn't
217 ### always produce valid loops.
218 ###$test->('40x10', 'hollow model with negative z-offset');
219 }
220
221 {
222 my $config = Slic3r::Config->new_from_defaults;
223 $config->set('spiral_vase', 1);
224 $config->set('perimeters', 1);
225 $config->set('fill_density', 0);
226 $config->set('top_solid_layers', 0);
227 $config->set('bottom_solid_layers', 0);
228 $config->set('retract_layer_change', [0]);
229 $config->set('skirts', 0);
230 $config->set('first_layer_height', '100%');
231 $config->set('layer_height', 0.4);
232 $config->set('start_gcode', '');
233 $config->validate;
234
235 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
236 my $z_moves = 0;
237 my @this_layer = (); # [ dist_Z, dist_XY ], ...
238
239 my $bottom_layer_not_flat = 0;
240 my $null_z_moves_not_layer_changes = 0;
241 my $null_z_moves_not_multiples_of_layer_height = 0;
242 my $sum_of_partial_z_equals_to_layer_height = 0;
243 my $all_layer_segments_have_same_slope = 0;
244 my $horizontal_extrusions = 0;
245
246 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
247 my ($self, $cmd, $args, $info) = @_;
248
249 if ($cmd eq 'G1') {
250 if ($z_moves < 2) {
251 # skip everything up to the second Z move
252 # (i.e. start of second layer)
253 if (exists $args->{Z}) {
254 $z_moves++;
255 $bottom_layer_not_flat = 1
256 if $info->{dist_Z} > 0 && $info->{dist_Z} != $config->layer_height;
257 }
258 } elsif ($info->{dist_Z} == 0 && $args->{Z}) {
259 $null_z_moves_not_layer_changes = 1
260 if $info->{dist_XY} != 0;
261
262 # % doesn't work easily with floats
263 $null_z_moves_not_multiples_of_layer_height = 1
264 if abs(($args->{Z} / $config->layer_height) * $config->layer_height - $args->{Z}) > epsilon;
265
266 my $total_dist_XY = sum(map $_->[1], @this_layer);
267 $sum_of_partial_z_equals_to_layer_height = 1
268 if abs(sum(map $_->[0], @this_layer) - $config->layer_height) > epsilon;
269
270 foreach my $segment (@this_layer) {
271 # check that segment's dist_Z is proportioned to its dist_XY
272 $all_layer_segments_have_same_slope = 1
273 if abs($segment->[0]*$total_dist_XY/$config->layer_height - $segment->[1]) > 0.2;
274 }
275
276 @this_layer = ();
277 } elsif ($info->{extruding} && $info->{dist_XY} > 0) {
278 $horizontal_extrusions = 1
279 if $info->{dist_Z} == 0;
280 push @this_layer, [ $info->{dist_Z}, $info->{dist_XY} ];
281 }
282 }
283 });
284 ok !$bottom_layer_not_flat, 'bottom layer is flat when using spiral vase';
285 ok !$null_z_moves_not_layer_changes, 'null Z moves are layer changes';
286 ok !$null_z_moves_not_multiples_of_layer_height, 'null Z moves are multiples of layer height';
287 ok !$sum_of_partial_z_equals_to_layer_height, 'sum of partial Z increments equals to a full layer height';
288 ok !$all_layer_segments_have_same_slope, 'all layer segments have the same slope';
289 ok !$horizontal_extrusions, 'no horizontal extrusions';
290 }
291
292 {
293 my $config = Slic3r::Config->new_from_defaults;
294 $config->set('perimeters', 1);
295 $config->set('fill_density', 0);
296 $config->set('top_solid_layers', 0);
297 $config->set('spiral_vase', 1);
298 $config->set('bottom_solid_layers', 0);
299 $config->set('skirts', 0);
300 $config->set('first_layer_height', '100%');
301 $config->set('start_gcode', '');
302
303 my $print = Slic3r::Test::init_print('two_hollow_squares', config => $config);
304 my $diagonal_moves = 0;
305 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
306 my ($self, $cmd, $args, $info) = @_;
307
308 if ($cmd eq 'G1') {
309 if ($info->{extruding} && $info->{dist_XY} > 0) {
310 if ($info->{dist_Z} > 0) {
311 $diagonal_moves++;
312 }
313 }
314 }
315 });
316 is $diagonal_moves, 0, 'no spiral moves on two-island object';
317 }
318
319 __END__
0 use Test::More tests => 6;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first);
10 use Slic3r;
11 use Slic3r::Geometry qw(unscale convex_hull);
12 use Slic3r::Test;
13
14 {
15 my $config = Slic3r::Config->new_from_defaults;
16 $config->set('skirts', 1);
17 $config->set('skirt_height', 2);
18 $config->set('perimeters', 0);
19 $config->set('support_material_speed', 99);
20 $config->set('cooling', 0); # to prevent speeds to be altered
21 $config->set('first_layer_speed', '100%'); # to prevent speeds to be altered
22
23 my $test = sub {
24 my ($conf) = @_;
25 $conf ||= $config;
26
27 my $print = Slic3r::Test::init_print(['20mm_cube','20mm_cube'], config => $config);
28
29 my %layers_with_skirt = (); # Z => $count
30 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
31 my ($self, $cmd, $args, $info) = @_;
32
33 if (defined $self->Z) {
34 $layers_with_skirt{$self->Z} //= 0;
35 $layers_with_skirt{$self->Z} = 1
36 if $info->{extruding} && ($args->{F} // $self->F) == $config->support_material_speed*60;
37 }
38 });
39 fail "wrong number of layers with skirt"
40 unless (grep $_, values %layers_with_skirt) == $config->skirt_height;
41 };
42
43 ok $test->(), "skirt_height is honored when printing multiple objects too";
44 }
45
46 {
47 my $config = Slic3r::Config->new_from_defaults;
48 $config->set('skirts', 0);
49 $config->set('perimeters', 0);
50 $config->set('top_solid_layers', 0); # to prevent solid shells and their speeds
51 $config->set('bottom_solid_layers', 0); # to prevent solid shells and their speeds
52 $config->set('brim_width', 5);
53 $config->set('support_material_speed', 99);
54 $config->set('cooling', 0); # to prevent speeds to be altered
55 $config->set('first_layer_speed', '100%'); # to prevent speeds to be altered
56
57 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
58
59 my %layers_with_brim = (); # Z => $count
60 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
61 my ($self, $cmd, $args, $info) = @_;
62
63 if (defined $self->Z) {
64 $layers_with_brim{$self->Z} //= 0;
65 $layers_with_brim{$self->Z} = 1
66 if $info->{extruding} && $info->{dist_XY} > 0 && ($args->{F} // $self->F) != $config->infill_speed*60;
67 }
68 });
69 is scalar(grep $_, values %layers_with_brim), 1, "brim is generated";
70 }
71
72 {
73 my $config = Slic3r::Config->new_from_defaults;
74 $config->set('skirts', 1);
75 $config->set('brim_width', 10);
76
77 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
78 ok Slic3r::Test::gcode($print), 'successful G-code generation when skirt is smaller than brim width';
79 }
80
81 {
82 my $config = Slic3r::Config->new_from_defaults;
83 $config->set('skirts', 1);
84 $config->set('skirt_height', 0);
85
86 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
87 ok Slic3r::Test::gcode($print), 'successful G-code generation when skirt_height = 0 and skirts > 0';
88 }
89
90 {
91 my $config = Slic3r::Config->new_from_defaults;
92 $config->set('layer_height', 0.4);
93 $config->set('first_layer_height', 0.4);
94 $config->set('skirts', 1);
95 $config->set('skirt_distance', 0);
96 $config->set('support_material_speed', 99);
97 $config->set('perimeter_extruder', 1);
98 $config->set('support_material_extruder', 2);
99 $config->set('cooling', 0); # to prevent speeds to be altered
100 $config->set('first_layer_speed', '100%'); # to prevent speeds to be altered
101
102 my $print = Slic3r::Test::init_print('overhang', config => $config);
103 $print->process;
104
105 # we enable support material after skirt has been generated
106 $config->set('support_material', 1);
107 $print->apply_config($config);
108
109 my $skirt_length = 0;
110 my @extrusion_points = ();
111 my $tool = undef;
112 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
113 my ($self, $cmd, $args, $info) = @_;
114
115 if ($cmd =~ /^T(\d+)/) {
116 $tool = $1;
117 } elsif (defined $self->Z && $self->Z == $config->first_layer_height) {
118 # we're on first layer
119 if ($info->{extruding} && $info->{dist_XY} > 0) {
120 my $speed = ($args->{F} // $self->F) / 60;
121 if ($speed == $config->support_material_speed && $tool == $config->perimeter_extruder-1) {
122 # skirt uses support material speed but first object's extruder
123 $skirt_length += $info->{dist_XY};
124 } else {
125 push @extrusion_points, my $point = Slic3r::Point->new_scale($args->{X}, $args->{Y});
126 }
127 }
128 }
129 });
130 my $convex_hull = convex_hull(\@extrusion_points);
131 my $hull_perimeter = unscale($convex_hull->split_at_first_point->length);
132 ok $skirt_length > $hull_perimeter, 'skirt lenght is large enough to contain object with support';
133 }
134
135 {
136 my $config = Slic3r::Config->new_from_defaults;
137 $config->set('min_skirt_length', 20);
138 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
139 ok Slic3r::Test::gcode($print), 'no crash when using min_skirt_length';
140 }
141
142 __END__
0 use Test::More;
1 use strict;
2 use warnings;
3
4 plan skip_all => 'temporarily disabled';
5 plan tests => 16;
6
7 BEGIN {
8 use FindBin;
9 use lib "$FindBin::Bin/../lib";
10 }
11
12 # temporarily disable compilation errors due to constant not being exported anymore
13 sub Slic3r::TriangleMesh::I_B {}
14 sub Slic3r::TriangleMesh::I_FACET_EDGE {}
15 sub Slic3r::TriangleMesh::FE_BOTTOM {
16 sub Slic3r::TriangleMesh::FE_TOP {}}
17
18 use Slic3r;
19 use Slic3r::Geometry qw(X Y Z A B);
20
21 my @lines;
22 my $z = 20;
23 my @points = ([3, 4], [8, 5], [1, 9]); # XY coordinates of the facet vertices
24
25 # NOTE:
26 # the first point of the intersection lines is replaced by -1 because TriangleMesh.pm
27 # is saving memory and doesn't store point A anymore since it's not actually needed.
28
29 # We disable this test because intersect_facet() now assumes we never feed a horizontal
30 # facet to it.
31 # is_deeply lines(20, 20, 20), [
32 # [ -1, $points[1] ], # $points[0]
33 # [ -1, $points[2] ], # $points[1]
34 # [ -1, $points[0] ], # $points[2]
35 # ], 'horizontal';
36
37 is_deeply lines(22, 20, 20), [ [ -1, $points[2] ] ], 'lower edge on layer'; # $points[1]
38 is_deeply lines(20, 20, 22), [ [ -1, $points[1] ] ], 'lower edge on layer'; # $points[0]
39 is_deeply lines(20, 22, 20), [ [ -1, $points[0] ] ], 'lower edge on layer'; # $points[2]
40
41 is_deeply lines(20, 20, 10), [ [ -1, $points[0] ] ], 'upper edge on layer'; # $points[1]
42 is_deeply lines(10, 20, 20), [ [ -1, $points[1] ] ], 'upper edge on layer'; # $points[2]
43 is_deeply lines(20, 10, 20), [ [ -1, $points[2] ] ], 'upper edge on layer'; # $points[0]
44
45 is_deeply lines(20, 15, 10), [ ], 'upper vertex on layer';
46 is_deeply lines(28, 20, 30), [ ], 'lower vertex on layer';
47
48 {
49 my @z = (24, 10, 16);
50 is_deeply lines(@z), [
51 [
52 -1, # line_plane_intersection([ vertices(@z)->[0], vertices(@z)->[1] ]),
53 line_plane_intersection([ vertices(@z)->[2], vertices(@z)->[0] ]),
54 ]
55 ], 'two edges intersect';
56 }
57
58 {
59 my @z = (16, 24, 10);
60 is_deeply lines(@z), [
61 [
62 -1, # line_plane_intersection([ vertices(@z)->[1], vertices(@z)->[2] ]),
63 line_plane_intersection([ vertices(@z)->[0], vertices(@z)->[1] ]),
64 ]
65 ], 'two edges intersect';
66 }
67
68 {
69 my @z = (10, 16, 24);
70 is_deeply lines(@z), [
71 [
72 -1, # line_plane_intersection([ vertices(@z)->[2], vertices(@z)->[0] ]),
73 line_plane_intersection([ vertices(@z)->[1], vertices(@z)->[2] ]),
74 ]
75 ], 'two edges intersect';
76 }
77
78 {
79 my @z = (24, 10, 20);
80 is_deeply lines(@z), [
81 [
82 -1, # line_plane_intersection([ vertices(@z)->[0], vertices(@z)->[1] ]),
83 $points[2],
84 ]
85 ], 'one vertex on plane and one edge intersects';
86 }
87
88 {
89 my @z = (10, 20, 24);
90 is_deeply lines(@z), [
91 [
92 -1, # line_plane_intersection([ vertices(@z)->[2], vertices(@z)->[0] ]),
93 $points[1],
94 ]
95 ], 'one vertex on plane and one edge intersects';
96 }
97
98 {
99 my @z = (20, 24, 10);
100 is_deeply lines(@z), [
101 [
102 -1, # line_plane_intersection([ vertices(@z)->[1], vertices(@z)->[2] ]),
103 $points[0],
104 ]
105 ], 'one vertex on plane and one edge intersects';
106 }
107
108 my @lower = intersect(22, 20, 20);
109 my @upper = intersect(20, 20, 10);
110 is $lower[0][Slic3r::TriangleMesh::I_FACET_EDGE], Slic3r::TriangleMesh::FE_BOTTOM, 'bottom edge on layer';
111 is $upper[0][Slic3r::TriangleMesh::I_FACET_EDGE], Slic3r::TriangleMesh::FE_TOP, 'upper edge on layer';
112
113 my $mesh;
114
115 sub intersect {
116 $mesh = Slic3r::TriangleMesh->new(
117 facets => [],
118 vertices => [],
119 );
120 push @{$mesh->facets}, [ [0,0,0], @{vertices(@_)} ];
121 $mesh->analyze;
122 return map Slic3r::TriangleMesh::unpack_line($_), $mesh->intersect_facet($#{$mesh->facets}, $z);
123 }
124
125 sub vertices {
126 push @{$mesh->vertices}, map [ @{$points[$_]}, $_[$_] ], 0..2;
127 [ ($#{$mesh->vertices}-2) .. $#{$mesh->vertices} ]
128 }
129
130 sub lines {
131 my @lines = intersect(@_);
132 #$_->a->[X] = sprintf('%.0f', $_->a->[X]) for @lines;
133 #$_->a->[Y] = sprintf('%.0f', $_->a->[Y]) for @lines;
134 $_->[Slic3r::TriangleMesh::I_B][X] = sprintf('%.0f', $_->[Slic3r::TriangleMesh::I_B][X]) for @lines;
135 $_->[Slic3r::TriangleMesh::I_B][Y] = sprintf('%.0f', $_->[Slic3r::TriangleMesh::I_B][Y]) for @lines;
136 return [ map [ -1, $_->[Slic3r::TriangleMesh::I_B] ], @lines ];
137 }
138
139 sub line_plane_intersection {
140 my ($line) = @_;
141 @$line = map $mesh->vertices->[$_], @$line;
142
143 return [
144 map sprintf('%.0f', $_),
145 map +($line->[B][$_] + ($line->[A][$_] - $line->[B][$_]) * ($z - $line->[B][Z]) / ($line->[A][Z] - $line->[B][Z])),
146 (X,Y)
147 ];
148 }
149
150 __END__
0 use Test::More tests => 27;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first);
10 use Slic3r;
11 use Slic3r::Geometry qw(epsilon scale);
12 use Slic3r::Geometry::Clipper qw(diff);
13 use Slic3r::Test;
14
15 {
16 my $config = Slic3r::Config->new_from_defaults;
17 $config->set('support_material', 1);
18 my @contact_z = my @top_z = ();
19
20 my $test = sub {
21 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
22 my $flow = $print->print->objects->[0]->support_material_flow;
23 my $support = Slic3r::Print::SupportMaterial->new(
24 object_config => $print->print->objects->[0]->config,
25 print_config => $print->print->config,
26 flow => $flow,
27 interface_flow => $flow,
28 first_layer_flow => $flow,
29 );
30 my $support_z = $support->support_layers_z(\@contact_z, \@top_z, $config->layer_height);
31 my $expected_top_spacing = $support->contact_distance($config->layer_height, $config->nozzle_diameter->[0]);
32
33 is $support_z->[0], $config->first_layer_height,
34 'first layer height is honored';
35 is scalar(grep { $support_z->[$_]-$support_z->[$_-1] <= 0 } 1..$#$support_z), 0,
36 'no null or negative support layers';
37 is scalar(grep { $support_z->[$_]-$support_z->[$_-1] > $config->nozzle_diameter->[0] + epsilon } 1..$#$support_z), 0,
38 'no layers thicker than nozzle diameter';
39
40 my $wrong_top_spacing = 0;
41 foreach my $top_z (@top_z) {
42 # find layer index of this top surface
43 my $layer_id = first { abs($support_z->[$_] - $top_z) < epsilon } 0..$#$support_z;
44
45 # check that first support layer above this top surface (or the next one) is spaced with nozzle diameter
46 $wrong_top_spacing = 1
47 if ($support_z->[$layer_id+1] - $support_z->[$layer_id]) != $expected_top_spacing
48 && ($support_z->[$layer_id+2] - $support_z->[$layer_id]) != $expected_top_spacing;
49 }
50 ok !$wrong_top_spacing, 'layers above top surfaces are spaced correctly';
51 };
52
53 $config->set('layer_height', 0.2);
54 $config->set('first_layer_height', 0.3);
55 @contact_z = (1.9);
56 @top_z = (1.1);
57 $test->();
58
59 $config->set('first_layer_height', 0.4);
60 $test->();
61
62 $config->set('layer_height', $config->nozzle_diameter->[0]);
63 $test->();
64 }
65
66 {
67 my $config = Slic3r::Config->new_from_defaults;
68 $config->set('raft_layers', 3);
69 $config->set('brim_width', 0);
70 $config->set('skirts', 0);
71 $config->set('support_material_extruder', 2);
72 $config->set('support_material_interface_extruder', 2);
73 $config->set('layer_height', 0.4);
74 $config->set('first_layer_height', 0.4);
75 my $print = Slic3r::Test::init_print('overhang', config => $config);
76 ok my $gcode = Slic3r::Test::gcode($print), 'no conflict between raft/support and brim';
77
78 my $tool = 0;
79 Slic3r::GCode::Reader->new->parse($gcode, sub {
80 my ($self, $cmd, $args, $info) = @_;
81
82 if ($cmd =~ /^T(\d+)/) {
83 $tool = $1;
84 } elsif ($info->{extruding}) {
85 if ($self->Z <= ($config->raft_layers * $config->layer_height)) {
86 fail 'not extruding raft with support material extruder'
87 if $tool != ($config->support_material_extruder-1);
88 } else {
89 fail 'support material exceeds raft layers'
90 if $tool == $config->support_material_extruder-1;
91 # TODO: we should test that full support is generated when we use raft too
92 }
93 }
94 });
95 }
96
97 {
98 my $config = Slic3r::Config->new_from_defaults;
99 $config->set('skirts', 0);
100 $config->set('raft_layers', 3);
101 $config->set('support_material_pattern', 'honeycomb');
102 $config->set('support_material_extrusion_width', 0.6);
103 $config->set('first_layer_extrusion_width', '100%');
104 $config->set('bridge_speed', 99);
105 $config->set('cooling', 0); # prevent speed alteration
106 $config->set('first_layer_speed', '100%'); # prevent speed alteration
107 $config->set('start_gcode', ''); # prevent any unexpected Z move
108 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
109
110 my $layer_id = -1; # so that first Z move sets this to 0
111 my @raft = my @first_object_layer = ();
112 my %first_object_layer_speeds = (); # F => 1
113 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
114 my ($self, $cmd, $args, $info) = @_;
115
116 if ($info->{extruding} && $info->{dist_XY} > 0) {
117 if ($layer_id <= $config->raft_layers) {
118 # this is a raft layer or the first object layer
119 my $line = Slic3r::Line->new_scale([ $self->X, $self->Y ], [ $info->{new_X}, $info->{new_Y} ]);
120 my @path = @{$line->grow(scale($config->support_material_extrusion_width/2))};
121 if ($layer_id < $config->raft_layers) {
122 # this is a raft layer
123 push @raft, @path;
124 } else {
125 push @first_object_layer, @path;
126 $first_object_layer_speeds{ $args->{F} // $self->F } = 1;
127 }
128 }
129 } elsif ($cmd eq 'G1' && $info->{dist_Z} > 0) {
130 $layer_id++;
131 }
132 });
133
134 ok !@{diff(\@first_object_layer, \@raft)},
135 'first object layer is completely supported by raft';
136 is scalar(keys %first_object_layer_speeds), 1,
137 'only one speed used in first object layer';
138 ok +(keys %first_object_layer_speeds)[0] == $config->bridge_speed*60,
139 'bridge speed used in first object layer';
140 }
141
142 {
143 my $config = Slic3r::Config->new_from_defaults;
144 $config->set('skirts', 0);
145 $config->set('layer_height', 0.35);
146 $config->set('first_layer_height', 0.3);
147 $config->set('nozzle_diameter', [0.5]);
148 $config->set('support_material_extruder', 2);
149 $config->set('support_material_interface_extruder', 2);
150
151 my $test = sub {
152 my ($raft_layers) = @_;
153 $config->set('raft_layers', $raft_layers);
154 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
155 my %raft_z = (); # z => 1
156 my $tool = undef;
157 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
158 my ($self, $cmd, $args, $info) = @_;
159
160 if ($cmd =~ /^T(\d+)/) {
161 $tool = $1;
162 } elsif ($info->{extruding} && $info->{dist_XY} > 0) {
163 if ($tool == $config->support_material_extruder-1) {
164 $raft_z{$self->Z} = 1;
165 }
166 }
167 });
168
169 is scalar(keys %raft_z), $config->raft_layers, 'correct number of raft layers is generated';
170 };
171
172 $test->(2);
173 $test->(70);
174
175 $config->set('layer_height', 0.4);
176 $config->set('first_layer_height', 0.35);
177 $test->(3);
178 $test->(70);
179 }
180
181 {
182 my $config = Slic3r::Config->new_from_defaults;
183 $config->set('brim_width', 0);
184 $config->set('skirts', 0);
185 $config->set('support_material', 1);
186 $config->set('top_solid_layers', 0); # so that we don't have the internal bridge over infill
187 $config->set('bridge_speed', 99);
188 $config->set('cooling', 0);
189 $config->set('first_layer_speed', '100%');
190
191 my $test = sub {
192 my $print = Slic3r::Test::init_print('overhang', config => $config);
193
194 my $has_bridge_speed = 0;
195 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
196 my ($self, $cmd, $args, $info) = @_;
197
198 if ($info->{extruding}) {
199 if (($args->{F} // $self->F) == $config->bridge_speed*60) {
200 $has_bridge_speed = 1;
201 }
202 }
203 });
204 return $has_bridge_speed;
205 };
206
207 $config->set('support_material_contact_distance', 0.2);
208 ok $test->(), 'bridge speed is used when support_material_contact_distance > 0';
209
210 $config->set('support_material_contact_distance', 0);
211 ok !$test->(), 'bridge speed is not used when support_material_contact_distance == 0';
212
213 $config->set('raft_layers', 5);
214 $config->set('support_material_contact_distance', 0.2);
215 ok $test->(), 'bridge speed is used when raft_layers > 0 and support_material_contact_distance > 0';
216
217 $config->set('support_material_contact_distance', 0);
218 ok !$test->(), 'bridge speed is not used when raft_layers > 0 and support_material_contact_distance == 0';
219 }
220
221 {
222 my $config = Slic3r::Config->new_from_defaults;
223 $config->set('skirts', 0);
224 $config->set('start_gcode', '');
225 $config->set('raft_layers', 8);
226 $config->set('nozzle_diameter', [0.4, 1]);
227 $config->set('layer_height', 0.1);
228 $config->set('first_layer_height', 0.8);
229 $config->set('support_material_extruder', 2);
230 $config->set('support_material_interface_extruder', 2);
231 $config->set('support_material_contact_distance', 0);
232 my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
233 ok my $gcode = Slic3r::Test::gcode($print), 'first_layer_height is validated with support material extruder nozzle diameter when using raft layers';
234
235 my $tool = undef;
236 my @z = (0);
237 my %layer_heights_by_tool = (); # tool => [ lh, lh... ]
238 Slic3r::GCode::Reader->new->parse($gcode, sub {
239 my ($self, $cmd, $args, $info) = @_;
240
241 if ($cmd =~ /^T(\d+)/) {
242 $tool = $1;
243 } elsif ($cmd eq 'G1' && exists $args->{Z} && $args->{Z} != $self->Z) {
244 push @z, $args->{Z};
245 } elsif ($info->{extruding} && $info->{dist_XY} > 0) {
246 $layer_heights_by_tool{$tool} ||= [];
247 push @{ $layer_heights_by_tool{$tool} }, $z[-1] - $z[-2];
248 }
249 });
250
251 ok !defined(first { $_ > $config->nozzle_diameter->[0] + epsilon }
252 @{ $layer_heights_by_tool{$config->perimeter_extruder-1} }),
253 'no object layer is thicker than nozzle diameter';
254
255 ok !defined(first { abs($_ - $config->layer_height) < epsilon }
256 @{ $layer_heights_by_tool{$config->support_material_extruder-1} }),
257 'no support material layer is as thin as object layers';
258 }
259
260 __END__
0 use Test::More tests => 2;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use Slic3r;
10 use Slic3r::Test;
11
12 {
13 my $print = Slic3r::Test::init_print('20mm_cube');
14 eval {
15 my $fh = IO::Scalar->new(\my $gcode);
16 $print->print->export_svg(output_fh => $fh, quiet => 1);
17 $fh->close;
18 };
19 die $@ if $@;
20 ok !$@, 'successful SVG export';
21 }
22
23 {
24 my $print = Slic3r::Test::init_print('two_hollow_squares');
25 eval {
26 my $fh = IO::Scalar->new(\my $gcode);
27 $print->print->export_svg(output_fh => $fh, quiet => 1);
28 $fh->close;
29 };
30 die $@ if $@;
31 ok !$@, 'successful SVG export of object with two islands';
32 }
33
34 __END__
0 use Test::More tests => 23;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use Slic3r;
10 use List::Util qw(first sum none);
11 use Slic3r::Geometry qw(epsilon scale unscale scaled_epsilon Y);
12 use Slic3r::Test;
13
14 # Disable this until a more robust implementation is provided. It currently
15 # fails on Linux 32bit because some spurious extrudates are generated.
16 if (0) {
17 my $config = Slic3r::Config->new_from_defaults;
18 $config->set('layer_height', 0.2);
19 $config->set('first_layer_height', '100%');
20 $config->set('extrusion_width', 0.5);
21 $config->set('first_layer_extrusion_width', '200%'); # check this one too
22 $config->set('skirts', 0);
23 $config->set('thin_walls', 1);
24
25 my $print = Slic3r::Test::init_print('gt2_teeth', config => $config);
26
27 my %extrusion_paths = (); # Z => count of continuous extrusions
28 my $extruding = 0;
29 Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
30 my ($self, $cmd, $args, $info) = @_;
31
32 if ($cmd eq 'G1') {
33 if ($info->{extruding} && $info->{dist_XY}) {
34 if (!$extruding) {
35 $extrusion_paths{$self->Z} //= 0;
36 $extrusion_paths{$self->Z}++;
37 }
38 $extruding = 1;
39 } else {
40 $extruding = 0;
41 }
42 }
43 });
44
45 ok !(first { $_ != 3 } values %extrusion_paths),
46 'no superfluous thin walls are generated for toothed profile';
47 }
48
49 {
50 my $square = Slic3r::Polygon->new_scale( # ccw
51 [100, 100],
52 [200, 100],
53 [200, 200],
54 [100, 200],
55 );
56 my $hole_in_square = Slic3r::Polygon->new_scale( # cw
57 [140, 140],
58 [140, 160],
59 [160, 160],
60 [160, 140],
61 );
62 my $expolygon = Slic3r::ExPolygon->new($square, $hole_in_square);
63 my $res = $expolygon->medial_axis(scale 40, scale 0.5);
64 is scalar(@$res), 1, 'medial axis of a square shape is a single path';
65 isa_ok $res->[0], 'Slic3r::Polyline', 'medial axis result is a polyline';
66 ok $res->[0]->first_point->coincides_with($res->[0]->last_point), 'polyline forms a closed loop';
67 ok $res->[0]->length > $hole_in_square->length && $res->[0]->length < $square->length,
68 'medial axis loop has reasonable length';
69 }
70
71 {
72 my $expolygon = Slic3r::ExPolygon->new(Slic3r::Polygon->new_scale(
73 [100, 100],
74 [120, 100],
75 [120, 200],
76 [100, 200],
77 ));
78 my $res = $expolygon->medial_axis(scale 20, scale 0.5);
79 is scalar(@$res), 1, 'medial axis of a narrow rectangle is a single line';
80 ok unscale($res->[0]->length) >= (200-100 - (120-100)) - epsilon, 'medial axis has reasonable length';
81
82 $expolygon = Slic3r::ExPolygon->new(Slic3r::Polygon->new_scale(
83 [100, 100],
84 [120, 100],
85 [120, 200],
86 [105, 200], # extra point in the short side
87 [100, 200],
88 ));
89 my $res2 = $expolygon->medial_axis(scale 1, scale 0.5);
90 is scalar(@$res), 1, 'medial axis of a narrow rectangle with an extra vertex is still a single line';
91 ok unscale($res->[0]->length) >= (200-100 - (120-100)) - epsilon, 'medial axis has still a reasonable length';
92 ok !(grep { abs($_ - scale 150) < scaled_epsilon } map $_->[Y], map @$_, @$res2), "extra vertices don't influence medial axis";
93 }
94
95 {
96 my $expolygon = Slic3r::ExPolygon->new(
97 Slic3r::Polygon->new([1185881,829367],[1421988,1578184],[1722442,2303558],[2084981,2999998],[2506843,3662186],[2984809,4285086],[3515250,4863959],[4094122,5394400],[4717018,5872368],[5379210,6294226],[6075653,6656769],[6801033,6957229],[7549842,7193328],[8316383,7363266],[9094809,7465751],[9879211,7500000],[10663611,7465750],[11442038,7363265],[12208580,7193327],[12957389,6957228],[13682769,6656768],[14379209,6294227],[15041405,5872366],[15664297,5394401],[16243171,4863960],[16758641,4301424],[17251579,3662185],[17673439,3000000],[18035980,2303556],[18336441,1578177],[18572539,829368],[18750748,0],[19758422,0],[19727293,236479],[19538467,1088188],[19276136,1920196],[18942292,2726179],[18539460,3499999],[18070731,4235755],[17539650,4927877],[16950279,5571067],[16307090,6160437],[15614974,6691519],[14879209,7160248],[14105392,7563079],[13299407,7896927],[12467399,8159255],[11615691,8348082],[10750769,8461952],[9879211,8500000],[9007652,8461952],[8142729,8348082],[7291022,8159255],[6459015,7896927],[5653029,7563079],[4879210,7160247],[4143447,6691519],[3451331,6160437],[2808141,5571066],[2218773,4927878],[1687689,4235755],[1218962,3499999],[827499,2748020],[482284,1920196],[219954,1088186],[31126,236479],[0,0],[1005754,0]),
98 );
99 my $res = $expolygon->medial_axis(scale 1.324888, scale 0.25);
100 is scalar(@$res), 1, 'medial axis of a semicircumference is a single line';
101
102 # check whether turns are all CCW or all CW
103 my @lines = @{$res->[0]->lines};
104 my @angles = map { $lines[$_-1]->ccw($lines[$_]->b) } 1..$#lines;
105 ok !!(none { $_ < 0 } @angles) || (none { $_ > 0 } @angles),
106 'all medial axis segments of a semicircumference have the same orientation';
107 }
108
109 {
110 my $expolygon = Slic3r::ExPolygon->new(Slic3r::Polygon->new_scale(
111 [100, 100],
112 [120, 100],
113 [112, 200],
114 [108, 200],
115 ));
116 my $res = $expolygon->medial_axis(scale 20, scale 0.5);
117 is scalar(@$res), 1, 'medial axis of a narrow trapezoid is a single line';
118 ok unscale($res->[0]->length) >= (200-100 - (120-100)) - epsilon, 'medial axis has reasonable length';
119 }
120
121 {
122 my $expolygon = Slic3r::ExPolygon->new(Slic3r::Polygon->new_scale(
123 [100, 100],
124 [120, 100],
125 [120, 180],
126 [200, 180],
127 [200, 200],
128 [100, 200],
129 ));
130 my $res = $expolygon->medial_axis(scale 20, scale 0.5);
131 is scalar(@$res), 1, 'medial axis of a L shape is a single polyline';
132 my $len = unscale($res->[0]->length) + 20; # 20 is the thickness of the expolygon, which is subtracted from the ends
133 ok $len > 80*2 && $len < 100*2, 'medial axis has reasonable length';
134 }
135
136 {
137 my $expolygon = Slic3r::ExPolygon->new(Slic3r::Polygon->new(
138 [-203064906,-51459966],[-219312231,-51459966],[-219335477,-51459962],[-219376095,-51459962],[-219412047,-51459966],
139 [-219572094,-51459966],[-219624814,-51459962],[-219642183,-51459962],[-219656665,-51459966],[-220815482,-51459966],
140 [-220815482,-37738966],[-221117540,-37738966],[-221117540,-51762024],[-203064906,-51762024],
141 ));
142 my $polylines = $expolygon->medial_axis(819998, 102499.75);
143
144 my $perimeter = $expolygon->contour->split_at_first_point->length;
145 ok sum(map $_->length, @$polylines) > $perimeter/2/4*3, 'medial axis has a reasonable length';
146 }
147
148 {
149 my $expolygon = Slic3r::ExPolygon->new(Slic3r::Polygon->new_scale(
150 [50, 100],
151 [1000, 102],
152 [50, 104],
153 ));
154 my $res = $expolygon->medial_axis(scale 4, scale 0.5);
155 is scalar(@$res), 1, 'medial axis of a narrow triangle is a single line';
156 ok unscale($res->[0]->length) >= (200-100 - (120-100)) - epsilon, 'medial axis has reasonable length';
157 }
158
159 {
160 # GH #2474
161 my $expolygon = Slic3r::ExPolygon->new(Slic3r::Polygon->new(
162 [91294454,31032190],[11294481,31032190],[11294481,29967810],[44969182,29967810],[89909960,29967808],[91294454,29967808]
163 ));
164 my $polylines = $expolygon->medial_axis(1871238, 500000);
165 is scalar(@$polylines), 1, 'medial axis is a single polyline';
166 my $polyline = $polylines->[0];
167
168 my $expected_y = $expolygon->bounding_box->center->y; #;;
169 ok abs(sum(map $_->y, @$polyline) / @$polyline - $expected_y) < scaled_epsilon, #,,
170 'medial axis is horizontal and is centered';
171
172 # order polyline from left to right
173 $polyline->reverse if $polyline->first_point->x > $polyline->last_point->x;
174
175 my $polyline_bb = $polyline->bounding_box;
176 is $polyline->first_point->x, $polyline_bb->x_min, 'expected x_min';
177 is $polyline->last_point->x, $polyline_bb->x_max, 'expected x_max';
178
179 is_deeply [ map $_->x, @$polyline ], [ sort map $_->x, @$polyline ],
180 'medial axis is not self-overlapping';
181 }
182
183 __END__
0 use Test::More;
1 use strict;
2 use warnings;
3
4 BEGIN {
5 use FindBin;
6 use lib "$FindBin::Bin/../lib";
7 }
8
9 use List::Util qw(first);
10 use Slic3r;
11 use Slic3r::Test;
12
13 if (!$Slic3r::have_threads) {
14 plan skip_all => "this perl is not compiled with threads";
15 }
16 plan tests => 2;
17
18 {
19 my $print = Slic3r::Test::init_print('20mm_cube');
20 {
21 my $thread = threads->create(sub { Slic3r::thread_cleanup(); return 1; });
22 ok $thread->join, "print survives thread spawning";
23 }
24 }
25
26 {
27 my $thread = threads->create(sub {
28 {
29 my $print = Slic3r::Test::init_print('20mm_cube');
30 Slic3r::Test::gcode($print);
31 }
32 Slic3r::thread_cleanup();
33 return 1;
34 });
35 ok $thread->join, "process print in a separate thread";
36 }
37
38 __END__
0 #!/usr/bin/perl
1 # This script converts an AMF file to STL
2
3 use strict;
4 use warnings;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use File::Basename qw(basename);
12 use Getopt::Long qw(:config no_auto_abbrev);
13 use Slic3r;
14 $|++;
15
16 my %opt = ();
17 {
18 my %options = (
19 'help' => sub { usage() },
20 'ascii' => \$opt{ascii},
21 );
22 GetOptions(%options) or usage(1);
23 $ARGV[0] or usage(1);
24 }
25
26 {
27 my $model = Slic3r::Format::AMF->read_file($ARGV[0]);
28 my $output_file = $ARGV[0];
29 $output_file =~ s/\.amf(?:\.xml)?$/\.stl/i;
30
31 printf "Writing to %s\n", basename($output_file);
32 Slic3r::Format::STL->write_file($output_file, $model, binary => !$opt{ascii});
33 }
34
35
36 sub usage {
37 my ($exit_code) = @_;
38
39 print <<"EOF";
40 Usage: amf-to-stl.pl [ OPTIONS ] file.amf
41
42 --help Output this usage screen and exit
43 --ascii Generate ASCII STL files (default: binary)
44
45 EOF
46 exit ($exit_code || 0);
47 }
48
49 __END__
0 #!/usr/bin/perl
1 # This script extracts a full active config from a config bundle.
2 # (Often users reporting issues don't attach plain configs, but
3 # bundles...)
4
5 use strict;
6 use warnings;
7
8 BEGIN {
9 use FindBin;
10 use lib "$FindBin::Bin/../lib";
11 }
12
13 use Getopt::Long qw(:config no_auto_abbrev);
14 use Slic3r;
15 use Slic3r::Test;
16 $|++;
17
18 my %opt = ();
19 {
20 my %options = (
21 'help' => sub { usage() },
22 'output=s' => \$opt{output},
23 );
24 GetOptions(%options) or usage(1);
25 $ARGV[0] or usage(1);
26 }
27
28 ($ARGV[0] && $opt{output}) or usage(1);
29
30 {
31 my $bundle_ini = Slic3r::Config->read_ini($ARGV[0])
32 or die "Failed to read $ARGV[0]\n";
33
34 my $config_ini = { _ => {} };
35 foreach my $section (qw(print filament printer)) {
36 my $preset_name = $bundle_ini->{presets}{$section};
37 $preset_name =~ s/\.ini$//;
38 my $preset = $bundle_ini->{"$section:$preset_name"}
39 or die "Failed to find preset $preset_name in bundle\n";
40 $config_ini->{_}{$_} = $preset->{$_} for keys %$preset;
41 }
42
43 Slic3r::Config->write_ini($opt{output}, $config_ini);
44 }
45
46
47 sub usage {
48 my ($exit_code) = @_;
49
50 print <<"EOF";
51 Usage: config-bundle-to-config.pl --output config.ini bundle.ini
52 EOF
53 exit ($exit_code || 0);
54 }
55
56 __END__
0 #!/usr/bin/perl
1 # This script dumps a STL file into Perl syntax for writing tests
2 # or dumps a test model into a STL file
3
4 use strict;
5 use warnings;
6
7 BEGIN {
8 use FindBin;
9 use lib "$FindBin::Bin/../lib";
10 }
11
12 use Slic3r;
13 use Slic3r::Test;
14 $|++;
15
16 $ARGV[0] or usage(1);
17
18 if (-e $ARGV[0]) {
19 my $model = Slic3r::Format::STL->read_file($ARGV[0]);
20 $model->objects->[0]->add_instance(offset => Slic3r::Pointf->new(0,0));
21 my $mesh = $model->mesh;
22 $mesh->repair;
23 printf "VERTICES = %s\n", join ',', map "[$_->[0],$_->[1],$_->[2]]", @{$mesh->vertices};
24 printf "FACETS = %s\n", join ',', map "[$_->[0],$_->[1],$_->[2]]", @{$mesh->facets};
25 exit 0;
26 } elsif ((my $model = Slic3r::Test::model($ARGV[0]))) {
27 $ARGV[1] or die "Missing writeable destination as second argument\n";
28 Slic3r::Format::STL->write_file($ARGV[1], $model);
29 printf "Model $ARGV[0] written to $ARGV[1]\n";
30 exit 0;
31 } else {
32 die "No such model exists\n";
33 }
34
35
36 sub usage {
37 my ($exit_code) = @_;
38
39 print <<"EOF";
40 Usage: dump-stl.pl file.stl
41 dump-stl.pl modelname file.stl
42 EOF
43 exit ($exit_code || 0);
44 }
45
46 __END__
0 #!/usr/bin/perl
1 # This script generates section cuts from a given G-Code file
2
3 use strict;
4 use warnings;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Getopt::Long qw(:config no_auto_abbrev);
12 use IO::All;
13 use List::Util qw(max);
14 use Slic3r;
15 use Slic3r::Geometry qw(X Y A B X1 Y1 X2 Y2);
16 use Slic3r::Geometry::Clipper qw(JT_SQUARE);
17 use Slic3r::Test;
18 use SVG;
19
20 my %opt = (
21 layer_height => 0.2,
22 extrusion_width => 0.5,
23 scale => 30,
24 );
25 {
26 my %options = (
27 'help' => sub { usage() },
28 'layer-height|h=f' => \$opt{layer_height},
29 'extrusion-width|w=f' => \$opt{extrusion_width},
30 'scale|s=i' => \$opt{scale},
31 );
32 GetOptions(%options) or usage(1);
33 $ARGV[0] or usage(1);
34 }
35
36 {
37 my $input_file = $ARGV[0];
38 my $output_file = $input_file;
39 $output_file =~ s/\.(?:gcode|gco|ngc|g)$/.svg/;
40
41 # read paths
42 my %paths = (); # z => [ path, path ... ]
43 Slic3r::GCode::Reader->new->parse(io($input_file)->all, sub {
44 my ($self, $cmd, $args, $info) = @_;
45
46 if ($cmd eq 'G1' && $info->{extruding}) {
47 $paths{ $self->Z } ||= [];
48 push @{ $paths{ $self->Z } }, Slic3r::Line->new(
49 [ $self->X, $self->Y ],
50 [ $info->{new_X}, $info->{new_Y} ],
51 );
52 }
53 });
54
55 # calculate print extents
56 my $bounding_box = Slic3r::Geometry::BoundingBox->new_from_points([ map @$_, map @$_, values %paths ]);
57
58 # calculate section line
59 my $section_y = $bounding_box->center->[Y];
60 my $section_line = [
61 [ $bounding_box->x_min, $section_y ],
62 [ $bounding_box->x_max, $section_y ],
63 ];
64
65 # initialize output
66 my $max_z = max(keys %paths);
67 my $svg = SVG->new(
68 width => $opt{scale} * $bounding_box->size->[X],
69 height => $opt{scale} * $max_z,
70 );
71
72 # put everything into a group
73 my $g = $svg->group(style => {
74 'stroke-width' => 1,
75 'stroke' => '#444444',
76 'fill' => 'grey',
77 });
78
79 # draw paths
80 foreach my $z (sort keys %paths) {
81 foreach my $line (@{ $paths{$z} }) {
82 my @intersections = @{intersection_pl(
83 [ $section_line ],
84 [ _grow($line, $opt{extrusion_width}/2) ],
85 )};
86
87 $g->rectangle(
88 'x' => $opt{scale} * ($_->[A][X] - $bounding_box->x_min),
89 'y' => $opt{scale} * ($max_z - $z),
90 'width' => $opt{scale} * abs($_->[B][X] - $_->[A][X]),
91 'height' => $opt{scale} * $opt{layer_height},
92 'rx' => $opt{scale} * $opt{layer_height} * 0.35,
93 'ry' => $opt{scale} * $opt{layer_height} * 0.35,
94 ) for @intersections;
95 }
96 }
97
98 # write output
99 Slic3r::open(\my $fh, '>', $output_file);
100 print $fh $svg->xmlify;
101 close $fh;
102 printf "Section cut SVG written to %s\n", $output_file;
103 }
104
105 # replace built-in Line->grow method which relies on int_offset()
106 sub _grow {
107 my ($line, $distance) = @_;
108
109 my $polygon = [ @$line, CORE::reverse @$line[1..($#$line-1)] ];
110 return @{Math::Clipper::offset([$polygon], $distance, 100000, JT_SQUARE, 2)};
111 }
112
113 sub usage {
114 my ($exit_code) = @_;
115
116 print <<"EOF";
117 Usage: gcode_sectioncut.pl [ OPTIONS ] file.gcode
118
119 --help Output this usage screen and exit
120 --layer-height, -h Use the specified layer height
121 --extrusion-width, -w Use the specified extrusion width
122 --scale Factor for converting G-code units to SVG units
123
124 EOF
125 exit ($exit_code || 0);
126 }
127
128 __END__
0 // title: Layer_generator
1 // written by: Joseph Lenox
2 // Used for generating cubes oriented about the center
3 // for making simple modifier meshes.
4
5 var width = 100;
6 var layer_height = 0.3;
7 var z = 30;
8 function main() {
9
10 return cube(size=[width,width,layer_height], center=true).translate([0,0,z]);
11 }
12 function getParameterDefinitions() {
13 return [
14 { name: 'width', type: 'float', initial: 100, caption: "Width of the cube:" },
15 { name: 'layer_height', type: 'float', initial: 0.3, caption: "Layer height used:" },
16 { name: 'z', type: 'float', initial: 0, caption: "Z:" }
17 ];
18 }
0 // Used to generate a modifier mesh to do something every few layers.
1 // Load into OpenSCAD, tweak the variables below, export as STL and load as
2 // a modifier mesh. Then change settings for the modifier mesh.
3
4 // Written by Joseph Lenox; in public domain.
5
6 layer_height = 0.3; // set to layer height in slic3r for "best" results.
7 number_of_solid_layers = 2;
8 N = 4; // N > number_of_solid_layers or else the whole thing will be solid
9 model_height = 300.0;
10 model_width = 300.0; // these two should be at least as big as the model
11 model_depth = 300.0; // but bigger isn't a problem
12 initial_offset=0; // don't generate below this
13
14 position_on_bed=[0,0,0]; // in case you need to move it around
15
16 // don't touch below unless you know what you are doing.
17 simple_layers = round(model_height/layer_height);
18 translate(position_on_bed)
19 for (i = [initial_offset:N:simple_layers]) {
20 translate([0,0,i*layer_height])
21 translate([0,0,(layer_height*number_of_solid_layers)/2])
22 cube([model_width,model_depth,layer_height*number_of_solid_layers], center=true);
23 }
0 #!/usr/bin/perl
1 # This script exports model slices to a PDF file as solid fills, one per page
2
3 use strict;
4 use warnings;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Getopt::Long qw(:config no_auto_abbrev);
12 use PDF::API2;
13 use Slic3r;
14 use Slic3r::Geometry qw(scale unscale X Y);
15
16 use constant mm => 25.4 / 72;
17
18 my %opt = ();
19 {
20 my %options = (
21 'help' => sub { usage() },
22 'output|o=s' => \$opt{output_file},
23 'layer-height|h=f' => \$opt{layer_height},
24 );
25 GetOptions(%options) or usage(1);
26 $ARGV[0] or usage(1);
27 }
28
29 {
30 # prepare config
31 my $config = Slic3r::Config->new;
32 $config->set('layer_height', $opt{layer_height}) if $opt{layer_height};
33
34 # read model
35 my $model = Slic3r::Model->read_from_file(my $input_file = $ARGV[0]);
36
37 # init print object
38 my $sprint = Slic3r::Print::Simple->new(
39 print_center => [0,0],
40 );
41 $sprint->apply_config($config);
42 $sprint->set_model($model);
43 my $print = $sprint->_print;
44
45 # compute sizes
46 my $bb = $print->bounding_box;
47 my $size = $bb->size;
48 my $mediabox = [ map unscale($_)/mm, @{$size} ];
49
50 # init PDF
51 my $pdf = PDF::API2->new();
52 my $color = $pdf->colorspace_separation('RDG_GLOSS', 'darkblue');
53
54 # slice and build output geometry
55 $_->slice for @{$print->objects};
56 foreach my $object (@{ $print->objects }) {
57 my $shift = $object->_shifted_copies->[0];
58 $shift->translate(map $_/2, @$size);
59
60 foreach my $layer (@{ $object->layers }) {
61 my $page = $pdf->page();
62 $page->mediabox(@$mediabox);
63 my $content = $page->gfx;
64 $content->fillcolor($color, 1);
65
66 foreach my $expolygon (@{$layer->slices}) {
67 $expolygon = $expolygon->clone;
68 $expolygon->translate(@$shift);
69 $content->poly(map { unscale($_->x)/mm, unscale($_->y)/mm } @{$expolygon->contour}); #)
70 $content->close;
71 foreach my $hole (@{$expolygon->holes}) {
72 $content->poly(map { unscale($_->x)/mm, unscale($_->y)/mm } @$hole); #)
73 $content->close;
74 }
75 $content->fill; # non-zero by default
76 }
77 }
78 }
79
80 # write output file
81 my $output_file = $opt{output_file};
82 if (!defined $output_file) {
83 $output_file = $input_file;
84 $output_file =~ s/\.(?:stl)$/.pdf/i;
85 }
86 $pdf->saveas($output_file);
87 printf "PDF file written to %s\n", $output_file;
88 }
89
90 sub usage {
91 my ($exit_code) = @_;
92
93 print <<"EOF";
94 Usage: pdf-slices.pl [ OPTIONS ] file.stl
95
96 --help Output this usage screen and exit
97 --output, -o Write to the specified file
98 --layer-height, -h Use the specified layer height
99
100 EOF
101 exit ($exit_code || 0);
102 }
103
104 __END__
0 #!/usr/bin/perl -i~
1
2 use strict;
3 use warnings;
4
5 my %lastpos = (X => 10000, Y => 10000, Z => 10000, E => 10000, F => 10000);
6 my %pos = (X => 0, Y => 0, Z => 0, E => 0, F => 0);
7
8 my $mindist = 0.33;
9
10 my $mindistz = 0.005;
11
12 my $mindistsq = $mindist * $mindist;
13
14 sub dist {
15 my $sq = 0;
16 for (qw/X Y Z E/) {
17 $sq += ($pos{$_} - $lastpos{$_}) ** 2;
18 }
19 return $sq;
20 }
21
22 while (<>) {
23 if (m#\bG[01]\b#) {
24 while (m#([XYZEF])(\d+(\.\d+)?)#gi) {
25 $pos{uc $1} = $2;
26 }
27 if (
28 (
29 /X/ &&
30 /Y/ &&
31 (dist() >= $mindistsq)
32 ) ||
33 (abs($pos{Z} - $lastpos{Z}) > $mindistz) ||
34 (!/X/ || !/Y/)
35 ) {
36 print;
37 %lastpos = %pos;
38 }
39 elsif (($pos{F} - $lastpos{F}) != 0) {
40 printf "G1 F%s\n", $pos{F};
41 $lastpos{F} = $pos{F};
42 }
43 }
44 else {
45 if (m#\bG92\b#) {
46 while (m#([XYZEF])(\d+(\.\d+)?)#gi) {
47 $lastpos{uc $1} = $2;
48 }
49 }
50 print;
51 }
52 }
0 #!/usr/bin/python
1 import sys
2 import re
3
4 sea = re.compile("M106 S[1-9]+[0-9]*")
5 rep = re.compile("M106 S255\n\g<0>")
6 out = open(sys.argv[1]+"_fixed", 'w')
7 with open(sys.argv[1]) as f:
8 for r in f:
9 if re.search(sea, r) is not None:
10 out.write(re.sub(sea,"M106 S255\n\g<0>",r))
11 else:
12 out.write(r)
0 #!/usr/bin/perl -i
1 #
2 # Post-processing script for adding weight and cost of required
3 # filament to G-code output.
4
5 use strict;
6 use warnings;
7
8 # example densities, adjust according to filament specifications
9 use constant PLA_P => 1.25; # g/cm3
10 use constant ABS_P => 1.05; # g/cm3
11
12 # example costs, adjust according to filament prices
13 use constant PLA_PRICE => 0.05; # EUR/g
14 use constant ABS_PRICE => 0.02; # EUR/g
15 use constant CURRENCY => "EUR";
16
17 while (<>) {
18 if (/^(;\s+filament\s+used\s+=\s.*\((\d+(?:\.\d+)?)cm3)\)/) {
19 my $pla_weight = $2 * PLA_P;
20 my $abs_weight = $2 * ABS_P;
21
22 my $pla_costs = $pla_weight * PLA_PRICE;
23 my $abs_costs = $abs_weight * ABS_PRICE;
24
25 printf "%s or %.2fg PLA/%.2fg ABS)\n", $1, $pla_weight, $abs_weight;
26 printf "; costs = %s %.2f (PLA), %s %.2f (ABS)\n", CURRENCY, $pla_costs, CURRENCY, $abs_costs;
27 } else {
28 print;
29 }
30 }
0 #!/usr/bin/perl -i
1
2 #
3 # Post-processing script for calculating flow rate for each move
4
5 use strict;
6 use warnings;
7
8 use constant PI => 3.141592653589793238;
9 my @filament_diameter = split /,/, $ENV{SLIC3R_FILAMENT_DIAMETER};
10
11 my $E = 0;
12 my $T = 0;
13 my ($X, $Y, $F);
14 while (<>) {
15 if (/^G1.*? F([0-9.]+)/) {
16 $F = $1;
17 }
18 if (/^G1 X([0-9.]+) Y([0-9.]+).*? E([0-9.]+)/) {
19 my ($x, $y, $e) = ($1, $2, $3);
20 my $e_length = $e - $E;
21 if ($e_length > 0 && defined $X && defined $Y) {
22 my $dist = sqrt( (($x-$X)**2) + (($y-$Y)**2) );
23 if ($dist > 0) {
24 my $mm_per_mm = $e_length / $dist; # dE/dXY
25 my $mm3_per_mm = ($filament_diameter[$T] ** 2) * PI/4 * $mm_per_mm;
26 my $vol_speed = $F/60 * $mm3_per_mm;
27 my $comment = sprintf ' ; dXY = %.3fmm ; dE = %.5fmm ; dE/XY = %.5fmm/mm; volspeed = %.5fmm^3/sec',
28 $dist, $e_length, $mm_per_mm, $vol_speed;
29 s/(\R+)/$comment$1/;
30 }
31 }
32 $E = $e;
33 $X = $x;
34 $Y = $y;
35 }
36 if (/^G1 X([0-9.]+) Y([0-9.]+)/) {
37 $X = $1;
38 $Y = $2;
39 }
40 if (/^G1.*? E([0-9.]+)/) {
41 $E = $1;
42 }
43 if (/^G92 E0/) {
44 $E = 0;
45 }
46 if (/^T(\d+)/) {
47 $T = $1;
48 }
49 print;
50 }
51
52 __END__
0 #!/usr/bin/perl
1 #
2 # Example post-processing script for sending a Prowl notification upon
3 # completion. See http://www.prowlapp.com/ for more info.
4
5 use strict;
6 use warnings;
7
8 use File::Basename qw(basename);
9 use WebService::Prowl;
10
11 # set your Prowl API key here
12 my $apikey = '';
13
14 my $file = basename $ARGV[0];
15 my $prowl = WebService::Prowl->new(apikey => $apikey);
16 my %options = (application => 'Slic3r',
17 event =>'Slicing Done!',
18 description => "$file was successfully generated");
19 printf STDERR "Error sending Prowl notification: %s\n", $prowl->error
20 unless $prowl->add(%options);
0 #!/usr/bin/perl -i
1
2 use strict;
3 use warnings;
4
5 my $z = 0;
6
7 # read stdin and any/all files passed as parameters one line at a time
8 while (<>) {
9 # if we find a Z word, save it
10 $z = $1 if /Z\s*(\d+(\.\d+)?)/;
11
12 # if we don't have Z, but we do have X and Y
13 if (!/Z/ && /X/ && /Y/ && $z > 0) {
14 # chop off the end of the line (incl. comments), saving chopped section in $1
15 s/\s*([\r\n\;\(].*)/" Z$z $1"/es;
16 # print start of line, insert our Z value then re-add the chopped end of line
17 # print "$_ Z$z $1";
18 }
19 #else {
20 # nothing interesting, print line as-is
21 print or die $!;
22 #}
23 }
0 #!/usr/bin/env perl
1
2 use strict;
3 use warnings;
4
5 BEGIN {
6 use FindBin;
7 use lib "$FindBin::Bin/../lib";
8 }
9
10 use Slic3r;
11
12 die "Usage: send-gcode.pl SERIALPORT BAUDRATE GCODE_FILE\n"
13 if @ARGV != 3;
14
15 my $serial = Slic3r::GCode::Sender->new($ARGV[0], $ARGV[1]);
16 1 until $serial->is_connected;
17 print "Connected to printer\n";
18
19 {
20 local $/ = "\n";
21 Slic3r::open(\my $fh, '<', $ARGV[2])
22 or die "Unable to open $ARGV[2]: $!\n";
23 binmode $fh, ':utf8';
24 while (<$fh>) {
25 $serial->send($_);
26 }
27 close $fh;
28 }
29
30 while ((my $queue_size = $serial->queue_size) > 0) {
31 printf "Queue size: %d\n", $queue_size;
32 }
33 $serial->disconnect;
34
35 __END__
0 #!/usr/bin/perl
1 # This script splits a STL plate into individual files
2
3 use strict;
4 use warnings;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use File::Basename qw(basename);
12 use Getopt::Long qw(:config no_auto_abbrev);
13 use Slic3r;
14 $|++;
15
16 my %opt = ();
17 {
18 my %options = (
19 'help' => sub { usage() },
20 'ascii' => \$opt{ascii},
21 );
22 GetOptions(%options) or usage(1);
23 $ARGV[0] or usage(1);
24 }
25
26 {
27 my $model = Slic3r::Format::STL->read_file($ARGV[0]);
28 my $basename = $ARGV[0];
29 $basename =~ s/\.stl$//i;
30
31 my $part_count = 0;
32 my $mesh = $model->objects->[0]->volumes->[0]->mesh;
33 foreach my $new_mesh (@{$mesh->split}) {
34 $new_mesh->repair;
35
36 my $new_model = Slic3r::Model->new;
37 $new_model
38 ->add_object()
39 ->add_volume(mesh => $new_mesh);
40
41 $new_model->add_default_instances;
42
43 my $output_file = sprintf '%s_%02d.stl', $basename, ++$part_count;
44 printf "Writing to %s\n", basename($output_file);
45 Slic3r::Format::STL->write_file($output_file, $new_model, binary => !$opt{ascii});
46 }
47 }
48
49
50 sub usage {
51 my ($exit_code) = @_;
52
53 print <<"EOF";
54 Usage: split_stl.pl [ OPTIONS ] file.stl
55
56 --help Output this usage screen and exit
57 --ascii Generate ASCII STL files (default: binary)
58
59 EOF
60 exit ($exit_code || 0);
61 }
62
63 __END__
0 #!/usr/bin/perl
1 # This script converts a STL file to AMF
2
3 use strict;
4 use warnings;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use File::Basename qw(basename);
12 use Getopt::Long qw(:config no_auto_abbrev);
13 use Slic3r;
14 $|++;
15
16 my %opt = ();
17 {
18 my %options = (
19 'help' => sub { usage() },
20 'distinct-materials' => \$opt{distinct_materials},
21 );
22 GetOptions(%options) or usage(1);
23 $ARGV[0] or usage(1);
24 }
25
26 {
27 my @models = map Slic3r::Format::STL->read_file($_), @ARGV;
28 my $output_file = $ARGV[0];
29 $output_file =~ s/\.stl$/.amf.xml/i;
30
31 my $new_model = Slic3r::Model->new;
32
33 if ($opt{distinct_materials} && @models > 1) {
34 my $new_object = $new_model->add_object;
35 for my $m (0 .. $#models) {
36 my $model = $models[$m];
37 $new_model->set_material($m, { Name => basename($ARGV[$m]) });
38 $new_object->add_volume(
39 material_id => $m,
40 facets => $model->objects->[0]->volumes->[0]->facets,
41 vertices => $model->objects->[0]->vertices,
42 );
43 }
44 } else {
45 foreach my $model (@models) {
46 $new_model->add_object(
47 vertices => $model->objects->[0]->vertices,
48 )->add_volume(
49 facets => $model->objects->[0]->volumes->[0]->facets,
50 );
51 }
52 }
53
54 printf "Writing to %s\n", basename($output_file);
55 Slic3r::Format::AMF->write_file($output_file, $new_model);
56 }
57
58
59 sub usage {
60 my ($exit_code) = @_;
61
62 print <<"EOF";
63 Usage: amf-to-stl.pl [ OPTIONS ] file.stl [ file2.stl [ file3.stl ] ]
64
65 --help Output this usage screen and exit
66 --distinct-materials Assign each STL file to a different material
67
68 EOF
69 exit ($exit_code || 0);
70 }
71
72 __END__
0 #!/usr/bin/perl
1 # This script displays 3D preview of a mesh
2
3 use strict;
4 use warnings;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Getopt::Long qw(:config no_auto_abbrev);
12 use Slic3r;
13 use Slic3r::GUI;
14 use Slic3r::GUI::3DScene;
15 $|++;
16
17 my %opt = ();
18 {
19 my %options = (
20 'help' => sub { usage() },
21 'cut=f' => \$opt{cut},
22 'enable-moving' => \$opt{enable_moving},
23 );
24 GetOptions(%options) or usage(1);
25 $ARGV[0] or usage(1);
26 }
27
28 {
29 my $model = Slic3r::Model->read_from_file($ARGV[0]);
30
31 # make sure all objects have at least one defined instance
32 $model->add_default_instances;
33 $_->center_around_origin for @{$model->objects}; # and align to Z = 0
34
35 my $app = Slic3r::ViewMesh->new;
36 $app->{canvas}->enable_picking(1);
37 $app->{canvas}->enable_moving($opt{enable_moving});
38 $app->{canvas}->load_object($model, 0);
39 $app->{canvas}->set_auto_bed_shape;
40 $app->{canvas}->zoom_to_volumes;
41 $app->{canvas}->SetCuttingPlane($opt{cut}) if defined $opt{cut};
42 $app->MainLoop;
43 }
44
45
46 sub usage {
47 my ($exit_code) = @_;
48
49 print <<"EOF";
50 Usage: view-mesh.pl [ OPTIONS ] file.stl
51
52 --help Output this usage screen and exit
53 --cut Z Display the cutting plane at the given Z
54
55 EOF
56 exit ($exit_code || 0);
57 }
58
59 package Slic3r::ViewMesh;
60 use Wx qw(:sizer);
61 use base qw(Wx::App);
62
63 sub OnInit {
64 my $self = shift;
65
66 my $frame = Wx::Frame->new(undef, -1, 'Mesh Viewer', [-1, -1], [500, 400]);
67 my $panel = Wx::Panel->new($frame, -1);
68
69 $self->{canvas} = Slic3r::GUI::3DScene->new($panel);
70
71 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
72 $sizer->Add($self->{canvas}, 1, wxEXPAND, 0);
73 $panel->SetSizer($sizer);
74 $sizer->SetSizeHints($panel);
75
76 $frame->Show(1);
77 }
78
79 __END__
0 #!/usr/bin/perl
1 # This script displays 3D preview of a mesh
2
3 use strict;
4 use warnings;
5
6 BEGIN {
7 use FindBin;
8 use lib "$FindBin::Bin/../lib";
9 }
10
11 use Getopt::Long qw(:config no_auto_abbrev);
12 use Slic3r;
13 use Slic3r::GUI;
14 use Slic3r::GUI::3DScene;
15 $|++;
16
17 my %opt = ();
18 {
19 my %options = (
20 'help' => sub { usage() },
21 'load=s' => \$opt{load},
22 '3D' => \$opt{d3},
23 'duplicate=i' => \$opt{duplicate},
24 );
25 GetOptions(%options) or usage(1);
26 $ARGV[0] or usage(1);
27 }
28
29 {
30 # load model
31 my $model = Slic3r::Model->read_from_file($ARGV[0]);
32
33 # load config
34 my $config = Slic3r::Config->new_from_defaults;
35 if ($opt{load}) {
36 $config->apply(Slic3r::Config->load($opt{load}));
37 }
38
39 # init print
40 my $sprint = Slic3r::Print::Simple->new;
41 $sprint->duplicate($opt{duplicate} // 1);
42 $sprint->apply_config($config);
43 $sprint->set_model($model);
44 $sprint->process;
45
46 # visualize toolpaths
47 $Slic3r::ViewToolpaths::print = $sprint->_print;
48 $Slic3r::ViewToolpaths::d3 = $opt{d3};
49 my $app = Slic3r::ViewToolpaths->new;
50 $app->MainLoop;
51 }
52
53
54 sub usage {
55 my ($exit_code) = @_;
56
57 print <<"EOF";
58 Usage: view-toolpaths.pl [ OPTIONS ] file.stl
59
60 --help Output this usage screen and exit
61 --load CONFIG Loads the supplied config file
62
63 EOF
64 exit ($exit_code || 0);
65 }
66
67
68 package Slic3r::ViewToolpaths;
69 use Wx qw(:sizer);
70 use base qw(Wx::App Class::Accessor);
71
72 our $print;
73 our $d3;
74
75 sub OnInit {
76 my $self = shift;
77
78 my $frame = Wx::Frame->new(undef, -1, 'Toolpaths', [-1, -1], [500, 500]);
79 my $panel = Wx::Panel->new($frame, -1);
80
81 my $canvas;
82 if ($d3) {
83 $canvas = Slic3r::GUI::3DScene->new($panel);
84 $canvas->set_bed_shape($print->config->bed_shape);
85 $canvas->load_print_toolpaths($print);
86
87 foreach my $object (@{$print->objects}) {
88 #$canvas->load_print_object_slices($object);
89 $canvas->load_print_object_toolpaths($object);
90 #$canvas->load_object($object->model_object);
91 }
92 $canvas->zoom_to_volumes;
93 } else {
94 $canvas = Slic3r::GUI::Plater::2DToolpaths->new($panel, $print);
95 }
96
97 my $sizer = Wx::BoxSizer->new(wxVERTICAL);
98 $sizer->Add($canvas, 1, wxEXPAND, 0);
99 $panel->SetSizer($sizer);
100
101 $frame->Show(1);
102 }
103
104 __END__
0 #!/usr/bin/perl
1 # This script exports experimental G-code for wireframe printing
2 # (inspired by the brilliant WirePrint concept)
3
4 use strict;
5 use warnings;
6
7 BEGIN {
8 use FindBin;
9 use lib "$FindBin::Bin/../lib";
10 }
11
12 use Getopt::Long qw(:config no_auto_abbrev);
13 use Slic3r;
14 use Slic3r::ExtrusionPath ':roles';
15 use Slic3r::Geometry qw(scale unscale X Y PI);
16
17 my %opt = (
18 step_height => 5,
19 nozzle_angle => 30,
20 nozzle_width => 10,
21 first_layer_height => 0.3,
22 );
23 {
24 my %options = (
25 'help' => sub { usage() },
26 'output|o=s' => \$opt{output_file},
27 'step-height|h=f' => \$opt{step_height},
28 'nozzle-angle|a=f' => \$opt{nozzle_angle},
29 'nozzle-width|w=f' => \$opt{nozzle_width},
30 'first-layer-height=f' => \$opt{first_layer_height},
31 );
32 GetOptions(%options) or usage(1);
33 $opt{output_file} or usage(1);
34 $ARGV[0] or usage(1);
35 }
36
37 {
38 # load model
39 my $model = Slic3r::Model->read_from_file($ARGV[0]);
40 $model->add_default_instances;
41 $model->center_instances_around_point(Slic3r::Pointf->new(100,100));
42 my $mesh = $model->mesh;
43 $mesh->translate(0, 0, -$mesh->bounding_box->z_min);
44
45 # get slices
46 my @z = ();
47 my $z_max = $mesh->bounding_box->z_max;
48 for (my $z = $opt{first_layer_height}; $z <= $z_max; $z += $opt{step_height}) {
49 push @z, $z;
50 }
51 my @slices = @{$mesh->slice(\@z)};
52
53 my $flow = Slic3r::Flow->new(
54 width => 0.35,
55 height => 0.35,
56 nozzle_diameter => 0.35,
57 bridge => 1,
58 );
59
60 my $config = Slic3r::Config::Print->new;
61 $config->set('gcode_comments', 1);
62
63 open my $fh, '>', $opt{output_file};
64 my $gcodegen = Slic3r::GCode->new(
65 enable_loop_clipping => 0, # better bonding
66 );
67 $gcodegen->apply_print_config($config);
68 $gcodegen->set_extruders([0]);
69 print $fh $gcodegen->set_extruder(0);
70 print $fh $gcodegen->writer->preamble;
71
72 my $e = $gcodegen->writer->extruder->e_per_mm3 * $flow->mm3_per_mm;
73
74 foreach my $layer_id (0..$#z) {
75 my $z = $z[$layer_id];
76
77 foreach my $island (@{$slices[$layer_id]}) {
78 foreach my $polygon (@$island) {
79 if ($layer_id > 0) {
80 # find the lower polygon that we want to connect to this one
81 my $lower = $slices[$layer_id-1]->[0]->contour; # 't was easy, wasn't it?
82 my $lower_z = $z[$layer_id-1];
83
84 {
85 my @points = ();
86
87 # keep all points with strong angles
88 {
89 my @pp = @$polygon;
90 foreach my $i (0..$#pp) {
91 push @points, $pp[$i-1] if abs($pp[$i-1]->ccw_angle($pp[$i-2], $pp[$i]) - PI) > PI/3;
92 }
93 }
94
95 $polygon = Slic3r::Polygon->new(@points);
96 }
97 #$polygon = Slic3r::Polygon->new(@{$polygon->split_at_first_point->equally_spaced_points(scale $opt{nozzle_width})});
98
99 # find vertical lines
100 my @vertical = ();
101 foreach my $point (@{$polygon}) {
102 push @vertical, Slic3r::Line->new($point->projection_onto_polygon($lower), $point);
103 }
104
105 next if !@vertical;
106
107 my @points = ();
108 foreach my $line (@vertical) {
109 push @points, Slic3r::Pointf3->new(
110 unscale($line->a->x),
111 unscale($line->a->y), #))
112 $lower_z,
113 );
114 push @points, Slic3r::Pointf3->new(
115 unscale($line->b->x),
116 unscale($line->b->y), #))
117 $z,
118 );
119 }
120
121 # reappend first point as destination of the last diagonal segment
122 push @points, Slic3r::Pointf3->new(
123 unscale($vertical[0]->a->x),
124 unscale($vertical[0]->a->y), #))
125 $lower_z,
126 );
127
128 # move to the position of the first vertical line
129 print $fh $gcodegen->writer->travel_to_xyz(shift @points);
130
131 # extrude segments
132 foreach my $point (@points) {
133 print $fh $gcodegen->writer->extrude_to_xyz($point, $e * $gcodegen->writer->get_position->distance_to($point));
134 }
135 }
136 }
137
138 print $fh $gcodegen->writer->travel_to_z($z);
139 foreach my $polygon (@$island) {
140 #my $polyline = $polygon->split_at_vertex(Slic3r::Point->new_scale(@{$gcodegen->writer->get_position}[0,1]));
141 my $polyline = $polygon->split_at_first_point;
142 print $fh $gcodegen->writer->travel_to_xy(Slic3r::Pointf->new_unscale(@{ $polyline->first_point }), "move to first contour point");
143
144 foreach my $line (@{$polyline->lines}) {
145 my $point = Slic3r::Pointf->new_unscale(@{ $line->b });
146 print $fh $gcodegen->writer->extrude_to_xy($point, $e * unscale($line->length));
147 }
148 }
149 }
150 }
151
152 close $fh;
153 }
154
155 sub usage {
156 my ($exit_code) = @_;
157
158 print <<"EOF";
159 Usage: wireframe.pl [ OPTIONS ] file.stl
160
161 --help Output this usage screen and exit
162 --output, -o Write to the specified file
163 --step-height, -h Use the specified step height
164 --nozzle-angle, -a Max nozzle angle
165 --nozzle-width, -w External nozzle diameter
166
167 EOF
168 exit ($exit_code || 0);
169 }
170
171 __END__
0 # ZSH Completions for Slic3r
1
2 To enable zsh(1) completions for Slic3r, add the following to your
3 ``~/.zshrc`` file, replacing ``/path/to/Slic3r/`` with the actual path
4 to your Slic3r directory:
5
6 typeset -U fpath
7
8 if [[ -d /path/to/Slic3r/utils/zsh/functions ]]; then
9 fpath=(/path/to/Slic3r/utils/zsh/functions $fpath)
10 fi
11
12 autoload -Uz compinit
13 compinit
14 zstyle ':completion:*' verbose true
15 zstyle ':completion:*:descriptions' format '%B%d%b'
16 zstyle ':completion:*:messages' format '%d'
17 zstyle ':completion:*:warnings' format 'No matches for %d'
18 zstyle ':completion:*' group-name '%d'
19
20 See the zshcompsys(1) man page for further details.
0 #compdef -P slic3r(|.pl|.exe)
1 #
2 # Slic3r completions configuration for zsh(1).
3
4 # Currently undocumented options:
5 # --debug, --gui, --ignore-nonexistent-config
6 # --acceleration, --perimeter-acceleration, --infill-acceleration
7
8 _arguments -S \
9 '(- *)--help[output usage screen and exit]' \
10 '(- *)--version[output the version of Slic3r and exit]' \
11 '--save[save configuration to file]:config output file:_files -g "*.(#i)ini(-.)"' \
12 '*--load[load configuration from file]:config input file:_files -g "*.(#i)ini(-.)"' \
13 '(--output -o)'{--output,-o}'[specify output file]:output file:_files -g "*.(#i)(gcode|svg)(-.)"' \
14 '(--threads -j)'{--threads,-j}'[specify number of threads to use]:number of threads' \
15 \
16 '--output-filename-format[specify output filename format]:output filename format' \
17 '*--post-process[specify post-processing script]:post-processing script file:_files' \
18 '--export-svg[export SVG containing slices instead of G-code]' \
19 '(--merge -m)'{--merge,-m}'[merge multiple input files into a single print]' \
20 \
21 '*--nozzle-diameter[specify nozzle diameter]:nozzle diameter in mm' \
22 '--print-center[specify print center coordinates]:print center coordinates in mm,mm' \
23 '--z-offset[specify Z-axis offset]:Z-axis offset in mm' \
24 '--gcode-flavor[specify the type of G-code to generate]:G-code flavor:(reprap teacup makerware sailfish mach3 machinekit no-extrusion)' \
25 '(--use-relative-e-distances --no-use-relative-e-distances)'--{no-,}use-relative-e-distances'[disable/enable relative E values]' \
26 '--extrusion-axis[specify letter associated with the extrusion axis]:extrusion axis letter' \
27 '(--gcode-arcs --no-gcode-arcs)'--{no-,}gcode-arcs'[disable/enable G2/G3 commands for native arcs]' \
28 '(--gcode-comments --no-gcode-comments)'--{no-,}gcode-comments'[disable/enable verbose G-code comments]' \
29 \
30 '*--filament-diameter[specify raw filament diameter]:raw filament diameter in mm' \
31 '*--extrusion-multiplier[specify multiplier for amount of plastic extruded]:extrusion multiplier' \
32 '*--temperature[specify extrusion temperature]:extrusion temperature in Celsius' \
33 '*--first-layer-temperature[specify extrusion temperature for the first layer]:first layer extrusion temperature in Celsius' \
34 '--bed-temperature[specify heated bed temperature]:heated bed temperature in Celsius' \
35 '--first-layer-bed-temperature[specify heated bed temperature for the first layer]:first layer heated bed temperature in Celsius' \
36 \
37 '--perimeter-extruder[specify extruder to use for printing perimeters]:extruder number' \
38 '--infill-extruder[specify extruder to use for printing infill]:extruder number' \
39 '--support-material-extruder[specify extruder to use for printing support material]:extruder number' \
40 \
41 '--travel-speed[specify speed of non-print moves]:speed of non-print moves in mm/s' \
42 '--perimeter-speed[specify speed of print moves for perimeters]:speed of print moves for perimeters in mm/s' \
43 '--external-perimeter-speed[specify speed of print moves for external perimeters]:speed of print moves for external perimeters in mm/s or % of --perimeter-speed' \
44 '--small-perimeter-speed[specify speed of print moves for small perimeters]:speed of print moves for small perimeters in mm/s or % of --perimeter-speed' \
45 '--infill-speed[specify speed of infill print moves]:speed of infill print moves in mm/s' \
46 '--solid-infill-speed[specify speed of solid surface print moves]:speed of solid surface print moves in mm/s or % of --infill-speed' \
47 '--top-solid-infill-speed[specify speed of top surface print moves]:speed of top surface print moves in mm/s or % of --solid-infill-speed' \
48 '--bridge-speed[specify speed of bridge print moves]:speed of bridge print moves in mm/s' \
49 '--first-layer-speed[specify speed of bottom layer print moves]:speed of bottom layer print moves in mm/s or % of normal speeds' \
50 \
51 '--layer-height[specify layer height]:layer height in mm' \
52 '--first-layer-height[specify layer height for bottom layer]:layer height for bottom layer in mm or % of --layer-height' \
53 '--infill-every-layers[specify infill for every N layers]:N layers' \
54 \
55 '--perimeters[specify number of perimeters]:number of perimeters' \
56 '--solid-layers[specify number of solid layers to do for top/bottom surfaces]:number of layers for top/bottom surfaces' \
57 '--fill-density[specify infill density]:infill density in percent' \
58 '--fill-angle[specify infill angle]:infill angle in degrees' \
59 '--fill-pattern[specify pattern used for infill]:infill pattern:(rectilinear line concentric honeycomb hilbertcurve archimedeanchords octagramspiral)' \
60 '--solid-fill-pattern[specify pattern used for solid layers]:solid fill pattern:(rectilinear concentric hilbertcurve archimedeanchords octagramspiral)' \
61 '--start-gcode[load initial G-code from file]:start G-code file:_files -g "*.(#i)(gcode)(-.)"' \
62 '--end-gcode[load final G-code from file]:end G-code file:_files -g "*.(#i)(gcode)(-.)"' \
63 '--layer-gcode[load layer-change G-code from file]:layer-change G-code file:_files -g "*.(#i)(gcode)(-.)"' \
64 '(--support-material --no-support-material)'--{no-,}support-material'[disable/enable generation of support material for overhangs]' \
65 '--support-material-threshold[specify support material threshold]:maximum slope angle for generating support material' \
66 '--support-material-pattern[specify pattern used for support material]:support material pattern:(rectilinear honeycomb)' \
67 '--support-material-spacing[specify spacing between support material lines]:spacing between support material lines in mm' \
68 '--support-material-angle[specify support material angle]:support material angle in degrees' \
69 '(--randomize-start --no-randomize-start)'--{no-,}randomize-start'[disable/enable randomization of starting point across layers]' \
70 '(--extra-perimeters --no-extra-perimeters)'--{no-,}extra-perimeters'[disable/enable generation of extra perimeters when needed]' \
71 \
72 '--retract-length[specify filament retraction length when pausing extrusion]:filament retraction length in mm' \
73 '--retract-speed[specify filament retraction speed]:filament retraction speed in mm/s' \
74 '--retract-restart-extra[specify filament length to extrude for compensating retraction]: filament lenght in mm' \
75 '--retract-before-travel[specify minimum travel length for activating retraction]:minimum travel length for activating retraction in mm' \
76 '--retract-lift[specify Z-axis lift for use when retracting]:Z-axis lift in mm' \
77 \
78 '(--cooling --no-cooling)'--{no-,}cooling'[disable/enable fan and cooling control]' \
79 '--min-fan-speed[specify minimum fan speed]:minimum fan speed in percent' \
80 '--max-fan-speed[specify maximum fan speed]:maximum fan speed in percent' \
81 '--bridge-fan-speed[specify fan speed to use for bridging]:bridging fan speed in percent' \
82 '--fan-below-layer-time[specify maximum layer print time before activating fan]:maximum layer print time in seconds' \
83 '--slowdown-below-layer-time[specify maximum layer print time before slowing down printing]:maximum layer print time in seconds' \
84 '--min-print-speed[specify minimum print speed]:minimum print speed in mm/s' \
85 '--disable-fan-first-layers[specify number of bottom layers to print before activating fan]:number of bottom layers' \
86 '(--fan-always-on --no-fan-always-on)'--{no-,}fan-always-on'[disable/enable deactivation of fan]' \
87 \
88 '--skirts[specify number of skirts]:number of skirts' \
89 '--skirt-distance[specify distance between innermost skirt and object]:distance between innermost skirt and object in mm' \
90 '--skirt-height[specify number of skirt layers]:number of skirt layers' \
91 '--brim-width[specify brim width]:width of brim in mm' \
92 \
93 '--scale[specify object scaling factor]:object scaling factor in percent' \
94 '--rotate[specify object rotation angle]:object rotation angle in degrees' \
95 '(--duplicate-grid)--duplicate[specify number of duplicates for auto-arrange]:number of duplicates for auto-arrange' \
96 '(--duplicate-grid)--bed-size[specify bed size for auto-arrange]:bed size for auto-arrange in mm,mm' \
97 '(--duplicate --bed-size)--duplicate-grid[specify number of duplicates for grid arrangement]:number of duplicates for grid arrangement as x,y' \
98 '--duplicate-distance[specify distance between duplicates]:distance between duplicates in mm' \
99 \
100 '(--complete-objects --no-complete-objects)'--{no-,}complete-objects'[disable/enable completion of each object before starting a new one]' \
101 '--extruder-clearance-radius[specify radius above which extruder will not collide with anything]:radius in mm' \
102 '--extruder-clearance-height[specify maximum vertical extruder depth]:maximum vertical extruder depth in mm' \
103 \
104 '--notes[specify notes to be added as comments to the output file]:notes' \
105 \
106 '--extrusion-width[specify extrusion width]:extrusion width in mm or % of --layer-height' \
107 '--first-layer-extrusion-width[specify extrusion width for first layer]:first layer extrusion width in mm or % og --layer-height' \
108 '--perimeters-extrusion-width[specify extrusion width for perimeters]:perimeter extrusion width in mm or % of --layer-height' \
109 '--infill-extrusion-width[specify extrusion width for infill]:infill extrusion width in mm or % of --layer-height' \
110 '--support-material-extrusion-width[specify extrusion width for support material]:support material extrusion width in mm or % of --layer-height' \
111 '--bridge-flow-ratio[specify multiplier for extrusion when bridging]:bridge extrusion multiplier' \
112 \
113 '*:input file:_files -g "*.(#i)(stl|obj|amf|xml)(-.)"'
114
115 # Local Variables: ***
116 # mode:sh ***
117 # End: ***
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
0 #!/usr/bin/perl -w
1
2 use strict;
3 use warnings;
4
5 use Devel::CheckLib;
6 use ExtUtils::CppGuess;
7 use Module::Build::WithXSpp;
8
9 my $cpp_guess = ExtUtils::CppGuess->new;
10 my $mswin = $^O eq 'MSWin32';
11
12 # _GLIBCXX_USE_C99 : to get the long long type for g++
13 # HAS_BOOL : stops Perl/lib/CORE/handy.h from doing "# define bool char" for MSVC
14 # NOGDI : prevents inclusion of wingdi.h which defines functions Polygon() and Polyline() in global namespace
15 # BOOST_ASIO_DISABLE_KQUEUE : prevents a Boost ASIO bug on OS X: https://svn.boost.org/trac/boost/ticket/5339
16 my @cflags = qw(-D_GLIBCXX_USE_C99 -DHAS_BOOL -DNOGDI -DSLIC3RXS -DBOOST_ASIO_DISABLE_KQUEUE -DGLEW_STATIC);
17 my @ldflags = ();
18 if ($^O eq 'darwin') {
19 push @ldflags, qw(-framework IOKit -framework CoreFoundation);
20 }
21 if ($mswin) {
22 # In case windows.h is included, we don't want the min / max macros to be active.
23 # If <math.h> is included, we want the #defines to be active (M_PI etc.)
24 push @cflags, qw(-D_WIN32 -DNOMINMAX -D_USE_MATH_DEFINES);
25 }
26
27 my @early_includes = ();
28 my @INC = qw(-Isrc/libslic3r -Isrc/glew/include);
29 my @LIBS = $cpp_guess->is_msvc ? qw(-LIBPATH:src/libslic3r) : qw(-Lsrc/libslic3r);
30
31 if ($ENV{SLIC3R_GUI})
32 {
33 print "Slic3r will be built with GUI support\n";
34 require Alien::wxWidgets;
35 Alien::wxWidgets->load;
36 push @INC, Alien::wxWidgets->include_path;
37 push @cflags, qw(-DSLIC3R_GUI -DUNICODE), Alien::wxWidgets->defines, Alien::wxWidgets->c_flags;
38 my $alienwx_libraries = Alien::wxWidgets->libraries(qw(gl html));
39 $alienwx_libraries =~ s/-L/-LIBPATH:/g if ($cpp_guess->is_msvc);
40 push @ldflags, Alien::wxWidgets->link_flags, $alienwx_libraries;
41 # push @early_includes, qw(slic3r/GUI/wxinit.h);
42 }
43
44 if ($ENV{SLIC3R_HAS_BROKEN_CROAK})
45 {
46 # Some Strawberry Perl builds (mainly the latest 64bit builds) have a broken mechanism
47 # for emiting Perl exception after handling a C++ exception. Perl interpreter
48 # simply hangs. Better to show a message box in that case and stop the application.
49 push @cflags, qw(-DSLIC3R_HAS_BROKEN_CROAK)
50 }
51
52 # search for Boost in a number of places
53 my @boost_include = ();
54 if (defined $ENV{BOOST_INCLUDEDIR}) {
55 push @boost_include, $ENV{BOOST_INCLUDEDIR}
56 } elsif (defined $ENV{BOOST_DIR}) {
57 my $subdir = $ENV{BOOST_DIR} . (($mswin == 1) ? '\include' : '/include');
58 if (-d $subdir) {
59 push @boost_include, $subdir;
60 } else {
61 push @boost_include, $ENV{BOOST_DIR};
62 }
63 } else {
64 # Boost library was not defined by the environment.
65 # Try to guess at some default paths.
66 if ($mswin) {
67 for my $path (glob('C:\dev\boost*\include'), glob ('C:\boost*\include')) {
68 push @boost_include, $path;
69 }
70 if (! @boost_include) {
71 # No boost\include. Try to include the boost root.
72 for my $path (glob('C:\dev\boost*'), glob ('C:\boost*')) {
73 push @boost_include, $path;
74 }
75 }
76 } else {
77 push @boost_include, grep { -d $_ }
78 qw(/opt/local/include /usr/local/include /opt/include /usr/include);
79 }
80 }
81
82 my @boost_libs = ();
83 if (defined $ENV{BOOST_LIBRARYDIR}) {
84 push @boost_libs, $ENV{BOOST_LIBRARYDIR}
85 } elsif (defined $ENV{BOOST_DIR}) {
86 my $subdir = $ENV{BOOST_DIR} . ($mswin ? '\stage\lib' : '/stage/lib');
87 if (-d $subdir) {
88 push @boost_libs, $subdir;
89 } else {
90 push @boost_libs, $ENV{BOOST_DIR};
91 }
92 } else {
93 # Boost library was not defined by the environment.
94 # Try to guess at some default paths.
95 if ($mswin) {
96 for my $path (
97 glob('C:\dev\boost*\lib'), glob ('C:\boost*\lib'),
98 glob('C:\dev\boost*\stage\lib'), glob ('C:\boost*\stage\lib')) {
99 push @boost_libs, $path;
100 }
101 } else {
102 push @boost_libs, grep { -d $_ }
103 qw(/opt/local/lib /usr/local/lib /opt/lib /usr/lib /lib);
104 }
105 }
106
107 # In order to generate the -l switches we need to know how Boost libraries are named
108 my $have_boost = 0;
109 my @boost_libraries = qw(system thread); # we need these
110
111 # check without explicit lib path (works on Linux)
112 if (! $mswin) {
113 $have_boost = 1
114 if check_lib(
115 lib => [ map "boost_${_}", @boost_libraries ],
116 );
117 }
118
119 if (!$ENV{SLIC3R_STATIC} && $have_boost) {
120 # The boost library was detected by check_lib on Linux.
121 push @LIBS, map "-lboost_${_}", @boost_libraries;
122 } else {
123 # Either static linking, or check_lib could not be used to find the boost libraries.
124 my $lib_prefix = 'libboost_';
125 my $lib_ext = ${$cpp_guess}{config}{lib_ext};
126 PATH: foreach my $path (@boost_libs) {
127 # Try to find the boost system library.
128 my @files = glob "$path/${lib_prefix}system*$lib_ext";
129 next if !@files;
130
131 if ($files[0] =~ /${lib_prefix}system([^.]+)$lib_ext$/) {
132 # Suffix contains the version number, the build type etc.
133 my $suffix = $1;
134 # Verify existence of all required boost libraries at $path.
135 for my $lib (map "${lib_prefix}${_}${suffix}${lib_ext}", @boost_libraries) {
136 # If the library file does not exist, try next library path.
137 -f "$path/$lib" or next PATH;
138 }
139 if (! $cpp_guess->is_msvc) {
140 # Test the correctness of boost libraries by linking them to a minimal C program.
141 check_lib(
142 lib => [ map "boost_${_}${suffix}", @boost_libraries ],
143 INC => join(' ', map "-I$_", @INC, @boost_include),
144 LIBS => "-L$path",
145 ) or next;
146 }
147 push @INC, (map " -I$_", @boost_include); # TODO: only use the one related to the chosen lib path
148 if ($ENV{SLIC3R_STATIC} || $cpp_guess->is_msvc) {
149 push @LIBS, map "${path}/${lib_prefix}$_${suffix}${lib_ext}", @boost_libraries;
150 } else {
151 push @LIBS, " -L$path", (map " -lboost_$_$suffix", @boost_libraries);
152 }
153 $have_boost = 1;
154 last;
155 }
156 }
157 }
158 push @cflags, '-DBOOST_LIBS' if $have_boost;
159 die <<'EOF' if !$have_boost;
160 Slic3r requires the Boost libraries. Please make sure they are installed.
161
162 If they are installed, this script should be able to locate them in several
163 standard locations. If this is not the case, you might want to supply their
164 path through the BOOST_DIR environment variable:
165
166 BOOST_DIR=/path/to/boost perl Build.PL
167
168 Or you may specify BOOST_INCLUDEPATH and BOOST_LIBRARYPATH separatly, which
169 is handy, if you have built Boost libraries with mutliple settings.
170
171 EOF
172
173 # Add the OpenGL and GLU libraries.
174 if ($ENV{SLIC3R_GUI}) {
175 if ($mswin) {
176 if ($cpp_guess->is_msvc) {
177 push @LIBS, qw(OpenGL32.Lib GlU32.Lib);
178 } else {
179 push @LIBS, qw(-lopengl32);
180 }
181 } else {
182 push @LIBS, qw(-lGL -lGLU);
183 }
184 }
185
186 if ($ENV{SLIC3R_DEBUG}) {
187 # only on newer GCCs: -ftemplate-backtrace-limit=0
188 push @cflags, '-DSLIC3R_DEBUG';
189 push @cflags, $cpp_guess->is_msvc ? '-Gd' : '-g';
190 } else {
191 # Disable asserts in the release builds.
192 push @cflags, '-DNDEBUG';
193 }
194 if ($cpp_guess->is_gcc) {
195 # check whether we're dealing with a buggy GCC version
196 # see https://github.com/alexrj/Slic3r/issues/1965
197 if (`cc --version` =~ m/ 4\.7\.[012]/) {
198 # Workaround suggested by Boost devs:
199 # https://svn.boost.org/trac/boost/ticket/8695
200 push @cflags, qw(-fno-inline-small-functions);
201 }
202 }
203
204 my $build = Module::Build::WithXSpp->new(
205 module_name => 'Slic3r::XS',
206 dist_abstract => 'XS code for Slic3r',
207 build_requires => {qw(
208 ExtUtils::ParseXS 3.18
209 ExtUtils::Typemaps 1.00
210 ExtUtils::Typemaps::Default 1.05
211 ExtUtils::XSpp 0.17
212 Module::Build 0.3601
213 Test::More 0
214 )},
215 configure_requires => {qw(
216 ExtUtils::CppGuess 0.07
217 Module::Build 0.38
218 Module::Build::WithXSpp 0.13
219 )},
220 extra_compiler_flags => [ @INC, @cflags ],
221 extra_linker_flags => [ @LIBS, @ldflags ],
222
223 # Provides extra C typemaps that are auto-merged
224 extra_typemap_modules => {
225 'ExtUtils::Typemaps::Basic' => '1.05',
226 },
227
228 # for MSVC builds
229 early_includes => [qw(
230 cstring
231 cstdlib
232 ostream
233 sstream
234 libslic3r/GCodeSender.hpp
235 ), @early_includes]
236 );
237
238 $build->create_build_script;
239
240 __END__
0 Build.PL
1 lib/Slic3r/XS.pm
2 MANIFEST This list of files
3 src/admesh/connect.c
4 src/admesh/normals.c
5 src/admesh/shared.c
6 src/admesh/stl.h
7 src/admesh/stl_io.c
8 src/admesh/stlinit.c
9 src/admesh/util.c
10 src/clipper.cpp
11 src/clipper.hpp
12 src/libslic3r/BoundingBox.cpp
13 src/libslic3r/BoundingBox.hpp
14 src/libslic3r/BridgeDetector.cpp
15 src/libslic3r/BridgeDetector.hpp
16 src/libslic3r/ClipperUtils.cpp
17 src/libslic3r/ClipperUtils.hpp
18 src/libslic3r/Config.cpp
19 src/libslic3r/Config.hpp
20 src/libslic3r/EdgeGrid.cpp
21 src/libslic3r/EdgeGrid.hpp
22 src/libslic3r/ExPolygon.cpp
23 src/libslic3r/ExPolygon.hpp
24 src/libslic3r/ExPolygonCollection.cpp
25 src/libslic3r/ExPolygonCollection.hpp
26 src/libslic3r/Extruder.cpp
27 src/libslic3r/Extruder.hpp
28 src/libslic3r/ExtrusionEntity.cpp
29 src/libslic3r/ExtrusionEntity.hpp
30 src/libslic3r/ExtrusionEntityCollection.cpp
31 src/libslic3r/ExtrusionEntityCollection.hpp
32 src/libslic3r/ExtrusionSimulator.cpp
33 src/libslic3r/ExtrusionSimulator.hpp
34 src/libslic3r/Fill/FillBase.cpp
35 src/libslic3r/Fill/FillBase.hpp
36 src/libslic3r/Fill/FillConcentric.cpp
37 src/libslic3r/Fill/FillConcentric.hpp
38 src/libslic3r/Fill/FillHoneycomb.cpp
39 src/libslic3r/Fill/FillHoneycomb.hpp
40 src/libslic3r/Fill/Fill3DHoneycomb.cpp
41 src/libslic3r/Fill/Fill3DHoneycomb.hpp
42 src/libslic3r/Fill/FillPlanePath.cpp
43 src/libslic3r/Fill/FillPlanePath.hpp
44 src/libslic3r/Fill/FillRectilinear.cpp
45 src/libslic3r/Fill/FillRectilinear.hpp
46 src/libslic3r/Fill/FillRectilinear2.cpp
47 src/libslic3r/Fill/FillRectilinear2.hpp
48 src/libslic3r/Flow.cpp
49 src/libslic3r/Flow.hpp
50 src/libslic3r/GCode.cpp
51 src/libslic3r/GCode.hpp
52 src/libslic3r/GCodeSender.cpp
53 src/libslic3r/GCodeSender.hpp
54 src/libslic3r/GCodeWriter.cpp
55 src/libslic3r/GCodeWriter.hpp
56 src/libslic3r/GCode/PressureEqualizer.cpp
57 src/libslic3r/GCode/PressureEqualizer.hpp
58 src/libslic3r/Geometry.cpp
59 src/libslic3r/Geometry.hpp
60 src/libslic3r/Layer.cpp
61 src/libslic3r/Layer.hpp
62 src/libslic3r/LayerRegion.cpp
63 src/libslic3r/libslic3r.h
64 src/libslic3r/Line.cpp
65 src/libslic3r/Line.hpp
66 src/libslic3r/Model.cpp
67 src/libslic3r/Model.hpp
68 src/libslic3r/MotionPlanner.cpp
69 src/libslic3r/MotionPlanner.hpp
70 src/libslic3r/MultiPoint.cpp
71 src/libslic3r/MultiPoint.hpp
72 src/libslic3r/PerimeterGenerator.cpp
73 src/libslic3r/PerimeterGenerator.hpp
74 src/libslic3r/PlaceholderParser.cpp
75 src/libslic3r/PlaceholderParser.hpp
76 src/libslic3r/Point.cpp
77 src/libslic3r/Point.hpp
78 src/libslic3r/Polygon.cpp
79 src/libslic3r/Polygon.hpp
80 src/libslic3r/Polyline.cpp
81 src/libslic3r/Polyline.hpp
82 src/libslic3r/PolylineCollection.cpp
83 src/libslic3r/PolylineCollection.hpp
84 src/libslic3r/Print.cpp
85 src/libslic3r/Print.hpp
86 src/libslic3r/PrintConfig.cpp
87 src/libslic3r/PrintConfig.hpp
88 src/libslic3r/PrintObject.cpp
89 src/libslic3r/PrintRegion.cpp
90 src/libslic3r/SupportMaterial.cpp
91 src/libslic3r/SupportMaterial.hpp
92 src/libslic3r/Surface.cpp
93 src/libslic3r/Surface.hpp
94 src/libslic3r/SurfaceCollection.cpp
95 src/libslic3r/SurfaceCollection.hpp
96 src/libslic3r/SVG.cpp
97 src/libslic3r/SVG.hpp
98 src/libslic3r/TriangleMesh.cpp
99 src/libslic3r/TriangleMesh.hpp
100 src/libslic3r/utils.cpp
101 src/perlglue.cpp
102 src/poly2tri/common/shapes.cc
103 src/poly2tri/common/shapes.h
104 src/poly2tri/common/utils.h
105 src/poly2tri/poly2tri.h
106 src/poly2tri/sweep/advancing_front.cc
107 src/poly2tri/sweep/advancing_front.h
108 src/poly2tri/sweep/cdt.cc
109 src/poly2tri/sweep/cdt.h
110 src/poly2tri/sweep/sweep.cc
111 src/poly2tri/sweep/sweep.h
112 src/poly2tri/sweep/sweep_context.cc
113 src/poly2tri/sweep/sweep_context.h
114 src/polypartition.cpp
115 src/polypartition.h
116 src/ppport.h
117 src/slic3r/GUI/3DScene.cpp
118 src/slic3r/GUI/3DScene.hpp
119 src/slic3r/GUI/GUI.cpp
120 src/slic3r/GUI/GUI.hpp
121 src/Shiny/Shiny.h
122 src/Shiny/ShinyData.h
123 src/Shiny/ShinyManager.h
124 src/Shiny/ShinyNodePool.h
125 src/Shiny/ShinyOutput.h
126 src/Shiny/ShinyTools.h
127 src/Shiny/ShinyZone.h
128 src/Shiny/ShinyConfig.h
129 src/Shiny/ShinyMacros.h
130 src/Shiny/ShinyNode.h
131 src/Shiny/ShinyNodeState.h
132 src/Shiny/ShinyPrereqs.h
133 src/Shiny/ShinyVersion.h
134 src/Shiny/ShinyManager.c
135 src/Shiny/ShinyNode.c
136 src/Shiny/ShinyNodePool.c
137 src/Shiny/ShinyNodeState.c
138 src/Shiny/ShinyOutput.c
139 src/Shiny/ShinyTools.c
140 src/Shiny/ShinyZone.c
141 src/glew/LICENSE.txt
142 src/glew/README.md
143 src/glew/src/glew.c
144 src/glew/include/GL/glew.h
145 src/glew/include/GL/glxew.h
146 src/glew/include/GL/wglew.h
147 src/xsinit.h
148 t/01_trianglemesh.t
149 t/03_point.t
150 t/04_expolygon.t
151 t/05_surface.t
152 t/06_polygon.t
153 t/07_extrusionpath.t
154 t/08_extrusionloop.t
155 t/09_polyline.t
156 t/10_line.t
157 t/11_clipper.t
158 t/12_extrusionpathcollection.t
159 t/13_polylinecollection.t
160 t/14_geometry.t
161 t/15_config.t
162 t/16_flow.t
163 t/17_boundingbox.t
164 t/18_motionplanner.t
165 t/19_model.t
166 t/20_print.t
167 t/21_gcode.t
168 t/22_exception.t
169 xsp/BoundingBox.xsp
170 xsp/BridgeDetector.xsp
171 xsp/Clipper.xsp
172 xsp/Config.xsp
173 xsp/ExPolygon.xsp
174 xsp/ExPolygonCollection.xsp
175 xsp/Extruder.xsp
176 xsp/ExtrusionEntityCollection.xsp
177 xsp/ExtrusionLoop.xsp
178 xsp/ExtrusionPath.xsp
179 xsp/ExtrusionSimulator.xsp
180 xsp/Filler.xsp
181 xsp/Flow.xsp
182 xsp/GCode.xsp
183 xsp/GCodeSender.xsp
184 xsp/GCodeWriter.xsp
185 xsp/GCodePressureEqualizer.xsp
186 xsp/Geometry.xsp
187 xsp/GUI.xsp
188 xsp/GUI_3DScene.xsp
189 xsp/Layer.xsp
190 xsp/Line.xsp
191 xsp/Model.xsp
192 xsp/MotionPlanner.xsp
193 xsp/my.map
194 xsp/mytype.map
195 xsp/PerimeterGenerator.xsp
196 xsp/PlaceholderParser.xsp
197 xsp/Point.xsp
198 xsp/Polygon.xsp
199 xsp/Polyline.xsp
200 xsp/PolylineCollection.xsp
201 xsp/Print.xsp
202 xsp/SupportMaterial.xsp
203 xsp/Surface.xsp
204 xsp/SurfaceCollection.xsp
205 xsp/TriangleMesh.xsp
206 xsp/typemap.xspt
207 xsp/XS.xsp
0
1 #!start included /Library/Perl/Updates/5.12.4/ExtUtils/MANIFEST.SKIP
2 # Avoid version control files.
3 \bRCS\b
4 \bCVS\b
5 \bSCCS\b
6 ,v$
7 \B\.svn\b
8 \B\.git\b
9 \B\.gitignore\b
10 \b_darcs\b
11 \B\.cvsignore$
12
13 # Avoid VMS specific MakeMaker generated files
14 \bDescrip.MMS$
15 \bDESCRIP.MMS$
16 \bdescrip.mms$
17
18 # Avoid Makemaker generated and utility files.
19 \bMANIFEST\.bak
20 \bMakefile$
21 \bblib/
22 \bMakeMaker-\d
23 \bpm_to_blib\.ts$
24 \bpm_to_blib$
25 \bblibdirs\.ts$ # 6.18 through 6.25 generated this
26
27 # Avoid Module::Build generated and utility files.
28 \bBuild$
29 \b_build/
30 \bBuild.bat$
31 \bBuild.COM$
32 \bBUILD.COM$
33 \bbuild.com$
34
35 # Avoid temp and backup files.
36 ~$
37 \.old$
38 \#$
39 \b\.#
40 \.bak$
41 \.tmp$
42 \.#
43 \.rej$
44
45 # Avoid OS-specific files/dirs
46 # Mac OSX metadata
47 \B\.DS_Store
48 # Mac OSX SMB mount metadata files
49 \B\._
50
51 # Avoid Devel::Cover and Devel::CoverX::Covered files.
52 \bcover_db\b
53 \bcovered\b
54
55 # Avoid MYMETA files
56 ^MYMETA\.
57 #!end included /Library/Perl/Updates/5.12.4/ExtUtils/MANIFEST.SKIP
58
59 # Avoid configuration metadata file
60 ^MYMETA\.
61
62 # Avoid Module::Build generated and utility files.
63 \bBuild$
64 \bBuild.bat$
65 \b_build
66 \bBuild.COM$
67 \bBUILD.COM$
68 \bbuild.com$
69 ^MANIFEST\.SKIP
70
71 # Avoid archives of this distribution
72 \bSlic3r-XS-[\d\.\_]+
73
74 ^assertlib
0 package Slic3r::XS;
1 use warnings;
2 use strict;
3
4 our $VERSION = '0.01';
5
6 # We have to load these modules in order to have Wx.pm find the correct paths
7 # for wxWidgets dlls on MSW.
8 # We avoid loading these on OS X because Wx::Load() initializes a Wx App
9 # automatically and it steals focus even when we're not running Slic3r in GUI mode.
10 # TODO: only load these when compiling with GUI support
11 BEGIN {
12 if ($^O eq 'MSWin32') {
13 eval "use Wx";
14 # eval "use Wx::Html";
15 eval "use Wx::Print"; # because of some Wx bug, thread creation fails if we don't have this (looks like Wx::Printout is hard-coded in some thread cleanup code)
16 }
17 }
18
19 use Carp qw();
20 use XSLoader;
21 XSLoader::load(__PACKAGE__, $VERSION);
22
23 package Slic3r::Line;
24 use overload
25 '@{}' => sub { $_[0]->arrayref },
26 'fallback' => 1;
27
28 package Slic3r::Point;
29 use overload
30 '@{}' => sub { $_[0]->arrayref },
31 'fallback' => 1;
32
33 package Slic3r::Point3;
34 use overload
35 '@{}' => sub { [ $_[0]->x, $_[0]->y, $_[0]->z ] }, #,
36 'fallback' => 1;
37
38 sub pp {
39 my ($self) = @_;
40 return [ @$self ];
41 }
42
43 package Slic3r::Pointf;
44 use overload
45 '@{}' => sub { $_[0]->arrayref },
46 'fallback' => 1;
47
48 package Slic3r::Pointf3;
49 use overload
50 '@{}' => sub { [ $_[0]->x, $_[0]->y, $_[0]->z ] }, #,
51 'fallback' => 1;
52
53 sub pp {
54 my ($self) = @_;
55 return [ @$self ];
56 }
57
58 package Slic3r::ExPolygon;
59 use overload
60 '@{}' => sub { $_[0]->arrayref },
61 'fallback' => 1;
62
63 package Slic3r::Polyline;
64 use overload
65 '@{}' => sub { $_[0]->arrayref },
66 'fallback' => 1;
67
68 package Slic3r::Polyline::Collection;
69 use overload
70 '@{}' => sub { $_[0]->arrayref },
71 'fallback' => 1;
72
73 package Slic3r::Polygon;
74 use overload
75 '@{}' => sub { $_[0]->arrayref },
76 'fallback' => 1;
77
78 package Slic3r::ExPolygon::Collection;
79 use overload
80 '@{}' => sub { $_[0]->arrayref },
81 'fallback' => 1;
82
83 package Slic3r::ExtrusionPath::Collection;
84 use overload
85 '@{}' => sub { $_[0]->arrayref },
86 'fallback' => 1;
87
88 sub new {
89 my ($class, @paths) = @_;
90
91 my $self = $class->_new;
92 $self->append(@paths);
93 return $self;
94 }
95
96 package Slic3r::ExtrusionLoop;
97 use overload
98 '@{}' => sub { $_[0]->arrayref },
99 'fallback' => 1;
100
101 sub new_from_paths {
102 my ($class, @paths) = @_;
103
104 my $loop = $class->new;
105 $loop->append($_) for @paths;
106 return $loop;
107 }
108
109 package Slic3r::ExtrusionPath;
110 use overload
111 '@{}' => sub { $_[0]->arrayref },
112 'fallback' => 1;
113
114 sub new {
115 my ($class, %args) = @_;
116
117 return $class->_new(
118 $args{polyline}, # required
119 $args{role}, # required
120 $args{mm3_per_mm} // die("Missing required mm3_per_mm in ExtrusionPath constructor"),
121 $args{width} // -1,
122 $args{height} // -1,
123 );
124 }
125
126 sub clone {
127 my ($self, %args) = @_;
128
129 return __PACKAGE__->_new(
130 $args{polyline} // $self->polyline,
131 $args{role} // $self->role,
132 $args{mm3_per_mm} // $self->mm3_per_mm,
133 $args{width} // $self->width,
134 $args{height} // $self->height,
135 );
136 }
137
138 package Slic3r::ExtrusionSimulator;
139
140 sub new {
141 my ($class, %args) = @_;
142 return $class->_new();
143 }
144
145 package Slic3r::Filler;
146
147 sub fill_surface {
148 my ($self, $surface, %args) = @_;
149 $self->set_density($args{density}) if defined($args{density});
150 $self->set_dont_connect($args{dont_connect}) if defined($args{dont_connect});
151 $self->set_dont_adjust($args{dont_adjust}) if defined($args{dont_adjust});
152 $self->set_complete($args{complete}) if defined($args{complete});
153 return $self->_fill_surface($surface);
154 }
155
156 package Slic3r::Flow;
157
158 sub new {
159 my ($class, %args) = @_;
160
161 my $self = $class->_new(
162 @args{qw(width height nozzle_diameter)},
163 );
164 $self->set_bridge($args{bridge} // 0);
165 return $self;
166 }
167
168 sub new_from_width {
169 my ($class, %args) = @_;
170
171 return $class->_new_from_width(
172 @args{qw(role width nozzle_diameter layer_height bridge_flow_ratio)},
173 );
174 }
175
176 sub new_from_spacing {
177 my ($class, %args) = @_;
178
179 return $class->_new_from_spacing(
180 @args{qw(spacing nozzle_diameter layer_height bridge)},
181 );
182 }
183
184 package Slic3r::Surface;
185
186 sub new {
187 my ($class, %args) = @_;
188
189 # defensive programming: make sure no negative bridge_angle is supplied
190 die "Error: invalid negative bridge_angle\n"
191 if defined $args{bridge_angle} && $args{bridge_angle} < 0;
192
193 return $class->_new(
194 $args{expolygon} // (die "Missing required expolygon\n"),
195 $args{surface_type} // (die "Missing required surface_type\n"),
196 $args{thickness} // -1,
197 $args{thickness_layers} // 1,
198 $args{bridge_angle} // -1,
199 $args{extra_perimeters} // 0,
200 );
201 }
202
203 sub clone {
204 my ($self, %args) = @_;
205
206 return (ref $self)->_new(
207 delete $args{expolygon} // $self->expolygon,
208 delete $args{surface_type} // $self->surface_type,
209 delete $args{thickness} // $self->thickness,
210 delete $args{thickness_layers} // $self->thickness_layers,
211 delete $args{bridge_angle} // $self->bridge_angle,
212 delete $args{extra_perimeters} // $self->extra_perimeters,
213 );
214 }
215
216 package Slic3r::Surface::Collection;
217 use overload
218 '@{}' => sub { $_[0]->arrayref },
219 'fallback' => 1;
220
221 sub new {
222 my ($class, @surfaces) = @_;
223
224 my $self = $class->_new;
225 $self->append($_) for @surfaces;
226 return $self;
227 }
228
229 package Slic3r::Print::SupportMaterial2;
230
231 sub new {
232 my ($class, %args) = @_;
233
234 return $class->_new(
235 $args{print_config}, # required
236 $args{object_config}, # required
237 $args{first_layer_flow}, # required
238 $args{flow}, # required
239 $args{interface_flow}, # required
240 $args{soluble_interface} // 0
241 );
242 }
243
244 package Slic3r::GUI::_3DScene::GLVertexArray;
245 sub CLONE_SKIP { 1 }
246
247 package main;
248 for my $class (qw(
249 Slic3r::BridgeDetector
250 Slic3r::Config
251 Slic3r::Config::Full
252 Slic3r::Config::GCode
253 Slic3r::Config::Print
254 Slic3r::Config::PrintObject
255 Slic3r::Config::PrintRegion
256 Slic3r::Config::Static
257 Slic3r::ExPolygon
258 Slic3r::ExPolygon::Collection
259 Slic3r::Extruder
260 Slic3r::ExtrusionLoop
261 Slic3r::ExtrusionPath
262 Slic3r::ExtrusionPath::Collection
263 Slic3r::ExtrusionSimulator
264 Slic3r::Filler
265 Slic3r::Flow
266 Slic3r::GCode
267 Slic3r::GCode::AvoidCrossingPerimeters
268 Slic3r::GCode::OozePrevention
269 Slic3r::GCode::PlaceholderParser
270 Slic3r::GCode::Wipe
271 Slic3r::GCode::Writer
272 Slic3r::Geometry::BoundingBox
273 Slic3r::Geometry::BoundingBoxf
274 Slic3r::Geometry::BoundingBoxf3
275 Slic3r::Layer
276 Slic3r::Layer::Region
277 Slic3r::Layer::Support
278 Slic3r::Line
279 Slic3r::Linef3
280 Slic3r::Model
281 Slic3r::Model::Instance
282 Slic3r::Model::Material
283 Slic3r::Model::Object
284 Slic3r::Model::Volume
285 Slic3r::Point
286 Slic3r::Point3
287 Slic3r::Pointf
288 Slic3r::Pointf3
289 Slic3r::Polygon
290 Slic3r::Polyline
291 Slic3r::Polyline::Collection
292 Slic3r::Print
293 Slic3r::Print::Object
294 Slic3r::Print::Region
295 Slic3r::Print::State
296 Slic3r::Surface
297 Slic3r::Surface::Collection
298 Slic3r::Print::SupportMaterial2
299 Slic3r::TriangleMesh
300 ))
301 {
302 no strict 'refs';
303 my $ref_class = $class . "::Ref";
304 eval "package $ref_class; our \@ISA = '$class'; sub DESTROY {};";
305 }
306
307 1;
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_H
25 #define SHINY_H
26
27 /*---------------------------------------------------------------------------*/
28
29 #include "ShinyMacros.h"
30 #include "ShinyManager.h"
31
32 #endif /* SHINY_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_CONFIG_H
25 #define SHINY_CONFIG_H
26
27
28 /*---------------------------------------------------------------------------*/
29
30 /* SHINY_IS_COMPILED is the master on or off swith at compile time. Define it to TRUE or FALSE before including header Shiny.h or inside ShinyConfig.h. Default is TRUE.
31 */
32 #if defined(SLIC3R_PROFILE) && defined(WIN32)
33 #define SHINY_IS_COMPILED TRUE
34 #else
35 #define SHINY_IS_COMPILED FALSE
36 #endif
37
38 #define SHINY_STATIC_LINK TRUE
39
40 /* if SHINY_LOOKUP_RATE is defined to TRUE then Shiny will record the success of its hash function. This is useful for debugging. Default is FALSE.
41 */
42 #ifndef SHINY_LOOKUP_RATE
43 // #define SHINY_LOOKUP_RATE FALSE
44 #endif
45
46 /* if SHINY_HAS_ENABLED is defined to TRUE then Shiny can be enabled and disabled at runtime. TODO: bla bla...
47 */
48 #ifndef SHINY_HAS_ENABLED
49 // #define SHINY_HAS_ENABLED FALSE
50 #endif
51
52 /* TODO:
53 */
54 #define SHINY_OUTPUT_MODE_FLAT 0x1
55
56 /* TODO:
57 */
58 #define SHINY_OUTPUT_MODE_TREE 0x2
59
60 /* TODO:
61 */
62 #define SHINY_OUTPUT_MODE_BOTH 0x3
63
64 /* TODO:
65 */
66 #ifndef SHINY_OUTPUT_MODE
67 #define SHINY_OUTPUT_MODE SHINY_OUTPUT_MODE_BOTH
68 #endif
69
70 #endif /* SHINY_CONFIG_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_DATA_H
25 #define SHINY_DATA_H
26
27 #include "ShinyPrereqs.h"
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 /*---------------------------------------------------------------------------*/
34
35 typedef struct {
36 uint32_t entryCount;
37 shinytick_t selfTicks;
38 } ShinyLastData;
39
40
41 /*---------------------------------------------------------------------------*/
42
43 typedef struct {
44 shinytick_t cur;
45 float avg;
46 } ShinyTickData;
47
48 typedef struct {
49 uint32_t cur;
50 float avg;
51 } ShinyCountData;
52
53 typedef struct {
54 ShinyCountData entryCount;
55 ShinyTickData selfTicks;
56 ShinyTickData childTicks;
57 } ShinyData;
58
59 SHINY_INLINE shinytick_t ShinyData_totalTicksCur(const ShinyData *self) {
60 return self->selfTicks.cur + self->childTicks.cur;
61 }
62
63 SHINY_INLINE float ShinyData_totalTicksAvg(const ShinyData *self) {
64 return self->selfTicks.avg + self->childTicks.avg;
65 }
66
67 SHINY_INLINE void ShinyData_computeAverage(ShinyData *self, float a_damping) {
68 self->entryCount.avg = self->entryCount.cur +
69 a_damping * (self->entryCount.avg - self->entryCount.cur);
70 self->selfTicks.avg = self->selfTicks.cur +
71 a_damping * (self->selfTicks.avg - self->selfTicks.cur);
72 self->childTicks.avg = self->childTicks.cur +
73 a_damping * (self->childTicks.avg - self->childTicks.cur);
74 }
75
76 SHINY_INLINE void ShinyData_copyAverage(ShinyData *self) {
77 self->entryCount.avg = (float) self->entryCount.cur;
78 self->selfTicks.avg = (float) self->selfTicks.cur;
79 self->childTicks.avg = (float) self->childTicks.cur;
80 }
81
82 SHINY_INLINE void ShinyData_clearAll(ShinyData *self) {
83 self->entryCount.cur = 0;
84 self->entryCount.avg = 0;
85 self->selfTicks.cur = 0;
86 self->selfTicks.avg = 0;
87 self->childTicks.cur = 0;
88 self->childTicks.avg = 0;
89 }
90
91 SHINY_INLINE void ShinyData_clearCurrent(ShinyData *self) {
92 self->entryCount.cur = 0;
93 self->selfTicks.cur = 0;
94 self->childTicks.cur = 0;
95 }
96
97 #if __cplusplus
98 } /* end of extern "C" */
99 #endif
100
101 #endif /* SHINY_DATA_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_MACROS_H
25 #define SHINY_MACROS_H
26
27 #include "ShinyManager.h"
28
29 #if SHINY_IS_COMPILED == TRUE
30
31 /*---------------------------------------------------------------------------*/
32 /* public preprocessors */
33
34 #define PROFILE_UPDATE() \
35 ShinyManager_update(&Shiny_instance)
36
37 #define PROFILE_SET_DAMPING(floatfrom0to1) \
38 Shiny_instance.damping = (floatfrom0to1);
39
40 #define PROFILE_GET_DAMPING() \
41 (Shiny_instance.damping)
42
43 #define PROFILE_OUTPUT(filename) \
44 ShinyManager_output(&Shiny_instance, (filename))
45
46 #define PROFILE_OUTPUT_STREAM(stream) \
47 ShinyManager_outputToStream(&Shiny_instance, (stream))
48
49 #ifdef __cplusplus
50 #define PROFILE_GET_TREE_STRING() \
51 ShinyManager_outputTreeToString(&Shiny_instance)
52
53 #define PROFILE_GET_FLAT_STRING() \
54 ShinyManager_outputFlatToString(&Shiny_instance)
55 #endif /* __cplusplus */
56
57 #define PROFILE_DESTROY() \
58 ShinyManager_destroy(&Shiny_instance)
59
60 #define PROFILE_CLEAR() \
61 ShinyManager_clear(&Shiny_instance)
62
63 #define PROFILE_SORT_ZONES() \
64 ShinyManager_sortZones(&Shiny_instance)
65
66
67 /*---------------------------------------------------------------------------*/
68 /* public preprocessors */
69
70 #define PROFILE_GET_TOTAL_TICKS_CUR() \
71 ShinyData_totalTicksCur(&Shiny_instance.rootZone.data)
72
73 #define PROFILE_GET_TOTAL_TICKS() \
74 ShinyData_totalTicksAvg(&Shiny_instance.rootZone.data)
75
76 #define PROFILE_GET_PROFILED_TICKS_CUR() \
77 (Shiny_instance.rootZone.data.selfTicks.cur)
78
79 #define PROFILE_GET_PROFILED_TICKS() \
80 (Shiny_instance.rootZone.data.selfTicks.avg)
81
82 #define PROFILE_GET_UNPROFILED_TICKS_CUR() \
83 (Shiny_instance.rootZone.data.childTicks.cur)
84
85 #define PROFILE_GET_UNPROFILED_TICKS() \
86 (Shiny_instance.rootZone.data.childTicks.avg)
87
88 #define PROFILE_GET_SHARED_TOTAL_TICKS_CUR(name) \
89 ShinyData_totalTicksCur(&(_PROFILE_ID_ZONE_SHARED(name).data))
90
91 #define PROFILE_GET_SHARED_TOTAL_TICKS(name) \
92 ShinyData_totalTicksAvg(&(_PROFILE_ID_ZONE_SHARED(name).data))
93
94 #define PROFILE_GET_SHARED_SELF_TICKS_CUR(name) \
95 (_PROFILE_ID_ZONE_SHARED(name).data.selfTicks.cur)
96
97 #define PROFILE_GET_SHARED_SELF_TICKS(name) \
98 (_PROFILE_ID_ZONE_SHARED(name).data.selfTicks.avg)
99
100
101 /*---------------------------------------------------------------------------*/
102 /* public preprocessors */
103
104 #define PROFILE_IS_SHARED_SELF_BELOW(name, floatfrom0to1) \
105 ShinyManager_isZoneSelfTimeBelow( \
106 &Shiny_instance, _PROFILE_ID_ZONE_SHARED(name), floatfrom0to1)
107
108 #define PROFILE_IS_SHARED_TOTAL_BELOW(name, floatfrom0to1) \
109 ShinyManager_isZoneTotalTimeBelow( \
110 &Shiny_instance, _PROFILE_ID_ZONE_SHARED(name), floatfrom0to1)
111
112
113 /*---------------------------------------------------------------------------*/
114 /* public preprocessors */
115
116 #define PROFILE_END() \
117 ShinyManager_endCurNode(&Shiny_instance)
118
119
120 /*---------------------------------------------------------------------------*/
121 /* public preprocessors */
122
123 #define PROFILE_BEGIN( name ) \
124 \
125 static _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE(name), #name); \
126 _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE(name))
127
128
129 /*---------------------------------------------------------------------------*/
130 /* public preprocessors */
131
132 #ifdef __cplusplus
133 #define PROFILE_BLOCK( name ) \
134 \
135 _PROFILE_BLOCK_DEFINE(_PROFILE_ID_BLOCK()); \
136 PROFILE_BEGIN(name)
137 #endif /* __cplusplus */
138
139 /*---------------------------------------------------------------------------*/
140 /* public preprocessors */
141
142 #ifdef __cplusplus
143 #define PROFILE_FUNC() \
144 \
145 _PROFILE_BLOCK_DEFINE(_PROFILE_ID_BLOCK()); \
146 static _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE_FUNC(), __FUNCTION__); \
147 _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_FUNC())
148 #endif /* __cplusplus */
149
150 /*---------------------------------------------------------------------------*/
151 /* public preprocessors */
152
153 #define PROFILE_CODE( code ) \
154 \
155 do { \
156 static _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE_CODE(), #code); \
157 _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_CODE()); \
158 { code; } \
159 PROFILE_END(); \
160 } while(0)
161
162
163 /*---------------------------------------------------------------------------*/
164 /* public preprocessors */
165
166 #define PROFILE_SHARED_EXTERN( name ) \
167 \
168 _PROFILE_ZONE_DECLARE(extern, _PROFILE_ID_ZONE_SHARED(name))
169
170
171 /*---------------------------------------------------------------------------*/
172 /* public preprocessors */
173
174 #define PROFILE_SHARED_DEFINE( name ) \
175 \
176 _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE_SHARED(name), #name)
177
178
179 /*---------------------------------------------------------------------------*/
180 /* public preprocessors */
181
182 #define PROFILE_SHARED_BEGIN( name ) \
183 \
184 _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_SHARED(name))
185
186
187 /*---------------------------------------------------------------------------*/
188 /* public preprocessors */
189
190 #ifdef __cplusplus
191 #define PROFILE_SHARED_BLOCK( name ) \
192 \
193 _PROFILE_BLOCK_DEFINE(_PROFILE_ID_BLOCK()); \
194 _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_SHARED(name))
195 #endif /* __cplusplus */
196
197
198 /*---------------------------------------------------------------------------*/
199 /* public preprocessors */
200
201 #ifdef SHINY_HAS_ENABLED
202 #define PROFILE_SET_ENABLED( boolean ) \
203 Shiny_instance.enabled = boolean
204 #endif
205
206
207 /*---------------------------------------------------------------------------*/
208 /* internal preprocessors */
209
210 #define _PROFILE_ID_ZONE( name ) __ShinyZone_##name
211 #define _PROFILE_ID_ZONE_FUNC() __ShinyZoneFunc
212 #define _PROFILE_ID_ZONE_CODE() __ShinyZoneCode
213 #define _PROFILE_ID_ZONE_SHARED( name ) name##__ShinyZoneShared
214 #define _PROFILE_ID_BLOCK() __ShinyBlock
215
216
217 /*---------------------------------------------------------------------------*/
218 /* internal preprocessor */
219
220 #define _PROFILE_ZONE_DEFINE( id, string ) \
221 \
222 ShinyZone id = { \
223 NULL, SHINY_ZONE_STATE_HIDDEN, string, \
224 { { 0, 0 }, { 0, 0 }, { 0, 0 } } \
225 }
226
227
228 /*---------------------------------------------------------------------------*/
229 /* internal preprocessor */
230
231 #define _PROFILE_ZONE_DECLARE( prefix, id ) \
232 \
233 prefix ShinyZone id
234
235
236 /*---------------------------------------------------------------------------*/
237 /* internal preprocessor */
238
239 #define _PROFILE_BLOCK_DEFINE( id ) \
240 \
241 ShinyEndNodeOnDestruction SHINY_UNUSED id
242
243
244 /*---------------------------------------------------------------------------*/
245 /* internal preprocessor */
246
247 #define _PROFILE_ZONE_BEGIN( id ) \
248 \
249 do { \
250 static ShinyNodeCache cache = &_ShinyNode_dummy; \
251 ShinyManager_lookupAndBeginNode(&Shiny_instance, &cache, &id); \
252 } while(0)
253
254 /*---------------------------------------------------------------------------*/
255
256 #else /* if SHINY_IS_COMPILED == TRUE */
257
258 #ifdef __cplusplus
259 extern "C" {
260 #endif
261 SHINY_INLINE ShinyData GetEmptyData() {
262 ShinyData a = { { 0, 0 }, { 0, 0 }, { 0, 0 } };
263 return a;
264 }
265 #ifdef __cplusplus
266 } /* end of extern "C" */
267 #endif
268
269 #define PROFILE_UPDATE()
270 #define PROFILE_SET_DAMPING(x)
271 #define PROFILE_GET_DAMPING() 0.0f
272 #define PROFILE_OUTPUT(x)
273 #define PROFILE_OUTPUT_STREAM(x)
274 #define PROFILE_CLEAR()
275 #define PROFILE_GET_TREE_STRING() std::string()
276 #define PROFILE_GET_FLAT_STRING() std::string()
277 #define PROFILE_DESTROY()
278 #define PROFILE_BEGIN(name)
279 #define PROFILE_BLOCK(name)
280 #define PROFILE_FUNC()
281 #define PROFILE_CODE(code) do { code; } while (0)
282 #define PROFILE_SHARED_GLOBAL(name)
283 #define PROFILE_SHARED_MEMBER(name)
284 #define PROFILE_SHARED_DEFINE(name)
285 #define PROFILE_SHARED_BEGIN(name)
286 #define PROFILE_SHARED_BLOCK(name)
287 #define PROFILE_GET_SHARED_DATA(name) ShinyGetEmptyData()
288 #define PROFILE_GET_ROOT_DATA() ShinyGetEmptyData()
289
290 #if SHINY_HAS_ENABLED == TRUE
291 #define PROFILE_SET_ENABLED(boolean)
292 #endif
293
294 #endif /* SHINY_IS_COMPILED == TRUE */
295
296 #endif /* SHINY_MACROS_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #include "ShinyManager.h"
25
26 // #include <malloc.h>
27 #include <memory.h>
28 #include <string.h>
29 #include <stdio.h>
30
31 #if SHINY_IS_COMPILED == TRUE
32
33
34 /*---------------------------------------------------------------------------*/
35
36 #define TABLE_SIZE_INIT 256
37
38 /*---------------------------------------------------------------------------*/
39
40 ShinyManager Shiny_instance = {
41 #if SHINY_HAS_ENABLED == TRUE
42 /* enabled = */ false,
43 #endif
44 /* _lastTick = */ 0,
45 /* _curNode = */ &Shiny_instance.rootNode,
46 /* _tableMask = */ 0,
47 /* _nodeTable = */ _ShinyManager_dummyNodeTable,
48 #if SHINY_LOOKUP_RATE == TRUE
49 /* _lookupCount = */ 0,
50 /* _lookupSuccessCount = */ 0,
51 #endif
52 /* _tableSize = */ 1,
53 /* nodeCount = */ 1,
54 /* zoneCount = */ 1,
55 /* _lastZone = */ &Shiny_instance.rootZone,
56 /* _lastNodePool = */ NULL,
57 /* _firstNodePool = */ NULL,
58 /* rootNode = */ {
59 /* _last = */ { 0, 0 },
60 /* zone = */ &Shiny_instance.rootZone,
61 /* parent = */ &Shiny_instance.rootNode,
62 /* nextSibling = */ NULL,
63 /* firstChild = */ NULL,
64 /* lastChild = */ NULL,
65 /* childCount = */ 0,
66 /* entryLevel = */ 0,
67 /* _cache = */ NULL,
68 /* data = */ { { 0, 0 }, { 0, 0 }, { 0, 0 } }
69 },
70 /* rootZone = */ {
71 /* next = */ NULL,
72 /* _state = */ SHINY_ZONE_STATE_HIDDEN,
73 /* name = */ "<unprofiled>",
74 /* data = */ { { 0, 0 }, { 0, 0 }, { 0, 0 } }
75 },
76 /* damping = */ 0.9f,
77 /* _initialized = */ FALSE,
78 /* _firstUpdate = */ TRUE
79 };
80
81 ShinyNode* _ShinyManager_dummyNodeTable[] = { NULL };
82
83
84 /*---------------------------------------------------------------------------*/
85
86 #if SHINY_COMPILER == SHINY_COMPILER_MSVC
87 # pragma warning (push)
88 # pragma warning (disable: 4311)
89 #endif
90
91 /* primary hash function */
92 SHINY_INLINE uint32_t hash_value(void* a_pParent, void* a_pZone) {
93 // uint32_t a = (uint32_t) a_pParent + (uint32_t) a_pZone;
94 uint32_t a = *reinterpret_cast<uint32_t*>(&a_pParent) + *reinterpret_cast<uint32_t*>(&a_pZone);
95
96 a = (a+0x7ed55d16) + (a<<12);
97 a = (a^0xc761c23c) ^ (a>>19);
98 return a;
99 }
100
101 /*
102 * secondary hash used as index offset: force it to be odd
103 * so it's relatively prime to the power-of-two table size
104 */
105 SHINY_INLINE uint32_t hash_offset(uint32_t a) {
106 return ((a << 8) + (a >> 4)) | 1;
107 }
108
109 #if SHINY_COMPILER == SHINY_COMPILER_MSVC
110 # pragma warning (pop)
111 #endif
112
113
114 /*---------------------------------------------------------------------------*/
115
116 void ShinyManager_preLoad(ShinyManager *self) {
117 if (!self->_initialized) {
118 _ShinyManager_init(self);
119
120 _ShinyManager_createNodeTable(self, TABLE_SIZE_INIT);
121 _ShinyManager_createNodePool(self, TABLE_SIZE_INIT / 2);
122 }
123 }
124
125
126 /*---------------------------------------------------------------------------*/
127
128 void ShinyManager_update(ShinyManager *self) {
129 #if SHINY_HAS_ENABLED == TRUE
130 if (!enabled) return;
131 #endif
132
133 _ShinyManager_appendTicksToCurNode(self);
134 ShinyZone_preUpdateChain(&self->rootZone);
135
136 if (self->_firstUpdate || self->damping == 0) {
137 self->_firstUpdate = FALSE;
138 ShinyNode_updateTreeClean(&self->rootNode);
139 ShinyZone_updateChainClean(&self->rootZone);
140
141 } else {
142 ShinyNode_updateTree(&self->rootNode, self->damping);
143 ShinyZone_updateChain(&self->rootZone, self->damping);
144 }
145 }
146
147
148 /*---------------------------------------------------------------------------*/
149
150 void ShinyManager_updateClean(ShinyManager *self) {
151 #if SHINY_HAS_ENABLED == TRUE
152 if (!enabled) return;
153 #endif
154
155 _ShinyManager_appendTicksToCurNode(self);
156 ShinyZone_preUpdateChain(&self->rootZone);
157
158 self->_firstUpdate = FALSE;
159 ShinyNode_updateTreeClean(&self->rootNode);
160 ShinyZone_updateChainClean(&self->rootZone);
161 }
162
163
164 /*---------------------------------------------------------------------------*/
165
166 void ShinyManager_clear(ShinyManager *self) {
167 ShinyManager_destroy(self);
168 ShinyManager_preLoad(self);
169 }
170
171
172 /*---------------------------------------------------------------------------*/
173
174 void ShinyManager_destroy(ShinyManager *self) {
175 ShinyManager_destroyNodes(self);
176 ShinyManager_resetZones(self);
177 _ShinyManager_uninit(self);
178 }
179
180
181 /*---------------------------------------------------------------------------*/
182
183 ShinyNode* _ShinyManager_lookupNode(ShinyManager *self, ShinyNodeCache *a_cache, ShinyZone *a_zone) {
184 uint32_t nHash = hash_value(self->_curNode, a_zone);
185 uint32_t nIndex = nHash & self->_tableMask;
186 ShinyNode* pNode = self->_nodeTable[nIndex];
187
188 _ShinyManager_incLookup(self);
189 _ShinyManager_incLookupSuccess(self);
190
191 if (pNode) {
192 uint32_t nStep;
193
194 if (ShinyNode_isEqual(pNode, self->_curNode, a_zone)) return pNode; /* found it! */
195
196 /* hash collision: */
197
198 /* compute a secondary hash function for stepping */
199 nStep = hash_offset(nHash);
200
201 for (;;) {
202 _ShinyManager_incLookup(self);
203
204 nIndex = (nIndex + nStep) & self->_tableMask;
205 pNode = self->_nodeTable[nIndex];
206
207 if (!pNode) break; /* found empty slot */
208 else if (ShinyNode_isEqual(pNode, self->_curNode, a_zone)) return pNode; /* found it! */
209 }
210
211 /* loop is guaranteed to end because the hash table is never full */
212 }
213
214 if (a_zone->_state == SHINY_ZONE_STATE_HIDDEN) { /* zone is not initialized */
215 ShinyZone_init(a_zone, self->_lastZone);
216
217 self->_lastZone = a_zone;
218 self->zoneCount++;
219
220 if (self->_initialized == FALSE) { /* first time init */
221 _ShinyManager_init(self);
222
223 _ShinyManager_createNodeTable(self, TABLE_SIZE_INIT);
224 _ShinyManager_createNodePool(self, TABLE_SIZE_INIT / 2);
225
226 /* initialization has invalidated nIndex
227 * we must compute nIndex again
228 */
229 return _ShinyManager_createNode(self, a_cache, a_zone);
230 }
231 }
232
233 /* Althouth nodeCount is not updated
234 * it includes rootNode so it adds up.
235 *
236 * check if we need to grow the table
237 * we keep it at most 1/2 full to be very fast
238 */
239 if (self->_tableSize < 2 * self->nodeCount) {
240
241 _ShinyManager_resizeNodeTable(self, 2 * self->_tableSize);
242 _ShinyManager_resizeNodePool(self, self->nodeCount - 1);
243
244 /* resize has invalidated nIndex
245 * we must compute nIndex again
246 */
247 return _ShinyManager_createNode(self, a_cache, a_zone);
248 }
249
250 self->nodeCount++;
251
252 {
253 ShinyNode* pNewNode = ShinyNodePool_newItem(self->_lastNodePool);
254 ShinyNode_init(pNewNode, self->_curNode, a_zone, a_cache);
255
256 self->_nodeTable[nIndex] = pNewNode;
257 return pNewNode;
258 }
259 }
260
261
262 /*---------------------------------------------------------------------------*/
263
264 void _ShinyManager_insertNode(ShinyManager *self, ShinyNode* a_pNode) {
265 uint32_t nHash = hash_value(a_pNode->parent, a_pNode->zone);
266 uint32_t nIndex = nHash & self->_tableMask;
267
268 if (self->_nodeTable[nIndex]) {
269 uint32_t nStep = hash_offset(nHash);
270
271 while (self->_nodeTable[nIndex])
272 nIndex = (nIndex + nStep) & self->_tableMask;
273 }
274
275 self->_nodeTable[nIndex] = a_pNode;
276 }
277
278
279 /*---------------------------------------------------------------------------*/
280
281 ShinyNode* _ShinyManager_createNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_pZone) {
282 ShinyNode* pNewNode = ShinyNodePool_newItem(self->_lastNodePool);
283 ShinyNode_init(pNewNode, self->_curNode, a_pZone, a_cache);
284
285 self->nodeCount++;
286 _ShinyManager_insertNode(self, pNewNode);
287 return pNewNode;
288 }
289
290
291 /*---------------------------------------------------------------------------*/
292
293 void _ShinyManager_createNodePool(ShinyManager *self, uint32_t a_nCount) {
294 self->_firstNodePool = ShinyNodePool_create(a_nCount);
295 self->_lastNodePool = self->_firstNodePool;
296 }
297
298
299 /*---------------------------------------------------------------------------*/
300
301 void _ShinyManager_resizeNodePool(ShinyManager *self, uint32_t a_nCount) {
302 ShinyNodePool* pPool = ShinyNodePool_create(a_nCount);
303 self->_lastNodePool->nextPool = pPool;
304 self->_lastNodePool = pPool;
305 }
306
307
308 /*---------------------------------------------------------------------------*/
309
310 void _ShinyManager_createNodeTable(ShinyManager *self, uint32_t a_nCount) {
311 self->_tableSize = a_nCount;
312 self->_tableMask = a_nCount - 1;
313
314 self->_nodeTable = (ShinyNodeTable*)
315 malloc(sizeof(ShinyNode) * a_nCount);
316
317 memset(self->_nodeTable, 0, a_nCount * sizeof(ShinyNode*));
318 }
319
320
321 /*---------------------------------------------------------------------------*/
322
323 void _ShinyManager_resizeNodeTable(ShinyManager *self, uint32_t a_nCount) {
324 ShinyNodePool* pPool;
325
326 free(self->_nodeTable);
327 _ShinyManager_createNodeTable(self, a_nCount);
328
329 pPool = self->_firstNodePool;
330 while (pPool) {
331
332 ShinyNode *pIter = ShinyNodePool_firstItem(pPool);
333
334 while (pIter != pPool->_nextItem)
335 _ShinyManager_insertNode(self, pIter++);
336
337 pPool = pPool->nextPool;
338 }
339 }
340
341
342 /*---------------------------------------------------------------------------*/
343
344 void ShinyManager_resetZones(ShinyManager *self) {
345 ShinyZone_resetChain(&self->rootZone);
346 self->_lastZone = &self->rootZone;
347 self->zoneCount = 1;
348 }
349
350
351 /*---------------------------------------------------------------------------*/
352
353 void ShinyManager_destroyNodes(ShinyManager *self) {
354 if (self->_firstNodePool) {
355 ShinyNodePool_destroy(self->_firstNodePool);
356 self->_firstNodePool = NULL;
357 }
358
359 if (self->_nodeTable != _ShinyManager_dummyNodeTable) {
360 free(self->_nodeTable);
361
362 self->_nodeTable = _ShinyManager_dummyNodeTable;
363 self->_tableSize = 1;
364 self->_tableMask = 0;
365 }
366
367 self->_curNode = &self->rootNode;
368 self->nodeCount = 1;
369
370 _ShinyManager_init(self);
371 }
372
373
374 /*---------------------------------------------------------------------------*/
375
376 const char* ShinyManager_getOutputErrorString(ShinyManager *self) {
377 if (self->_firstUpdate) return "!!! Profile data must first be updated !!!";
378 else if (!self->_initialized) return "!!! No profiles where executed !!!";
379 else return NULL;
380 }
381
382
383 /*---------------------------------------------------------------------------*/
384
385 #if SHINY_COMPILER == SHINY_COMPILER_MSVC
386 # pragma warning (push)
387 # pragma warning (disable: 4996)
388 #endif
389
390 int ShinyManager_output(ShinyManager *self, const char *a_filename) {
391 if (!a_filename) {
392 ShinyManager_outputToStream(self, stdout);
393
394 } else {
395 FILE *file = fopen(a_filename, "w");
396 if (!file) return FALSE;
397 ShinyManager_outputToStream(self, file);
398 fclose(file);
399 }
400
401 return TRUE;
402 }
403
404 #if SHINY_COMPILER == SHINY_COMPILER_MSVC
405 # pragma warning (pop)
406 #endif
407
408
409 /*---------------------------------------------------------------------------*/
410
411 void ShinyManager_outputToStream(ShinyManager *self, FILE *a_stream) {
412 const char *error = ShinyManager_getOutputErrorString(self);
413
414 if (error) {
415 fwrite(error, 1, strlen(error), a_stream);
416 fwrite("\n\n", 1, 2, a_stream);
417 return;
418 }
419
420 #if SHINY_OUTPUT_MODE & SHINY_OUTPUT_MODE_FLAT
421 ShinyManager_sortZones(self);
422
423 {
424 int size = ShinyPrintZonesSize(self->zoneCount);
425 char *buffer = (char*) malloc(size);
426 ShinyPrintZones(buffer, &self->rootZone);
427 fwrite(buffer, 1, size - 1, a_stream);
428 fwrite("\n\n", 1, 2, a_stream);
429 free(buffer);
430 }
431 #endif
432
433 #if SHINY_OUTPUT_MODE & SHINY_OUTPUT_MODE_TREE
434 {
435 int size = ShinyPrintNodesSize(self->nodeCount);
436 char *buffer = (char*) malloc(size);
437 ShinyPrintNodes(buffer, &self->rootNode);
438 fwrite(buffer, 1, size - 1, a_stream);
439 fwrite("\n\n", 1, 2, a_stream);
440 free(buffer);
441 }
442 #endif
443 }
444
445 #endif /* if SHINY_IS_COMPILED == TRUE */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_MANAGER_H
25 #define SHINY_MANAGER_H
26
27 #include "ShinyZone.h"
28 #include "ShinyNode.h"
29 #include "ShinyNodePool.h"
30 #include "ShinyTools.h"
31 #include "ShinyOutput.h"
32
33 #include <stdio.h>
34
35 #if SHINY_IS_COMPILED == TRUE
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 /*---------------------------------------------------------------------------*/
42
43 typedef struct {
44 #ifdef SHINY_HAS_ENABLED
45 bool enabled;
46 #endif
47
48 shinytick_t _lastTick;
49
50 ShinyNode* _curNode;
51
52 uint32_t _tableMask; /* = _tableSize - 1 */
53
54 ShinyNodeTable* _nodeTable;
55
56 #ifdef SHINY_LOOKUP_RATE
57 uint64_t _lookupCount;
58 uint64_t _lookupSuccessCount;
59 #endif
60
61 uint32_t _tableSize;
62
63 uint32_t nodeCount;
64 uint32_t zoneCount;
65
66 ShinyZone* _lastZone;
67
68 ShinyNodePool* _lastNodePool;
69 ShinyNodePool* _firstNodePool;
70
71 ShinyNode rootNode;
72 ShinyZone rootZone;
73
74 float damping;
75
76 int _initialized;
77 int _firstUpdate;
78 } ShinyManager;
79
80
81 /*---------------------------------------------------------------------------*/
82
83 extern ShinyNode* _ShinyManager_dummyNodeTable[];
84
85 extern ShinyManager Shiny_instance;
86
87
88 /*---------------------------------------------------------------------------*/
89
90 SHINY_INLINE void _ShinyManager_appendTicksToCurNode(ShinyManager *self) {
91 shinytick_t curTick;
92 ShinyGetTicks(&curTick);
93
94 ShinyNode_appendTicks(self->_curNode, curTick - self->_lastTick);
95 self->_lastTick = curTick;
96 }
97
98 SHINY_API ShinyNode* _ShinyManager_lookupNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_zone);
99
100 SHINY_API void _ShinyManager_createNodeTable(ShinyManager *self, uint32_t a_count);
101 SHINY_API void _ShinyManager_resizeNodeTable(ShinyManager *self, uint32_t a_count);
102
103 SHINY_API void _ShinyManager_createNodePool(ShinyManager *self, uint32_t a_count);
104 SHINY_API void _ShinyManager_resizeNodePool(ShinyManager *self, uint32_t a_count);
105
106 SHINY_API ShinyNode* _ShinyManager_createNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_pZone);
107 SHINY_API void _ShinyManager_insertNode(ShinyManager *self, ShinyNode* a_pNode);
108
109 SHINY_INLINE void _ShinyManager_init(ShinyManager *self) {
110 self->_initialized = TRUE;
111
112 self->rootNode._last.entryCount = 1;
113 self->rootNode._last.selfTicks = 0;
114 ShinyGetTicks(&self->_lastTick);
115 }
116
117 SHINY_INLINE void _ShinyManager_uninit(ShinyManager *self) {
118 self->_initialized = FALSE;
119
120 ShinyNode_clear(&self->rootNode);
121 self->rootNode.parent = &self->rootNode;
122 self->rootNode.zone = &self->rootZone;
123 }
124
125 #ifdef SHINY_LOOKUP_RATE
126 SHINY_INLINE void _ShinyManager_incLookup(ShinyManager *self) { self->_lookupCount++; }
127 SHINY_INLINE void _ShinyManager_incLookupSuccess(ShinyManager *self) { self->_lookupSuccessCount++; }
128 SHINY_INLINE float ShinyManager_lookupRate(const ShinyManager *self) { return ((float) self->_lookupSuccessCount) / ((float) self->_lookupCount); }
129
130 #else
131 SHINY_INLINE void _ShinyManager_incLookup(ShinyManager * self) { self = self; }
132 SHINY_INLINE void _ShinyManager_incLookupSuccess(ShinyManager * self) { self = self; }
133 SHINY_INLINE float ShinyManager_lookupRate(const ShinyManager * self) { self = self; return -1; }
134 #endif
135
136 SHINY_API void ShinyManager_resetZones(ShinyManager *self);
137 SHINY_API void ShinyManager_destroyNodes(ShinyManager *self);
138
139 SHINY_INLINE float ShinyManager_tableUsage(const ShinyManager *self) {
140 return ((float) self->nodeCount) / ((float) self->_tableSize);
141 }
142
143 SHINY_INLINE uint32_t ShinyManager_allocMemInBytes(const ShinyManager *self) {
144 return self->_tableSize * sizeof(ShinyNode*)
145 + (self->_firstNodePool)? ShinyNodePool_memoryUsageChain(self->_firstNodePool) : 0;
146 }
147
148 SHINY_INLINE void ShinyManager_beginNode(ShinyManager *self, ShinyNode* a_node) {
149 ShinyNode_beginEntry(a_node);
150
151 _ShinyManager_appendTicksToCurNode(self);
152 self->_curNode = a_node;
153 }
154
155 SHINY_INLINE void ShinyManager_lookupAndBeginNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_zone) {
156 #ifdef SHINY_HAS_ENABLED
157 if (!self->enabled) return;
158 #endif
159
160 if (self->_curNode != (*a_cache)->parent)
161 *a_cache = _ShinyManager_lookupNode(self, a_cache, a_zone);
162
163 ShinyManager_beginNode(self, *a_cache);
164 }
165
166 SHINY_INLINE void ShinyManager_endCurNode(ShinyManager *self) {
167 #ifdef SHINY_HAS_ENABLED
168 if (!self->enabled) return;
169 #endif
170
171 _ShinyManager_appendTicksToCurNode(self);
172 self->_curNode = self->_curNode->parent;
173 }
174
175 /**/
176
177 SHINY_API void ShinyManager_preLoad(ShinyManager *self);
178
179 SHINY_API void ShinyManager_updateClean(ShinyManager *self);
180 SHINY_API void ShinyManager_update(ShinyManager *self);
181
182 SHINY_API void ShinyManager_clear(ShinyManager *self);
183 SHINY_API void ShinyManager_destroy(ShinyManager *self);
184
185 SHINY_INLINE void ShinyManager_sortZones(ShinyManager *self) {
186 if (self->rootZone.next)
187 self->_lastZone = ShinyZone_sortChain(&self->rootZone.next);
188 }
189
190 SHINY_API const char* ShinyManager_getOutputErrorString(ShinyManager *self);
191
192 SHINY_API int ShinyManager_output(ShinyManager *self, const char *a_filename);
193 SHINY_API void ShinyManager_outputToStream(ShinyManager *self, FILE *stream);
194
195 #if __cplusplus
196 } /* end of extern "C" */
197
198 SHINY_INLINE std::string ShinyManager_outputTreeToString(ShinyManager *self) {
199 const char* error = ShinyManager_getOutputErrorString(self);
200 if (error) return error;
201 else return ShinyNodesToString(&self->rootNode, self->nodeCount);
202 }
203
204 SHINY_INLINE std::string ShinyManager_outputFlatToString(ShinyManager *self) {
205 const char* error = ShinyManager_getOutputErrorString(self);
206 if (error) return error;
207
208 ShinyManager_sortZones(self);
209 return ShinyZonesToString(&self->rootZone, self->zoneCount);
210 }
211
212 extern "C" { /* end of c++ */
213 #endif
214
215 SHINY_INLINE int ShinyManager_isZoneSelfTimeBelow(ShinyManager *self, ShinyZone* a_zone, float a_percentage) {
216 return a_percentage * (float) self->rootZone.data.childTicks.cur
217 <= (float) a_zone->data.selfTicks.cur;
218 }
219
220 SHINY_INLINE int ShinyManager_isZoneTotalTimeBelow(ShinyManager *self, ShinyZone* a_zone, float a_percentage) {
221 return a_percentage * (float) self->rootZone.data.childTicks.cur
222 <= (float) ShinyData_totalTicksCur(&a_zone->data);
223 }
224
225 /**/
226
227 SHINY_INLINE void ShinyManager_enumerateNodes(ShinyManager *self, void (*a_func)(const ShinyNode*)) {
228 ShinyNode_enumerateNodes(&self->rootNode, a_func);
229 }
230
231 SHINY_INLINE void ShinyManager_enumerateZones(ShinyManager *self, void (*a_func)(const ShinyZone*)) {
232 ShinyZone_enumerateZones(&self->rootZone, a_func);
233 }
234
235 #if __cplusplus
236 } /* end of extern "C" */
237
238 template <class T> void ShinyManager_enumerateNodes(ShinyManager *self, T* a_this, void (T::*a_func)(const ShinyNode*)) {
239 ShinyNode_enumerateNodes(&self->rootNode, a_this, a_func);
240 }
241
242 template <class T> void ShinyManager_enumerateZones(ShinyManager *self, T* a_this, void (T::*a_func)(const ShinyZone*)) {
243 ShinyZone_enumerateZones(&self->rootZone, a_this, a_func);
244 }
245
246 extern "C" { /* end of c++ */
247 #endif
248
249
250 /*---------------------------------------------------------------------------*/
251
252 #if __cplusplus
253 } /* end of extern "C" */
254
255 class ShinyEndNodeOnDestruction {
256 public:
257
258 SHINY_INLINE ~ShinyEndNodeOnDestruction() {
259 ShinyManager_endCurNode(&Shiny_instance);
260 }
261 };
262 #endif
263
264 #endif /* if SHINY_IS_COMPILED == TRUE */
265
266 #endif /* SHINY_MANAGER_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #include "ShinyNode.h"
25 #include "ShinyZone.h"
26 #include "ShinyNodeState.h"
27
28 #include <memory.h>
29
30
31 #if SHINY_IS_COMPILED == TRUE
32
33 /*---------------------------------------------------------------------------*/
34
35 ShinyNode _ShinyNode_dummy = {
36 /* _last = */ { 0, 0 },
37 /* zone = */ NULL,
38 /* parent = */ NULL,
39 /* nextSibling = */ NULL,
40 /* firstChild = */ NULL,
41 /* lastChild = */ NULL
42 };
43
44
45 /*---------------------------------------------------------------------------*/
46
47 void ShinyNode_updateTree(ShinyNode* first, float a_damping) {
48 ShinyNodeState *top = NULL;
49 ShinyNode *node = first;
50
51 for (;;) {
52 do {
53 top = ShinyNodeState_push(top, node);
54 node = node->firstChild;
55 } while (node);
56
57 for (;;) {
58 node = ShinyNodeState_finishAndGetNext(top, a_damping);
59 top = ShinyNodeState_pop(top);
60
61 if (node) break;
62 else if (!top) return;
63 }
64 }
65 }
66
67
68 /*---------------------------------------------------------------------------*/
69
70 void ShinyNode_updateTreeClean(ShinyNode* first) {
71 ShinyNodeState *top = NULL;
72 ShinyNode *node = first;
73
74 for (;;) {
75 do {
76 top = ShinyNodeState_push(top, node);
77 node = node->firstChild;
78 } while (node);
79
80 for (;;) {
81 node = ShinyNodeState_finishAndGetNextClean(top);
82 top = ShinyNodeState_pop(top);
83
84 if (node) break;
85 else if (!top) return;
86 }
87 }
88 }
89
90
91 /*---------------------------------------------------------------------------*/
92
93 const ShinyNode* ShinyNode_findNextInTree(const ShinyNode* self) {
94 if (self->firstChild) {
95 return self->firstChild;
96
97 } else if (self->nextSibling) {
98 return self->nextSibling;
99
100 } else {
101 ShinyNode* pParent = self->parent;
102
103 while (!ShinyNode_isRoot(pParent)) {
104 if (pParent->nextSibling) return pParent->nextSibling;
105 else pParent = pParent->parent;
106 }
107
108 return NULL;
109 }
110 }
111
112
113 /*---------------------------------------------------------------------------*/
114
115 void ShinyNode_clear(ShinyNode* self) {
116 memset(self, 0, sizeof(ShinyNode));
117 }
118
119
120 /*---------------------------------------------------------------------------*/
121
122 void ShinyNode_enumerateNodes(const ShinyNode* a_node, void (*a_func)(const ShinyNode*)) {
123 a_func(a_node);
124
125 if (a_node->firstChild) ShinyNode_enumerateNodes(a_node->firstChild, a_func);
126 if (a_node->nextSibling) ShinyNode_enumerateNodes(a_node->nextSibling, a_func);
127 }
128
129 #endif
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_NODE_H
25 #define SHINY_NODE_H
26
27 #include "ShinyData.h"
28 #include "ShinyTools.h"
29
30 #if SHINY_IS_COMPILED == TRUE
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 /*---------------------------------------------------------------------------*/
37
38 typedef struct _ShinyNode {
39
40 ShinyLastData _last;
41
42 struct _ShinyZone* zone;
43 struct _ShinyNode* parent;
44 struct _ShinyNode* nextSibling;
45
46 struct _ShinyNode* firstChild;
47 struct _ShinyNode* lastChild;
48
49 uint32_t childCount;
50 uint32_t entryLevel;
51
52 ShinyNodeCache* _cache;
53
54 ShinyData data;
55
56 } ShinyNode;
57
58
59 /*---------------------------------------------------------------------------*/
60
61 extern ShinyNode _ShinyNode_dummy;
62
63
64 /*---------------------------------------------------------------------------*/
65
66 SHINY_INLINE void ShinyNode_addChild(ShinyNode* self, ShinyNode* a_child) {
67 if (self->childCount++) {
68 self->lastChild->nextSibling = a_child;
69 self->lastChild = a_child;
70
71 } else {
72 self->lastChild = a_child;
73 self->firstChild = a_child;
74 }
75 }
76
77 SHINY_INLINE void ShinyNode_init(ShinyNode* self, ShinyNode* a_parent, struct _ShinyZone* a_zone, ShinyNodeCache* a_cache) {
78 /* NOTE: all member variables are assumed to be zero when allocated */
79
80 self->zone = a_zone;
81 self->parent = a_parent;
82
83 self->entryLevel = a_parent->entryLevel + 1;
84 ShinyNode_addChild(a_parent, self);
85
86 self->_cache = a_cache;
87 }
88
89 SHINY_API void ShinyNode_updateTree(ShinyNode* self, float a_damping);
90 SHINY_API void ShinyNode_updateTreeClean(ShinyNode* self);
91
92 SHINY_INLINE void ShinyNode_destroy(ShinyNode* self) {
93 *(self->_cache) = &_ShinyNode_dummy;
94 }
95
96 SHINY_INLINE void ShinyNode_appendTicks(ShinyNode* self, shinytick_t a_elapsedTicks) {
97 self->_last.selfTicks += a_elapsedTicks;
98 }
99
100 SHINY_INLINE void ShinyNode_beginEntry(ShinyNode* self) {
101 self->_last.entryCount++;
102 }
103
104 SHINY_INLINE int ShinyNode_isRoot(ShinyNode* self) {
105 return (self->entryLevel == 0);
106 }
107
108 SHINY_INLINE int ShinyNode_isDummy(ShinyNode* self) {
109 return (self == &_ShinyNode_dummy);
110 }
111
112 SHINY_INLINE int ShinyNode_isEqual(ShinyNode* self, const ShinyNode* a_parent, const struct _ShinyZone* a_zone) {
113 return (self->parent == a_parent && self->zone == a_zone);
114 }
115
116 SHINY_API const ShinyNode* ShinyNode_findNextInTree(const ShinyNode* self);
117
118 SHINY_API void ShinyNode_clear(ShinyNode* self);
119
120 SHINY_API void ShinyNode_enumerateNodes(const ShinyNode* a_node, void (*a_func)(const ShinyNode*));
121
122 #if __cplusplus
123 } /* end of extern "C" */
124
125 template <class T>
126 void ShinyNode_enumerateNodes(const ShinyNode* a_node, T* a_this, void (T::*a_func)(const ShinyNode*)) {
127 (a_this->*a_func)(a_node);
128
129 if (a_node->firstChild) ShinyNode_enumerateNodes(a_node->firstChild, a_this, a_func);
130 if (a_node->nextSibling) ShinyNode_enumerateNodes(a_node->nextSibling, a_this, a_func);
131 }
132 #endif /* __cplusplus */
133
134 #endif /* if SHINY_IS_COMPILED == TRUE */
135
136 #endif /* SHINY_NODE_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #include "ShinyNodePool.h"
25 #include "ShinyTools.h"
26
27 #include <memory.h>
28 // #include <malloc.h>
29
30 #if SHINY_IS_COMPILED == TRUE
31
32
33 /*---------------------------------------------------------------------------*/
34
35 ShinyNodePool* ShinyNodePool_create(uint32_t a_items) {
36 ShinyNodePool* pPool = (ShinyNodePool*)
37 malloc(sizeof(ShinyNodePool) + sizeof(ShinyNode) * (a_items - 1));
38
39 pPool->nextPool = NULL;
40 pPool->_nextItem = &pPool->_items[0];
41 pPool->endOfItems = &pPool->_items[a_items];
42
43 memset(&pPool->_items[0], 0, a_items * sizeof(ShinyNode));
44 return pPool;
45 }
46
47
48 /*---------------------------------------------------------------------------*/
49
50 uint32_t ShinyNodePool_memoryUsageChain(ShinyNodePool *first) {
51 uint32_t bytes = (uint32_t) ((char*) first->endOfItems - (char*) first);
52 ShinyNodePool *pool = first->nextPool;
53
54 while (pool) {
55 bytes += (uint32_t) ((char*) pool->endOfItems - (char*) pool);
56 pool = pool->nextPool;
57 }
58
59 return bytes;
60 }
61
62
63 /*---------------------------------------------------------------------------*/
64
65 void ShinyNodePool_destroy(ShinyNodePool *self) {
66 ShinyNode* firstNode = ShinyNodePool_firstItem(self);
67 ShinyNode* lastNode = self->_nextItem;
68
69 while (firstNode != lastNode)
70 ShinyNode_destroy(firstNode++);
71
72 /* TODO: make this into a loop or a tail recursion */
73 if (self->nextPool) ShinyNodePool_destroy(self->nextPool);
74 free(self);
75 }
76
77 #endif
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_NODE_POOL_H
25 #define SHINY_NODE_POOL_H
26
27 #include "ShinyNode.h"
28
29 #if SHINY_IS_COMPILED == TRUE
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 /*---------------------------------------------------------------------------*/
36
37 typedef struct _ShinyNodePool {
38
39 struct _ShinyNodePool* nextPool;
40
41 ShinyNode *_nextItem;
42 ShinyNode *endOfItems;
43
44 ShinyNode _items[1];
45
46 } ShinyNodePool;
47
48
49 /*---------------------------------------------------------------------------*/
50
51 SHINY_INLINE ShinyNode* ShinyNodePool_firstItem(ShinyNodePool *self) {
52 return &(self->_items[0]);
53 }
54
55 SHINY_INLINE ShinyNode* ShinyNodePool_newItem(ShinyNodePool *self) {
56 return self->_nextItem++;
57 }
58
59 ShinyNodePool* ShinyNodePool_create(uint32_t a_items);
60 void ShinyNodePool_destroy(ShinyNodePool *self);
61
62 uint32_t ShinyNodePool_memoryUsageChain(ShinyNodePool *first);
63
64 #if __cplusplus
65 } /* end of extern "C" */
66 #endif
67
68 #endif /* if SHINY_IS_COMPILED == TRUE */
69
70
71 #endif /* SHINY_NODE_POOL_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #include "ShinyNodeState.h"
25 #include "ShinyNode.h"
26 #include "ShinyZone.h"
27
28 // #include <malloc.h>
29
30
31 #if SHINY_IS_COMPILED == TRUE
32
33 /*---------------------------------------------------------------------------*/
34
35 ShinyNodeState* ShinyNodeState_push(ShinyNodeState *a_top, ShinyNode *a_node) {
36 ShinyZone *zone = a_node->zone;
37 ShinyNodeState *self = (ShinyNodeState*) malloc(sizeof(ShinyNodeState));
38 self->node = a_node;
39 self->_prev = a_top;
40
41 a_node->data.selfTicks.cur = a_node->_last.selfTicks;
42 a_node->data.entryCount.cur = a_node->_last.entryCount;
43
44 zone->data.selfTicks.cur += a_node->_last.selfTicks;
45 zone->data.entryCount.cur += a_node->_last.entryCount;
46
47 a_node->data.childTicks.cur = 0;
48 a_node->_last.selfTicks = 0;
49 a_node->_last.entryCount = 0;
50
51 self->zoneUpdating = zone->_state != SHINY_ZONE_STATE_UPDATING;
52 if (self->zoneUpdating) {
53 zone->_state = SHINY_ZONE_STATE_UPDATING;
54 } else {
55 zone->data.childTicks.cur -= a_node->data.selfTicks.cur;
56 }
57
58 return self;
59 }
60
61 /*---------------------------------------------------------------------------*/
62
63 ShinyNodeState* ShinyNodeState_pop(ShinyNodeState *a_top) {
64 ShinyNodeState *prev = a_top->_prev;
65 free(a_top);
66 return prev;
67 }
68
69 /*---------------------------------------------------------------------------*/
70
71 ShinyNode* ShinyNodeState_finishAndGetNext(ShinyNodeState *self, float a_damping) {
72 ShinyNode *node = self->node;
73 ShinyZone *zone = node->zone;
74
75 if (self->zoneUpdating) {
76 zone->data.childTicks.cur += node->data.childTicks.cur;
77 zone->_state = SHINY_ZONE_STATE_INITIALIZED;
78 }
79
80 ShinyData_computeAverage(&node->data, a_damping);
81
82 if (!ShinyNode_isRoot(node))
83 node->parent->data.childTicks.cur += node->data.selfTicks.cur + node->data.childTicks.cur;
84
85 return node->nextSibling;
86 }
87
88
89 /*---------------------------------------------------------------------------*/
90
91 ShinyNode* ShinyNodeState_finishAndGetNextClean(ShinyNodeState *self) {
92 ShinyNode *node = self->node;
93 ShinyZone *zone = node->zone;
94
95 if (self->zoneUpdating) {
96 zone->data.childTicks.cur += node->data.childTicks.cur;
97 zone->_state = SHINY_ZONE_STATE_INITIALIZED;
98 }
99
100 ShinyData_copyAverage(&node->data);
101
102 if (!ShinyNode_isRoot(node))
103 node->parent->data.childTicks.cur += node->data.selfTicks.cur + node->data.childTicks.cur;
104
105 return node->nextSibling;
106 }
107
108 #endif
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_NODE_STATE_H
25 #define SHINY_NODE_STATE_H
26
27 #include "ShinyNode.h"
28
29 #if SHINY_IS_COMPILED == TRUE
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 /*---------------------------------------------------------------------------*/
36
37 typedef struct _ShinyNodeState {
38 ShinyNode *node;
39 int zoneUpdating;
40
41 struct _ShinyNodeState *_prev;
42 } ShinyNodeState;
43
44
45 /*---------------------------------------------------------------------------*/
46
47 ShinyNodeState* ShinyNodeState_push(ShinyNodeState *a_top, ShinyNode *a_node);
48 ShinyNodeState* ShinyNodeState_pop(ShinyNodeState *a_top);
49
50 ShinyNode* ShinyNodeState_finishAndGetNext(ShinyNodeState *self, float a_damping);
51 ShinyNode* ShinyNodeState_finishAndGetNextClean(ShinyNodeState *self);
52
53 #if __cplusplus
54 } /* end of extern "C" */
55 #endif
56
57 #endif /* if SHINY_IS_COMPILED == TRUE */
58
59 #endif /* SHINY_NODE_STATE_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #include "ShinyOutput.h"
25
26 #include <stdio.h>
27
28 #if SHINY_COMPILER == SHINY_COMPILER_MSVC
29 # pragma warning(disable: 4996)
30 # define snprintf _snprintf
31 # define TRAILING 0
32
33 #else
34 # define TRAILING 1
35 #endif
36
37 #if SHINY_IS_COMPILED == TRUE
38
39
40 /*---------------------------------------------------------------------------*/
41
42 #define OUTPUT_WIDTH_CALL 6
43 #define OUTPUT_WIDTH_TIME 6
44 #define OUTPUT_WIDTH_PERC 4
45 #define OUTPUT_WIDTH_SUM 79
46
47 #define OUTPUT_WIDTH_DATA (1+OUTPUT_WIDTH_CALL + 1 + 2*(OUTPUT_WIDTH_TIME+4+OUTPUT_WIDTH_PERC+1) + 1)
48 #define OUTPUT_WIDTH_NAME (OUTPUT_WIDTH_SUM - OUTPUT_WIDTH_DATA)
49
50
51 /*---------------------------------------------------------------------------*/
52
53 SHINY_INLINE char* printHeader(char *output, const char *a_title) {
54 snprintf(output, OUTPUT_WIDTH_SUM + TRAILING,
55 "%-*s %*s %*s %*s",
56 OUTPUT_WIDTH_NAME, a_title,
57 OUTPUT_WIDTH_CALL, "calls",
58 OUTPUT_WIDTH_TIME+4+OUTPUT_WIDTH_PERC+1, "self time",
59 OUTPUT_WIDTH_TIME+4+OUTPUT_WIDTH_PERC+1, "total time");
60
61 return output + OUTPUT_WIDTH_SUM;
62 }
63
64
65 /*---------------------------------------------------------------------------*/
66
67 SHINY_INLINE char* printData(char *output, const ShinyData *a_data, float a_topercent) {
68 float totalTicksAvg = ShinyData_totalTicksAvg(a_data);
69 const ShinyTimeUnit *selfUnit = ShinyGetTimeUnit(a_data->selfTicks.avg);
70 const ShinyTimeUnit *totalUnit = ShinyGetTimeUnit(totalTicksAvg);
71
72 snprintf(output, OUTPUT_WIDTH_DATA + TRAILING,
73 " %*.1f %*.0f %-2s %*.0f%% %*.0f %-2s %*.0f%%",
74 OUTPUT_WIDTH_CALL, a_data->entryCount.avg,
75 OUTPUT_WIDTH_TIME, a_data->selfTicks.avg * selfUnit->invTickFreq, selfUnit->suffix,
76 OUTPUT_WIDTH_PERC, a_data->selfTicks.avg * a_topercent,
77 OUTPUT_WIDTH_TIME, totalTicksAvg * totalUnit->invTickFreq, totalUnit->suffix,
78 OUTPUT_WIDTH_PERC, totalTicksAvg * a_topercent);
79
80 return output + OUTPUT_WIDTH_DATA;
81 }
82
83
84 /*---------------------------------------------------------------------------*/
85
86 SHINY_INLINE char* printNode(char* output, const ShinyNode *a_node, float a_topercent) {
87 int offset = a_node->entryLevel * 2;
88
89 snprintf(output, OUTPUT_WIDTH_NAME + TRAILING, "%*s%-*s",
90 offset, "", OUTPUT_WIDTH_NAME - offset, a_node->zone->name);
91
92 output += OUTPUT_WIDTH_NAME;
93
94 output = printData(output, &a_node->data, a_topercent);
95 return output;
96 }
97
98
99 /*---------------------------------------------------------------------------*/
100
101 SHINY_INLINE char* printZone(char* output, const ShinyZone *a_zone, float a_topercent) {
102 snprintf(output, OUTPUT_WIDTH_NAME + TRAILING, "%-*s",
103 OUTPUT_WIDTH_NAME, a_zone->name);
104
105 output += OUTPUT_WIDTH_NAME;
106
107 output = printData(output, &a_zone->data, a_topercent);
108 return output;
109 }
110
111
112 /*---------------------------------------------------------------------------*/
113
114 int ShinyPrintNodesSize(uint32_t a_count) {
115 return (1 + a_count) * (OUTPUT_WIDTH_SUM + 1);
116 }
117
118
119 /*---------------------------------------------------------------------------*/
120
121 int ShinyPrintZonesSize(uint32_t a_count) {
122 return (1 + a_count) * (OUTPUT_WIDTH_SUM + 1);
123 }
124
125
126 /*---------------------------------------------------------------------------*/
127
128 void ShinyPrintANode(char* output, const ShinyNode *a_node, const ShinyNode *a_root) {
129 float fTicksToPc = 100.0f / a_root->data.childTicks.avg;
130 output = printNode(output, a_node, fTicksToPc);
131 (*output++) = '\0';
132 }
133
134
135 /*---------------------------------------------------------------------------*/
136
137 void ShinyPrintAZone(char* output, const ShinyZone *a_zone, const ShinyZone *a_root) {
138 float fTicksToPc = 100.0f / a_root->data.childTicks.avg;
139 output = printZone(output, a_zone, fTicksToPc);
140 (*output++) = '\0';
141 }
142
143
144 /*---------------------------------------------------------------------------*/
145
146 void ShinyPrintNodes(char* output, const ShinyNode *a_root) {
147 float fTicksToPc = 100.0f / a_root->data.childTicks.avg;
148 const ShinyNode *node = a_root;
149
150 output = printHeader(output, "call tree");
151 (*output++) = '\n';
152
153 for (;;) {
154 output = printNode(output, node, fTicksToPc);
155
156 node = ShinyNode_findNextInTree(node);
157 if (node) {
158 (*output++) = '\n';
159 } else {
160 (*output++) = '\0';
161 return;
162 }
163 }
164 }
165
166
167 /*---------------------------------------------------------------------------*/
168
169 void ShinyPrintZones(char* output, const ShinyZone *a_root) {
170 float fTicksToPc = 100.0f / a_root->data.childTicks.avg;
171 const ShinyZone *zone = a_root;
172
173 output = printHeader(output, "sorted list");
174 (*output++) = '\n';
175
176 for (;;) {
177 output = printZone(output, zone, fTicksToPc);
178
179 zone = zone->next;
180 if (zone) {
181 (*output++) = '\n';
182 } else {
183 (*output++) = '\0';
184 return;
185 }
186 }
187 }
188
189 #endif
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_OUTPUT_H
25 #define SHINY_OUTPUT_H
26
27 #include "ShinyNode.h"
28 #include "ShinyZone.h"
29
30 #if SHINY_IS_COMPILED == TRUE
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 /*---------------------------------------------------------------------------*/
37
38 SHINY_API int ShinyPrintNodesSize(uint32_t a_count);
39 SHINY_API int ShinyPrintZonesSize(uint32_t a_count);
40
41 SHINY_API void ShinyPrintANode(char* output, const ShinyNode *a_node, const ShinyNode *a_root);
42 SHINY_API void ShinyPrintAZone(char* output, const ShinyZone *a_zone, const ShinyZone *a_root);
43
44 SHINY_API void ShinyPrintNodes(char* output, const ShinyNode *a_root);
45 SHINY_API void ShinyPrintZones(char* output, const ShinyZone *a_root);
46
47
48 /*---------------------------------------------------------------------------*/
49
50 #if __cplusplus
51 } /* end of extern "C" */
52 #include <string>
53
54 SHINY_INLINE std::string ShinyNodesToString(const ShinyNode *a_root, uint32_t a_count) {
55 std::string str;
56 str.resize(ShinyPrintNodesSize(a_count) - 1);
57 ShinyPrintNodes(&str[0], a_root);
58 return str;
59 }
60
61 SHINY_INLINE std::string ShinyZonesToString(const ShinyZone *a_root, uint32_t a_count) {
62 std::string str;
63 str.resize(ShinyPrintZonesSize(a_count) - 1);
64 ShinyPrintZones(&str[0], a_root);
65 return str;
66 }
67 #endif /* __cplusplus */
68
69 #endif /* if SHINY_IS_COMPILED == TRUE */
70
71 #endif /* SHINY_OUTPUT_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_PREREQS_H
25 #define SHINY_PREREQS_H
26
27 /*---------------------------------------------------------------------------*/
28
29 #ifndef FALSE
30 #define FALSE 0x0
31 #endif
32
33 #ifndef TRUE
34 #define TRUE 0x1
35 #endif
36
37 #ifndef NULL
38 #define NULL 0
39 #endif
40
41 #include "ShinyConfig.h"
42 #include "ShinyVersion.h"
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 /*---------------------------------------------------------------------------*/
49
50 #define SHINY_PLATFORM_WIN32 0x1
51 #define SHINY_PLATFORM_POSIX 0x2
52
53 #if defined (_WIN32)
54 # define SHINY_PLATFORM SHINY_PLATFORM_WIN32
55
56 #else /* ASSUME: POSIX-compliant OS */
57 # define SHINY_PLATFORM SHINY_PLATFORM_POSIX
58 #endif
59
60
61 /*---------------------------------------------------------------------------*/
62
63 #define SHINY_COMPILER_MSVC 0x1
64 #define SHINY_COMPILER_GNUC 0x2
65 #define SHINY_COMPILER_OTHER 0x3
66
67 #if defined (_MSC_VER)
68 # define SHINY_COMPILER SHINY_COMPILER_MSVC
69
70 #elif defined (__GNUG__)
71 # define SHINY_COMPILER SHINY_COMPILER_GNUC
72
73 #else
74 # define SHINY_COMPILER SHINY_COMPILER_OTHER
75 #endif
76
77
78 /*---------------------------------------------------------------------------*/
79
80 #if SHINY_COMPILER == SHINY_COMPILER_GNUC
81 #include <sys/types.h>
82 #include <stdint.h>
83 #endif
84
85
86 /*---------------------------------------------------------------------------*/
87
88 #if SHINY_IS_COMPILED == TRUE
89 struct _ShinyNode;
90 struct _ShinyZone;
91
92 typedef struct _ShinyNode* ShinyNodeCache;
93 typedef struct _ShinyNode* ShinyNodeTable;
94 #endif
95
96
97 /*---------------------------------------------------------------------------*/
98
99 #ifdef SHINY_STATIC_LINK
100 # define SHINY_API
101 #else
102 # define SHINY_API SHINY_EXPORT
103 #endif
104
105
106 /*---------------------------------------------------------------------------*/
107
108 #if SHINY_COMPILER == SHINY_COMPILER_MSVC
109 # define SHINY_INLINE __inline
110 # define SHINY_UNUSED
111 # define SHINY_EXPORT __declspec(dllexport)
112
113 #elif SHINY_COMPILER == SHINY_COMPILER_GNUC
114 # define SHINY_INLINE inline
115 # define SHINY_UNUSED __attribute__((unused))
116 # define SHINY_EXPORT __attribute__((dllexport))
117
118 #elif SHINY_COMPILER == SHINY_COMPILER_OTHER
119 # define SHINY_INLINE inline
120 # define SHINY_UNUSED
121 # define SHINY_EXPORT extern
122 #endif
123
124
125 /*---------------------------------------------------------------------------*/
126
127 #if SHINY_COMPILER == SHINY_COMPILER_MSVC
128 typedef int int32_t;
129 typedef unsigned int uint32_t;
130
131 typedef __int64 int64_t;
132 typedef unsigned __int64 uint64_t;
133
134 /*
135 #elif defined(__CYGWIN__)
136 typedef u_int32_t uint32_t;
137 typedef u_int64_t uint64_t;
138 */
139 #endif
140
141 typedef uint64_t shinytick_t;
142
143 #if __cplusplus
144 } /* end of extern "C" */
145 #endif
146
147 #endif /* SHINY_PREREQS_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #if SHINY_IS_COMPILED == TRUE
25
26 #include "ShinyTools.h"
27
28 #if SHINY_PLATFORM == SHINY_PLATFORM_WIN32
29 #define WIN32_LEAN_AND_MEAN
30 #ifndef NOMINMAX
31 #define NOMINMAX
32 #endif /* NOMINMAX */
33 #include <windows.h>
34
35 #elif SHINY_PLATFORM == SHINY_PLATFORM_POSIX
36 #include <sys/time.h>
37 #endif
38
39
40 /*---------------------------------------------------------------------------*/
41
42 const ShinyTimeUnit* ShinyGetTimeUnit(float ticks) {
43 static ShinyTimeUnit units[4] = { 0 };
44
45 if (units[0].tickFreq == 0) { /* auto initialize first time */
46 units[0].tickFreq = ShinyGetTickFreq() / 1.0f;
47 units[0].invTickFreq = ShinyGetTickInvFreq() * 1.0f;
48 units[0].suffix = "s";
49
50 units[1].tickFreq = ShinyGetTickFreq() / 1000.0f;
51 units[1].invTickFreq = ShinyGetTickInvFreq() * 1000.0f;
52 units[1].suffix = "ms";
53
54 units[2].tickFreq = ShinyGetTickFreq() / 1000000.0f;
55 units[2].invTickFreq = ShinyGetTickInvFreq() * 1000000.0f;
56 units[2].suffix = "us";
57
58 units[3].tickFreq = ShinyGetTickFreq() / 1000000000.0f;
59 units[3].invTickFreq = ShinyGetTickInvFreq() * 1000000000.0f;
60 units[3].suffix = "ns";
61 }
62
63 if (units[0].tickFreq < ticks) return &units[0];
64 else if (units[1].tickFreq < ticks) return &units[1];
65 else if (units[2].tickFreq < ticks) return &units[2];
66 else return &units[3];
67 }
68
69
70 /*---------------------------------------------------------------------------*/
71
72 #if SHINY_PLATFORM == SHINY_PLATFORM_WIN32
73
74 void ShinyGetTicks(shinytick_t *p) {
75 QueryPerformanceCounter((LARGE_INTEGER*)(p));
76 }
77
78 shinytick_t ShinyGetTickFreq(void) {
79 static shinytick_t freq = 0;
80 if (freq == 0) QueryPerformanceFrequency((LARGE_INTEGER*)(&freq));
81 return freq;
82 }
83
84 float ShinyGetTickInvFreq(void) {
85 static float invfreq = 0;
86 if (invfreq == 0) invfreq = 1.0f / ShinyGetTickFreq();
87 return invfreq;
88 }
89
90
91 /*---------------------------------------------------------------------------*/
92
93 #elif SHINY_PLATFORM == SHINY_PLATFORM_POSIX
94
95 void ShinyGetTicks(shinytick_t *p) {
96 timeval time;
97 gettimeofday(&time, NULL);
98
99 *p = time.tv_sec * 1000000 + time.tv_usec;
100 }
101
102 shinytick_t ShinyGetTickFreq(void) {
103 return 1000000;
104 }
105
106 float ShinyGetTickInvFreq(void) {
107 return 1.0f / 1000000.0f;
108 }
109
110 #endif
111
112 #endif /* if SHINY_IS_COMPILED == TRUE */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_TOOLS_H
25 #define SHINY_TOOLS_H
26
27 #include "ShinyPrereqs.h"
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 /*---------------------------------------------------------------------------*/
34
35 typedef struct {
36 float tickFreq;
37 float invTickFreq;
38 const char* suffix;
39 } ShinyTimeUnit;
40
41
42 /*---------------------------------------------------------------------------*/
43
44 SHINY_API const ShinyTimeUnit* ShinyGetTimeUnit(float ticks);
45
46 SHINY_API void ShinyGetTicks(shinytick_t *p);
47
48 SHINY_API shinytick_t ShinyGetTickFreq(void);
49
50 SHINY_API float ShinyGetTickInvFreq(void);
51
52 #if __cplusplus
53 } /* end of extern "C" */
54 #endif
55
56 #endif /* SHINY_TOOLS_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_VERSION_H
25 #define SHINY_VERSION_H
26
27
28 /*---------------------------------------------------------------------------*/
29
30 #define SHINY_VERSION "2.6 RC1"
31 #define SHINY_SHORTNAME "Shiny"
32 #define SHINY_FULLNAME "Shiny Profiler"
33 #define SHINY_COPYRIGHT "Copyright (C) 2007-2010 Aidin Abedi"
34 #define SHINY_DESCRIPTION "Shiny is a state of the art profiler designed to help finding bottlenecks in your project."
35
36 #endif /* SHINY_VERSION_H */
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #include "ShinyZone.h"
25
26 #include <memory.h>
27
28 #if SHINY_IS_COMPILED == TRUE
29
30 /*---------------------------------------------------------------------------*/
31
32 void ShinyZone_preUpdateChain(ShinyZone *first) {
33 ShinyZone* zone = first;
34
35 while (zone) {
36 ShinyData_clearCurrent(&(zone->data));
37 zone = zone->next;
38 }
39 }
40
41
42 /*---------------------------------------------------------------------------*/
43
44 void ShinyZone_updateChain(ShinyZone *first, float a_damping) {
45 ShinyZone* zone = first;
46
47 do {
48 ShinyData_computeAverage(&(zone->data), a_damping);
49 zone = zone->next;
50 } while (zone);
51 }
52
53
54 /*---------------------------------------------------------------------------*/
55
56 void ShinyZone_updateChainClean(ShinyZone *first) {
57 ShinyZone* zone = first;
58
59 do {
60 ShinyData_copyAverage(&(zone->data));
61 zone = zone->next;
62 } while (zone);
63 }
64
65
66 /*---------------------------------------------------------------------------*/
67
68 void ShinyZone_resetChain(ShinyZone *first) {
69 ShinyZone* zone = first, *temp;
70
71 do {
72 zone->_state = SHINY_ZONE_STATE_HIDDEN;
73 temp = zone->next;
74 zone->next = NULL;
75 zone = temp;
76 } while (zone);
77 }
78
79 /*---------------------------------------------------------------------------*/
80
81 /* A Linked-List Memory Sort
82 by Philip J. Erdelsky
83 pje@efgh.com
84 http://www.alumni.caltech.edu/~pje/
85
86 Modified by Aidin Abedi
87 */
88
89 ShinyZone* ShinyZone_sortChain(ShinyZone **first) /* return ptr to last zone */
90 {
91 ShinyZone *p = *first;
92
93 unsigned base;
94 unsigned long block_size;
95
96 struct tape
97 {
98 ShinyZone *first, *last;
99 unsigned long count;
100 } tape[4];
101
102 /* Distribute the records alternately to tape[0] and tape[1]. */
103
104 tape[0].count = tape[1].count = 0L;
105 tape[0].first = NULL;
106 base = 0;
107 while (p != NULL)
108 {
109 ShinyZone *next = p->next;
110 p->next = tape[base].first;
111 tape[base].first = p;
112 tape[base].count++;
113 p = next;
114 base ^= 1;
115 }
116
117 /* If the list is empty or contains only a single record, then */
118 /* tape[1].count == 0L and this part is vacuous. */
119
120 for (base = 0, block_size = 1L; tape[base+1].count != 0L;
121 base ^= 2, block_size <<= 1)
122 {
123 int dest;
124 struct tape *tape0, *tape1;
125 tape0 = tape + base;
126 tape1 = tape + base + 1;
127 dest = base ^ 2;
128 tape[dest].count = tape[dest+1].count = 0;
129 for (; tape0->count != 0; dest ^= 1)
130 {
131 unsigned long n0, n1;
132 struct tape *output_tape = tape + dest;
133 n0 = n1 = block_size;
134 while (1)
135 {
136 ShinyZone *chosen_record;
137 struct tape *chosen_tape;
138 if (n0 == 0 || tape0->count == 0)
139 {
140 if (n1 == 0 || tape1->count == 0)
141 break;
142 chosen_tape = tape1;
143 n1--;
144 }
145 else if (n1 == 0 || tape1->count == 0)
146 {
147 chosen_tape = tape0;
148 n0--;
149 }
150 else if (ShinyZone_compare(tape1->first, tape0->first) > 0)
151 {
152 chosen_tape = tape1;
153 n1--;
154 }
155 else
156 {
157 chosen_tape = tape0;
158 n0--;
159 }
160 chosen_tape->count--;
161 chosen_record = chosen_tape->first;
162 chosen_tape->first = chosen_record->next;
163 if (output_tape->count == 0)
164 output_tape->first = chosen_record;
165 else
166 output_tape->last->next = chosen_record;
167 output_tape->last = chosen_record;
168 output_tape->count++;
169 }
170 }
171 }
172
173 if (tape[base].count > 1L) {
174 ShinyZone* last = tape[base].last;
175 *first = tape[base].first;
176 last->next = NULL;
177 return last;
178
179 } else {
180 return NULL;
181 }
182 }
183
184
185 /*---------------------------------------------------------------------------*/
186
187 void ShinyZone_clear(ShinyZone* self) {
188 memset(self, 0, sizeof(ShinyZone));
189 }
190
191
192 /*---------------------------------------------------------------------------*/
193
194 void ShinyZone_enumerateZones(const ShinyZone* a_zone, void (*a_func)(const ShinyZone*)) {
195 a_func(a_zone);
196
197 if (a_zone->next) ShinyZone_enumerateZones(a_zone->next, a_func);
198 }
199
200 #endif
0 /*
1 The MIT License
2
3 Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 */
23
24 #ifndef SHINY_ZONE_H
25 #define SHINY_ZONE_H
26
27 #include "ShinyData.h"
28 #include <memory.h>
29
30 #if SHINY_IS_COMPILED == TRUE
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 /*---------------------------------------------------------------------------*/
37
38 #define SHINY_ZONE_STATE_HIDDEN 0
39 #define SHINY_ZONE_STATE_INITIALIZED 1
40 #define SHINY_ZONE_STATE_UPDATING 2
41
42
43 /*---------------------------------------------------------------------------*/
44
45 typedef struct _ShinyZone {
46 struct _ShinyZone* next;
47 int _state;
48 const char* name;
49 ShinyData data;
50 } ShinyZone;
51
52
53 /*---------------------------------------------------------------------------*/
54
55 SHINY_INLINE void ShinyZone_init(ShinyZone *self, ShinyZone* a_prev) {
56 self->_state = SHINY_ZONE_STATE_INITIALIZED;
57 a_prev->next = self;
58 }
59
60 SHINY_INLINE void ShinyZone_uninit(ShinyZone *self) {
61 self->_state = SHINY_ZONE_STATE_HIDDEN;
62 self->next = NULL;
63 }
64
65 SHINY_API void ShinyZone_preUpdateChain(ShinyZone *first);
66 SHINY_API void ShinyZone_updateChain(ShinyZone *first, float a_damping);
67 SHINY_API void ShinyZone_updateChainClean(ShinyZone *first);
68
69 SHINY_API void ShinyZone_resetChain(ShinyZone *first);
70
71 SHINY_API ShinyZone* ShinyZone_sortChain(ShinyZone **first);
72
73 SHINY_INLINE float ShinyZone_compare(ShinyZone *a, ShinyZone *b) {
74 return a->data.selfTicks.avg - b->data.selfTicks.avg;
75 }
76
77 SHINY_API void ShinyZone_clear(ShinyZone* self);
78
79 SHINY_API void ShinyZone_enumerateZones(const ShinyZone* a_zone, void (*a_func)(const ShinyZone*));
80
81 #if __cplusplus
82 } /* end of extern "C" */
83
84 template <class T>
85 void ShinyZone_enumerateZones(const ShinyZone* a_zone, T* a_this, void (T::*a_func)(const ShinyZone*)) {
86 (a_this->*a_func)(a_zone);
87
88 if (a_zone->next) ShinyZone_enumerateZones(a_zone->next, a_this, a_func);
89 }
90 #endif /* __cplusplus */
91
92 #endif /* if SHINY_IS_COMPILED == TRUE */
93
94 #endif /* SHINY_ZONE_H */
0 /* ADMesh -- process triangulated solid meshes
1 * Copyright (C) 1995, 1996 Anthony D. Martin <amartin@engr.csulb.edu>
2 * Copyright (C) 2013, 2014 several contributors, see AUTHORS
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Questions, comments, suggestions, etc to
19 * https://github.com/admesh/admesh/issues
20 */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <math.h>
26
27 #include "stl.h"
28
29
30 static void stl_match_neighbors_exact(stl_file *stl,
31 stl_hash_edge *edge_a, stl_hash_edge *edge_b);
32 static void stl_match_neighbors_nearby(stl_file *stl,
33 stl_hash_edge *edge_a, stl_hash_edge *edge_b);
34 static void stl_record_neighbors(stl_file *stl,
35 stl_hash_edge *edge_a, stl_hash_edge *edge_b);
36 static void stl_initialize_facet_check_exact(stl_file *stl);
37 static void stl_initialize_facet_check_nearby(stl_file *stl);
38 static void stl_load_edge_exact(stl_file *stl, stl_hash_edge *edge,
39 stl_vertex *a, stl_vertex *b);
40 static int stl_load_edge_nearby(stl_file *stl, stl_hash_edge *edge,
41 stl_vertex *a, stl_vertex *b, float tolerance);
42 static void insert_hash_edge(stl_file *stl, stl_hash_edge edge,
43 void (*match_neighbors)(stl_file *stl,
44 stl_hash_edge *edge_a, stl_hash_edge *edge_b));
45 static int stl_get_hash_for_edge(int M, stl_hash_edge *edge);
46 static int stl_compare_function(stl_hash_edge *edge_a, stl_hash_edge *edge_b);
47 static void stl_free_edges(stl_file *stl);
48 static void stl_remove_facet(stl_file *stl, int facet_number);
49 static void stl_change_vertices(stl_file *stl, int facet_num, int vnot,
50 stl_vertex new_vertex);
51 static void stl_which_vertices_to_change(stl_file *stl, stl_hash_edge *edge_a,
52 stl_hash_edge *edge_b, int *facet1, int *vertex1,
53 int *facet2, int *vertex2,
54 stl_vertex *new_vertex1, stl_vertex *new_vertex2);
55 static void stl_remove_degenerate(stl_file *stl, int facet);
56 extern int stl_check_normal_vector(stl_file *stl,
57 int facet_num, int normal_fix_flag);
58 static void stl_update_connects_remove_1(stl_file *stl, int facet_num);
59
60
61 void
62 stl_check_facets_exact(stl_file *stl) {
63 /* This function builds the neighbors list. No modifications are made
64 * to any of the facets. The edges are said to match only if all six
65 * floats of the first edge matches all six floats of the second edge.
66 */
67
68 stl_hash_edge edge;
69 stl_facet facet;
70 int i;
71 int j;
72
73 if (stl->error) return;
74
75 stl->stats.connected_edges = 0;
76 stl->stats.connected_facets_1_edge = 0;
77 stl->stats.connected_facets_2_edge = 0;
78 stl->stats.connected_facets_3_edge = 0;
79
80 stl_initialize_facet_check_exact(stl);
81
82 for(i = 0; i < stl->stats.number_of_facets; i++) {
83 facet = stl->facet_start[i];
84
85 /* If any two of the three vertices are found to be exactally the same, call them degenerate and remove the facet. */
86 if( !memcmp(&facet.vertex[0], &facet.vertex[1],
87 sizeof(stl_vertex))
88 || !memcmp(&facet.vertex[1], &facet.vertex[2],
89 sizeof(stl_vertex))
90 || !memcmp(&facet.vertex[0], &facet.vertex[2],
91 sizeof(stl_vertex))) {
92 stl->stats.degenerate_facets += 1;
93 stl_remove_facet(stl, i);
94 i--;
95 continue;
96
97 }
98 for(j = 0; j < 3; j++) {
99 edge.facet_number = i;
100 edge.which_edge = j;
101 stl_load_edge_exact(stl, &edge, &facet.vertex[j],
102 &facet.vertex[(j + 1) % 3]);
103
104 insert_hash_edge(stl, edge, stl_match_neighbors_exact);
105 }
106 }
107 stl_free_edges(stl);
108 }
109
110 static void
111 stl_load_edge_exact(stl_file *stl, stl_hash_edge *edge,
112 stl_vertex *a, stl_vertex *b) {
113
114 float diff_x;
115 float diff_y;
116 float diff_z;
117 float max_diff;
118
119 if (stl->error) return;
120
121 diff_x = ABS(a->x - b->x);
122 diff_y = ABS(a->y - b->y);
123 diff_z = ABS(a->z - b->z);
124 max_diff = STL_MAX(diff_x, diff_y);
125 max_diff = STL_MAX(diff_z, max_diff);
126 stl->stats.shortest_edge = STL_MIN(max_diff, stl->stats.shortest_edge);
127
128 if(diff_x == max_diff) {
129 if(a->x > b->x) {
130 memcpy(&edge->key[0], a, sizeof(stl_vertex));
131 memcpy(&edge->key[3], b, sizeof(stl_vertex));
132 } else {
133 memcpy(&edge->key[0], b, sizeof(stl_vertex));
134 memcpy(&edge->key[3], a, sizeof(stl_vertex));
135 edge->which_edge += 3; /* this edge is loaded backwards */
136 }
137 } else if(diff_y == max_diff) {
138 if(a->y > b->y) {
139 memcpy(&edge->key[0], a, sizeof(stl_vertex));
140 memcpy(&edge->key[3], b, sizeof(stl_vertex));
141 } else {
142 memcpy(&edge->key[0], b, sizeof(stl_vertex));
143 memcpy(&edge->key[3], a, sizeof(stl_vertex));
144 edge->which_edge += 3; /* this edge is loaded backwards */
145 }
146 } else {
147 if(a->z > b->z) {
148 memcpy(&edge->key[0], a, sizeof(stl_vertex));
149 memcpy(&edge->key[3], b, sizeof(stl_vertex));
150 } else {
151 memcpy(&edge->key[0], b, sizeof(stl_vertex));
152 memcpy(&edge->key[3], a, sizeof(stl_vertex));
153 edge->which_edge += 3; /* this edge is loaded backwards */
154 }
155 }
156 }
157
158 static void
159 stl_initialize_facet_check_exact(stl_file *stl) {
160 int i;
161
162 if (stl->error) return;
163
164 stl->stats.malloced = 0;
165 stl->stats.freed = 0;
166 stl->stats.collisions = 0;
167
168
169 stl->M = 81397;
170
171 for(i = 0; i < stl->stats.number_of_facets ; i++) {
172 /* initialize neighbors list to -1 to mark unconnected edges */
173 stl->neighbors_start[i].neighbor[0] = -1;
174 stl->neighbors_start[i].neighbor[1] = -1;
175 stl->neighbors_start[i].neighbor[2] = -1;
176 }
177
178 stl->heads = (stl_hash_edge**)calloc(stl->M, sizeof(*stl->heads));
179 if(stl->heads == NULL) perror("stl_initialize_facet_check_exact");
180
181 stl->tail = (stl_hash_edge*)malloc(sizeof(stl_hash_edge));
182 if(stl->tail == NULL) perror("stl_initialize_facet_check_exact");
183
184 stl->tail->next = stl->tail;
185
186 for(i = 0; i < stl->M; i++) {
187 stl->heads[i] = stl->tail;
188 }
189 }
190
191 static void
192 insert_hash_edge(stl_file *stl, stl_hash_edge edge,
193 void (*match_neighbors)(stl_file *stl,
194 stl_hash_edge *edge_a, stl_hash_edge *edge_b)) {
195 stl_hash_edge *link;
196 stl_hash_edge *new_edge;
197 stl_hash_edge *temp;
198 int chain_number;
199
200 if (stl->error) return;
201
202 chain_number = stl_get_hash_for_edge(stl->M, &edge);
203
204 link = stl->heads[chain_number];
205
206 if(link == stl->tail) {
207 /* This list doesn't have any edges currently in it. Add this one. */
208 new_edge = (stl_hash_edge*)malloc(sizeof(stl_hash_edge));
209 if(new_edge == NULL) perror("insert_hash_edge");
210 stl->stats.malloced++;
211 *new_edge = edge;
212 new_edge->next = stl->tail;
213 stl->heads[chain_number] = new_edge;
214 return;
215 } else if(!stl_compare_function(&edge, link)) {
216 /* This is a match. Record result in neighbors list. */
217 match_neighbors(stl, &edge, link);
218 /* Delete the matched edge from the list. */
219 stl->heads[chain_number] = link->next;
220 free(link);
221 stl->stats.freed++;
222 return;
223 } else {
224 /* Continue through the rest of the list */
225 for(;;) {
226 if(link->next == stl->tail) {
227 /* This is the last item in the list. Insert a new edge. */
228 new_edge = (stl_hash_edge*)malloc(sizeof(stl_hash_edge));
229 if(new_edge == NULL) perror("insert_hash_edge");
230 stl->stats.malloced++;
231 *new_edge = edge;
232 new_edge->next = stl->tail;
233 link->next = new_edge;
234 stl->stats.collisions++;
235 return;
236 } else if(!stl_compare_function(&edge, link->next)) {
237 /* This is a match. Record result in neighbors list. */
238 match_neighbors(stl, &edge, link->next);
239
240 /* Delete the matched edge from the list. */
241 temp = link->next;
242 link->next = link->next->next;
243 free(temp);
244 stl->stats.freed++;
245 return;
246 } else {
247 /* This is not a match. Go to the next link */
248 link = link->next;
249 stl->stats.collisions++;
250 }
251 }
252 }
253 }
254
255
256 static int
257 stl_get_hash_for_edge(int M, stl_hash_edge *edge) {
258 return ((edge->key[0] / 23 + edge->key[1] / 19 + edge->key[2] / 17
259 + edge->key[3] /13 + edge->key[4] / 11 + edge->key[5] / 7 ) % M);
260 }
261
262 static int
263 stl_compare_function(stl_hash_edge *edge_a, stl_hash_edge *edge_b) {
264 if(edge_a->facet_number == edge_b->facet_number) {
265 return 1; /* Don't match edges of the same facet */
266 } else {
267 return memcmp(edge_a, edge_b, SIZEOF_EDGE_SORT);
268 }
269 }
270
271 void
272 stl_check_facets_nearby(stl_file *stl, float tolerance) {
273 stl_hash_edge edge[3];
274 stl_facet facet;
275 int i;
276 int j;
277
278 if (stl->error) return;
279
280 if( (stl->stats.connected_facets_1_edge == stl->stats.number_of_facets)
281 && (stl->stats.connected_facets_2_edge == stl->stats.number_of_facets)
282 && (stl->stats.connected_facets_3_edge == stl->stats.number_of_facets)) {
283 /* No need to check any further. All facets are connected */
284 return;
285 }
286
287 stl_initialize_facet_check_nearby(stl);
288
289 for(i = 0; i < stl->stats.number_of_facets; i++) {
290 facet = stl->facet_start[i];
291 for(j = 0; j < 3; j++) {
292 if(stl->neighbors_start[i].neighbor[j] == -1) {
293 edge[j].facet_number = i;
294 edge[j].which_edge = j;
295 if(stl_load_edge_nearby(stl, &edge[j], &facet.vertex[j],
296 &facet.vertex[(j + 1) % 3],
297 tolerance)) {
298 /* only insert edges that have different keys */
299 insert_hash_edge(stl, edge[j], stl_match_neighbors_nearby);
300 }
301 }
302 }
303 }
304
305 stl_free_edges(stl);
306 }
307
308 static int
309 stl_load_edge_nearby(stl_file *stl, stl_hash_edge *edge,
310 stl_vertex *a, stl_vertex *b, float tolerance) {
311 float diff_x;
312 float diff_y;
313 float diff_z;
314 float max_diff;
315 unsigned vertex1[3];
316 unsigned vertex2[3];
317
318
319 diff_x = ABS(a->x - b->x);
320 diff_y = ABS(a->y - b->y);
321 diff_z = ABS(a->z - b->z);
322 max_diff = STL_MAX(diff_x, diff_y);
323 max_diff = STL_MAX(diff_z, max_diff);
324
325 vertex1[0] = (unsigned)((a->x - stl->stats.min.x) / tolerance);
326 vertex1[1] = (unsigned)((a->y - stl->stats.min.y) / tolerance);
327 vertex1[2] = (unsigned)((a->z - stl->stats.min.z) / tolerance);
328 vertex2[0] = (unsigned)((b->x - stl->stats.min.x) / tolerance);
329 vertex2[1] = (unsigned)((b->y - stl->stats.min.y) / tolerance);
330 vertex2[2] = (unsigned)((b->z - stl->stats.min.z) / tolerance);
331
332 if( (vertex1[0] == vertex2[0])
333 && (vertex1[1] == vertex2[1])
334 && (vertex1[2] == vertex2[2])) {
335 /* Both vertices hash to the same value */
336 return 0;
337 }
338
339 if(diff_x == max_diff) {
340 if(a->x > b->x) {
341 memcpy(&edge->key[0], vertex1, sizeof(stl_vertex));
342 memcpy(&edge->key[3], vertex2, sizeof(stl_vertex));
343 } else {
344 memcpy(&edge->key[0], vertex2, sizeof(stl_vertex));
345 memcpy(&edge->key[3], vertex1, sizeof(stl_vertex));
346 edge->which_edge += 3; /* this edge is loaded backwards */
347 }
348 } else if(diff_y == max_diff) {
349 if(a->y > b->y) {
350 memcpy(&edge->key[0], vertex1, sizeof(stl_vertex));
351 memcpy(&edge->key[3], vertex2, sizeof(stl_vertex));
352 } else {
353 memcpy(&edge->key[0], vertex2, sizeof(stl_vertex));
354 memcpy(&edge->key[3], vertex1, sizeof(stl_vertex));
355 edge->which_edge += 3; /* this edge is loaded backwards */
356 }
357 } else {
358 if(a->z > b->z) {
359 memcpy(&edge->key[0], vertex1, sizeof(stl_vertex));
360 memcpy(&edge->key[3], vertex2, sizeof(stl_vertex));
361 } else {
362 memcpy(&edge->key[0], vertex2, sizeof(stl_vertex));
363 memcpy(&edge->key[3], vertex1, sizeof(stl_vertex));
364 edge->which_edge += 3; /* this edge is loaded backwards */
365 }
366 }
367 return 1;
368 }
369
370 static void
371 stl_free_edges(stl_file *stl) {
372 int i;
373 stl_hash_edge *temp;
374
375 if (stl->error) return;
376
377 if(stl->stats.malloced != stl->stats.freed) {
378 for(i = 0; i < stl->M; i++) {
379 for(temp = stl->heads[i]; stl->heads[i] != stl->tail;
380 temp = stl->heads[i]) {
381 stl->heads[i] = stl->heads[i]->next;
382 free(temp);
383 stl->stats.freed++;
384 }
385 }
386 }
387 free(stl->heads);
388 free(stl->tail);
389 }
390
391 static void
392 stl_initialize_facet_check_nearby(stl_file *stl) {
393 int i;
394
395 if (stl->error) return;
396
397 stl->stats.malloced = 0;
398 stl->stats.freed = 0;
399 stl->stats.collisions = 0;
400
401 /* tolerance = STL_MAX(stl->stats.shortest_edge, tolerance);*/
402 /* tolerance = STL_MAX((stl->stats.bounding_diameter / 500000.0), tolerance);*/
403 /* tolerance *= 0.5;*/
404
405 stl->M = 81397;
406
407 stl->heads = (stl_hash_edge**)calloc(stl->M, sizeof(*stl->heads));
408 if(stl->heads == NULL) perror("stl_initialize_facet_check_nearby");
409
410 stl->tail = (stl_hash_edge*)malloc(sizeof(stl_hash_edge));
411 if(stl->tail == NULL) perror("stl_initialize_facet_check_nearby");
412
413 stl->tail->next = stl->tail;
414
415 for(i = 0; i < stl->M; i++) {
416 stl->heads[i] = stl->tail;
417 }
418 }
419
420
421
422 static void
423 stl_record_neighbors(stl_file *stl,
424 stl_hash_edge *edge_a, stl_hash_edge *edge_b) {
425 int i;
426 int j;
427
428 if (stl->error) return;
429
430 /* Facet a's neighbor is facet b */
431 stl->neighbors_start[edge_a->facet_number].neighbor[edge_a->which_edge % 3] =
432 edge_b->facet_number; /* sets the .neighbor part */
433
434 stl->neighbors_start[edge_a->facet_number].
435 which_vertex_not[edge_a->which_edge % 3] =
436 (edge_b->which_edge + 2) % 3; /* sets the .which_vertex_not part */
437
438 /* Facet b's neighbor is facet a */
439 stl->neighbors_start[edge_b->facet_number].neighbor[edge_b->which_edge % 3] =
440 edge_a->facet_number; /* sets the .neighbor part */
441
442 stl->neighbors_start[edge_b->facet_number].
443 which_vertex_not[edge_b->which_edge % 3] =
444 (edge_a->which_edge + 2) % 3; /* sets the .which_vertex_not part */
445
446 if( ((edge_a->which_edge < 3) && (edge_b->which_edge < 3))
447 || ((edge_a->which_edge > 2) && (edge_b->which_edge > 2))) {
448 /* these facets are oriented in opposite directions. */
449 /* their normals are probably messed up. */
450 stl->neighbors_start[edge_a->facet_number].
451 which_vertex_not[edge_a->which_edge % 3] += 3;
452 stl->neighbors_start[edge_b->facet_number].
453 which_vertex_not[edge_b->which_edge % 3] += 3;
454 }
455
456
457 /* Count successful connects */
458 /* Total connects */
459 stl->stats.connected_edges += 2;
460 /* Count individual connects */
461 i = ((stl->neighbors_start[edge_a->facet_number].neighbor[0] == -1) +
462 (stl->neighbors_start[edge_a->facet_number].neighbor[1] == -1) +
463 (stl->neighbors_start[edge_a->facet_number].neighbor[2] == -1));
464 j = ((stl->neighbors_start[edge_b->facet_number].neighbor[0] == -1) +
465 (stl->neighbors_start[edge_b->facet_number].neighbor[1] == -1) +
466 (stl->neighbors_start[edge_b->facet_number].neighbor[2] == -1));
467 if(i == 2) {
468 stl->stats.connected_facets_1_edge +=1;
469 } else if(i == 1) {
470 stl->stats.connected_facets_2_edge +=1;
471 } else {
472 stl->stats.connected_facets_3_edge +=1;
473 }
474 if(j == 2) {
475 stl->stats.connected_facets_1_edge +=1;
476 } else if(j == 1) {
477 stl->stats.connected_facets_2_edge +=1;
478 } else {
479 stl->stats.connected_facets_3_edge +=1;
480 }
481 }
482
483 static void
484 stl_match_neighbors_exact(stl_file *stl,
485 stl_hash_edge *edge_a, stl_hash_edge *edge_b) {
486 if (stl->error) return;
487 stl_record_neighbors(stl, edge_a, edge_b);
488 }
489
490 static void
491 stl_match_neighbors_nearby(stl_file *stl,
492 stl_hash_edge *edge_a, stl_hash_edge *edge_b) {
493 int facet1;
494 int facet2;
495 int vertex1;
496 int vertex2;
497 int vnot1;
498 int vnot2;
499 stl_vertex new_vertex1;
500 stl_vertex new_vertex2;
501
502 if (stl->error) return;
503
504 stl_record_neighbors(stl, edge_a, edge_b);
505 stl_which_vertices_to_change(stl, edge_a, edge_b, &facet1, &vertex1,
506 &facet2, &vertex2, &new_vertex1, &new_vertex2);
507 if(facet1 != -1) {
508 if(facet1 == edge_a->facet_number) {
509 vnot1 = (edge_a->which_edge + 2) % 3;
510 } else {
511 vnot1 = (edge_b->which_edge + 2) % 3;
512 }
513 if(((vnot1 + 2) % 3) == vertex1) {
514 vnot1 += 3;
515 }
516 stl_change_vertices(stl, facet1, vnot1, new_vertex1);
517 }
518 if(facet2 != -1) {
519 if(facet2 == edge_a->facet_number) {
520 vnot2 = (edge_a->which_edge + 2) % 3;
521 } else {
522 vnot2 = (edge_b->which_edge + 2) % 3;
523 }
524 if(((vnot2 + 2) % 3) == vertex2) {
525 vnot2 += 3;
526 }
527 stl_change_vertices(stl, facet2, vnot2, new_vertex2);
528 }
529 stl->stats.edges_fixed += 2;
530 }
531
532
533 static void
534 stl_change_vertices(stl_file *stl, int facet_num, int vnot,
535 stl_vertex new_vertex) {
536 int first_facet;
537 int direction;
538 int next_edge;
539 int pivot_vertex;
540
541 if (stl->error) return;
542
543 first_facet = facet_num;
544 direction = 0;
545
546 for(;;) {
547 if(vnot > 2) {
548 if(direction == 0) {
549 pivot_vertex = (vnot + 2) % 3;
550 next_edge = pivot_vertex;
551 direction = 1;
552 } else {
553 pivot_vertex = (vnot + 1) % 3;
554 next_edge = vnot % 3;
555 direction = 0;
556 }
557 } else {
558 if(direction == 0) {
559 pivot_vertex = (vnot + 1) % 3;
560 next_edge = vnot;
561 } else {
562 pivot_vertex = (vnot + 2) % 3;
563 next_edge = pivot_vertex;
564 }
565 }
566 stl->facet_start[facet_num].vertex[pivot_vertex] = new_vertex;
567 vnot = stl->neighbors_start[facet_num].which_vertex_not[next_edge];
568 facet_num = stl->neighbors_start[facet_num].neighbor[next_edge];
569
570 if(facet_num == -1) {
571 break;
572 }
573
574 if(facet_num == first_facet) {
575 /* back to the beginning */
576 printf("\
577 Back to the first facet changing vertices: probably a mobius part.\n\
578 Try using a smaller tolerance or don't do a nearby check\n");
579 return;
580 }
581 }
582 }
583
584
585 static void
586 stl_which_vertices_to_change(stl_file *stl, stl_hash_edge *edge_a,
587 stl_hash_edge *edge_b, int *facet1, int *vertex1,
588 int *facet2, int *vertex2,
589 stl_vertex *new_vertex1, stl_vertex *new_vertex2) {
590 int v1a; /* pair 1, facet a */
591 int v1b; /* pair 1, facet b */
592 int v2a; /* pair 2, facet a */
593 int v2b; /* pair 2, facet b */
594
595 /* Find first pair */
596 if(edge_a->which_edge < 3) {
597 v1a = edge_a->which_edge;
598 v2a = (edge_a->which_edge + 1) % 3;
599 } else {
600 v2a = edge_a->which_edge % 3;
601 v1a = (edge_a->which_edge + 1) % 3;
602 }
603 if(edge_b->which_edge < 3) {
604 v1b = edge_b->which_edge;
605 v2b = (edge_b->which_edge + 1) % 3;
606 } else {
607 v2b = edge_b->which_edge % 3;
608 v1b = (edge_b->which_edge + 1) % 3;
609 }
610
611 /* Of the first pair, which vertex, if any, should be changed */
612 if(!memcmp(&stl->facet_start[edge_a->facet_number].vertex[v1a],
613 &stl->facet_start[edge_b->facet_number].vertex[v1b],
614 sizeof(stl_vertex))) {
615 /* These facets are already equal. No need to change. */
616 *facet1 = -1;
617 } else {
618 if( (stl->neighbors_start[edge_a->facet_number].neighbor[v1a] == -1)
619 && (stl->neighbors_start[edge_a->facet_number].
620 neighbor[(v1a + 2) % 3] == -1)) {
621 /* This vertex has no neighbors. This is a good one to change */
622 *facet1 = edge_a->facet_number;
623 *vertex1 = v1a;
624 *new_vertex1 = stl->facet_start[edge_b->facet_number].vertex[v1b];
625 } else {
626 *facet1 = edge_b->facet_number;
627 *vertex1 = v1b;
628 *new_vertex1 = stl->facet_start[edge_a->facet_number].vertex[v1a];
629 }
630 }
631
632 /* Of the second pair, which vertex, if any, should be changed */
633 if(!memcmp(&stl->facet_start[edge_a->facet_number].vertex[v2a],
634 &stl->facet_start[edge_b->facet_number].vertex[v2b],
635 sizeof(stl_vertex))) {
636 /* These facets are already equal. No need to change. */
637 *facet2 = -1;
638 } else {
639 if( (stl->neighbors_start[edge_a->facet_number].neighbor[v2a] == -1)
640 && (stl->neighbors_start[edge_a->facet_number].
641 neighbor[(v2a + 2) % 3] == -1)) {
642 /* This vertex has no neighbors. This is a good one to change */
643 *facet2 = edge_a->facet_number;
644 *vertex2 = v2a;
645 *new_vertex2 = stl->facet_start[edge_b->facet_number].vertex[v2b];
646 } else {
647 *facet2 = edge_b->facet_number;
648 *vertex2 = v2b;
649 *new_vertex2 = stl->facet_start[edge_a->facet_number].vertex[v2a];
650 }
651 }
652 }
653
654 static void
655 stl_remove_facet(stl_file *stl, int facet_number) {
656 int neighbor[3];
657 int vnot[3];
658 int i;
659 int j;
660
661 if (stl->error) return;
662
663 stl->stats.facets_removed += 1;
664 /* Update list of connected edges */
665 j = ((stl->neighbors_start[facet_number].neighbor[0] == -1) +
666 (stl->neighbors_start[facet_number].neighbor[1] == -1) +
667 (stl->neighbors_start[facet_number].neighbor[2] == -1));
668 if(j == 2) {
669 stl->stats.connected_facets_1_edge -= 1;
670 } else if(j == 1) {
671 stl->stats.connected_facets_2_edge -= 1;
672 stl->stats.connected_facets_1_edge -= 1;
673 } else if(j == 0) {
674 stl->stats.connected_facets_3_edge -= 1;
675 stl->stats.connected_facets_2_edge -= 1;
676 stl->stats.connected_facets_1_edge -= 1;
677 }
678
679 stl->facet_start[facet_number] =
680 stl->facet_start[stl->stats.number_of_facets - 1];
681 /* I could reallocate at this point, but it is not really necessary. */
682 stl->neighbors_start[facet_number] =
683 stl->neighbors_start[stl->stats.number_of_facets - 1];
684 stl->stats.number_of_facets -= 1;
685
686 for(i = 0; i < 3; i++) {
687 neighbor[i] = stl->neighbors_start[facet_number].neighbor[i];
688 vnot[i] = stl->neighbors_start[facet_number].which_vertex_not[i];
689 }
690
691 for(i = 0; i < 3; i++) {
692 if(neighbor[i] != -1) {
693 if(stl->neighbors_start[neighbor[i]].neighbor[(vnot[i] + 1)% 3] !=
694 stl->stats.number_of_facets) {
695 printf("\
696 in stl_remove_facet: neighbor = %d numfacets = %d this is wrong\n",
697 stl->neighbors_start[neighbor[i]].neighbor[(vnot[i] + 1)% 3],
698 stl->stats.number_of_facets);
699 return;
700 }
701 stl->neighbors_start[neighbor[i]].neighbor[(vnot[i] + 1)% 3]
702 = facet_number;
703 }
704 }
705 }
706
707 void
708 stl_remove_unconnected_facets(stl_file *stl) {
709 /* A couple of things need to be done here. One is to remove any */
710 /* completely unconnected facets (0 edges connected) since these are */
711 /* useless and could be completely wrong. The second thing that needs to */
712 /* be done is to remove any degenerate facets that were created during */
713 /* stl_check_facets_nearby(). */
714
715 int i;
716
717 if (stl->error) return;
718
719 /* remove degenerate facets */
720 for(i = 0; i < stl->stats.number_of_facets; i++) {
721 if( !memcmp(&stl->facet_start[i].vertex[0],
722 &stl->facet_start[i].vertex[1], sizeof(stl_vertex))
723 || !memcmp(&stl->facet_start[i].vertex[1],
724 &stl->facet_start[i].vertex[2], sizeof(stl_vertex))
725 || !memcmp(&stl->facet_start[i].vertex[0],
726 &stl->facet_start[i].vertex[2], sizeof(stl_vertex))) {
727 stl_remove_degenerate(stl, i);
728 i--;
729 }
730 }
731
732 if(stl->stats.connected_facets_1_edge < stl->stats.number_of_facets) {
733 /* remove completely unconnected facets */
734 for(i = 0; i < stl->stats.number_of_facets; i++) {
735 if( (stl->neighbors_start[i].neighbor[0] == -1)
736 && (stl->neighbors_start[i].neighbor[1] == -1)
737 && (stl->neighbors_start[i].neighbor[2] == -1)) {
738 /* This facet is completely unconnected. Remove it. */
739 stl_remove_facet(stl, i);
740 i--;
741 }
742 }
743 }
744 }
745
746 static void
747 stl_remove_degenerate(stl_file *stl, int facet) {
748 int edge1;
749 int edge2;
750 int edge3;
751 int neighbor1;
752 int neighbor2;
753 int neighbor3;
754 int vnot1;
755 int vnot2;
756 int vnot3;
757
758 if (stl->error) return;
759
760 if( !memcmp(&stl->facet_start[facet].vertex[0],
761 &stl->facet_start[facet].vertex[1], sizeof(stl_vertex))
762 && !memcmp(&stl->facet_start[facet].vertex[1],
763 &stl->facet_start[facet].vertex[2], sizeof(stl_vertex))) {
764 /* all 3 vertices are equal. Just remove the facet. I don't think*/
765 /* this is really possible, but just in case... */
766 printf("removing a facet in stl_remove_degenerate\n");
767
768 stl_remove_facet(stl, facet);
769 return;
770 }
771
772 if(!memcmp(&stl->facet_start[facet].vertex[0],
773 &stl->facet_start[facet].vertex[1], sizeof(stl_vertex))) {
774 edge1 = 1;
775 edge2 = 2;
776 edge3 = 0;
777 } else if(!memcmp(&stl->facet_start[facet].vertex[1],
778 &stl->facet_start[facet].vertex[2], sizeof(stl_vertex))) {
779 edge1 = 0;
780 edge2 = 2;
781 edge3 = 1;
782 } else if(!memcmp(&stl->facet_start[facet].vertex[2],
783 &stl->facet_start[facet].vertex[0], sizeof(stl_vertex))) {
784 edge1 = 0;
785 edge2 = 1;
786 edge3 = 2;
787 } else {
788 /* No degenerate. Function shouldn't have been called. */
789 return;
790 }
791 neighbor1 = stl->neighbors_start[facet].neighbor[edge1];
792 neighbor2 = stl->neighbors_start[facet].neighbor[edge2];
793
794 if(neighbor1 == -1) {
795 stl_update_connects_remove_1(stl, neighbor2);
796 }
797 if(neighbor2 == -1) {
798 stl_update_connects_remove_1(stl, neighbor1);
799 }
800
801
802 neighbor3 = stl->neighbors_start[facet].neighbor[edge3];
803 vnot1 = stl->neighbors_start[facet].which_vertex_not[edge1];
804 vnot2 = stl->neighbors_start[facet].which_vertex_not[edge2];
805 vnot3 = stl->neighbors_start[facet].which_vertex_not[edge3];
806
807 if(neighbor1 >= 0){
808 stl->neighbors_start[neighbor1].neighbor[(vnot1 + 1) % 3] = neighbor2;
809 stl->neighbors_start[neighbor1].which_vertex_not[(vnot1 + 1) % 3] = vnot2;
810 }
811 if(neighbor2 >= 0){
812 stl->neighbors_start[neighbor2].neighbor[(vnot2 + 1) % 3] = neighbor1;
813 stl->neighbors_start[neighbor2].which_vertex_not[(vnot2 + 1) % 3] = vnot1;
814 }
815
816 stl_remove_facet(stl, facet);
817
818 if(neighbor3 >= 0) {
819 stl_update_connects_remove_1(stl, neighbor3);
820 stl->neighbors_start[neighbor3].neighbor[(vnot3 + 1) % 3] = -1;
821 }
822 }
823
824 void
825 stl_update_connects_remove_1(stl_file *stl, int facet_num) {
826 int j;
827
828 if (stl->error) return;
829 /* Update list of connected edges */
830 j = ((stl->neighbors_start[facet_num].neighbor[0] == -1) +
831 (stl->neighbors_start[facet_num].neighbor[1] == -1) +
832 (stl->neighbors_start[facet_num].neighbor[2] == -1));
833 if(j == 0) { /* Facet has 3 neighbors */
834 stl->stats.connected_facets_3_edge -= 1;
835 } else if(j == 1) { /* Facet has 2 neighbors */
836 stl->stats.connected_facets_2_edge -= 1;
837 } else if(j == 2) { /* Facet has 1 neighbor */
838 stl->stats.connected_facets_1_edge -= 1;
839 }
840 }
841
842 void
843 stl_fill_holes(stl_file *stl) {
844 stl_facet facet;
845 stl_facet new_facet;
846 int neighbors_initial[3];
847 stl_hash_edge edge;
848 int first_facet;
849 int direction;
850 int facet_num;
851 int vnot;
852 int next_edge;
853 int pivot_vertex;
854 int next_facet;
855 int i;
856 int j;
857 int k;
858
859 if (stl->error) return;
860
861 /* Insert all unconnected edges into hash list */
862 stl_initialize_facet_check_nearby(stl);
863 for(i = 0; i < stl->stats.number_of_facets; i++) {
864 facet = stl->facet_start[i];
865 for(j = 0; j < 3; j++) {
866 if(stl->neighbors_start[i].neighbor[j] != -1) continue;
867 edge.facet_number = i;
868 edge.which_edge = j;
869 stl_load_edge_exact(stl, &edge, &facet.vertex[j],
870 &facet.vertex[(j + 1) % 3]);
871
872 insert_hash_edge(stl, edge, stl_match_neighbors_exact);
873 }
874 }
875
876 for(i = 0; i < stl->stats.number_of_facets; i++) {
877 facet = stl->facet_start[i];
878 neighbors_initial[0] = stl->neighbors_start[i].neighbor[0];
879 neighbors_initial[1] = stl->neighbors_start[i].neighbor[1];
880 neighbors_initial[2] = stl->neighbors_start[i].neighbor[2];
881 first_facet = i;
882 for(j = 0; j < 3; j++) {
883 if(stl->neighbors_start[i].neighbor[j] != -1) continue;
884
885 new_facet.vertex[0] = facet.vertex[j];
886 new_facet.vertex[1] = facet.vertex[(j + 1) % 3];
887 if(neighbors_initial[(j + 2) % 3] == -1) {
888 direction = 1;
889 } else {
890 direction = 0;
891 }
892
893 facet_num = i;
894 vnot = (j + 2) % 3;
895
896 for(;;) {
897 if(vnot > 2) {
898 if(direction == 0) {
899 pivot_vertex = (vnot + 2) % 3;
900 next_edge = pivot_vertex;
901 direction = 1;
902 } else {
903 pivot_vertex = (vnot + 1) % 3;
904 next_edge = vnot % 3;
905 direction = 0;
906 }
907 } else {
908 if(direction == 0) {
909 pivot_vertex = (vnot + 1) % 3;
910 next_edge = vnot;
911 } else {
912 pivot_vertex = (vnot + 2) % 3;
913 next_edge = pivot_vertex;
914 }
915 }
916 next_facet = stl->neighbors_start[facet_num].neighbor[next_edge];
917
918 if(next_facet == -1) {
919 new_facet.vertex[2] = stl->facet_start[facet_num].
920 vertex[vnot % 3];
921 stl_add_facet(stl, &new_facet);
922 for(k = 0; k < 3; k++) {
923 edge.facet_number = stl->stats.number_of_facets - 1;
924 edge.which_edge = k;
925 stl_load_edge_exact(stl, &edge, &new_facet.vertex[k],
926 &new_facet.vertex[(k + 1) % 3]);
927
928 insert_hash_edge(stl, edge, stl_match_neighbors_exact);
929 }
930 break;
931 } else {
932 vnot = stl->neighbors_start[facet_num].
933 which_vertex_not[next_edge];
934 facet_num = next_facet;
935 }
936
937 if(facet_num == first_facet) {
938 /* back to the beginning */
939 printf("\
940 Back to the first facet filling holes: probably a mobius part.\n\
941 Try using a smaller tolerance or don't do a nearby check\n");
942 return;
943 }
944 }
945 }
946 }
947 }
948
949 void
950 stl_add_facet(stl_file *stl, stl_facet *new_facet) {
951 if (stl->error) return;
952
953 stl->stats.facets_added += 1;
954 if(stl->stats.facets_malloced < stl->stats.number_of_facets + 1) {
955 stl->facet_start = (stl_facet*)realloc(stl->facet_start,
956 (sizeof(stl_facet) * (stl->stats.facets_malloced + 256)));
957 if(stl->facet_start == NULL) perror("stl_add_facet");
958 stl->neighbors_start = (stl_neighbors*)realloc(stl->neighbors_start,
959 (sizeof(stl_neighbors) * (stl->stats.facets_malloced + 256)));
960 if(stl->neighbors_start == NULL) perror("stl_add_facet");
961 stl->stats.facets_malloced += 256;
962 }
963 stl->facet_start[stl->stats.number_of_facets] = *new_facet;
964
965 /* note that the normal vector is not set here, just initialized to 0 */
966 stl->facet_start[stl->stats.number_of_facets].normal.x = 0.0;
967 stl->facet_start[stl->stats.number_of_facets].normal.y = 0.0;
968 stl->facet_start[stl->stats.number_of_facets].normal.z = 0.0;
969
970 stl->neighbors_start[stl->stats.number_of_facets].neighbor[0] = -1;
971 stl->neighbors_start[stl->stats.number_of_facets].neighbor[1] = -1;
972 stl->neighbors_start[stl->stats.number_of_facets].neighbor[2] = -1;
973 stl->stats.number_of_facets += 1;
974 }
0 /* ADMesh -- process triangulated solid meshes
1 * Copyright (C) 1995, 1996 Anthony D. Martin <amartin@engr.csulb.edu>
2 * Copyright (C) 2013, 2014 several contributors, see AUTHORS
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Questions, comments, suggestions, etc to
19 * https://github.com/admesh/admesh/issues
20 */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <math.h>
26
27 #include "stl.h"
28
29 static void stl_reverse_facet(stl_file *stl, int facet_num);
30 static void stl_reverse_vector(float v[]);
31 int stl_check_normal_vector(stl_file *stl, int facet_num, int normal_fix_flag);
32
33 static void
34 stl_reverse_facet(stl_file *stl, int facet_num) {
35 stl_vertex tmp_vertex;
36 /* int tmp_neighbor;*/
37 int neighbor[3];
38 int vnot[3];
39
40 stl->stats.facets_reversed += 1;
41
42 neighbor[0] = stl->neighbors_start[facet_num].neighbor[0];
43 neighbor[1] = stl->neighbors_start[facet_num].neighbor[1];
44 neighbor[2] = stl->neighbors_start[facet_num].neighbor[2];
45 vnot[0] = stl->neighbors_start[facet_num].which_vertex_not[0];
46 vnot[1] = stl->neighbors_start[facet_num].which_vertex_not[1];
47 vnot[2] = stl->neighbors_start[facet_num].which_vertex_not[2];
48
49 /* reverse the facet */
50 tmp_vertex = stl->facet_start[facet_num].vertex[0];
51 stl->facet_start[facet_num].vertex[0] =
52 stl->facet_start[facet_num].vertex[1];
53 stl->facet_start[facet_num].vertex[1] = tmp_vertex;
54
55 /* fix the vnots of the neighboring facets */
56 if(neighbor[0] != -1)
57 stl->neighbors_start[neighbor[0]].which_vertex_not[(vnot[0] + 1) % 3] =
58 (stl->neighbors_start[neighbor[0]].
59 which_vertex_not[(vnot[0] + 1) % 3] + 3) % 6;
60 if(neighbor[1] != -1)
61 stl->neighbors_start[neighbor[1]].which_vertex_not[(vnot[1] + 1) % 3] =
62 (stl->neighbors_start[neighbor[1]].
63 which_vertex_not[(vnot[1] + 1) % 3] + 4) % 6;
64 if(neighbor[2] != -1)
65 stl->neighbors_start[neighbor[2]].which_vertex_not[(vnot[2] + 1) % 3] =
66 (stl->neighbors_start[neighbor[2]].
67 which_vertex_not[(vnot[2] + 1) % 3] + 2) % 6;
68
69 /* swap the neighbors of the facet that is being reversed */
70 stl->neighbors_start[facet_num].neighbor[1] = neighbor[2];
71 stl->neighbors_start[facet_num].neighbor[2] = neighbor[1];
72
73 /* swap the vnots of the facet that is being reversed */
74 stl->neighbors_start[facet_num].which_vertex_not[1] = vnot[2];
75 stl->neighbors_start[facet_num].which_vertex_not[2] = vnot[1];
76
77 /* reverse the values of the vnots of the facet that is being reversed */
78 stl->neighbors_start[facet_num].which_vertex_not[0] =
79 (stl->neighbors_start[facet_num].which_vertex_not[0] + 3) % 6;
80 stl->neighbors_start[facet_num].which_vertex_not[1] =
81 (stl->neighbors_start[facet_num].which_vertex_not[1] + 3) % 6;
82 stl->neighbors_start[facet_num].which_vertex_not[2] =
83 (stl->neighbors_start[facet_num].which_vertex_not[2] + 3) % 6;
84 }
85
86 void
87 stl_fix_normal_directions(stl_file *stl) {
88 char *norm_sw;
89 /* int edge_num;*/
90 /* int vnot;*/
91 int checked = 0;
92 int facet_num;
93 /* int next_facet;*/
94 int i;
95 int j;
96 struct stl_normal {
97 int facet_num;
98 struct stl_normal *next;
99 };
100 struct stl_normal *head;
101 struct stl_normal *tail;
102 struct stl_normal *newn;
103 struct stl_normal *temp;
104
105 if (stl->error) return;
106
107 /* Initialize linked list. */
108 head = (struct stl_normal*)malloc(sizeof(struct stl_normal));
109 if(head == NULL) perror("stl_fix_normal_directions");
110 tail = (struct stl_normal*)malloc(sizeof(struct stl_normal));
111 if(tail == NULL) perror("stl_fix_normal_directions");
112 head->next = tail;
113 tail->next = tail;
114
115 /* Initialize list that keeps track of already fixed facets. */
116 norm_sw = (char*)calloc(stl->stats.number_of_facets, sizeof(char));
117 if(norm_sw == NULL) perror("stl_fix_normal_directions");
118
119
120 facet_num = 0;
121 /* If normal vector is not within tolerance and backwards:
122 Arbitrarily starts at face 0. If this one is wrong, we're screwed. Thankfully, the chances
123 of it being wrong randomly are low if most of the triangles are right: */
124 if(stl_check_normal_vector(stl, 0, 0) == 2)
125 stl_reverse_facet(stl, 0);
126
127 /* Say that we've fixed this facet: */
128 norm_sw[facet_num] = 1;
129 checked++;
130
131 for(;;) {
132 /* Add neighbors_to_list.
133 Add unconnected neighbors to the list:a */
134 for(j = 0; j < 3; j++) {
135 /* Reverse the neighboring facets if necessary. */
136 if(stl->neighbors_start[facet_num].which_vertex_not[j] > 2) {
137 /* If the facet has a neighbor that is -1, it means that edge isn't shared by another facet */
138 if(stl->neighbors_start[facet_num].neighbor[j] != -1) {
139 stl_reverse_facet
140 (stl, stl->neighbors_start[facet_num].neighbor[j]);
141 }
142 }
143 /* If this edge of the facet is connected: */
144 if(stl->neighbors_start[facet_num].neighbor[j] != -1) {
145 /* If we haven't fixed this facet yet, add it to the list: */
146 if(norm_sw[stl->neighbors_start[facet_num].neighbor[j]] != 1) {
147 /* Add node to beginning of list. */
148 newn = (struct stl_normal*)malloc(sizeof(struct stl_normal));
149 if(newn == NULL) perror("stl_fix_normal_directions");
150 newn->facet_num = stl->neighbors_start[facet_num].neighbor[j];
151 newn->next = head->next;
152 head->next = newn;
153 }
154 }
155 }
156 /* Get next facet to fix from top of list. */
157 if(head->next != tail) {
158 facet_num = head->next->facet_num;
159 if(norm_sw[facet_num] != 1) { /* If facet is in list mutiple times */
160 norm_sw[facet_num] = 1; /* Record this one as being fixed. */
161 checked++;
162 }
163 temp = head->next; /* Delete this facet from the list. */
164 head->next = head->next->next;
165 free(temp);
166 } else { /* if we ran out of facets to fix: */
167 /* All of the facets in this part have been fixed. */
168 stl->stats.number_of_parts += 1;
169 if(checked >= stl->stats.number_of_facets) {
170 /* All of the facets have been checked. Bail out. */
171 break;
172 } else {
173 /* There is another part here. Find it and continue. */
174 for(i = 0; i < stl->stats.number_of_facets; i++) {
175 if(norm_sw[i] == 0) {
176 /* This is the first facet of the next part. */
177 facet_num = i;
178 if(stl_check_normal_vector(stl, i, 0) == 2) {
179 stl_reverse_facet(stl, i);
180 }
181
182 norm_sw[facet_num] = 1;
183 checked++;
184 break;
185 }
186 }
187 }
188 }
189 }
190 free(head);
191 free(tail);
192 free(norm_sw);
193 }
194
195 int
196 stl_check_normal_vector(stl_file *stl, int facet_num, int normal_fix_flag) {
197 /* Returns 0 if the normal is within tolerance */
198 /* Returns 1 if the normal is not within tolerance, but direction is OK */
199 /* Returns 2 if the normal is not within tolerance and backwards */
200 /* Returns 4 if the status is unknown. */
201
202 float normal[3];
203 float test_norm[3];
204 stl_facet *facet;
205
206 facet = &stl->facet_start[facet_num];
207
208 stl_calculate_normal(normal, facet);
209 stl_normalize_vector(normal);
210
211 if( (ABS(normal[0] - facet->normal.x) < 0.001)
212 && (ABS(normal[1] - facet->normal.y) < 0.001)
213 && (ABS(normal[2] - facet->normal.z) < 0.001)) {
214 /* It is not really necessary to change the values here */
215 /* but just for consistency, I will. */
216 facet->normal.x = normal[0];
217 facet->normal.y = normal[1];
218 facet->normal.z = normal[2];
219 return 0;
220 }
221
222 test_norm[0] = facet->normal.x;
223 test_norm[1] = facet->normal.y;
224 test_norm[2] = facet->normal.z;
225
226 stl_normalize_vector(test_norm);
227 if( (ABS(normal[0] - test_norm[0]) < 0.001)
228 && (ABS(normal[1] - test_norm[1]) < 0.001)
229 && (ABS(normal[2] - test_norm[2]) < 0.001)) {
230 if(normal_fix_flag) {
231 facet->normal.x = normal[0];
232 facet->normal.y = normal[1];
233 facet->normal.z = normal[2];
234 stl->stats.normals_fixed += 1;
235 }
236 return 1;
237 }
238
239 stl_reverse_vector(test_norm);
240 if( (ABS(normal[0] - test_norm[0]) < 0.001)
241 && (ABS(normal[1] - test_norm[1]) < 0.001)
242 && (ABS(normal[2] - test_norm[2]) < 0.001)) {
243 /* Facet is backwards. */
244 if(normal_fix_flag) {
245 facet->normal.x = normal[0];
246 facet->normal.y = normal[1];
247 facet->normal.z = normal[2];
248 stl->stats.normals_fixed += 1;
249 }
250 return 2;
251 }
252 if(normal_fix_flag) {
253 facet->normal.x = normal[0];
254 facet->normal.y = normal[1];
255 facet->normal.z = normal[2];
256 stl->stats.normals_fixed += 1;
257 }
258 return 4;
259 }
260
261 static void
262 stl_reverse_vector(float v[]) {
263 v[0] *= -1;
264 v[1] *= -1;
265 v[2] *= -1;
266 }
267
268
269 void
270 stl_calculate_normal(float normal[], stl_facet *facet) {
271 float v1[3];
272 float v2[3];
273
274 v1[0] = facet->vertex[1].x - facet->vertex[0].x;
275 v1[1] = facet->vertex[1].y - facet->vertex[0].y;
276 v1[2] = facet->vertex[1].z - facet->vertex[0].z;
277 v2[0] = facet->vertex[2].x - facet->vertex[0].x;
278 v2[1] = facet->vertex[2].y - facet->vertex[0].y;
279 v2[2] = facet->vertex[2].z - facet->vertex[0].z;
280
281 normal[0] = (float)((double)v1[1] * (double)v2[2]) - ((double)v1[2] * (double)v2[1]);
282 normal[1] = (float)((double)v1[2] * (double)v2[0]) - ((double)v1[0] * (double)v2[2]);
283 normal[2] = (float)((double)v1[0] * (double)v2[1]) - ((double)v1[1] * (double)v2[0]);
284 }
285
286 void stl_normalize_vector(float v[]) {
287 double length;
288 double factor;
289 float min_normal_length;
290
291 length = sqrt((double)v[0] * (double)v[0] + (double)v[1] * (double)v[1] + (double)v[2] * (double)v[2]);
292 min_normal_length = 0.000000000001;
293 if(length < min_normal_length) {
294 v[0] = 0.0;
295 v[1] = 0.0;
296 v[2] = 0.0;
297 return;
298 }
299 factor = 1.0 / length;
300 v[0] *= factor;
301 v[1] *= factor;
302 v[2] *= factor;
303 }
304
305 void
306 stl_fix_normal_values(stl_file *stl) {
307 int i;
308
309 if (stl->error) return;
310
311 for(i = 0; i < stl->stats.number_of_facets; i++) {
312 stl_check_normal_vector(stl, i, 1);
313 }
314 }
315
316 void
317 stl_reverse_all_facets(stl_file *stl) {
318 int i;
319 float normal[3];
320
321 if (stl->error) return;
322
323 for(i = 0; i < stl->stats.number_of_facets; i++) {
324 stl_reverse_facet(stl, i);
325 stl_calculate_normal(normal, &stl->facet_start[i]);
326 stl_normalize_vector(normal);
327 stl->facet_start[i].normal.x = normal[0];
328 stl->facet_start[i].normal.y = normal[1];
329 stl->facet_start[i].normal.z = normal[2];
330 }
331 }
332
0 /* ADMesh -- process triangulated solid meshes
1 * Copyright (C) 1995, 1996 Anthony D. Martin <amartin@engr.csulb.edu>
2 * Copyright (C) 2013, 2014 several contributors, see AUTHORS
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Questions, comments, suggestions, etc to
19 * https://github.com/admesh/admesh/issues
20 */
21
22 #include <stdlib.h>
23 #include <string.h>
24
25 #include "stl.h"
26
27 void
28 stl_invalidate_shared_vertices(stl_file *stl) {
29 if (stl->error) return;
30
31 if (stl->v_indices != NULL) {
32 free(stl->v_indices);
33 stl->v_indices = NULL;
34 }
35 if (stl->v_shared != NULL) {
36 free(stl->v_shared);
37 stl->v_shared = NULL;
38 }
39 }
40
41 void
42 stl_generate_shared_vertices(stl_file *stl) {
43 int i;
44 int j;
45 int first_facet;
46 int direction;
47 int facet_num;
48 int vnot;
49 int next_edge;
50 int pivot_vertex;
51 int next_facet;
52 int reversed;
53
54 if (stl->error) return;
55
56 /* make sure this function is idempotent and does not leak memory */
57 stl_invalidate_shared_vertices(stl);
58
59 stl->v_indices = (v_indices_struct*)
60 calloc(stl->stats.number_of_facets, sizeof(v_indices_struct));
61 if(stl->v_indices == NULL) perror("stl_generate_shared_vertices");
62 stl->v_shared = (stl_vertex*)
63 calloc((stl->stats.number_of_facets / 2), sizeof(stl_vertex));
64 if(stl->v_shared == NULL) perror("stl_generate_shared_vertices");
65 stl->stats.shared_malloced = stl->stats.number_of_facets / 2;
66 stl->stats.shared_vertices = 0;
67
68 for(i = 0; i < stl->stats.number_of_facets; i++) {
69 stl->v_indices[i].vertex[0] = -1;
70 stl->v_indices[i].vertex[1] = -1;
71 stl->v_indices[i].vertex[2] = -1;
72 }
73
74
75 for(i = 0; i < stl->stats.number_of_facets; i++) {
76 first_facet = i;
77 for(j = 0; j < 3; j++) {
78 if(stl->v_indices[i].vertex[j] != -1) {
79 continue;
80 }
81 if(stl->stats.shared_vertices == stl->stats.shared_malloced) {
82 stl->stats.shared_malloced += 1024;
83 stl->v_shared = (stl_vertex*)realloc(stl->v_shared,
84 stl->stats.shared_malloced * sizeof(stl_vertex));
85 if(stl->v_shared == NULL) perror("stl_generate_shared_vertices");
86 }
87
88 stl->v_shared[stl->stats.shared_vertices] =
89 stl->facet_start[i].vertex[j];
90
91 direction = 0;
92 reversed = 0;
93 facet_num = i;
94 vnot = (j + 2) % 3;
95
96 for(;;) {
97 if(vnot > 2) {
98 if(direction == 0) {
99 pivot_vertex = (vnot + 2) % 3;
100 next_edge = pivot_vertex;
101 direction = 1;
102 } else {
103 pivot_vertex = (vnot + 1) % 3;
104 next_edge = vnot % 3;
105 direction = 0;
106 }
107 } else {
108 if(direction == 0) {
109 pivot_vertex = (vnot + 1) % 3;
110 next_edge = vnot;
111 } else {
112 pivot_vertex = (vnot + 2) % 3;
113 next_edge = pivot_vertex;
114 }
115 }
116 stl->v_indices[facet_num].vertex[pivot_vertex] =
117 stl->stats.shared_vertices;
118
119 next_facet = stl->neighbors_start[facet_num].neighbor[next_edge];
120 if(next_facet == -1) {
121 if(reversed) {
122 break;
123 } else {
124 direction = 1;
125 vnot = (j + 1) % 3;
126 reversed = 1;
127 facet_num = first_facet;
128 }
129 } else if(next_facet != first_facet) {
130 vnot = stl->neighbors_start[facet_num].
131 which_vertex_not[next_edge];
132 facet_num = next_facet;
133 } else {
134 break;
135 }
136 }
137 stl->stats.shared_vertices += 1;
138 }
139 }
140 }
141
142 void
143 stl_write_off(stl_file *stl, char *file) {
144 int i;
145 FILE *fp;
146 char *error_msg;
147
148 if (stl->error) return;
149
150 /* Open the file */
151 fp = fopen(file, "w");
152 if(fp == NULL) {
153 error_msg = (char*)
154 malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
155 sprintf(error_msg, "stl_write_ascii: Couldn't open %s for writing",
156 file);
157 perror(error_msg);
158 free(error_msg);
159 stl->error = 1;
160 return;
161 }
162
163 fprintf(fp, "OFF\n");
164 fprintf(fp, "%d %d 0\n",
165 stl->stats.shared_vertices, stl->stats.number_of_facets);
166
167 for(i = 0; i < stl->stats.shared_vertices; i++) {
168 fprintf(fp, "\t%f %f %f\n",
169 stl->v_shared[i].x, stl->v_shared[i].y, stl->v_shared[i].z);
170 }
171 for(i = 0; i < stl->stats.number_of_facets; i++) {
172 fprintf(fp, "\t3 %d %d %d\n", stl->v_indices[i].vertex[0],
173 stl->v_indices[i].vertex[1], stl->v_indices[i].vertex[2]);
174 }
175 fclose(fp);
176 }
177
178 void
179 stl_write_vrml(stl_file *stl, char *file) {
180 int i;
181 FILE *fp;
182 char *error_msg;
183
184 if (stl->error) return;
185
186 /* Open the file */
187 fp = fopen(file, "w");
188 if(fp == NULL) {
189 error_msg = (char*)
190 malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
191 sprintf(error_msg, "stl_write_ascii: Couldn't open %s for writing",
192 file);
193 perror(error_msg);
194 free(error_msg);
195 stl->error = 1;
196 return;
197 }
198
199 fprintf(fp, "#VRML V1.0 ascii\n\n");
200 fprintf(fp, "Separator {\n");
201 fprintf(fp, "\tDEF STLShape ShapeHints {\n");
202 fprintf(fp, "\t\tvertexOrdering COUNTERCLOCKWISE\n");
203 fprintf(fp, "\t\tfaceType CONVEX\n");
204 fprintf(fp, "\t\tshapeType SOLID\n");
205 fprintf(fp, "\t\tcreaseAngle 0.0\n");
206 fprintf(fp, "\t}\n");
207 fprintf(fp, "\tDEF STLModel Separator {\n");
208 fprintf(fp, "\t\tDEF STLColor Material {\n");
209 fprintf(fp, "\t\t\temissiveColor 0.700000 0.700000 0.000000\n");
210 fprintf(fp, "\t\t}\n");
211 fprintf(fp, "\t\tDEF STLVertices Coordinate3 {\n");
212 fprintf(fp, "\t\t\tpoint [\n");
213
214 for(i = 0; i < (stl->stats.shared_vertices - 1); i++) {
215 fprintf(fp, "\t\t\t\t%f %f %f,\n",
216 stl->v_shared[i].x, stl->v_shared[i].y, stl->v_shared[i].z);
217 }
218 fprintf(fp, "\t\t\t\t%f %f %f]\n",
219 stl->v_shared[i].x, stl->v_shared[i].y, stl->v_shared[i].z);
220 fprintf(fp, "\t\t}\n");
221 fprintf(fp, "\t\tDEF STLTriangles IndexedFaceSet {\n");
222 fprintf(fp, "\t\t\tcoordIndex [\n");
223
224 for(i = 0; i < (stl->stats.number_of_facets - 1); i++) {
225 fprintf(fp, "\t\t\t\t%d, %d, %d, -1,\n", stl->v_indices[i].vertex[0],
226 stl->v_indices[i].vertex[1], stl->v_indices[i].vertex[2]);
227 }
228 fprintf(fp, "\t\t\t\t%d, %d, %d, -1]\n", stl->v_indices[i].vertex[0],
229 stl->v_indices[i].vertex[1], stl->v_indices[i].vertex[2]);
230 fprintf(fp, "\t\t}\n");
231 fprintf(fp, "\t}\n");
232 fprintf(fp, "}\n");
233 fclose(fp);
234 }
235
236 void stl_write_obj (stl_file *stl, char *file) {
237 int i;
238 FILE* fp;
239
240 if (stl->error) return;
241
242 /* Open the file */
243 fp = fopen(file, "w");
244 if (fp == NULL) {
245 char* error_msg = (char*)malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
246 sprintf(error_msg, "stl_write_ascii: Couldn't open %s for writing", file);
247 perror(error_msg);
248 free(error_msg);
249 stl->error = 1;
250 return;
251 }
252
253 for (i = 0; i < stl->stats.shared_vertices; i++) {
254 fprintf(fp, "v %f %f %f\n", stl->v_shared[i].x, stl->v_shared[i].y, stl->v_shared[i].z);
255 }
256 for (i = 0; i < stl->stats.number_of_facets; i++) {
257 fprintf(fp, "f %d %d %d\n", stl->v_indices[i].vertex[0]+1, stl->v_indices[i].vertex[1]+1, stl->v_indices[i].vertex[2]+1);
258 }
259
260 fclose(fp);
261 }
0 /* ADMesh -- process triangulated solid meshes
1 * Copyright (C) 1995, 1996 Anthony D. Martin <amartin@engr.csulb.edu>
2 * Copyright (C) 2013, 2014 several contributors, see AUTHORS
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Questions, comments, suggestions, etc to
19 * https://github.com/admesh/admesh/issues
20 */
21
22 #ifndef __admesh_stl__
23 #define __admesh_stl__
24
25 #include <stdio.h>
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 #define STL_MAX(A,B) ((A)>(B)? (A):(B))
32 #define STL_MIN(A,B) ((A)<(B)? (A):(B))
33 #define ABS(X) ((X) < 0 ? -(X) : (X))
34
35 #define LABEL_SIZE 80
36 #define NUM_FACET_SIZE 4
37 #define HEADER_SIZE 84
38 #define STL_MIN_FILE_SIZE 284
39 #define ASCII_LINES_PER_FACET 7
40 #define SIZEOF_EDGE_SORT 24
41
42 typedef struct {
43 float x;
44 float y;
45 float z;
46 } stl_vertex;
47
48 typedef struct {
49 float x;
50 float y;
51 float z;
52 } stl_normal;
53
54 typedef char stl_extra[2];
55
56 typedef struct {
57 stl_normal normal;
58 stl_vertex vertex[3];
59 stl_extra extra;
60 } stl_facet;
61 #define SIZEOF_STL_FACET 50
62
63 typedef enum {binary, ascii, inmemory} stl_type;
64
65 typedef struct {
66 stl_vertex p1;
67 stl_vertex p2;
68 int facet_number;
69 } stl_edge;
70
71 typedef struct stl_hash_edge {
72 unsigned key[6];
73 int facet_number;
74 int which_edge;
75 struct stl_hash_edge *next;
76 } stl_hash_edge;
77
78 typedef struct {
79 int neighbor[3];
80 char which_vertex_not[3];
81 } stl_neighbors;
82
83 typedef struct {
84 int vertex[3];
85 } v_indices_struct;
86
87 typedef struct {
88 char header[81];
89 stl_type type;
90 int number_of_facets;
91 stl_vertex max;
92 stl_vertex min;
93 stl_vertex size;
94 float bounding_diameter;
95 float shortest_edge;
96 float volume;
97 unsigned number_of_blocks;
98 int connected_edges;
99 int connected_facets_1_edge;
100 int connected_facets_2_edge;
101 int connected_facets_3_edge;
102 int facets_w_1_bad_edge;
103 int facets_w_2_bad_edge;
104 int facets_w_3_bad_edge;
105 int original_num_facets;
106 int edges_fixed;
107 int degenerate_facets;
108 int facets_removed;
109 int facets_added;
110 int facets_reversed;
111 int backwards_edges;
112 int normals_fixed;
113 int number_of_parts;
114 int malloced;
115 int freed;
116 int facets_malloced;
117 int collisions;
118 int shared_vertices;
119 int shared_malloced;
120 } stl_stats;
121
122 typedef struct {
123 FILE *fp;
124 stl_facet *facet_start;
125 stl_edge *edge_start;
126 stl_hash_edge **heads;
127 stl_hash_edge *tail;
128 int M;
129 stl_neighbors *neighbors_start;
130 v_indices_struct *v_indices;
131 stl_vertex *v_shared;
132 stl_stats stats;
133 char error;
134 } stl_file;
135
136
137 extern void stl_open(stl_file *stl, char *file);
138 extern void stl_close(stl_file *stl);
139 extern void stl_stats_out(stl_file *stl, FILE *file, char *input_file);
140 extern void stl_print_edges(stl_file *stl, FILE *file);
141 extern void stl_print_neighbors(stl_file *stl, char *file);
142 extern void stl_put_little_int(FILE *fp, int value_in);
143 extern void stl_put_little_float(FILE *fp, float value_in);
144 extern void stl_write_ascii(stl_file *stl, const char *file, const char *label);
145 extern void stl_write_binary(stl_file *stl, const char *file, const char *label);
146 extern void stl_write_binary_block(stl_file *stl, FILE *fp);
147 extern void stl_check_facets_exact(stl_file *stl);
148 extern void stl_check_facets_nearby(stl_file *stl, float tolerance);
149 extern void stl_remove_unconnected_facets(stl_file *stl);
150 extern void stl_write_vertex(stl_file *stl, int facet, int vertex);
151 extern void stl_write_facet(stl_file *stl, char *label, int facet);
152 extern void stl_write_edge(stl_file *stl, char *label, stl_hash_edge edge);
153 extern void stl_write_neighbor(stl_file *stl, int facet);
154 extern void stl_write_quad_object(stl_file *stl, char *file);
155 extern void stl_verify_neighbors(stl_file *stl);
156 extern void stl_fill_holes(stl_file *stl);
157 extern void stl_fix_normal_directions(stl_file *stl);
158 extern void stl_fix_normal_values(stl_file *stl);
159 extern void stl_reverse_all_facets(stl_file *stl);
160 extern void stl_translate(stl_file *stl, float x, float y, float z);
161 extern void stl_translate_relative(stl_file *stl, float x, float y, float z);
162 extern void stl_scale_versor(stl_file *stl, float versor[3]);
163 extern void stl_scale(stl_file *stl, float factor);
164 extern void stl_rotate_x(stl_file *stl, float angle);
165 extern void stl_rotate_y(stl_file *stl, float angle);
166 extern void stl_rotate_z(stl_file *stl, float angle);
167 extern void stl_mirror_xy(stl_file *stl);
168 extern void stl_mirror_yz(stl_file *stl);
169 extern void stl_mirror_xz(stl_file *stl);
170 extern void stl_open_merge(stl_file *stl, char *file);
171 extern void stl_invalidate_shared_vertices(stl_file *stl);
172 extern void stl_generate_shared_vertices(stl_file *stl);
173 extern void stl_write_obj(stl_file *stl, char *file);
174 extern void stl_write_off(stl_file *stl, char *file);
175 extern void stl_write_dxf(stl_file *stl, char *file, char *label);
176 extern void stl_write_vrml(stl_file *stl, char *file);
177 extern void stl_calculate_normal(float normal[], stl_facet *facet);
178 extern void stl_normalize_vector(float v[]);
179 extern void stl_calculate_volume(stl_file *stl);
180
181 extern void stl_repair(stl_file *stl, int fixall_flag, int exact_flag, int tolerance_flag, float tolerance, int increment_flag, float increment, int nearby_flag, int iterations, int remove_unconnected_flag, int fill_holes_flag, int normal_directions_flag, int normal_values_flag, int reverse_all_flag, int verbose_flag);
182
183 extern void stl_initialize(stl_file *stl);
184 extern void stl_count_facets(stl_file *stl, char *file);
185 extern void stl_allocate(stl_file *stl);
186 extern void stl_read(stl_file *stl, int first_facet, int first);
187 extern void stl_facet_stats(stl_file *stl, stl_facet facet, int first);
188 extern void stl_reallocate(stl_file *stl);
189 extern void stl_add_facet(stl_file *stl, stl_facet *new_facet);
190 extern void stl_get_size(stl_file *stl);
191
192 extern void stl_clear_error(stl_file *stl);
193 extern int stl_get_error(stl_file *stl);
194 extern void stl_exit_on_error(stl_file *stl);
195
196 #ifdef __cplusplus
197 }
198 #endif
199
200 #endif
0 /* ADMesh -- process triangulated solid meshes
1 * Copyright (C) 1995, 1996 Anthony D. Martin <amartin@engr.csulb.edu>
2 * Copyright (C) 2013, 2014 several contributors, see AUTHORS
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Questions, comments, suggestions, etc to
19 * https://github.com/admesh/admesh/issues
20 */
21
22 #include <stdlib.h>
23 #include <string.h>
24 #include "stl.h"
25 #include "config.h"
26
27 #if !defined(SEEK_SET)
28 #define SEEK_SET 0
29 #define SEEK_CUR 1
30 #define SEEK_END 2
31 #endif
32
33 void
34 stl_print_edges(stl_file *stl, FILE *file) {
35 int i;
36 int edges_allocated;
37
38 if (stl->error) return;
39
40 edges_allocated = stl->stats.number_of_facets * 3;
41 for(i = 0; i < edges_allocated; i++) {
42 fprintf(file, "%d, %f, %f, %f, %f, %f, %f\n",
43 stl->edge_start[i].facet_number,
44 stl->edge_start[i].p1.x, stl->edge_start[i].p1.y,
45 stl->edge_start[i].p1.z, stl->edge_start[i].p2.x,
46 stl->edge_start[i].p2.y, stl->edge_start[i].p2.z);
47 }
48 }
49
50
51 void
52 stl_stats_out(stl_file *stl, FILE *file, char *input_file) {
53 if (stl->error) return;
54
55 /* this is here for Slic3r, without our config.h
56 it won't use this part of the code anyway */
57 #ifndef VERSION
58 #define VERSION "unknown"
59 #endif
60 fprintf(file, "\n\
61 ================= Results produced by ADMesh version " VERSION " ================\n");
62 fprintf(file, "\
63 Input file : %s\n", input_file);
64 if(stl->stats.type == binary) {
65 fprintf(file, "\
66 File type : Binary STL file\n");
67 } else {
68 fprintf(file, "\
69 File type : ASCII STL file\n");
70 }
71 fprintf(file, "\
72 Header : %s\n", stl->stats.header);
73 fprintf(file, "============== Size ==============\n");
74 fprintf(file, "Min X = % f, Max X = % f\n",
75 stl->stats.min.x, stl->stats.max.x);
76 fprintf(file, "Min Y = % f, Max Y = % f\n",
77 stl->stats.min.y, stl->stats.max.y);
78 fprintf(file, "Min Z = % f, Max Z = % f\n",
79 stl->stats.min.z, stl->stats.max.z);
80
81 fprintf(file, "\
82 ========= Facet Status ========== Original ============ Final ====\n");
83 fprintf(file, "\
84 Number of facets : %5d %5d\n",
85 stl->stats.original_num_facets, stl->stats.number_of_facets);
86 fprintf(file, "\
87 Facets with 1 disconnected edge : %5d %5d\n",
88 stl->stats.facets_w_1_bad_edge, stl->stats.connected_facets_2_edge -
89 stl->stats.connected_facets_3_edge);
90 fprintf(file, "\
91 Facets with 2 disconnected edges : %5d %5d\n",
92 stl->stats.facets_w_2_bad_edge, stl->stats.connected_facets_1_edge -
93 stl->stats.connected_facets_2_edge);
94 fprintf(file, "\
95 Facets with 3 disconnected edges : %5d %5d\n",
96 stl->stats.facets_w_3_bad_edge, stl->stats.number_of_facets -
97 stl->stats.connected_facets_1_edge);
98 fprintf(file, "\
99 Total disconnected facets : %5d %5d\n",
100 stl->stats.facets_w_1_bad_edge + stl->stats.facets_w_2_bad_edge +
101 stl->stats.facets_w_3_bad_edge, stl->stats.number_of_facets -
102 stl->stats.connected_facets_3_edge);
103
104 fprintf(file,
105 "=== Processing Statistics === ===== Other Statistics =====\n");
106 fprintf(file, "\
107 Number of parts : %5d Volume : % f\n",
108 stl->stats.number_of_parts, stl->stats.volume);
109 fprintf(file, "\
110 Degenerate facets : %5d\n", stl->stats.degenerate_facets);
111 fprintf(file, "\
112 Edges fixed : %5d\n", stl->stats.edges_fixed);
113 fprintf(file, "\
114 Facets removed : %5d\n", stl->stats.facets_removed);
115 fprintf(file, "\
116 Facets added : %5d\n", stl->stats.facets_added);
117 fprintf(file, "\
118 Facets reversed : %5d\n", stl->stats.facets_reversed);
119 fprintf(file, "\
120 Backwards edges : %5d\n", stl->stats.backwards_edges);
121 fprintf(file, "\
122 Normals fixed : %5d\n", stl->stats.normals_fixed);
123 }
124
125 void
126 stl_write_ascii(stl_file *stl, const char *file, const char *label) {
127 int i;
128 FILE *fp;
129 char *error_msg;
130
131 if (stl->error) return;
132
133 /* Open the file */
134 fp = fopen(file, "w");
135 if(fp == NULL) {
136 error_msg = (char*)
137 malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
138 sprintf(error_msg, "stl_write_ascii: Couldn't open %s for writing",
139 file);
140 perror(error_msg);
141 free(error_msg);
142 stl->error = 1;
143 return;
144 }
145
146 fprintf(fp, "solid %s\n", label);
147
148 for(i = 0; i < stl->stats.number_of_facets; i++) {
149 fprintf(fp, " facet normal % .8E % .8E % .8E\n",
150 stl->facet_start[i].normal.x, stl->facet_start[i].normal.y,
151 stl->facet_start[i].normal.z);
152 fprintf(fp, " outer loop\n");
153 fprintf(fp, " vertex % .8E % .8E % .8E\n",
154 stl->facet_start[i].vertex[0].x, stl->facet_start[i].vertex[0].y,
155 stl->facet_start[i].vertex[0].z);
156 fprintf(fp, " vertex % .8E % .8E % .8E\n",
157 stl->facet_start[i].vertex[1].x, stl->facet_start[i].vertex[1].y,
158 stl->facet_start[i].vertex[1].z);
159 fprintf(fp, " vertex % .8E % .8E % .8E\n",
160 stl->facet_start[i].vertex[2].x, stl->facet_start[i].vertex[2].y,
161 stl->facet_start[i].vertex[2].z);
162 fprintf(fp, " endloop\n");
163 fprintf(fp, " endfacet\n");
164 }
165
166 fprintf(fp, "endsolid %s\n", label);
167
168 fclose(fp);
169 }
170
171 void
172 stl_print_neighbors(stl_file *stl, char *file) {
173 int i;
174 FILE *fp;
175 char *error_msg;
176
177 if (stl->error) return;
178
179 /* Open the file */
180 fp = fopen(file, "w");
181 if(fp == NULL) {
182 error_msg = (char*)
183 malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
184 sprintf(error_msg, "stl_print_neighbors: Couldn't open %s for writing",
185 file);
186 perror(error_msg);
187 free(error_msg);
188 stl->error = 1;
189 return;
190 }
191
192 for(i = 0; i < stl->stats.number_of_facets; i++) {
193 fprintf(fp, "%d, %d,%d, %d,%d, %d,%d\n",
194 i,
195 stl->neighbors_start[i].neighbor[0],
196 (int)stl->neighbors_start[i].which_vertex_not[0],
197 stl->neighbors_start[i].neighbor[1],
198 (int)stl->neighbors_start[i].which_vertex_not[1],
199 stl->neighbors_start[i].neighbor[2],
200 (int)stl->neighbors_start[i].which_vertex_not[2]);
201 }
202 fclose(fp);
203 }
204
205 void
206 stl_put_little_int(FILE *fp, int value_in) {
207 int new_value;
208 union {
209 int int_value;
210 char char_value[4];
211 } value;
212
213 value.int_value = value_in;
214
215 new_value = value.char_value[0] & 0xFF;
216 new_value |= (value.char_value[1] & 0xFF) << 0x08;
217 new_value |= (value.char_value[2] & 0xFF) << 0x10;
218 new_value |= (value.char_value[3] & 0xFF) << 0x18;
219 fwrite(&new_value, sizeof(int), 1, fp);
220 }
221
222 void
223 stl_put_little_float(FILE *fp, float value_in) {
224 int new_value;
225 union {
226 float float_value;
227 char char_value[4];
228 } value;
229
230 value.float_value = value_in;
231
232 new_value = value.char_value[0] & 0xFF;
233 new_value |= (value.char_value[1] & 0xFF) << 0x08;
234 new_value |= (value.char_value[2] & 0xFF) << 0x10;
235 new_value |= (value.char_value[3] & 0xFF) << 0x18;
236 fwrite(&new_value, sizeof(int), 1, fp);
237 }
238
239 void
240 stl_write_binary_block(stl_file *stl, FILE *fp)
241 {
242 int i;
243 for(i = 0; i < stl->stats.number_of_facets; i++)
244 {
245 stl_put_little_float(fp, stl->facet_start[i].normal.x);
246 stl_put_little_float(fp, stl->facet_start[i].normal.y);
247 stl_put_little_float(fp, stl->facet_start[i].normal.z);
248 stl_put_little_float(fp, stl->facet_start[i].vertex[0].x);
249 stl_put_little_float(fp, stl->facet_start[i].vertex[0].y);
250 stl_put_little_float(fp, stl->facet_start[i].vertex[0].z);
251 stl_put_little_float(fp, stl->facet_start[i].vertex[1].x);
252 stl_put_little_float(fp, stl->facet_start[i].vertex[1].y);
253 stl_put_little_float(fp, stl->facet_start[i].vertex[1].z);
254 stl_put_little_float(fp, stl->facet_start[i].vertex[2].x);
255 stl_put_little_float(fp, stl->facet_start[i].vertex[2].y);
256 stl_put_little_float(fp, stl->facet_start[i].vertex[2].z);
257 fputc(stl->facet_start[i].extra[0], fp);
258 fputc(stl->facet_start[i].extra[1], fp);
259 }
260 }
261
262 void
263 stl_write_binary(stl_file *stl, const char *file, const char *label) {
264 FILE *fp;
265 int i;
266 char *error_msg;
267
268 if (stl->error) return;
269
270 /* Open the file */
271 fp = fopen(file, "wb");
272 if(fp == NULL) {
273 error_msg = (char*)
274 malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
275 sprintf(error_msg, "stl_write_binary: Couldn't open %s for writing",
276 file);
277 perror(error_msg);
278 free(error_msg);
279 stl->error = 1;
280 return;
281 }
282
283 fprintf(fp, "%s", label);
284 for(i = strlen(label); i < LABEL_SIZE; i++) putc(0, fp);
285
286 fseek(fp, LABEL_SIZE, SEEK_SET);
287
288 stl_put_little_int(fp, stl->stats.number_of_facets);
289
290 stl_write_binary_block(stl, fp);
291
292 fclose(fp);
293 }
294
295 void
296 stl_write_vertex(stl_file *stl, int facet, int vertex) {
297 if (stl->error) return;
298 printf(" vertex %d/%d % .8E % .8E % .8E\n", vertex, facet,
299 stl->facet_start[facet].vertex[vertex].x,
300 stl->facet_start[facet].vertex[vertex].y,
301 stl->facet_start[facet].vertex[vertex].z);
302 }
303
304 void
305 stl_write_facet(stl_file *stl, char *label, int facet) {
306 if (stl->error) return;
307 printf("facet (%d)/ %s\n", facet, label);
308 stl_write_vertex(stl, facet, 0);
309 stl_write_vertex(stl, facet, 1);
310 stl_write_vertex(stl, facet, 2);
311 }
312
313 void
314 stl_write_edge(stl_file *stl, char *label, stl_hash_edge edge) {
315 if (stl->error) return;
316 printf("edge (%d)/(%d) %s\n", edge.facet_number, edge.which_edge, label);
317 if(edge.which_edge < 3) {
318 stl_write_vertex(stl, edge.facet_number, edge.which_edge % 3);
319 stl_write_vertex(stl, edge.facet_number, (edge.which_edge + 1) % 3);
320 } else {
321 stl_write_vertex(stl, edge.facet_number, (edge.which_edge + 1) % 3);
322 stl_write_vertex(stl, edge.facet_number, edge.which_edge % 3);
323 }
324 }
325
326 void
327 stl_write_neighbor(stl_file *stl, int facet) {
328 if (stl->error) return;
329 printf("Neighbors %d: %d, %d, %d ; %d, %d, %d\n", facet,
330 stl->neighbors_start[facet].neighbor[0],
331 stl->neighbors_start[facet].neighbor[1],
332 stl->neighbors_start[facet].neighbor[2],
333 stl->neighbors_start[facet].which_vertex_not[0],
334 stl->neighbors_start[facet].which_vertex_not[1],
335 stl->neighbors_start[facet].which_vertex_not[2]);
336 }
337
338 void
339 stl_write_quad_object(stl_file *stl, char *file) {
340 FILE *fp;
341 int i;
342 int j;
343 char *error_msg;
344 stl_vertex connect_color;
345 stl_vertex uncon_1_color;
346 stl_vertex uncon_2_color;
347 stl_vertex uncon_3_color;
348 stl_vertex color;
349
350 if (stl->error) return;
351
352 /* Open the file */
353 fp = fopen(file, "w");
354 if(fp == NULL) {
355 error_msg = (char*)
356 malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
357 sprintf(error_msg, "stl_write_quad_object: Couldn't open %s for writing",
358 file);
359 perror(error_msg);
360 free(error_msg);
361 stl->error = 1;
362 return;
363 }
364
365 connect_color.x = 0.0;
366 connect_color.y = 0.0;
367 connect_color.z = 1.0;
368 uncon_1_color.x = 0.0;
369 uncon_1_color.y = 1.0;
370 uncon_1_color.z = 0.0;
371 uncon_2_color.x = 1.0;
372 uncon_2_color.y = 1.0;
373 uncon_2_color.z = 1.0;
374 uncon_3_color.x = 1.0;
375 uncon_3_color.y = 0.0;
376 uncon_3_color.z = 0.0;
377
378 fprintf(fp, "CQUAD\n");
379 for(i = 0; i < stl->stats.number_of_facets; i++) {
380 j = ((stl->neighbors_start[i].neighbor[0] == -1) +
381 (stl->neighbors_start[i].neighbor[1] == -1) +
382 (stl->neighbors_start[i].neighbor[2] == -1));
383 if(j == 0) {
384 color = connect_color;
385 } else if(j == 1) {
386 color = uncon_1_color;
387 } else if(j == 2) {
388 color = uncon_2_color;
389 } else {
390 color = uncon_3_color;
391 }
392 fprintf(fp, "%f %f %f %1.1f %1.1f %1.1f 1\n",
393 stl->facet_start[i].vertex[0].x,
394 stl->facet_start[i].vertex[0].y,
395 stl->facet_start[i].vertex[0].z, color.x, color.y, color.z);
396 fprintf(fp, "%f %f %f %1.1f %1.1f %1.1f 1\n",
397 stl->facet_start[i].vertex[1].x,
398 stl->facet_start[i].vertex[1].y,
399 stl->facet_start[i].vertex[1].z, color.x, color.y, color.z);
400 fprintf(fp, "%f %f %f %1.1f %1.1f %1.1f 1\n",
401 stl->facet_start[i].vertex[2].x,
402 stl->facet_start[i].vertex[2].y,
403 stl->facet_start[i].vertex[2].z, color.x, color.y, color.z);
404 fprintf(fp, "%f %f %f %1.1f %1.1f %1.1f 1\n",
405 stl->facet_start[i].vertex[2].x,
406 stl->facet_start[i].vertex[2].y,
407 stl->facet_start[i].vertex[2].z, color.x, color.y, color.z);
408 }
409 fclose(fp);
410 }
411
412 void
413 stl_write_dxf(stl_file *stl, char *file, char *label) {
414 int i;
415 FILE *fp;
416 char *error_msg;
417
418 if (stl->error) return;
419
420 /* Open the file */
421 fp = fopen(file, "w");
422 if(fp == NULL) {
423 error_msg = (char*)
424 malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
425 sprintf(error_msg, "stl_write_ascii: Couldn't open %s for writing",
426 file);
427 perror(error_msg);
428 free(error_msg);
429 stl->error = 1;
430 return;
431 }
432
433 fprintf(fp, "999\n%s\n", label);
434 fprintf(fp, "0\nSECTION\n2\nHEADER\n0\nENDSEC\n");
435 fprintf(fp, "0\nSECTION\n2\nTABLES\n0\nTABLE\n2\nLAYER\n70\n1\n\
436 0\nLAYER\n2\n0\n70\n0\n62\n7\n6\nCONTINUOUS\n0\nENDTAB\n0\nENDSEC\n");
437 fprintf(fp, "0\nSECTION\n2\nBLOCKS\n0\nENDSEC\n");
438
439 fprintf(fp, "0\nSECTION\n2\nENTITIES\n");
440
441 for(i = 0; i < stl->stats.number_of_facets; i++) {
442 fprintf(fp, "0\n3DFACE\n8\n0\n");
443 fprintf(fp, "10\n%f\n20\n%f\n30\n%f\n",
444 stl->facet_start[i].vertex[0].x, stl->facet_start[i].vertex[0].y,
445 stl->facet_start[i].vertex[0].z);
446 fprintf(fp, "11\n%f\n21\n%f\n31\n%f\n",
447 stl->facet_start[i].vertex[1].x, stl->facet_start[i].vertex[1].y,
448 stl->facet_start[i].vertex[1].z);
449 fprintf(fp, "12\n%f\n22\n%f\n32\n%f\n",
450 stl->facet_start[i].vertex[2].x, stl->facet_start[i].vertex[2].y,
451 stl->facet_start[i].vertex[2].z);
452 fprintf(fp, "13\n%f\n23\n%f\n33\n%f\n",
453 stl->facet_start[i].vertex[2].x, stl->facet_start[i].vertex[2].y,
454 stl->facet_start[i].vertex[2].z);
455 }
456
457 fprintf(fp, "0\nENDSEC\n0\nEOF\n");
458
459 fclose(fp);
460 }
461
462 void
463 stl_clear_error(stl_file *stl) {
464 stl->error = 0;
465 }
466
467 void
468 stl_exit_on_error(stl_file *stl) {
469 if (!stl->error) return;
470 stl->error = 0;
471 stl_close(stl);
472 exit(1);
473 }
474
475 int
476 stl_get_error(stl_file *stl) {
477 return stl->error;
478 }
0 /* ADMesh -- process triangulated solid meshes
1 * Copyright (C) 1995, 1996 Anthony D. Martin <amartin@engr.csulb.edu>
2 * Copyright (C) 2013, 2014 several contributors, see AUTHORS
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Questions, comments, suggestions, etc to
19 * https://github.com/admesh/admesh/issues
20 */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <math.h>
26
27 #include "stl.h"
28
29 #if !defined(SEEK_SET)
30 #define SEEK_SET 0
31 #define SEEK_CUR 1
32 #define SEEK_END 2
33 #endif
34
35 void
36 stl_open(stl_file *stl, char *file) {
37 stl_initialize(stl);
38 stl_count_facets(stl, file);
39 stl_allocate(stl);
40 stl_read(stl, 0, 1);
41 if (!stl->error) fclose(stl->fp);
42 }
43
44
45 void
46 stl_initialize(stl_file *stl) {
47 stl->error = 0;
48 stl->stats.degenerate_facets = 0;
49 stl->stats.edges_fixed = 0;
50 stl->stats.facets_added = 0;
51 stl->stats.facets_removed = 0;
52 stl->stats.facets_reversed = 0;
53 stl->stats.normals_fixed = 0;
54 stl->stats.number_of_parts = 0;
55 stl->stats.original_num_facets = 0;
56 stl->stats.number_of_facets = 0;
57 stl->stats.facets_malloced = 0;
58 stl->stats.volume = -1.0;
59
60 stl->neighbors_start = NULL;
61 stl->facet_start = NULL;
62 stl->v_indices = NULL;
63 stl->v_shared = NULL;
64 }
65
66 void
67 stl_count_facets(stl_file *stl, char *file) {
68 long file_size;
69 int header_num_facets;
70 int num_facets;
71 int i;
72 size_t s;
73 unsigned char chtest[128];
74 int num_lines = 1;
75 char *error_msg;
76
77 if (stl->error) return;
78
79 /* Open the file in binary mode first */
80 stl->fp = fopen(file, "rb");
81 if(stl->fp == NULL) {
82 error_msg = (char*)
83 malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
84 sprintf(error_msg, "stl_initialize: Couldn't open %s for reading",
85 file);
86 perror(error_msg);
87 free(error_msg);
88 stl->error = 1;
89 return;
90 }
91 /* Find size of file */
92 fseek(stl->fp, 0, SEEK_END);
93 file_size = ftell(stl->fp);
94
95 /* Check for binary or ASCII file */
96 fseek(stl->fp, HEADER_SIZE, SEEK_SET);
97 if (!fread(chtest, sizeof(chtest), 1, stl->fp)) {
98 perror("The input is an empty file");
99 stl->error = 1;
100 return;
101 }
102 stl->stats.type = ascii;
103 for(s = 0; s < sizeof(chtest); s++) {
104 if(chtest[s] > 127) {
105 stl->stats.type = binary;
106 break;
107 }
108 }
109 rewind(stl->fp);
110
111 /* Get the header and the number of facets in the .STL file */
112 /* If the .STL file is binary, then do the following */
113 if(stl->stats.type == binary) {
114 /* Test if the STL file has the right size */
115 if(((file_size - HEADER_SIZE) % SIZEOF_STL_FACET != 0)
116 || (file_size < STL_MIN_FILE_SIZE)) {
117 fprintf(stderr, "The file %s has the wrong size.\n", file);
118 stl->error = 1;
119 return;
120 }
121 num_facets = (file_size - HEADER_SIZE) / SIZEOF_STL_FACET;
122
123 /* Read the header */
124 if (fread(stl->stats.header, LABEL_SIZE, 1, stl->fp) > 79) {
125 stl->stats.header[80] = '\0';
126 }
127
128 /* Read the int following the header. This should contain # of facets */
129 if((!fread(&header_num_facets, sizeof(int), 1, stl->fp)) || (num_facets != header_num_facets)) {
130 fprintf(stderr,
131 "Warning: File size doesn't match number of facets in the header\n");
132 }
133 }
134 /* Otherwise, if the .STL file is ASCII, then do the following */
135 else {
136 /* Reopen the file in text mode (for getting correct newlines on Windows) */
137 // fix to silence a warning about unused return value.
138 // obviously if it fails we have problems....
139 stl->fp = freopen(file, "r", stl->fp);
140
141 // do another null check to be safe
142 if(stl->fp == NULL) {
143 error_msg = (char*)
144 malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
145 sprintf(error_msg, "stl_initialize: Couldn't open %s for reading",
146 file);
147 perror(error_msg);
148 free(error_msg);
149 stl->error = 1;
150 return;
151 }
152
153 /* Find the number of facets */
154 char linebuf[100];
155 while (fgets(linebuf, 100, stl->fp) != NULL) {
156 /* don't count short lines */
157 if (strlen(linebuf) <= 4) continue;
158
159 /* skip solid/endsolid lines as broken STL file generators may put several of them */
160 if (strncmp(linebuf, "solid", 5) == 0 || strncmp(linebuf, "endsolid", 8) == 0) continue;
161
162 ++num_lines;
163 }
164
165 rewind(stl->fp);
166
167 /* Get the header */
168 for(i = 0;
169 (i < 80) && (stl->stats.header[i] = getc(stl->fp)) != '\n'; i++);
170 stl->stats.header[i] = '\0'; /* Lose the '\n' */
171 stl->stats.header[80] = '\0';
172
173 num_facets = num_lines / ASCII_LINES_PER_FACET;
174 }
175 stl->stats.number_of_facets += num_facets;
176 stl->stats.original_num_facets = stl->stats.number_of_facets;
177 }
178
179 void
180 stl_allocate(stl_file *stl) {
181 if (stl->error) return;
182
183 /* Allocate memory for the entire .STL file */
184 stl->facet_start = (stl_facet*)calloc(stl->stats.number_of_facets,
185 sizeof(stl_facet));
186 if(stl->facet_start == NULL) perror("stl_initialize");
187 stl->stats.facets_malloced = stl->stats.number_of_facets;
188
189 /* Allocate memory for the neighbors list */
190 stl->neighbors_start = (stl_neighbors*)
191 calloc(stl->stats.number_of_facets, sizeof(stl_neighbors));
192 if(stl->facet_start == NULL) perror("stl_initialize");
193 }
194
195 void
196 stl_open_merge(stl_file *stl, char *file_to_merge) {
197 int num_facets_so_far;
198 stl_type origStlType;
199 FILE *origFp;
200 stl_file stl_to_merge;
201
202 if (stl->error) return;
203
204 /* Record how many facets we have so far from the first file. We will start putting
205 facets in the next position. Since we're 0-indexed, it'l be the same position. */
206 num_facets_so_far = stl->stats.number_of_facets;
207
208 /* Record the file type we started with: */
209 origStlType=stl->stats.type;
210 /* Record the file pointer too: */
211 origFp=stl->fp;
212
213 /* Initialize the sturucture with zero stats, header info and sizes: */
214 stl_initialize(&stl_to_merge);
215 stl_count_facets(&stl_to_merge, file_to_merge);
216
217 /* Copy what we need to into stl so that we can read the file_to_merge directly into it
218 using stl_read: Save the rest of the valuable info: */
219 stl->stats.type=stl_to_merge.stats.type;
220 stl->fp=stl_to_merge.fp;
221
222 /* Add the number of facets we already have in stl with what we we found in stl_to_merge but
223 haven't read yet. */
224 stl->stats.number_of_facets=num_facets_so_far+stl_to_merge.stats.number_of_facets;
225
226 /* Allocate enough room for stl->stats.number_of_facets facets and neighbors: */
227 stl_reallocate(stl);
228
229 /* Read the file to merge directly into stl, adding it to what we have already.
230 Start at num_facets_so_far, the index to the first unused facet. Also say
231 that this isn't our first time so we should augment stats like min and max
232 instead of erasing them. */
233 stl_read(stl, num_facets_so_far, 0);
234
235 /* Restore the stl information we overwrote (for stl_read) so that it still accurately
236 reflects the subject part: */
237 stl->stats.type=origStlType;
238 stl->fp=origFp;
239 }
240
241 extern void
242 stl_reallocate(stl_file *stl) {
243 if (stl->error) return;
244 /* Reallocate more memory for the .STL file(s) */
245 stl->facet_start = (stl_facet*)realloc(stl->facet_start, stl->stats.number_of_facets *
246 sizeof(stl_facet));
247 if(stl->facet_start == NULL) perror("stl_initialize");
248 stl->stats.facets_malloced = stl->stats.number_of_facets;
249
250 /* Reallocate more memory for the neighbors list */
251 stl->neighbors_start = (stl_neighbors*)
252 realloc(stl->neighbors_start, stl->stats.number_of_facets *
253 sizeof(stl_neighbors));
254 if(stl->facet_start == NULL) perror("stl_initialize");
255 }
256
257
258 /* Reads the contents of the file pointed to by stl->fp into the stl structure,
259 starting at facet first_facet. The second argument says if it's our first
260 time running this for the stl and therefore we should reset our max and min stats. */
261 void
262 stl_read(stl_file *stl, int first_facet, int first) {
263 stl_facet facet;
264 int i;
265
266 if (stl->error) return;
267
268 if(stl->stats.type == binary) {
269 fseek(stl->fp, HEADER_SIZE, SEEK_SET);
270 } else {
271 rewind(stl->fp);
272 }
273
274 for(i = first_facet; i < stl->stats.number_of_facets; i++) {
275 if(stl->stats.type == binary)
276 /* Read a single facet from a binary .STL file */
277 {
278 /* we assume little-endian architecture! */
279 if (fread(&facet.normal, sizeof(stl_normal), 1, stl->fp) \
280 + fread(&facet.vertex, sizeof(stl_vertex), 3, stl->fp) \
281 + fread(&facet.extra, sizeof(char), 2, stl->fp) != 6) {
282 perror("Cannot read facet");
283 stl->error = 1;
284 return;
285 }
286 } else
287 /* Read a single facet from an ASCII .STL file */
288 {
289 // skip solid/endsolid
290 // (in this order, otherwise it won't work when they are paired in the middle of a file)
291 fscanf(stl->fp, "endsolid\n");
292 fscanf(stl->fp, "solid%*[^\n]\n"); // name might contain spaces so %*s doesn't work and it also can be empty (just "solid")
293
294 if((fscanf(stl->fp, " facet normal %f %f %f\n", &facet.normal.x, &facet.normal.y, &facet.normal.z) + \
295 fscanf(stl->fp, " outer loop\n") + \
296 fscanf(stl->fp, " vertex %f %f %f\n", &facet.vertex[0].x, &facet.vertex[0].y, &facet.vertex[0].z) + \
297 fscanf(stl->fp, " vertex %f %f %f\n", &facet.vertex[1].x, &facet.vertex[1].y, &facet.vertex[1].z) + \
298 fscanf(stl->fp, " vertex %f %f %f\n", &facet.vertex[2].x, &facet.vertex[2].y, &facet.vertex[2].z) + \
299 fscanf(stl->fp, " endloop\n") + \
300 fscanf(stl->fp, " endfacet\n")) != 12) {
301 perror("Something is syntactically very wrong with this ASCII STL!");
302 stl->error = 1;
303 return;
304 }
305 }
306 /* Write the facet into memory. */
307 stl->facet_start[i] = facet;
308
309 stl_facet_stats(stl, facet, first);
310 first = 0;
311 }
312 stl->stats.size.x = stl->stats.max.x - stl->stats.min.x;
313 stl->stats.size.y = stl->stats.max.y - stl->stats.min.y;
314 stl->stats.size.z = stl->stats.max.z - stl->stats.min.z;
315 stl->stats.bounding_diameter = sqrt(
316 stl->stats.size.x * stl->stats.size.x +
317 stl->stats.size.y * stl->stats.size.y +
318 stl->stats.size.z * stl->stats.size.z
319 );
320 }
321
322 void
323 stl_facet_stats(stl_file *stl, stl_facet facet, int first) {
324 float diff_x;
325 float diff_y;
326 float diff_z;
327 float max_diff;
328
329 if (stl->error) return;
330
331 /* while we are going through all of the facets, let's find the */
332 /* maximum and minimum values for x, y, and z */
333
334 /* Initialize the max and min values the first time through*/
335 if (first) {
336 stl->stats.max.x = facet.vertex[0].x;
337 stl->stats.min.x = facet.vertex[0].x;
338 stl->stats.max.y = facet.vertex[0].y;
339 stl->stats.min.y = facet.vertex[0].y;
340 stl->stats.max.z = facet.vertex[0].z;
341 stl->stats.min.z = facet.vertex[0].z;
342
343 diff_x = ABS(facet.vertex[0].x - facet.vertex[1].x);
344 diff_y = ABS(facet.vertex[0].y - facet.vertex[1].y);
345 diff_z = ABS(facet.vertex[0].z - facet.vertex[1].z);
346 max_diff = STL_MAX(diff_x, diff_y);
347 max_diff = STL_MAX(diff_z, max_diff);
348 stl->stats.shortest_edge = max_diff;
349
350 first = 0;
351 }
352
353 /* now find the max and min values */
354 stl->stats.max.x = STL_MAX(stl->stats.max.x, facet.vertex[0].x);
355 stl->stats.min.x = STL_MIN(stl->stats.min.x, facet.vertex[0].x);
356 stl->stats.max.y = STL_MAX(stl->stats.max.y, facet.vertex[0].y);
357 stl->stats.min.y = STL_MIN(stl->stats.min.y, facet.vertex[0].y);
358 stl->stats.max.z = STL_MAX(stl->stats.max.z, facet.vertex[0].z);
359 stl->stats.min.z = STL_MIN(stl->stats.min.z, facet.vertex[0].z);
360
361 stl->stats.max.x = STL_MAX(stl->stats.max.x, facet.vertex[1].x);
362 stl->stats.min.x = STL_MIN(stl->stats.min.x, facet.vertex[1].x);
363 stl->stats.max.y = STL_MAX(stl->stats.max.y, facet.vertex[1].y);
364 stl->stats.min.y = STL_MIN(stl->stats.min.y, facet.vertex[1].y);
365 stl->stats.max.z = STL_MAX(stl->stats.max.z, facet.vertex[1].z);
366 stl->stats.min.z = STL_MIN(stl->stats.min.z, facet.vertex[1].z);
367
368 stl->stats.max.x = STL_MAX(stl->stats.max.x, facet.vertex[2].x);
369 stl->stats.min.x = STL_MIN(stl->stats.min.x, facet.vertex[2].x);
370 stl->stats.max.y = STL_MAX(stl->stats.max.y, facet.vertex[2].y);
371 stl->stats.min.y = STL_MIN(stl->stats.min.y, facet.vertex[2].y);
372 stl->stats.max.z = STL_MAX(stl->stats.max.z, facet.vertex[2].z);
373 stl->stats.min.z = STL_MIN(stl->stats.min.z, facet.vertex[2].z);
374 }
375
376 void
377 stl_close(stl_file *stl) {
378 if (stl->error) return;
379
380 if(stl->neighbors_start != NULL)
381 free(stl->neighbors_start);
382 if(stl->facet_start != NULL)
383 free(stl->facet_start);
384 if(stl->v_indices != NULL)
385 free(stl->v_indices);
386 if(stl->v_shared != NULL)
387 free(stl->v_shared);
388 }
389
0 /* ADMesh -- process triangulated solid meshes
1 * Copyright (C) 1995, 1996 Anthony D. Martin <amartin@engr.csulb.edu>
2 * Copyright (C) 2013, 2014 several contributors, see AUTHORS
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Questions, comments, suggestions, etc to
19 * https://github.com/admesh/admesh/issues
20 */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <math.h>
26
27 #include "stl.h"
28
29 static void stl_rotate(float *x, float *y, float angle);
30 static float get_area(stl_facet *facet);
31 static float get_volume(stl_file *stl);
32
33
34 void
35 stl_verify_neighbors(stl_file *stl) {
36 int i;
37 int j;
38 stl_edge edge_a;
39 stl_edge edge_b;
40 int neighbor;
41 int vnot;
42
43 if (stl->error) return;
44
45 stl->stats.backwards_edges = 0;
46
47 for(i = 0; i < stl->stats.number_of_facets; i++) {
48 for(j = 0; j < 3; j++) {
49 edge_a.p1 = stl->facet_start[i].vertex[j];
50 edge_a.p2 = stl->facet_start[i].vertex[(j + 1) % 3];
51 neighbor = stl->neighbors_start[i].neighbor[j];
52 vnot = stl->neighbors_start[i].which_vertex_not[j];
53
54 if(neighbor == -1)
55 continue; /* this edge has no neighbor... Continue. */
56 if(vnot < 3) {
57 edge_b.p1 = stl->facet_start[neighbor].vertex[(vnot + 2) % 3];
58 edge_b.p2 = stl->facet_start[neighbor].vertex[(vnot + 1) % 3];
59 } else {
60 stl->stats.backwards_edges += 1;
61 edge_b.p1 = stl->facet_start[neighbor].vertex[(vnot + 1) % 3];
62 edge_b.p2 = stl->facet_start[neighbor].vertex[(vnot + 2) % 3];
63 }
64 if(memcmp(&edge_a, &edge_b, SIZEOF_EDGE_SORT) != 0) {
65 /* These edges should match but they don't. Print results. */
66 printf("edge %d of facet %d doesn't match edge %d of facet %d\n",
67 j, i, vnot + 1, neighbor);
68 stl_write_facet(stl, (char*)"first facet", i);
69 stl_write_facet(stl, (char*)"second facet", neighbor);
70 }
71 }
72 }
73 }
74
75 void
76 stl_translate(stl_file *stl, float x, float y, float z) {
77 int i;
78 int j;
79
80 if (stl->error) return;
81
82 for(i = 0; i < stl->stats.number_of_facets; i++) {
83 for(j = 0; j < 3; j++) {
84 stl->facet_start[i].vertex[j].x -= (stl->stats.min.x - x);
85 stl->facet_start[i].vertex[j].y -= (stl->stats.min.y - y);
86 stl->facet_start[i].vertex[j].z -= (stl->stats.min.z - z);
87 }
88 }
89 stl->stats.max.x -= (stl->stats.min.x - x);
90 stl->stats.max.y -= (stl->stats.min.y - y);
91 stl->stats.max.z -= (stl->stats.min.z - z);
92 stl->stats.min.x = x;
93 stl->stats.min.y = y;
94 stl->stats.min.z = z;
95
96 stl_invalidate_shared_vertices(stl);
97 }
98
99 /* Translates the stl by x,y,z, relatively from wherever it is currently */
100 void
101 stl_translate_relative(stl_file *stl, float x, float y, float z) {
102 int i;
103 int j;
104
105 if (stl->error) return;
106
107 for(i = 0; i < stl->stats.number_of_facets; i++) {
108 for(j = 0; j < 3; j++) {
109 stl->facet_start[i].vertex[j].x += x;
110 stl->facet_start[i].vertex[j].y += y;
111 stl->facet_start[i].vertex[j].z += z;
112 }
113 }
114 stl->stats.min.x += x;
115 stl->stats.min.y += y;
116 stl->stats.min.z += z;
117 stl->stats.max.x += x;
118 stl->stats.max.y += y;
119 stl->stats.max.z += z;
120
121 stl_invalidate_shared_vertices(stl);
122 }
123
124 void
125 stl_scale_versor(stl_file *stl, float versor[3]) {
126 int i;
127 int j;
128
129 if (stl->error) return;
130
131 /* scale extents */
132 stl->stats.min.x *= versor[0];
133 stl->stats.min.y *= versor[1];
134 stl->stats.min.z *= versor[2];
135 stl->stats.max.x *= versor[0];
136 stl->stats.max.y *= versor[1];
137 stl->stats.max.z *= versor[2];
138
139 /* scale size */
140 stl->stats.size.x *= versor[0];
141 stl->stats.size.y *= versor[1];
142 stl->stats.size.z *= versor[2];
143
144 /* scale volume */
145 if (stl->stats.volume > 0.0) {
146 stl->stats.volume *= (versor[0] * versor[1] * versor[2]);
147 }
148
149 for(i = 0; i < stl->stats.number_of_facets; i++) {
150 for(j = 0; j < 3; j++) {
151 stl->facet_start[i].vertex[j].x *= versor[0];
152 stl->facet_start[i].vertex[j].y *= versor[1];
153 stl->facet_start[i].vertex[j].z *= versor[2];
154 }
155 }
156
157 stl_invalidate_shared_vertices(stl);
158 }
159
160 void
161 stl_scale(stl_file *stl, float factor) {
162 float versor[3];
163
164 if (stl->error) return;
165
166 versor[0] = factor;
167 versor[1] = factor;
168 versor[2] = factor;
169 stl_scale_versor(stl, versor);
170 }
171
172 static void calculate_normals(stl_file *stl) {
173 long i;
174 float normal[3];
175
176 if (stl->error) return;
177
178 for(i = 0; i < stl->stats.number_of_facets; i++) {
179 stl_calculate_normal(normal, &stl->facet_start[i]);
180 stl_normalize_vector(normal);
181 stl->facet_start[i].normal.x = normal[0];
182 stl->facet_start[i].normal.y = normal[1];
183 stl->facet_start[i].normal.z = normal[2];
184 }
185 }
186
187 void
188 stl_rotate_x(stl_file *stl, float angle) {
189 int i;
190 int j;
191
192 if (stl->error) return;
193
194 for(i = 0; i < stl->stats.number_of_facets; i++) {
195 for(j = 0; j < 3; j++) {
196 stl_rotate(&stl->facet_start[i].vertex[j].y,
197 &stl->facet_start[i].vertex[j].z, angle);
198 }
199 }
200 stl_get_size(stl);
201 calculate_normals(stl);
202 }
203
204 void
205 stl_rotate_y(stl_file *stl, float angle) {
206 int i;
207 int j;
208
209 if (stl->error) return;
210
211 for(i = 0; i < stl->stats.number_of_facets; i++) {
212 for(j = 0; j < 3; j++) {
213 stl_rotate(&stl->facet_start[i].vertex[j].z,
214 &stl->facet_start[i].vertex[j].x, angle);
215 }
216 }
217 stl_get_size(stl);
218 calculate_normals(stl);
219 }
220
221 void
222 stl_rotate_z(stl_file *stl, float angle) {
223 int i;
224 int j;
225
226 if (stl->error) return;
227
228 for(i = 0; i < stl->stats.number_of_facets; i++) {
229 for(j = 0; j < 3; j++) {
230 stl_rotate(&stl->facet_start[i].vertex[j].x,
231 &stl->facet_start[i].vertex[j].y, angle);
232 }
233 }
234 stl_get_size(stl);
235 calculate_normals(stl);
236 }
237
238
239
240 static void
241 stl_rotate(float *x, float *y, float angle) {
242 double r;
243 double theta;
244 double radian_angle;
245
246 radian_angle = (angle / 180.0) * M_PI;
247
248 r = sqrt((*x **x) + (*y **y));
249 theta = atan2(*y, *x);
250 *x = r * cos(theta + radian_angle);
251 *y = r * sin(theta + radian_angle);
252 }
253
254 extern void
255 stl_get_size(stl_file *stl) {
256 int i;
257 int j;
258
259 if (stl->error) return;
260 if (stl->stats.number_of_facets == 0) return;
261
262 stl->stats.min.x = stl->facet_start[0].vertex[0].x;
263 stl->stats.min.y = stl->facet_start[0].vertex[0].y;
264 stl->stats.min.z = stl->facet_start[0].vertex[0].z;
265 stl->stats.max.x = stl->facet_start[0].vertex[0].x;
266 stl->stats.max.y = stl->facet_start[0].vertex[0].y;
267 stl->stats.max.z = stl->facet_start[0].vertex[0].z;
268
269 for(i = 0; i < stl->stats.number_of_facets; i++) {
270 for(j = 0; j < 3; j++) {
271 stl->stats.min.x = STL_MIN(stl->stats.min.x,
272 stl->facet_start[i].vertex[j].x);
273 stl->stats.min.y = STL_MIN(stl->stats.min.y,
274 stl->facet_start[i].vertex[j].y);
275 stl->stats.min.z = STL_MIN(stl->stats.min.z,
276 stl->facet_start[i].vertex[j].z);
277 stl->stats.max.x = STL_MAX(stl->stats.max.x,
278 stl->facet_start[i].vertex[j].x);
279 stl->stats.max.y = STL_MAX(stl->stats.max.y,
280 stl->facet_start[i].vertex[j].y);
281 stl->stats.max.z = STL_MAX(stl->stats.max.z,
282 stl->facet_start[i].vertex[j].z);
283 }
284 }
285 stl->stats.size.x = stl->stats.max.x - stl->stats.min.x;
286 stl->stats.size.y = stl->stats.max.y - stl->stats.min.y;
287 stl->stats.size.z = stl->stats.max.z - stl->stats.min.z;
288 stl->stats.bounding_diameter = sqrt(
289 stl->stats.size.x * stl->stats.size.x +
290 stl->stats.size.y * stl->stats.size.y +
291 stl->stats.size.z * stl->stats.size.z
292 );
293 }
294
295 void
296 stl_mirror_xy(stl_file *stl) {
297 int i;
298 int j;
299 float temp_size;
300
301 if (stl->error) return;
302
303 for(i = 0; i < stl->stats.number_of_facets; i++) {
304 for(j = 0; j < 3; j++) {
305 stl->facet_start[i].vertex[j].z *= -1.0;
306 }
307 }
308 temp_size = stl->stats.min.z;
309 stl->stats.min.z = stl->stats.max.z;
310 stl->stats.max.z = temp_size;
311 stl->stats.min.z *= -1.0;
312 stl->stats.max.z *= -1.0;
313 stl_reverse_all_facets(stl);
314 stl->stats.facets_reversed -= stl->stats.number_of_facets; /* for not altering stats */
315 }
316
317 void
318 stl_mirror_yz(stl_file *stl) {
319 int i;
320 int j;
321 float temp_size;
322
323 if (stl->error) return;
324
325 for(i = 0; i < stl->stats.number_of_facets; i++) {
326 for(j = 0; j < 3; j++) {
327 stl->facet_start[i].vertex[j].x *= -1.0;
328 }
329 }
330 temp_size = stl->stats.min.x;
331 stl->stats.min.x = stl->stats.max.x;
332 stl->stats.max.x = temp_size;
333 stl->stats.min.x *= -1.0;
334 stl->stats.max.x *= -1.0;
335 stl_reverse_all_facets(stl);
336 stl->stats.facets_reversed -= stl->stats.number_of_facets; /* for not altering stats */
337 }
338
339 void
340 stl_mirror_xz(stl_file *stl) {
341 int i;
342 int j;
343 float temp_size;
344
345 if (stl->error) return;
346
347 for(i = 0; i < stl->stats.number_of_facets; i++) {
348 for(j = 0; j < 3; j++) {
349 stl->facet_start[i].vertex[j].y *= -1.0;
350 }
351 }
352 temp_size = stl->stats.min.y;
353 stl->stats.min.y = stl->stats.max.y;
354 stl->stats.max.y = temp_size;
355 stl->stats.min.y *= -1.0;
356 stl->stats.max.y *= -1.0;
357 stl_reverse_all_facets(stl);
358 stl->stats.facets_reversed -= stl->stats.number_of_facets; /* for not altering stats */
359 }
360
361 static float get_volume(stl_file *stl) {
362 long i;
363 stl_vertex p0;
364 stl_vertex p;
365 stl_normal n;
366 float height;
367 float area;
368 float volume = 0.0;
369
370 if (stl->error) return 0;
371
372 /* Choose a point, any point as the reference */
373 p0.x = stl->facet_start[0].vertex[0].x;
374 p0.y = stl->facet_start[0].vertex[0].y;
375 p0.z = stl->facet_start[0].vertex[0].z;
376
377 for(i = 0; i < stl->stats.number_of_facets; i++) {
378 p.x = stl->facet_start[i].vertex[0].x - p0.x;
379 p.y = stl->facet_start[i].vertex[0].y - p0.y;
380 p.z = stl->facet_start[i].vertex[0].z - p0.z;
381 /* Do dot product to get distance from point to plane */
382 n = stl->facet_start[i].normal;
383 height = (n.x * p.x) + (n.y * p.y) + (n.z * p.z);
384 area = get_area(&stl->facet_start[i]);
385 volume += (area * height) / 3.0;
386 }
387 return volume;
388 }
389
390 void stl_calculate_volume(stl_file *stl) {
391 if (stl->error) return;
392 stl->stats.volume = get_volume(stl);
393 if(stl->stats.volume < 0.0) {
394 stl_reverse_all_facets(stl);
395 stl->stats.volume = -stl->stats.volume;
396 }
397 }
398
399 static float get_area(stl_facet *facet) {
400 double cross[3][3];
401 float sum[3];
402 float n[3];
403 float area;
404 int i;
405
406 /* cast to double before calculating cross product because large coordinates
407 can result in overflowing product
408 (bad area is responsible for bad volume and bad facets reversal) */
409 for(i = 0; i < 3; i++) {
410 cross[i][0]=(((double)facet->vertex[i].y * (double)facet->vertex[(i + 1) % 3].z) -
411 ((double)facet->vertex[i].z * (double)facet->vertex[(i + 1) % 3].y));
412 cross[i][1]=(((double)facet->vertex[i].z * (double)facet->vertex[(i + 1) % 3].x) -
413 ((double)facet->vertex[i].x * (double)facet->vertex[(i + 1) % 3].z));
414 cross[i][2]=(((double)facet->vertex[i].x * (double)facet->vertex[(i + 1) % 3].y) -
415 ((double)facet->vertex[i].y * (double)facet->vertex[(i + 1) % 3].x));
416 }
417
418 sum[0] = cross[0][0] + cross[1][0] + cross[2][0];
419 sum[1] = cross[0][1] + cross[1][1] + cross[2][1];
420 sum[2] = cross[0][2] + cross[1][2] + cross[2][2];
421
422 /* This should already be done. But just in case, let's do it again */
423 stl_calculate_normal(n, facet);
424 stl_normalize_vector(n);
425
426 area = 0.5 * (n[0] * sum[0] + n[1] * sum[1] + n[2] * sum[2]);
427 return area;
428 }
429
430 void stl_repair(stl_file *stl,
431 int fixall_flag,
432 int exact_flag,
433 int tolerance_flag,
434 float tolerance,
435 int increment_flag,
436 float increment,
437 int nearby_flag,
438 int iterations,
439 int remove_unconnected_flag,
440 int fill_holes_flag,
441 int normal_directions_flag,
442 int normal_values_flag,
443 int reverse_all_flag,
444 int verbose_flag) {
445
446 int i;
447 int last_edges_fixed = 0;
448
449 if (stl->error) return;
450
451 if(exact_flag || fixall_flag || nearby_flag || remove_unconnected_flag
452 || fill_holes_flag || normal_directions_flag) {
453 if (verbose_flag)
454 printf("Checking exact...\n");
455 exact_flag = 1;
456 stl_check_facets_exact(stl);
457 stl->stats.facets_w_1_bad_edge =
458 (stl->stats.connected_facets_2_edge -
459 stl->stats.connected_facets_3_edge);
460 stl->stats.facets_w_2_bad_edge =
461 (stl->stats.connected_facets_1_edge -
462 stl->stats.connected_facets_2_edge);
463 stl->stats.facets_w_3_bad_edge =
464 (stl->stats.number_of_facets -
465 stl->stats.connected_facets_1_edge);
466 }
467
468 if(nearby_flag || fixall_flag) {
469 if(!tolerance_flag) {
470 tolerance = stl->stats.shortest_edge;
471 }
472 if(!increment_flag) {
473 increment = stl->stats.bounding_diameter / 10000.0;
474 }
475
476 if(stl->stats.connected_facets_3_edge < stl->stats.number_of_facets) {
477 for(i = 0; i < iterations; i++) {
478 if(stl->stats.connected_facets_3_edge <
479 stl->stats.number_of_facets) {
480 if (verbose_flag)
481 printf("\
482 Checking nearby. Tolerance= %f Iteration=%d of %d...",
483 tolerance, i + 1, iterations);
484 stl_check_facets_nearby(stl, tolerance);
485 if (verbose_flag)
486 printf(" Fixed %d edges.\n",
487 stl->stats.edges_fixed - last_edges_fixed);
488 last_edges_fixed = stl->stats.edges_fixed;
489 tolerance += increment;
490 } else {
491 if (verbose_flag)
492 printf("\
493 All facets connected. No further nearby check necessary.\n");
494 break;
495 }
496 }
497 } else {
498 if (verbose_flag)
499 printf("All facets connected. No nearby check necessary.\n");
500 }
501 }
502
503 if(remove_unconnected_flag || fixall_flag || fill_holes_flag) {
504 if(stl->stats.connected_facets_3_edge < stl->stats.number_of_facets) {
505 if (verbose_flag)
506 printf("Removing unconnected facets...\n");
507 stl_remove_unconnected_facets(stl);
508 } else
509 if (verbose_flag)
510 printf("No unconnected need to be removed.\n");
511 }
512
513 if(fill_holes_flag || fixall_flag) {
514 if(stl->stats.connected_facets_3_edge < stl->stats.number_of_facets) {
515 if (verbose_flag)
516 printf("Filling holes...\n");
517 stl_fill_holes(stl);
518 } else
519 if (verbose_flag)
520 printf("No holes need to be filled.\n");
521 }
522
523 if(reverse_all_flag) {
524 if (verbose_flag)
525 printf("Reversing all facets...\n");
526 stl_reverse_all_facets(stl);
527 }
528
529 if(normal_directions_flag || fixall_flag) {
530 if (verbose_flag)
531 printf("Checking normal directions...\n");
532 stl_fix_normal_directions(stl);
533 }
534
535 if(normal_values_flag || fixall_flag) {
536 if (verbose_flag)
537 printf("Checking normal values...\n");
538 stl_fix_normal_values(stl);
539 }
540
541 /* Always calculate the volume. It shouldn't take too long */
542 if (verbose_flag)
543 printf("Calculating volume...\n");
544 stl_calculate_volume(stl);
545
546 if(exact_flag) {
547 if (verbose_flag)
548 printf("Verifying neighbors...\n");
549 stl_verify_neighbors(stl);
550 }
551 }
0 /*******************************************************************************
1 * *
2 * Author : Angus Johnson *
3 * Version : 6.2.9 *
4 * Date : 16 February 2015 *
5 * Website : http://www.angusj.com *
6 * Copyright : Angus Johnson 2010-2015 *
7 * *
8 * License: *
9 * Use, modification & distribution is subject to Boost Software License Ver 1. *
10 * http://www.boost.org/LICENSE_1_0.txt *
11 * *
12 * Attributions: *
13 * The code in this library is an extension of Bala Vatti's clipping algorithm: *
14 * "A generic solution to polygon clipping" *
15 * Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. *
16 * http://portal.acm.org/citation.cfm?id=129906 *
17 * *
18 * Computer graphics and geometric modeling: implementation and algorithms *
19 * By Max K. Agoston *
20 * Springer; 1 edition (January 4, 2005) *
21 * http://books.google.com/books?q=vatti+clipping+agoston *
22 * *
23 * See also: *
24 * "Polygon Offsetting by Computing Winding Numbers" *
25 * Paper no. DETC2005-85513 pp. 565-575 *
26 * ASME 2005 International Design Engineering Technical Conferences *
27 * and Computers and Information in Engineering Conference (IDETC/CIE2005) *
28 * September 24-28, 2005 , Long Beach, California, USA *
29 * http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf *
30 * *
31 *******************************************************************************/
32
33 /*******************************************************************************
34 * *
35 * This is a translation of the Delphi Clipper library and the naming style *
36 * used has retained a Delphi flavour. *
37 * *
38 *******************************************************************************/
39
40 #include "clipper.hpp"
41 #include <cmath>
42 #include <vector>
43 #include <algorithm>
44 #include <stdexcept>
45 #include <cstring>
46 #include <cstdlib>
47 #include <ostream>
48 #include <functional>
49
50 namespace ClipperLib {
51
52 static double const pi = 3.141592653589793238;
53 static double const two_pi = pi *2;
54 static double const def_arc_tolerance = 0.25;
55
56 enum Direction { dRightToLeft, dLeftToRight };
57
58 static int const Unassigned = -1; //edge not currently 'owning' a solution
59 static int const Skip = -2; //edge that would otherwise close a path
60
61 #define HORIZONTAL (-1.0E+40)
62 #define TOLERANCE (1.0e-20)
63 #define NEAR_ZERO(val) (((val) > -TOLERANCE) && ((val) < TOLERANCE))
64
65 struct TEdge {
66 IntPoint Bot;
67 IntPoint Curr;
68 IntPoint Top;
69 IntPoint Delta;
70 double Dx;
71 PolyType PolyTyp;
72 EdgeSide Side;
73 int WindDelta; //1 or -1 depending on winding direction
74 int WindCnt;
75 int WindCnt2; //winding count of the opposite polytype
76 int OutIdx;
77 TEdge *Next;
78 TEdge *Prev;
79 TEdge *NextInLML;
80 TEdge *NextInAEL;
81 TEdge *PrevInAEL;
82 TEdge *NextInSEL;
83 TEdge *PrevInSEL;
84 };
85
86 struct IntersectNode {
87 TEdge *Edge1;
88 TEdge *Edge2;
89 IntPoint Pt;
90 };
91
92 struct LocalMinimum {
93 cInt Y;
94 TEdge *LeftBound;
95 TEdge *RightBound;
96 };
97
98 struct OutPt;
99
100 struct OutRec {
101 int Idx;
102 bool IsHole;
103 bool IsOpen;
104 OutRec *FirstLeft; //see comments in clipper.pas
105 PolyNode *PolyNd;
106 OutPt *Pts;
107 OutPt *BottomPt;
108 };
109
110 struct OutPt {
111 int Idx;
112 IntPoint Pt;
113 OutPt *Next;
114 OutPt *Prev;
115 };
116
117 struct Join {
118 OutPt *OutPt1;
119 OutPt *OutPt2;
120 IntPoint OffPt;
121 };
122
123 struct LocMinSorter
124 {
125 inline bool operator()(const LocalMinimum& locMin1, const LocalMinimum& locMin2)
126 {
127 return locMin2.Y < locMin1.Y;
128 }
129 };
130
131 //------------------------------------------------------------------------------
132 //------------------------------------------------------------------------------
133
134 inline cInt Round(double val)
135 {
136 if ((val < 0)) return static_cast<cInt>(val - 0.5);
137 else return static_cast<cInt>(val + 0.5);
138 }
139 //------------------------------------------------------------------------------
140
141 inline cInt Abs(cInt val)
142 {
143 return val < 0 ? -val : val;
144 }
145
146 //------------------------------------------------------------------------------
147 // PolyTree methods ...
148 //------------------------------------------------------------------------------
149
150 void PolyTree::Clear()
151 {
152 for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i)
153 delete AllNodes[i];
154 AllNodes.resize(0);
155 Childs.resize(0);
156 }
157 //------------------------------------------------------------------------------
158
159 PolyNode* PolyTree::GetFirst() const
160 {
161 if (!Childs.empty())
162 return Childs[0];
163 else
164 return 0;
165 }
166 //------------------------------------------------------------------------------
167
168 int PolyTree::Total() const
169 {
170 int result = (int)AllNodes.size();
171 //with negative offsets, ignore the hidden outer polygon ...
172 if (result > 0 && Childs[0] != AllNodes[0]) result--;
173 return result;
174 }
175
176 //------------------------------------------------------------------------------
177 // PolyNode methods ...
178 //------------------------------------------------------------------------------
179
180 PolyNode::PolyNode(): Childs(), Parent(0), Index(0), m_IsOpen(false)
181 {
182 }
183 //------------------------------------------------------------------------------
184
185 int PolyNode::ChildCount() const
186 {
187 return (int)Childs.size();
188 }
189 //------------------------------------------------------------------------------
190
191 void PolyNode::AddChild(PolyNode& child)
192 {
193 unsigned cnt = (unsigned)Childs.size();
194 Childs.push_back(&child);
195 child.Parent = this;
196 child.Index = cnt;
197 }
198 //------------------------------------------------------------------------------
199
200 PolyNode* PolyNode::GetNext() const
201 {
202 if (!Childs.empty())
203 return Childs[0];
204 else
205 return GetNextSiblingUp();
206 }
207 //------------------------------------------------------------------------------
208
209 PolyNode* PolyNode::GetNextSiblingUp() const
210 {
211 if (!Parent) //protects against PolyTree.GetNextSiblingUp()
212 return 0;
213 else if (Index == Parent->Childs.size() - 1)
214 return Parent->GetNextSiblingUp();
215 else
216 return Parent->Childs[Index + 1];
217 }
218 //------------------------------------------------------------------------------
219
220 bool PolyNode::IsHole() const
221 {
222 bool result = true;
223 PolyNode* node = Parent;
224 while (node)
225 {
226 result = !result;
227 node = node->Parent;
228 }
229 return result;
230 }
231 //------------------------------------------------------------------------------
232
233 bool PolyNode::IsOpen() const
234 {
235 return m_IsOpen;
236 }
237 //------------------------------------------------------------------------------
238
239 #ifndef use_int32
240
241 //------------------------------------------------------------------------------
242 // Int128 class (enables safe math on signed 64bit integers)
243 // eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1
244 // Int128 val2((long64)9223372036854775807);
245 // Int128 val3 = val1 * val2;
246 // val3.AsString => "85070591730234615847396907784232501249" (8.5e+37)
247 //------------------------------------------------------------------------------
248
249 class Int128
250 {
251 public:
252 ulong64 lo;
253 long64 hi;
254
255 Int128(long64 _lo = 0)
256 {
257 lo = (ulong64)_lo;
258 if (_lo < 0) hi = -1; else hi = 0;
259 }
260
261
262 Int128(const Int128 &val): lo(val.lo), hi(val.hi){}
263
264 Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){}
265
266 Int128& operator = (const long64 &val)
267 {
268 lo = (ulong64)val;
269 if (val < 0) hi = -1; else hi = 0;
270 return *this;
271 }
272
273 bool operator == (const Int128 &val) const
274 {return (hi == val.hi && lo == val.lo);}
275
276 bool operator != (const Int128 &val) const
277 { return !(*this == val);}
278
279 bool operator > (const Int128 &val) const
280 {
281 if (hi != val.hi)
282 return hi > val.hi;
283 else
284 return lo > val.lo;
285 }
286
287 bool operator < (const Int128 &val) const
288 {
289 if (hi != val.hi)
290 return hi < val.hi;
291 else
292 return lo < val.lo;
293 }
294
295 bool operator >= (const Int128 &val) const
296 { return !(*this < val);}
297
298 bool operator <= (const Int128 &val) const
299 { return !(*this > val);}
300
301 Int128& operator += (const Int128 &rhs)
302 {
303 hi += rhs.hi;
304 lo += rhs.lo;
305 if (lo < rhs.lo) hi++;
306 return *this;
307 }
308
309 Int128 operator + (const Int128 &rhs) const
310 {
311 Int128 result(*this);
312 result+= rhs;
313 return result;
314 }
315
316 Int128& operator -= (const Int128 &rhs)
317 {
318 *this += -rhs;
319 return *this;
320 }
321
322 Int128 operator - (const Int128 &rhs) const
323 {
324 Int128 result(*this);
325 result -= rhs;
326 return result;
327 }
328
329 Int128 operator-() const //unary negation
330 {
331 if (lo == 0)
332 return Int128(-hi, 0);
333 else
334 return Int128(~hi, ~lo + 1);
335 }
336
337 operator double() const
338 {
339 const double shift64 = 18446744073709551616.0; //2^64
340 if (hi < 0)
341 {
342 if (lo == 0) return (double)hi * shift64;
343 else return -(double)(~lo + ~hi * shift64);
344 }
345 else
346 return (double)(lo + hi * shift64);
347 }
348
349 };
350 //------------------------------------------------------------------------------
351
352 Int128 Int128Mul (long64 lhs, long64 rhs)
353 {
354 bool negate = (lhs < 0) != (rhs < 0);
355
356 if (lhs < 0) lhs = -lhs;
357 ulong64 int1Hi = ulong64(lhs) >> 32;
358 ulong64 int1Lo = ulong64(lhs & 0xFFFFFFFF);
359
360 if (rhs < 0) rhs = -rhs;
361 ulong64 int2Hi = ulong64(rhs) >> 32;
362 ulong64 int2Lo = ulong64(rhs & 0xFFFFFFFF);
363
364 //nb: see comments in clipper.pas
365 ulong64 a = int1Hi * int2Hi;
366 ulong64 b = int1Lo * int2Lo;
367 ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi;
368
369 Int128 tmp;
370 tmp.hi = long64(a + (c >> 32));
371 tmp.lo = long64(c << 32);
372 tmp.lo += long64(b);
373 if (tmp.lo < b) tmp.hi++;
374 if (negate) tmp = -tmp;
375 return tmp;
376 };
377 #endif
378
379 //------------------------------------------------------------------------------
380 // Miscellaneous global functions
381 //------------------------------------------------------------------------------
382
383 bool Orientation(const Path &poly)
384 {
385 return Area(poly) >= 0;
386 }
387 //------------------------------------------------------------------------------
388
389 double Area(const Path &poly)
390 {
391 int size = (int)poly.size();
392 if (size < 3) return 0;
393
394 double a = 0;
395 for (int i = 0, j = size -1; i < size; ++i)
396 {
397 a += ((double)poly[j].X + poly[i].X) * ((double)poly[j].Y - poly[i].Y);
398 j = i;
399 }
400 return -a * 0.5;
401 }
402 //------------------------------------------------------------------------------
403
404 double Area(const OutRec &outRec)
405 {
406 OutPt *op = outRec.Pts;
407 if (!op) return 0;
408 double a = 0;
409 do {
410 a += (double)(op->Prev->Pt.X + op->Pt.X) * (double)(op->Prev->Pt.Y - op->Pt.Y);
411 op = op->Next;
412 } while (op != outRec.Pts);
413 return a * 0.5;
414 }
415 //------------------------------------------------------------------------------
416
417 bool PointIsVertex(const IntPoint &Pt, OutPt *pp)
418 {
419 OutPt *pp2 = pp;
420 do
421 {
422 if (pp2->Pt == Pt) return true;
423 pp2 = pp2->Next;
424 }
425 while (pp2 != pp);
426 return false;
427 }
428 //------------------------------------------------------------------------------
429
430 //See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos
431 //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf
432 int PointInPolygon(const IntPoint &pt, const Path &path)
433 {
434 //returns 0 if false, +1 if true, -1 if pt ON polygon boundary
435 int result = 0;
436 size_t cnt = path.size();
437 if (cnt < 3) return 0;
438 IntPoint ip = path[0];
439 for(size_t i = 1; i <= cnt; ++i)
440 {
441 IntPoint ipNext = (i == cnt ? path[0] : path[i]);
442 if (ipNext.Y == pt.Y)
443 {
444 if ((ipNext.X == pt.X) || (ip.Y == pt.Y &&
445 ((ipNext.X > pt.X) == (ip.X < pt.X)))) return -1;
446 }
447 if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y))
448 {
449 if (ip.X >= pt.X)
450 {
451 if (ipNext.X > pt.X) result = 1 - result;
452 else
453 {
454 double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) -
455 (double)(ipNext.X - pt.X) * (ip.Y - pt.Y);
456 if (!d) return -1;
457 if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result;
458 }
459 } else
460 {
461 if (ipNext.X > pt.X)
462 {
463 double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) -
464 (double)(ipNext.X - pt.X) * (ip.Y - pt.Y);
465 if (!d) return -1;
466 if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result;
467 }
468 }
469 }
470 ip = ipNext;
471 }
472 return result;
473 }
474 //------------------------------------------------------------------------------
475
476 int PointInPolygon (const IntPoint &pt, OutPt *op)
477 {
478 //returns 0 if false, +1 if true, -1 if pt ON polygon boundary
479 int result = 0;
480 OutPt* startOp = op;
481 for(;;)
482 {
483 if (op->Next->Pt.Y == pt.Y)
484 {
485 if ((op->Next->Pt.X == pt.X) || (op->Pt.Y == pt.Y &&
486 ((op->Next->Pt.X > pt.X) == (op->Pt.X < pt.X)))) return -1;
487 }
488 if ((op->Pt.Y < pt.Y) != (op->Next->Pt.Y < pt.Y))
489 {
490 if (op->Pt.X >= pt.X)
491 {
492 if (op->Next->Pt.X > pt.X) result = 1 - result;
493 else
494 {
495 double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) -
496 (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y);
497 if (!d) return -1;
498 if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result;
499 }
500 } else
501 {
502 if (op->Next->Pt.X > pt.X)
503 {
504 double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) -
505 (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y);
506 if (!d) return -1;
507 if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result;
508 }
509 }
510 }
511 op = op->Next;
512 if (startOp == op) break;
513 }
514 return result;
515 }
516 //------------------------------------------------------------------------------
517
518 bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2)
519 {
520 OutPt* op = OutPt1;
521 do
522 {
523 //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon
524 int res = PointInPolygon(op->Pt, OutPt2);
525 if (res >= 0) return res > 0;
526 op = op->Next;
527 }
528 while (op != OutPt1);
529 return true;
530 }
531 //----------------------------------------------------------------------
532
533 bool SlopesEqual(const TEdge &e1, const TEdge &e2, bool UseFullInt64Range)
534 {
535 #ifndef use_int32
536 if (UseFullInt64Range)
537 return Int128Mul(e1.Delta.Y, e2.Delta.X) == Int128Mul(e1.Delta.X, e2.Delta.Y);
538 else
539 #endif
540 return e1.Delta.Y * e2.Delta.X == e1.Delta.X * e2.Delta.Y;
541 }
542 //------------------------------------------------------------------------------
543
544 bool SlopesEqual(const IntPoint &pt1, const IntPoint &pt2,
545 const IntPoint &pt3, bool UseFullInt64Range)
546 {
547 #ifndef use_int32
548 if (UseFullInt64Range)
549 return Int128Mul(pt1.Y-pt2.Y, pt2.X-pt3.X) == Int128Mul(pt1.X-pt2.X, pt2.Y-pt3.Y);
550 else
551 #endif
552 return (pt1.Y-pt2.Y)*(pt2.X-pt3.X) == (pt1.X-pt2.X)*(pt2.Y-pt3.Y);
553 }
554 //------------------------------------------------------------------------------
555
556 bool SlopesEqual(const IntPoint &pt1, const IntPoint &pt2,
557 const IntPoint &pt3, const IntPoint &pt4, bool UseFullInt64Range)
558 {
559 #ifndef use_int32
560 if (UseFullInt64Range)
561 return Int128Mul(pt1.Y-pt2.Y, pt3.X-pt4.X) == Int128Mul(pt1.X-pt2.X, pt3.Y-pt4.Y);
562 else
563 #endif
564 return (pt1.Y-pt2.Y)*(pt3.X-pt4.X) == (pt1.X-pt2.X)*(pt3.Y-pt4.Y);
565 }
566 //------------------------------------------------------------------------------
567
568 inline bool IsHorizontal(TEdge &e)
569 {
570 return e.Delta.Y == 0;
571 }
572 //------------------------------------------------------------------------------
573
574 inline double GetDx(const IntPoint &pt1, const IntPoint &pt2)
575 {
576 return (pt1.Y == pt2.Y) ?
577 HORIZONTAL : (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y);
578 }
579 //---------------------------------------------------------------------------
580
581 inline void SetDx(TEdge &e)
582 {
583 e.Delta.X = (e.Top.X - e.Bot.X);
584 e.Delta.Y = (e.Top.Y - e.Bot.Y);
585
586 if (e.Delta.Y == 0) e.Dx = HORIZONTAL;
587 else e.Dx = (double)(e.Delta.X) / e.Delta.Y;
588 }
589 //---------------------------------------------------------------------------
590
591 inline void SwapSides(TEdge &Edge1, TEdge &Edge2)
592 {
593 EdgeSide Side = Edge1.Side;
594 Edge1.Side = Edge2.Side;
595 Edge2.Side = Side;
596 }
597 //------------------------------------------------------------------------------
598
599 inline void SwapPolyIndexes(TEdge &Edge1, TEdge &Edge2)
600 {
601 int OutIdx = Edge1.OutIdx;
602 Edge1.OutIdx = Edge2.OutIdx;
603 Edge2.OutIdx = OutIdx;
604 }
605 //------------------------------------------------------------------------------
606
607 inline cInt TopX(TEdge &edge, const cInt currentY)
608 {
609 return ( currentY == edge.Top.Y ) ?
610 edge.Top.X : edge.Bot.X + Round(edge.Dx *(currentY - edge.Bot.Y));
611 }
612 //------------------------------------------------------------------------------
613
614 void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip)
615 {
616 #ifdef use_xyz
617 ip.Z = 0;
618 #endif
619
620 double b1, b2;
621 if (Edge1.Dx == Edge2.Dx)
622 {
623 ip.Y = Edge1.Curr.Y;
624 ip.X = TopX(Edge1, ip.Y);
625 return;
626 }
627 else if (Edge1.Delta.X == 0)
628 {
629 ip.X = Edge1.Bot.X;
630 if (IsHorizontal(Edge2))
631 ip.Y = Edge2.Bot.Y;
632 else
633 {
634 b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx);
635 ip.Y = Round(ip.X / Edge2.Dx + b2);
636 }
637 }
638 else if (Edge2.Delta.X == 0)
639 {
640 ip.X = Edge2.Bot.X;
641 if (IsHorizontal(Edge1))
642 ip.Y = Edge1.Bot.Y;
643 else
644 {
645 b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx);
646 ip.Y = Round(ip.X / Edge1.Dx + b1);
647 }
648 }
649 else
650 {
651 b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx;
652 b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx;
653 double q = (b2-b1) / (Edge1.Dx - Edge2.Dx);
654 ip.Y = Round(q);
655 if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx))
656 ip.X = Round(Edge1.Dx * q + b1);
657 else
658 ip.X = Round(Edge2.Dx * q + b2);
659 }
660
661 if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y)
662 {
663 if (Edge1.Top.Y > Edge2.Top.Y)
664 ip.Y = Edge1.Top.Y;
665 else
666 ip.Y = Edge2.Top.Y;
667 if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx))
668 ip.X = TopX(Edge1, ip.Y);
669 else
670 ip.X = TopX(Edge2, ip.Y);
671 }
672 //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ...
673 if (ip.Y > Edge1.Curr.Y)
674 {
675 ip.Y = Edge1.Curr.Y;
676 //use the more vertical edge to derive X ...
677 if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx))
678 ip.X = TopX(Edge2, ip.Y); else
679 ip.X = TopX(Edge1, ip.Y);
680 }
681 }
682 //------------------------------------------------------------------------------
683
684 void ReversePolyPtLinks(OutPt *pp)
685 {
686 if (!pp) return;
687 OutPt *pp1, *pp2;
688 pp1 = pp;
689 do {
690 pp2 = pp1->Next;
691 pp1->Next = pp1->Prev;
692 pp1->Prev = pp2;
693 pp1 = pp2;
694 } while( pp1 != pp );
695 }
696 //------------------------------------------------------------------------------
697
698 void DisposeOutPts(OutPt*& pp)
699 {
700 if (pp == 0) return;
701 pp->Prev->Next = 0;
702 while( pp )
703 {
704 OutPt *tmpPp = pp;
705 pp = pp->Next;
706 delete tmpPp;
707 }
708 }
709 //------------------------------------------------------------------------------
710
711 inline void InitEdge(TEdge* e, TEdge* eNext, TEdge* ePrev, const IntPoint& Pt)
712 {
713 std::memset(e, 0, sizeof(TEdge));
714 e->Next = eNext;
715 e->Prev = ePrev;
716 e->Curr = Pt;
717 e->OutIdx = Unassigned;
718 }
719 //------------------------------------------------------------------------------
720
721 void InitEdge2(TEdge& e, PolyType Pt)
722 {
723 if (e.Curr.Y >= e.Next->Curr.Y)
724 {
725 e.Bot = e.Curr;
726 e.Top = e.Next->Curr;
727 } else
728 {
729 e.Top = e.Curr;
730 e.Bot = e.Next->Curr;
731 }
732 SetDx(e);
733 e.PolyTyp = Pt;
734 }
735 //------------------------------------------------------------------------------
736
737 TEdge* RemoveEdge(TEdge* e)
738 {
739 //removes e from double_linked_list (but without removing from memory)
740 e->Prev->Next = e->Next;
741 e->Next->Prev = e->Prev;
742 TEdge* result = e->Next;
743 e->Prev = 0; //flag as removed (see ClipperBase.Clear)
744 return result;
745 }
746 //------------------------------------------------------------------------------
747
748 inline void ReverseHorizontal(TEdge &e)
749 {
750 //swap horizontal edges' Top and Bottom x's so they follow the natural
751 //progression of the bounds - ie so their xbots will align with the
752 //adjoining lower edge. [Helpful in the ProcessHorizontal() method.]
753 std::swap(e.Top.X, e.Bot.X);
754 #ifdef use_xyz
755 std::swap(e.Top.Z, e.Bot.Z);
756 #endif
757 }
758 //------------------------------------------------------------------------------
759
760 void SwapPoints(IntPoint &pt1, IntPoint &pt2)
761 {
762 IntPoint tmp = pt1;
763 pt1 = pt2;
764 pt2 = tmp;
765 }
766 //------------------------------------------------------------------------------
767
768 bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a,
769 IntPoint pt2b, IntPoint &pt1, IntPoint &pt2)
770 {
771 //precondition: segments are Collinear.
772 if (Abs(pt1a.X - pt1b.X) > Abs(pt1a.Y - pt1b.Y))
773 {
774 if (pt1a.X > pt1b.X) SwapPoints(pt1a, pt1b);
775 if (pt2a.X > pt2b.X) SwapPoints(pt2a, pt2b);
776 if (pt1a.X > pt2a.X) pt1 = pt1a; else pt1 = pt2a;
777 if (pt1b.X < pt2b.X) pt2 = pt1b; else pt2 = pt2b;
778 return pt1.X < pt2.X;
779 } else
780 {
781 if (pt1a.Y < pt1b.Y) SwapPoints(pt1a, pt1b);
782 if (pt2a.Y < pt2b.Y) SwapPoints(pt2a, pt2b);
783 if (pt1a.Y < pt2a.Y) pt1 = pt1a; else pt1 = pt2a;
784 if (pt1b.Y > pt2b.Y) pt2 = pt1b; else pt2 = pt2b;
785 return pt1.Y > pt2.Y;
786 }
787 }
788 //------------------------------------------------------------------------------
789
790 bool FirstIsBottomPt(const OutPt* btmPt1, const OutPt* btmPt2)
791 {
792 OutPt *p = btmPt1->Prev;
793 while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Prev;
794 double dx1p = std::fabs(GetDx(btmPt1->Pt, p->Pt));
795 p = btmPt1->Next;
796 while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Next;
797 double dx1n = std::fabs(GetDx(btmPt1->Pt, p->Pt));
798
799 p = btmPt2->Prev;
800 while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Prev;
801 double dx2p = std::fabs(GetDx(btmPt2->Pt, p->Pt));
802 p = btmPt2->Next;
803 while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Next;
804 double dx2n = std::fabs(GetDx(btmPt2->Pt, p->Pt));
805 return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n);
806 }
807 //------------------------------------------------------------------------------
808
809 OutPt* GetBottomPt(OutPt *pp)
810 {
811 OutPt* dups = 0;
812 OutPt* p = pp->Next;
813 while (p != pp)
814 {
815 if (p->Pt.Y > pp->Pt.Y)
816 {
817 pp = p;
818 dups = 0;
819 }
820 else if (p->Pt.Y == pp->Pt.Y && p->Pt.X <= pp->Pt.X)
821 {
822 if (p->Pt.X < pp->Pt.X)
823 {
824 dups = 0;
825 pp = p;
826 } else
827 {
828 if (p->Next != pp && p->Prev != pp) dups = p;
829 }
830 }
831 p = p->Next;
832 }
833 if (dups)
834 {
835 //there appears to be at least 2 vertices at BottomPt so ...
836 while (dups != p)
837 {
838 if (!FirstIsBottomPt(p, dups)) pp = dups;
839 dups = dups->Next;
840 while (dups->Pt != pp->Pt) dups = dups->Next;
841 }
842 }
843 return pp;
844 }
845 //------------------------------------------------------------------------------
846
847 bool Pt2IsBetweenPt1AndPt3(const IntPoint &pt1,
848 const IntPoint &pt2, const IntPoint &pt3)
849 {
850 if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2))
851 return false;
852 else if (pt1.X != pt3.X)
853 return (pt2.X > pt1.X) == (pt2.X < pt3.X);
854 else
855 return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y);
856 }
857 //------------------------------------------------------------------------------
858
859 bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b)
860 {
861 if (seg1a > seg1b) std::swap(seg1a, seg1b);
862 if (seg2a > seg2b) std::swap(seg2a, seg2b);
863 return (seg1a < seg2b) && (seg2a < seg1b);
864 }
865
866 //------------------------------------------------------------------------------
867 // ClipperBase class methods ...
868 //------------------------------------------------------------------------------
869
870 ClipperBase::ClipperBase() //constructor
871 {
872 m_CurrentLM = m_MinimaList.begin(); //begin() == end() here
873 m_UseFullRange = false;
874 }
875 //------------------------------------------------------------------------------
876
877 ClipperBase::~ClipperBase() //destructor
878 {
879 Clear();
880 }
881 //------------------------------------------------------------------------------
882
883 void RangeTest(const IntPoint& Pt, bool& useFullRange)
884 {
885 if (useFullRange)
886 {
887 if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange)
888 throw "Coordinate outside allowed range";
889 }
890 else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange)
891 {
892 useFullRange = true;
893 RangeTest(Pt, useFullRange);
894 }
895 }
896 //------------------------------------------------------------------------------
897
898 TEdge* FindNextLocMin(TEdge* E)
899 {
900 for (;;)
901 {
902 while (E->Bot != E->Prev->Bot || E->Curr == E->Top) E = E->Next;
903 if (!IsHorizontal(*E) && !IsHorizontal(*E->Prev)) break;
904 while (IsHorizontal(*E->Prev)) E = E->Prev;
905 TEdge* E2 = E;
906 while (IsHorizontal(*E)) E = E->Next;
907 if (E->Top.Y == E->Prev->Bot.Y) continue; //ie just an intermediate horz.
908 if (E2->Prev->Bot.X < E->Bot.X) E = E2;
909 break;
910 }
911 return E;
912 }
913 //------------------------------------------------------------------------------
914
915 TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward)
916 {
917 TEdge *Result = E;
918 TEdge *Horz = 0;
919
920 if (E->OutIdx == Skip)
921 {
922 //if edges still remain in the current bound beyond the skip edge then
923 //create another LocMin and call ProcessBound once more
924 if (NextIsForward)
925 {
926 while (E->Top.Y == E->Next->Bot.Y) E = E->Next;
927 //don't include top horizontals when parsing a bound a second time,
928 //they will be contained in the opposite bound ...
929 while (E != Result && IsHorizontal(*E)) E = E->Prev;
930 }
931 else
932 {
933 while (E->Top.Y == E->Prev->Bot.Y) E = E->Prev;
934 while (E != Result && IsHorizontal(*E)) E = E->Next;
935 }
936
937 if (E == Result)
938 {
939 if (NextIsForward) Result = E->Next;
940 else Result = E->Prev;
941 }
942 else
943 {
944 //there are more edges in the bound beyond result starting with E
945 if (NextIsForward)
946 E = Result->Next;
947 else
948 E = Result->Prev;
949 MinimaList::value_type locMin;
950 locMin.Y = E->Bot.Y;
951 locMin.LeftBound = 0;
952 locMin.RightBound = E;
953 E->WindDelta = 0;
954 Result = ProcessBound(E, NextIsForward);
955 m_MinimaList.push_back(locMin);
956 }
957 return Result;
958 }
959
960 TEdge *EStart;
961
962 if (IsHorizontal(*E))
963 {
964 //We need to be careful with open paths because this may not be a
965 //true local minima (ie E may be following a skip edge).
966 //Also, consecutive horz. edges may start heading left before going right.
967 if (NextIsForward)
968 EStart = E->Prev;
969 else
970 EStart = E->Next;
971 if (IsHorizontal(*EStart)) //ie an adjoining horizontal skip edge
972 {
973 if (EStart->Bot.X != E->Bot.X && EStart->Top.X != E->Bot.X)
974 ReverseHorizontal(*E);
975 }
976 else if (EStart->Bot.X != E->Bot.X)
977 ReverseHorizontal(*E);
978 }
979
980 EStart = E;
981 if (NextIsForward)
982 {
983 while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip)
984 Result = Result->Next;
985 if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip)
986 {
987 //nb: at the top of a bound, horizontals are added to the bound
988 //only when the preceding edge attaches to the horizontal's left vertex
989 //unless a Skip edge is encountered when that becomes the top divide
990 Horz = Result;
991 while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev;
992 if (Horz->Prev->Top.X > Result->Next->Top.X) Result = Horz->Prev;
993 }
994 while (E != Result)
995 {
996 E->NextInLML = E->Next;
997 if (IsHorizontal(*E) && E != EStart &&
998 E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E);
999 E = E->Next;
1000 }
1001 if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X)
1002 ReverseHorizontal(*E);
1003 Result = Result->Next; //move to the edge just beyond current bound
1004 } else
1005 {
1006 while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip)
1007 Result = Result->Prev;
1008 if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip)
1009 {
1010 Horz = Result;
1011 while (IsHorizontal(*Horz->Next)) Horz = Horz->Next;
1012 if (Horz->Next->Top.X == Result->Prev->Top.X ||
1013 Horz->Next->Top.X > Result->Prev->Top.X) Result = Horz->Next;
1014 }
1015
1016 while (E != Result)
1017 {
1018 E->NextInLML = E->Prev;
1019 if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X)
1020 ReverseHorizontal(*E);
1021 E = E->Prev;
1022 }
1023 if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X)
1024 ReverseHorizontal(*E);
1025 Result = Result->Prev; //move to the edge just beyond current bound
1026 }
1027
1028 return Result;
1029 }
1030 //------------------------------------------------------------------------------
1031
1032 bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
1033 {
1034 #ifdef use_lines
1035 if (!Closed && PolyTyp == ptClip)
1036 throw clipperException("AddPath: Open paths must be subject.");
1037 #else
1038 if (!Closed)
1039 throw clipperException("AddPath: Open paths have been disabled.");
1040 #endif
1041
1042 int highI = (int)pg.size() -1;
1043 if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI;
1044 while (highI > 0 && (pg[highI] == pg[highI -1])) --highI;
1045 if ((Closed && highI < 2) || (!Closed && highI < 1)) return false;
1046
1047 //create a new edge array ...
1048 TEdge *edges = new TEdge [highI +1];
1049
1050 bool IsFlat = true;
1051 //1. Basic (first) edge initialization ...
1052 try
1053 {
1054 edges[1].Curr = pg[1];
1055 RangeTest(pg[0], m_UseFullRange);
1056 RangeTest(pg[highI], m_UseFullRange);
1057 InitEdge(&edges[0], &edges[1], &edges[highI], pg[0]);
1058 InitEdge(&edges[highI], &edges[0], &edges[highI-1], pg[highI]);
1059 for (int i = highI - 1; i >= 1; --i)
1060 {
1061 RangeTest(pg[i], m_UseFullRange);
1062 InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]);
1063 }
1064 }
1065 catch(...)
1066 {
1067 delete [] edges;
1068 throw; //range test fails
1069 }
1070 TEdge *eStart = &edges[0];
1071
1072 //2. Remove duplicate vertices, and (when closed) collinear edges ...
1073 TEdge *E = eStart, *eLoopStop = eStart;
1074 for (;;)
1075 {
1076 //nb: allows matching start and end points when not Closed ...
1077 if (E->Curr == E->Next->Curr && (Closed || E->Next != eStart))
1078 {
1079 if (E == E->Next) break;
1080 if (E == eStart) eStart = E->Next;
1081 E = RemoveEdge(E);
1082 eLoopStop = E;
1083 continue;
1084 }
1085 if (E->Prev == E->Next)
1086 break; //only two vertices
1087 else if (Closed &&
1088 SlopesEqual(E->Prev->Curr, E->Curr, E->Next->Curr, m_UseFullRange) &&
1089 (!m_PreserveCollinear ||
1090 !Pt2IsBetweenPt1AndPt3(E->Prev->Curr, E->Curr, E->Next->Curr)))
1091 {
1092 //Collinear edges are allowed for open paths but in closed paths
1093 //the default is to merge adjacent collinear edges into a single edge.
1094 //However, if the PreserveCollinear property is enabled, only overlapping
1095 //collinear edges (ie spikes) will be removed from closed paths.
1096 if (E == eStart) eStart = E->Next;
1097 E = RemoveEdge(E);
1098 E = E->Prev;
1099 eLoopStop = E;
1100 continue;
1101 }
1102 E = E->Next;
1103 if ((E == eLoopStop) || (!Closed && E->Next == eStart)) break;
1104 }
1105
1106 if ((!Closed && (E == E->Next)) || (Closed && (E->Prev == E->Next)))
1107 {
1108 delete [] edges;
1109 return false;
1110 }
1111
1112 if (!Closed)
1113 {
1114 m_HasOpenPaths = true;
1115 eStart->Prev->OutIdx = Skip;
1116 }
1117
1118 //3. Do second stage of edge initialization ...
1119 E = eStart;
1120 do
1121 {
1122 InitEdge2(*E, PolyTyp);
1123 E = E->Next;
1124 if (IsFlat && E->Curr.Y != eStart->Curr.Y) IsFlat = false;
1125 }
1126 while (E != eStart);
1127
1128 //4. Finally, add edge bounds to LocalMinima list ...
1129
1130 //Totally flat paths must be handled differently when adding them
1131 //to LocalMinima list to avoid endless loops etc ...
1132 if (IsFlat)
1133 {
1134 if (Closed)
1135 {
1136 delete [] edges;
1137 return false;
1138 }
1139 E->Prev->OutIdx = Skip;
1140 MinimaList::value_type locMin;
1141 locMin.Y = E->Bot.Y;
1142 locMin.LeftBound = 0;
1143 locMin.RightBound = E;
1144 locMin.RightBound->Side = esRight;
1145 locMin.RightBound->WindDelta = 0;
1146 for (;;)
1147 {
1148 if (E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E);
1149 if (E->Next->OutIdx == Skip) break;
1150 E->NextInLML = E->Next;
1151 E = E->Next;
1152 }
1153 m_MinimaList.push_back(locMin);
1154 m_edges.push_back(edges);
1155 return true;
1156 }
1157
1158 m_edges.push_back(edges);
1159 bool leftBoundIsForward;
1160 TEdge* EMin = 0;
1161
1162 //workaround to avoid an endless loop in the while loop below when
1163 //open paths have matching start and end points ...
1164 if (E->Prev->Bot == E->Prev->Top) E = E->Next;
1165
1166 for (;;)
1167 {
1168 E = FindNextLocMin(E);
1169 if (E == EMin) break;
1170 else if (!EMin) EMin = E;
1171
1172 //E and E.Prev now share a local minima (left aligned if horizontal).
1173 //Compare their slopes to find which starts which bound ...
1174 MinimaList::value_type locMin;
1175 locMin.Y = E->Bot.Y;
1176 if (E->Dx < E->Prev->Dx)
1177 {
1178 locMin.LeftBound = E->Prev;
1179 locMin.RightBound = E;
1180 leftBoundIsForward = false; //Q.nextInLML = Q.prev
1181 } else
1182 {
1183 locMin.LeftBound = E;
1184 locMin.RightBound = E->Prev;
1185 leftBoundIsForward = true; //Q.nextInLML = Q.next
1186 }
1187 locMin.LeftBound->Side = esLeft;
1188 locMin.RightBound->Side = esRight;
1189
1190 if (!Closed) locMin.LeftBound->WindDelta = 0;
1191 else if (locMin.LeftBound->Next == locMin.RightBound)
1192 locMin.LeftBound->WindDelta = -1;
1193 else locMin.LeftBound->WindDelta = 1;
1194 locMin.RightBound->WindDelta = -locMin.LeftBound->WindDelta;
1195
1196 E = ProcessBound(locMin.LeftBound, leftBoundIsForward);
1197 if (E->OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward);
1198
1199 TEdge* E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward);
1200 if (E2->OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward);
1201
1202 if (locMin.LeftBound->OutIdx == Skip)
1203 locMin.LeftBound = 0;
1204 else if (locMin.RightBound->OutIdx == Skip)
1205 locMin.RightBound = 0;
1206 m_MinimaList.push_back(locMin);
1207 if (!leftBoundIsForward) E = E2;
1208 }
1209 return true;
1210 }
1211 //------------------------------------------------------------------------------
1212
1213 bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed)
1214 {
1215 bool result = false;
1216 for (Paths::size_type i = 0; i < ppg.size(); ++i)
1217 if (AddPath(ppg[i], PolyTyp, Closed)) result = true;
1218 return result;
1219 }
1220 //------------------------------------------------------------------------------
1221
1222 void ClipperBase::Clear()
1223 {
1224 DisposeLocalMinimaList();
1225 for (EdgeList::size_type i = 0; i < m_edges.size(); ++i)
1226 {
1227 //for each edge array in turn, find the first used edge and
1228 //check for and remove any hiddenPts in each edge in the array.
1229 TEdge* edges = m_edges[i];
1230 delete [] edges;
1231 }
1232 m_edges.clear();
1233 m_UseFullRange = false;
1234 m_HasOpenPaths = false;
1235 }
1236 //------------------------------------------------------------------------------
1237
1238 void ClipperBase::Reset()
1239 {
1240 m_CurrentLM = m_MinimaList.begin();
1241 if (m_CurrentLM == m_MinimaList.end()) return; //ie nothing to process
1242 std::sort(m_MinimaList.begin(), m_MinimaList.end(), LocMinSorter());
1243
1244 //reset all edges ...
1245 for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm)
1246 {
1247 TEdge* e = lm->LeftBound;
1248 if (e)
1249 {
1250 e->Curr = e->Bot;
1251 e->Side = esLeft;
1252 e->OutIdx = Unassigned;
1253 }
1254
1255 e = lm->RightBound;
1256 if (e)
1257 {
1258 e->Curr = e->Bot;
1259 e->Side = esRight;
1260 e->OutIdx = Unassigned;
1261 }
1262 }
1263 }
1264 //------------------------------------------------------------------------------
1265
1266 void ClipperBase::DisposeLocalMinimaList()
1267 {
1268 m_MinimaList.clear();
1269 m_CurrentLM = m_MinimaList.begin();
1270 }
1271 //------------------------------------------------------------------------------
1272
1273 void ClipperBase::PopLocalMinima()
1274 {
1275 if (m_CurrentLM == m_MinimaList.end()) return;
1276 ++m_CurrentLM;
1277 }
1278 //------------------------------------------------------------------------------
1279
1280 IntRect ClipperBase::GetBounds()
1281 {
1282 IntRect result;
1283 MinimaList::iterator lm = m_MinimaList.begin();
1284 if (lm == m_MinimaList.end())
1285 {
1286 result.left = result.top = result.right = result.bottom = 0;
1287 return result;
1288 }
1289 result.left = lm->LeftBound->Bot.X;
1290 result.top = lm->LeftBound->Bot.Y;
1291 result.right = lm->LeftBound->Bot.X;
1292 result.bottom = lm->LeftBound->Bot.Y;
1293 while (lm != m_MinimaList.end())
1294 {
1295 result.bottom = std::max(result.bottom, lm->LeftBound->Bot.Y);
1296 TEdge* e = lm->LeftBound;
1297 for (;;) {
1298 TEdge* bottomE = e;
1299 while (e->NextInLML)
1300 {
1301 if (e->Bot.X < result.left) result.left = e->Bot.X;
1302 if (e->Bot.X > result.right) result.right = e->Bot.X;
1303 e = e->NextInLML;
1304 }
1305 result.left = std::min(result.left, e->Bot.X);
1306 result.right = std::max(result.right, e->Bot.X);
1307 result.left = std::min(result.left, e->Top.X);
1308 result.right = std::max(result.right, e->Top.X);
1309 result.top = std::min(result.top, e->Top.Y);
1310 if (bottomE == lm->LeftBound) e = lm->RightBound;
1311 else break;
1312 }
1313 ++lm;
1314 }
1315 return result;
1316 }
1317
1318 //------------------------------------------------------------------------------
1319 // TClipper methods ...
1320 //------------------------------------------------------------------------------
1321
1322 Clipper::Clipper(int initOptions) : ClipperBase() //constructor
1323 {
1324 m_ActiveEdges = 0;
1325 m_SortedEdges = 0;
1326 m_ExecuteLocked = false;
1327 m_UseFullRange = false;
1328 m_ReverseOutput = ((initOptions & ioReverseSolution) != 0);
1329 m_StrictSimple = ((initOptions & ioStrictlySimple) != 0);
1330 m_PreserveCollinear = ((initOptions & ioPreserveCollinear) != 0);
1331 m_HasOpenPaths = false;
1332 #ifdef use_xyz
1333 m_ZFill = 0;
1334 #endif
1335 }
1336 //------------------------------------------------------------------------------
1337
1338 Clipper::~Clipper() //destructor
1339 {
1340 Clear();
1341 }
1342 //------------------------------------------------------------------------------
1343
1344 #ifdef use_xyz
1345 void Clipper::ZFillFunction(ZFillCallback zFillFunc)
1346 {
1347 m_ZFill = zFillFunc;
1348 }
1349 //------------------------------------------------------------------------------
1350 #endif
1351
1352 void Clipper::Reset()
1353 {
1354 ClipperBase::Reset();
1355 m_Scanbeam = ScanbeamList();
1356 m_Maxima = MaximaList();
1357 m_ActiveEdges = 0;
1358 m_SortedEdges = 0;
1359 for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm)
1360 InsertScanbeam(lm->Y);
1361 }
1362 //------------------------------------------------------------------------------
1363
1364 bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType fillType)
1365 {
1366 return Execute(clipType, solution, fillType, fillType);
1367 }
1368 //------------------------------------------------------------------------------
1369
1370 bool Clipper::Execute(ClipType clipType, PolyTree &polytree, PolyFillType fillType)
1371 {
1372 return Execute(clipType, polytree, fillType, fillType);
1373 }
1374 //------------------------------------------------------------------------------
1375
1376 bool Clipper::Execute(ClipType clipType, Paths &solution,
1377 PolyFillType subjFillType, PolyFillType clipFillType)
1378 {
1379 if( m_ExecuteLocked ) return false;
1380 if (m_HasOpenPaths)
1381 throw clipperException("Error: PolyTree struct is needed for open path clipping.");
1382 m_ExecuteLocked = true;
1383 solution.resize(0);
1384 m_SubjFillType = subjFillType;
1385 m_ClipFillType = clipFillType;
1386 m_ClipType = clipType;
1387 m_UsingPolyTree = false;
1388 bool succeeded = ExecuteInternal();
1389 if (succeeded) BuildResult(solution);
1390 DisposeAllOutRecs();
1391 m_ExecuteLocked = false;
1392 return succeeded;
1393 }
1394 //------------------------------------------------------------------------------
1395
1396 bool Clipper::Execute(ClipType clipType, PolyTree& polytree,
1397 PolyFillType subjFillType, PolyFillType clipFillType)
1398 {
1399 if( m_ExecuteLocked ) return false;
1400 m_ExecuteLocked = true;
1401 m_SubjFillType = subjFillType;
1402 m_ClipFillType = clipFillType;
1403 m_ClipType = clipType;
1404 m_UsingPolyTree = true;
1405 bool succeeded = ExecuteInternal();
1406 if (succeeded) BuildResult2(polytree);
1407 DisposeAllOutRecs();
1408 m_ExecuteLocked = false;
1409 return succeeded;
1410 }
1411 //------------------------------------------------------------------------------
1412
1413 void Clipper::FixHoleLinkage(OutRec &outrec)
1414 {
1415 //skip OutRecs that (a) contain outermost polygons or
1416 //(b) already have the correct owner/child linkage ...
1417 if (!outrec.FirstLeft ||
1418 (outrec.IsHole != outrec.FirstLeft->IsHole &&
1419 outrec.FirstLeft->Pts)) return;
1420
1421 OutRec* orfl = outrec.FirstLeft;
1422 while (orfl && ((orfl->IsHole == outrec.IsHole) || !orfl->Pts))
1423 orfl = orfl->FirstLeft;
1424 outrec.FirstLeft = orfl;
1425 }
1426 //------------------------------------------------------------------------------
1427
1428 bool Clipper::ExecuteInternal()
1429 {
1430 bool succeeded = true;
1431 try {
1432 Reset();
1433 if (m_CurrentLM == m_MinimaList.end()) return true;
1434 cInt botY = PopScanbeam();
1435 do {
1436 InsertLocalMinimaIntoAEL(botY);
1437 ProcessHorizontals();
1438 ClearGhostJoins();
1439 if (m_Scanbeam.empty()) break;
1440 cInt topY = PopScanbeam();
1441 succeeded = ProcessIntersections(topY);
1442 if (!succeeded) break;
1443 ProcessEdgesAtTopOfScanbeam(topY);
1444 botY = topY;
1445 } while (!m_Scanbeam.empty() || m_CurrentLM != m_MinimaList.end());
1446 }
1447 catch(...)
1448 {
1449 succeeded = false;
1450 }
1451
1452 if (succeeded)
1453 {
1454 //fix orientations ...
1455 for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
1456 {
1457 OutRec *outRec = m_PolyOuts[i];
1458 if (!outRec->Pts || outRec->IsOpen) continue;
1459 if ((outRec->IsHole ^ m_ReverseOutput) == (Area(*outRec) > 0))
1460 ReversePolyPtLinks(outRec->Pts);
1461 }
1462
1463 if (!m_Joins.empty()) JoinCommonEdges();
1464
1465 //unfortunately FixupOutPolygon() must be done after JoinCommonEdges()
1466 for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
1467 {
1468 OutRec *outRec = m_PolyOuts[i];
1469 if (!outRec->Pts) continue;
1470 if (outRec->IsOpen)
1471 FixupOutPolyline(*outRec);
1472 else
1473 FixupOutPolygon(*outRec);
1474 }
1475
1476 if (m_StrictSimple) DoSimplePolygons();
1477 }
1478
1479 ClearJoins();
1480 ClearGhostJoins();
1481 return succeeded;
1482 }
1483 //------------------------------------------------------------------------------
1484
1485 void Clipper::InsertScanbeam(const cInt Y)
1486 {
1487 m_Scanbeam.push(Y);
1488 }
1489 //------------------------------------------------------------------------------
1490
1491 cInt Clipper::PopScanbeam()
1492 {
1493 const cInt Y = m_Scanbeam.top();
1494 m_Scanbeam.pop();
1495 while (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) { m_Scanbeam.pop(); } // Pop duplicates.
1496 return Y;
1497 }
1498 //------------------------------------------------------------------------------
1499
1500 void Clipper::DisposeAllOutRecs(){
1501 for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
1502 DisposeOutRec(i);
1503 m_PolyOuts.clear();
1504 }
1505 //------------------------------------------------------------------------------
1506
1507 void Clipper::DisposeOutRec(PolyOutList::size_type index)
1508 {
1509 OutRec *outRec = m_PolyOuts[index];
1510 if (outRec->Pts) DisposeOutPts(outRec->Pts);
1511 delete outRec;
1512 m_PolyOuts[index] = 0;
1513 }
1514 //------------------------------------------------------------------------------
1515
1516 void Clipper::SetWindingCount(TEdge &edge) const
1517 {
1518 TEdge *e = edge.PrevInAEL;
1519 //find the edge of the same polytype that immediately preceeds 'edge' in AEL
1520 while (e && ((e->PolyTyp != edge.PolyTyp) || (e->WindDelta == 0))) e = e->PrevInAEL;
1521 if (!e)
1522 {
1523 edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta);
1524 edge.WindCnt2 = 0;
1525 e = m_ActiveEdges; //ie get ready to calc WindCnt2
1526 }
1527 else if (edge.WindDelta == 0 && m_ClipType != ctUnion)
1528 {
1529 edge.WindCnt = 1;
1530 edge.WindCnt2 = e->WindCnt2;
1531 e = e->NextInAEL; //ie get ready to calc WindCnt2
1532 }
1533 else if (IsEvenOddFillType(edge))
1534 {
1535 //EvenOdd filling ...
1536 if (edge.WindDelta == 0)
1537 {
1538 //are we inside a subj polygon ...
1539 bool Inside = true;
1540 TEdge *e2 = e->PrevInAEL;
1541 while (e2)
1542 {
1543 if (e2->PolyTyp == e->PolyTyp && e2->WindDelta != 0)
1544 Inside = !Inside;
1545 e2 = e2->PrevInAEL;
1546 }
1547 edge.WindCnt = (Inside ? 0 : 1);
1548 }
1549 else
1550 {
1551 edge.WindCnt = edge.WindDelta;
1552 }
1553 edge.WindCnt2 = e->WindCnt2;
1554 e = e->NextInAEL; //ie get ready to calc WindCnt2
1555 }
1556 else
1557 {
1558 //nonZero, Positive or Negative filling ...
1559 if (e->WindCnt * e->WindDelta < 0)
1560 {
1561 //prev edge is 'decreasing' WindCount (WC) toward zero
1562 //so we're outside the previous polygon ...
1563 if (Abs(e->WindCnt) > 1)
1564 {
1565 //outside prev poly but still inside another.
1566 //when reversing direction of prev poly use the same WC
1567 if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt;
1568 //otherwise continue to 'decrease' WC ...
1569 else edge.WindCnt = e->WindCnt + edge.WindDelta;
1570 }
1571 else
1572 //now outside all polys of same polytype so set own WC ...
1573 edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta);
1574 } else
1575 {
1576 //prev edge is 'increasing' WindCount (WC) away from zero
1577 //so we're inside the previous polygon ...
1578 if (edge.WindDelta == 0)
1579 edge.WindCnt = (e->WindCnt < 0 ? e->WindCnt - 1 : e->WindCnt + 1);
1580 //if wind direction is reversing prev then use same WC
1581 else if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt;
1582 //otherwise add to WC ...
1583 else edge.WindCnt = e->WindCnt + edge.WindDelta;
1584 }
1585 edge.WindCnt2 = e->WindCnt2;
1586 e = e->NextInAEL; //ie get ready to calc WindCnt2
1587 }
1588
1589 //update WindCnt2 ...
1590 if (IsEvenOddAltFillType(edge))
1591 {
1592 //EvenOdd filling ...
1593 while (e != &edge)
1594 {
1595 if (e->WindDelta != 0)
1596 edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0);
1597 e = e->NextInAEL;
1598 }
1599 } else
1600 {
1601 //nonZero, Positive or Negative filling ...
1602 while ( e != &edge )
1603 {
1604 edge.WindCnt2 += e->WindDelta;
1605 e = e->NextInAEL;
1606 }
1607 }
1608 }
1609 //------------------------------------------------------------------------------
1610
1611 bool Clipper::IsEvenOddFillType(const TEdge& edge) const
1612 {
1613 if (edge.PolyTyp == ptSubject)
1614 return m_SubjFillType == pftEvenOdd; else
1615 return m_ClipFillType == pftEvenOdd;
1616 }
1617 //------------------------------------------------------------------------------
1618
1619 bool Clipper::IsEvenOddAltFillType(const TEdge& edge) const
1620 {
1621 if (edge.PolyTyp == ptSubject)
1622 return m_ClipFillType == pftEvenOdd; else
1623 return m_SubjFillType == pftEvenOdd;
1624 }
1625 //------------------------------------------------------------------------------
1626
1627 bool Clipper::IsContributing(const TEdge& edge) const
1628 {
1629 PolyFillType pft, pft2;
1630 if (edge.PolyTyp == ptSubject)
1631 {
1632 pft = m_SubjFillType;
1633 pft2 = m_ClipFillType;
1634 } else
1635 {
1636 pft = m_ClipFillType;
1637 pft2 = m_SubjFillType;
1638 }
1639
1640 switch(pft)
1641 {
1642 case pftEvenOdd:
1643 //return false if a subj line has been flagged as inside a subj polygon
1644 if (edge.WindDelta == 0 && edge.WindCnt != 1) return false;
1645 break;
1646 case pftNonZero:
1647 if (Abs(edge.WindCnt) != 1) return false;
1648 break;
1649 case pftPositive:
1650 if (edge.WindCnt != 1) return false;
1651 break;
1652 default: //pftNegative
1653 if (edge.WindCnt != -1) return false;
1654 }
1655
1656 switch(m_ClipType)
1657 {
1658 case ctIntersection:
1659 switch(pft2)
1660 {
1661 case pftEvenOdd:
1662 case pftNonZero:
1663 return (edge.WindCnt2 != 0);
1664 case pftPositive:
1665 return (edge.WindCnt2 > 0);
1666 default:
1667 return (edge.WindCnt2 < 0);
1668 }
1669 break;
1670 case ctUnion:
1671 switch(pft2)
1672 {
1673 case pftEvenOdd:
1674 case pftNonZero:
1675 return (edge.WindCnt2 == 0);
1676 case pftPositive:
1677 return (edge.WindCnt2 <= 0);
1678 default:
1679 return (edge.WindCnt2 >= 0);
1680 }
1681 break;
1682 case ctDifference:
1683 if (edge.PolyTyp == ptSubject)
1684 switch(pft2)
1685 {
1686 case pftEvenOdd:
1687 case pftNonZero:
1688 return (edge.WindCnt2 == 0);
1689 case pftPositive:
1690 return (edge.WindCnt2 <= 0);
1691 default:
1692 return (edge.WindCnt2 >= 0);
1693 }
1694 else
1695 switch(pft2)
1696 {
1697 case pftEvenOdd:
1698 case pftNonZero:
1699 return (edge.WindCnt2 != 0);
1700 case pftPositive:
1701 return (edge.WindCnt2 > 0);
1702 default:
1703 return (edge.WindCnt2 < 0);
1704 }
1705 break;
1706 case ctXor:
1707 if (edge.WindDelta == 0) //XOr always contributing unless open
1708 switch(pft2)
1709 {
1710 case pftEvenOdd:
1711 case pftNonZero:
1712 return (edge.WindCnt2 == 0);
1713 case pftPositive:
1714 return (edge.WindCnt2 <= 0);
1715 default:
1716 return (edge.WindCnt2 >= 0);
1717 }
1718 else
1719 return true;
1720 break;
1721 default:
1722 return true;
1723 }
1724 }
1725 //------------------------------------------------------------------------------
1726
1727 OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt)
1728 {
1729 OutPt* result;
1730 TEdge *e, *prevE;
1731 if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx ))
1732 {
1733 result = AddOutPt(e1, Pt);
1734 e2->OutIdx = e1->OutIdx;
1735 e1->Side = esLeft;
1736 e2->Side = esRight;
1737 e = e1;
1738 if (e->PrevInAEL == e2)
1739 prevE = e2->PrevInAEL;
1740 else
1741 prevE = e->PrevInAEL;
1742 } else
1743 {
1744 result = AddOutPt(e2, Pt);
1745 e1->OutIdx = e2->OutIdx;
1746 e1->Side = esRight;
1747 e2->Side = esLeft;
1748 e = e2;
1749 if (e->PrevInAEL == e1)
1750 prevE = e1->PrevInAEL;
1751 else
1752 prevE = e->PrevInAEL;
1753 }
1754
1755 if (prevE && prevE->OutIdx >= 0 &&
1756 (TopX(*prevE, Pt.Y) == TopX(*e, Pt.Y)) &&
1757 SlopesEqual(*e, *prevE, m_UseFullRange) &&
1758 (e->WindDelta != 0) && (prevE->WindDelta != 0))
1759 {
1760 OutPt* outPt = AddOutPt(prevE, Pt);
1761 AddJoin(result, outPt, e->Top);
1762 }
1763 return result;
1764 }
1765 //------------------------------------------------------------------------------
1766
1767 void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt)
1768 {
1769 AddOutPt( e1, Pt );
1770 if (e2->WindDelta == 0) AddOutPt(e2, Pt);
1771 if( e1->OutIdx == e2->OutIdx )
1772 {
1773 e1->OutIdx = Unassigned;
1774 e2->OutIdx = Unassigned;
1775 }
1776 else if (e1->OutIdx < e2->OutIdx)
1777 AppendPolygon(e1, e2);
1778 else
1779 AppendPolygon(e2, e1);
1780 }
1781 //------------------------------------------------------------------------------
1782
1783 void Clipper::AddEdgeToSEL(TEdge *edge)
1784 {
1785 //SEL pointers in PEdge are reused to build a list of horizontal edges.
1786 //However, we don't need to worry about order with horizontal edge processing.
1787 if( !m_SortedEdges )
1788 {
1789 m_SortedEdges = edge;
1790 edge->PrevInSEL = 0;
1791 edge->NextInSEL = 0;
1792 }
1793 else
1794 {
1795 edge->NextInSEL = m_SortedEdges;
1796 edge->PrevInSEL = 0;
1797 m_SortedEdges->PrevInSEL = edge;
1798 m_SortedEdges = edge;
1799 }
1800 }
1801 //------------------------------------------------------------------------------
1802
1803 void Clipper::CopyAELToSEL()
1804 {
1805 TEdge* e = m_ActiveEdges;
1806 m_SortedEdges = e;
1807 while ( e )
1808 {
1809 e->PrevInSEL = e->PrevInAEL;
1810 e->NextInSEL = e->NextInAEL;
1811 e = e->NextInAEL;
1812 }
1813 }
1814 //------------------------------------------------------------------------------
1815
1816 void Clipper::AddJoin(OutPt *op1, OutPt *op2, const IntPoint &OffPt)
1817 {
1818 Join* j = new Join;
1819 j->OutPt1 = op1;
1820 j->OutPt2 = op2;
1821 j->OffPt = OffPt;
1822 m_Joins.push_back(j);
1823 }
1824 //------------------------------------------------------------------------------
1825
1826 void Clipper::ClearJoins()
1827 {
1828 for (JoinList::size_type i = 0; i < m_Joins.size(); i++)
1829 delete m_Joins[i];
1830 m_Joins.resize(0);
1831 }
1832 //------------------------------------------------------------------------------
1833
1834 void Clipper::ClearGhostJoins()
1835 {
1836 for (JoinList::size_type i = 0; i < m_GhostJoins.size(); i++)
1837 delete m_GhostJoins[i];
1838 m_GhostJoins.resize(0);
1839 }
1840 //------------------------------------------------------------------------------
1841
1842 void Clipper::AddGhostJoin(OutPt *op, const IntPoint &OffPt)
1843 {
1844 Join* j = new Join;
1845 j->OutPt1 = op;
1846 j->OutPt2 = 0;
1847 j->OffPt = OffPt;
1848 m_GhostJoins.push_back(j);
1849 }
1850 //------------------------------------------------------------------------------
1851
1852 void Clipper::InsertLocalMinimaIntoAEL(const cInt botY)
1853 {
1854 while (m_CurrentLM != m_MinimaList.end() && (m_CurrentLM->Y == botY))
1855 {
1856 TEdge* lb = m_CurrentLM->LeftBound;
1857 TEdge* rb = m_CurrentLM->RightBound;
1858 PopLocalMinima();
1859 OutPt *Op1 = 0;
1860 if (!lb)
1861 {
1862 //nb: don't insert LB into either AEL or SEL
1863 InsertEdgeIntoAEL(rb, 0);
1864 SetWindingCount(*rb);
1865 if (IsContributing(*rb))
1866 Op1 = AddOutPt(rb, rb->Bot);
1867 }
1868 else if (!rb)
1869 {
1870 InsertEdgeIntoAEL(lb, 0);
1871 SetWindingCount(*lb);
1872 if (IsContributing(*lb))
1873 Op1 = AddOutPt(lb, lb->Bot);
1874 InsertScanbeam(lb->Top.Y);
1875 }
1876 else
1877 {
1878 InsertEdgeIntoAEL(lb, 0);
1879 InsertEdgeIntoAEL(rb, lb);
1880 SetWindingCount( *lb );
1881 rb->WindCnt = lb->WindCnt;
1882 rb->WindCnt2 = lb->WindCnt2;
1883 if (IsContributing(*lb))
1884 Op1 = AddLocalMinPoly(lb, rb, lb->Bot);
1885 InsertScanbeam(lb->Top.Y);
1886 }
1887
1888 if (rb)
1889 {
1890 if(IsHorizontal(*rb)) AddEdgeToSEL(rb);
1891 else InsertScanbeam( rb->Top.Y );
1892 }
1893
1894 if (!lb || !rb) continue;
1895
1896 //if any output polygons share an edge, they'll need joining later ...
1897 if (Op1 && IsHorizontal(*rb) &&
1898 m_GhostJoins.size() > 0 && (rb->WindDelta != 0))
1899 {
1900 for (JoinList::size_type i = 0; i < m_GhostJoins.size(); ++i)
1901 {
1902 Join* jr = m_GhostJoins[i];
1903 //if the horizontal Rb and a 'ghost' horizontal overlap, then convert
1904 //the 'ghost' join to a real join ready for later ...
1905 if (HorzSegmentsOverlap(jr->OutPt1->Pt.X, jr->OffPt.X, rb->Bot.X, rb->Top.X))
1906 AddJoin(jr->OutPt1, Op1, jr->OffPt);
1907 }
1908 }
1909
1910 if (lb->OutIdx >= 0 && lb->PrevInAEL &&
1911 lb->PrevInAEL->Curr.X == lb->Bot.X &&
1912 lb->PrevInAEL->OutIdx >= 0 &&
1913 SlopesEqual(*lb->PrevInAEL, *lb, m_UseFullRange) &&
1914 (lb->WindDelta != 0) && (lb->PrevInAEL->WindDelta != 0))
1915 {
1916 OutPt *Op2 = AddOutPt(lb->PrevInAEL, lb->Bot);
1917 AddJoin(Op1, Op2, lb->Top);
1918 }
1919
1920 if(lb->NextInAEL != rb)
1921 {
1922
1923 if (rb->OutIdx >= 0 && rb->PrevInAEL->OutIdx >= 0 &&
1924 SlopesEqual(*rb->PrevInAEL, *rb, m_UseFullRange) &&
1925 (rb->WindDelta != 0) && (rb->PrevInAEL->WindDelta != 0))
1926 {
1927 OutPt *Op2 = AddOutPt(rb->PrevInAEL, rb->Bot);
1928 AddJoin(Op1, Op2, rb->Top);
1929 }
1930
1931 TEdge* e = lb->NextInAEL;
1932 if (e)
1933 {
1934 while( e != rb )
1935 {
1936 //nb: For calculating winding counts etc, IntersectEdges() assumes
1937 //that param1 will be to the Right of param2 ABOVE the intersection ...
1938 IntersectEdges(rb , e , lb->Curr); //order important here
1939 e = e->NextInAEL;
1940 }
1941 }
1942 }
1943
1944 }
1945 }
1946 //------------------------------------------------------------------------------
1947
1948 void Clipper::DeleteFromAEL(TEdge *e)
1949 {
1950 TEdge* AelPrev = e->PrevInAEL;
1951 TEdge* AelNext = e->NextInAEL;
1952 if( !AelPrev && !AelNext && (e != m_ActiveEdges) ) return; //already deleted
1953 if( AelPrev ) AelPrev->NextInAEL = AelNext;
1954 else m_ActiveEdges = AelNext;
1955 if( AelNext ) AelNext->PrevInAEL = AelPrev;
1956 e->NextInAEL = 0;
1957 e->PrevInAEL = 0;
1958 }
1959 //------------------------------------------------------------------------------
1960
1961 void Clipper::DeleteFromSEL(TEdge *e)
1962 {
1963 TEdge* SelPrev = e->PrevInSEL;
1964 TEdge* SelNext = e->NextInSEL;
1965 if( !SelPrev && !SelNext && (e != m_SortedEdges) ) return; //already deleted
1966 if( SelPrev ) SelPrev->NextInSEL = SelNext;
1967 else m_SortedEdges = SelNext;
1968 if( SelNext ) SelNext->PrevInSEL = SelPrev;
1969 e->NextInSEL = 0;
1970 e->PrevInSEL = 0;
1971 }
1972 //------------------------------------------------------------------------------
1973
1974 #ifdef use_xyz
1975 void Clipper::SetZ(IntPoint& pt, TEdge& e1, TEdge& e2)
1976 {
1977 if (pt.Z != 0 || !m_ZFill) return;
1978 else if (pt == e1.Bot) pt.Z = e1.Bot.Z;
1979 else if (pt == e1.Top) pt.Z = e1.Top.Z;
1980 else if (pt == e2.Bot) pt.Z = e2.Bot.Z;
1981 else if (pt == e2.Top) pt.Z = e2.Top.Z;
1982 else (*m_ZFill)(e1.Bot, e1.Top, e2.Bot, e2.Top, pt);
1983 }
1984 //------------------------------------------------------------------------------
1985 #endif
1986
1987 void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &Pt)
1988 {
1989 bool e1Contributing = ( e1->OutIdx >= 0 );
1990 bool e2Contributing = ( e2->OutIdx >= 0 );
1991
1992 #ifdef use_xyz
1993 SetZ(Pt, *e1, *e2);
1994 #endif
1995
1996 #ifdef use_lines
1997 //if either edge is on an OPEN path ...
1998 if (e1->WindDelta == 0 || e2->WindDelta == 0)
1999 {
2000 //ignore subject-subject open path intersections UNLESS they
2001 //are both open paths, AND they are both 'contributing maximas' ...
2002 if (e1->WindDelta == 0 && e2->WindDelta == 0) return;
2003
2004 //if intersecting a subj line with a subj poly ...
2005 else if (e1->PolyTyp == e2->PolyTyp &&
2006 e1->WindDelta != e2->WindDelta && m_ClipType == ctUnion)
2007 {
2008 if (e1->WindDelta == 0)
2009 {
2010 if (e2Contributing)
2011 {
2012 AddOutPt(e1, Pt);
2013 if (e1Contributing) e1->OutIdx = Unassigned;
2014 }
2015 }
2016 else
2017 {
2018 if (e1Contributing)
2019 {
2020 AddOutPt(e2, Pt);
2021 if (e2Contributing) e2->OutIdx = Unassigned;
2022 }
2023 }
2024 }
2025 else if (e1->PolyTyp != e2->PolyTyp)
2026 {
2027 //toggle subj open path OutIdx on/off when Abs(clip.WndCnt) == 1 ...
2028 if ((e1->WindDelta == 0) && abs(e2->WindCnt) == 1 &&
2029 (m_ClipType != ctUnion || e2->WindCnt2 == 0))
2030 {
2031 AddOutPt(e1, Pt);
2032 if (e1Contributing) e1->OutIdx = Unassigned;
2033 }
2034 else if ((e2->WindDelta == 0) && (abs(e1->WindCnt) == 1) &&
2035 (m_ClipType != ctUnion || e1->WindCnt2 == 0))
2036 {
2037 AddOutPt(e2, Pt);
2038 if (e2Contributing) e2->OutIdx = Unassigned;
2039 }
2040 }
2041 return;
2042 }
2043 #endif
2044
2045 //update winding counts...
2046 //assumes that e1 will be to the Right of e2 ABOVE the intersection
2047 if ( e1->PolyTyp == e2->PolyTyp )
2048 {
2049 if ( IsEvenOddFillType( *e1) )
2050 {
2051 int oldE1WindCnt = e1->WindCnt;
2052 e1->WindCnt = e2->WindCnt;
2053 e2->WindCnt = oldE1WindCnt;
2054 } else
2055 {
2056 if (e1->WindCnt + e2->WindDelta == 0 ) e1->WindCnt = -e1->WindCnt;
2057 else e1->WindCnt += e2->WindDelta;
2058 if ( e2->WindCnt - e1->WindDelta == 0 ) e2->WindCnt = -e2->WindCnt;
2059 else e2->WindCnt -= e1->WindDelta;
2060 }
2061 } else
2062 {
2063 if (!IsEvenOddFillType(*e2)) e1->WindCnt2 += e2->WindDelta;
2064 else e1->WindCnt2 = ( e1->WindCnt2 == 0 ) ? 1 : 0;
2065 if (!IsEvenOddFillType(*e1)) e2->WindCnt2 -= e1->WindDelta;
2066 else e2->WindCnt2 = ( e2->WindCnt2 == 0 ) ? 1 : 0;
2067 }
2068
2069 PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2;
2070 if (e1->PolyTyp == ptSubject)
2071 {
2072 e1FillType = m_SubjFillType;
2073 e1FillType2 = m_ClipFillType;
2074 } else
2075 {
2076 e1FillType = m_ClipFillType;
2077 e1FillType2 = m_SubjFillType;
2078 }
2079 if (e2->PolyTyp == ptSubject)
2080 {
2081 e2FillType = m_SubjFillType;
2082 e2FillType2 = m_ClipFillType;
2083 } else
2084 {
2085 e2FillType = m_ClipFillType;
2086 e2FillType2 = m_SubjFillType;
2087 }
2088
2089 cInt e1Wc, e2Wc;
2090 switch (e1FillType)
2091 {
2092 case pftPositive: e1Wc = e1->WindCnt; break;
2093 case pftNegative: e1Wc = -e1->WindCnt; break;
2094 default: e1Wc = Abs(e1->WindCnt);
2095 }
2096 switch(e2FillType)
2097 {
2098 case pftPositive: e2Wc = e2->WindCnt; break;
2099 case pftNegative: e2Wc = -e2->WindCnt; break;
2100 default: e2Wc = Abs(e2->WindCnt);
2101 }
2102
2103 if ( e1Contributing && e2Contributing )
2104 {
2105 if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) ||
2106 (e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor) )
2107 {
2108 AddLocalMaxPoly(e1, e2, Pt);
2109 }
2110 else
2111 {
2112 AddOutPt(e1, Pt);
2113 AddOutPt(e2, Pt);
2114 SwapSides( *e1 , *e2 );
2115 SwapPolyIndexes( *e1 , *e2 );
2116 }
2117 }
2118 else if ( e1Contributing )
2119 {
2120 if (e2Wc == 0 || e2Wc == 1)
2121 {
2122 AddOutPt(e1, Pt);
2123 SwapSides(*e1, *e2);
2124 SwapPolyIndexes(*e1, *e2);
2125 }
2126 }
2127 else if ( e2Contributing )
2128 {
2129 if (e1Wc == 0 || e1Wc == 1)
2130 {
2131 AddOutPt(e2, Pt);
2132 SwapSides(*e1, *e2);
2133 SwapPolyIndexes(*e1, *e2);
2134 }
2135 }
2136 else if ( (e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1))
2137 {
2138 //neither edge is currently contributing ...
2139
2140 cInt e1Wc2, e2Wc2;
2141 switch (e1FillType2)
2142 {
2143 case pftPositive: e1Wc2 = e1->WindCnt2; break;
2144 case pftNegative : e1Wc2 = -e1->WindCnt2; break;
2145 default: e1Wc2 = Abs(e1->WindCnt2);
2146 }
2147 switch (e2FillType2)
2148 {
2149 case pftPositive: e2Wc2 = e2->WindCnt2; break;
2150 case pftNegative: e2Wc2 = -e2->WindCnt2; break;
2151 default: e2Wc2 = Abs(e2->WindCnt2);
2152 }
2153
2154 if (e1->PolyTyp != e2->PolyTyp)
2155 {
2156 AddLocalMinPoly(e1, e2, Pt);
2157 }
2158 else if (e1Wc == 1 && e2Wc == 1)
2159 switch( m_ClipType ) {
2160 case ctIntersection:
2161 if (e1Wc2 > 0 && e2Wc2 > 0)
2162 AddLocalMinPoly(e1, e2, Pt);
2163 break;
2164 case ctUnion:
2165 if ( e1Wc2 <= 0 && e2Wc2 <= 0 )
2166 AddLocalMinPoly(e1, e2, Pt);
2167 break;
2168 case ctDifference:
2169 if (((e1->PolyTyp == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) ||
2170 ((e1->PolyTyp == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0)))
2171 AddLocalMinPoly(e1, e2, Pt);
2172 break;
2173 case ctXor:
2174 AddLocalMinPoly(e1, e2, Pt);
2175 }
2176 else
2177 SwapSides( *e1, *e2 );
2178 }
2179 }
2180 //------------------------------------------------------------------------------
2181
2182 void Clipper::SetHoleState(TEdge *e, OutRec *outrec) const
2183 {
2184 bool IsHole = false;
2185 TEdge *e2 = e->PrevInAEL;
2186 while (e2)
2187 {
2188 if (e2->OutIdx >= 0 && e2->WindDelta != 0)
2189 {
2190 IsHole = !IsHole;
2191 if (! outrec->FirstLeft)
2192 outrec->FirstLeft = m_PolyOuts[e2->OutIdx];
2193 }
2194 e2 = e2->PrevInAEL;
2195 }
2196 if (IsHole) outrec->IsHole = true;
2197 }
2198 //------------------------------------------------------------------------------
2199
2200 OutRec* GetLowermostRec(OutRec *outRec1, OutRec *outRec2)
2201 {
2202 //work out which polygon fragment has the correct hole state ...
2203 if (!outRec1->BottomPt)
2204 outRec1->BottomPt = GetBottomPt(outRec1->Pts);
2205 if (!outRec2->BottomPt)
2206 outRec2->BottomPt = GetBottomPt(outRec2->Pts);
2207 OutPt *OutPt1 = outRec1->BottomPt;
2208 OutPt *OutPt2 = outRec2->BottomPt;
2209 if (OutPt1->Pt.Y > OutPt2->Pt.Y) return outRec1;
2210 else if (OutPt1->Pt.Y < OutPt2->Pt.Y) return outRec2;
2211 else if (OutPt1->Pt.X < OutPt2->Pt.X) return outRec1;
2212 else if (OutPt1->Pt.X > OutPt2->Pt.X) return outRec2;
2213 else if (OutPt1->Next == OutPt1) return outRec2;
2214 else if (OutPt2->Next == OutPt2) return outRec1;
2215 else if (FirstIsBottomPt(OutPt1, OutPt2)) return outRec1;
2216 else return outRec2;
2217 }
2218 //------------------------------------------------------------------------------
2219
2220 bool Param1RightOfParam2(OutRec* outRec1, OutRec* outRec2)
2221 {
2222 do
2223 {
2224 outRec1 = outRec1->FirstLeft;
2225 if (outRec1 == outRec2) return true;
2226 } while (outRec1);
2227 return false;
2228 }
2229 //------------------------------------------------------------------------------
2230
2231 OutRec* Clipper::GetOutRec(int Idx)
2232 {
2233 OutRec* outrec = m_PolyOuts[Idx];
2234 while (outrec != m_PolyOuts[outrec->Idx])
2235 outrec = m_PolyOuts[outrec->Idx];
2236 return outrec;
2237 }
2238 //------------------------------------------------------------------------------
2239
2240 void Clipper::AppendPolygon(TEdge *e1, TEdge *e2) const
2241 {
2242 //get the start and ends of both output polygons ...
2243 OutRec *outRec1 = m_PolyOuts[e1->OutIdx];
2244 OutRec *outRec2 = m_PolyOuts[e2->OutIdx];
2245
2246 OutRec *holeStateRec;
2247 if (Param1RightOfParam2(outRec1, outRec2))
2248 holeStateRec = outRec2;
2249 else if (Param1RightOfParam2(outRec2, outRec1))
2250 holeStateRec = outRec1;
2251 else
2252 holeStateRec = GetLowermostRec(outRec1, outRec2);
2253
2254 //get the start and ends of both output polygons and
2255 //join e2 poly onto e1 poly and delete pointers to e2 ...
2256
2257 OutPt* p1_lft = outRec1->Pts;
2258 OutPt* p1_rt = p1_lft->Prev;
2259 OutPt* p2_lft = outRec2->Pts;
2260 OutPt* p2_rt = p2_lft->Prev;
2261
2262 EdgeSide Side;
2263 //join e2 poly onto e1 poly and delete pointers to e2 ...
2264 if( e1->Side == esLeft )
2265 {
2266 if( e2->Side == esLeft )
2267 {
2268 //z y x a b c
2269 ReversePolyPtLinks(p2_lft);
2270 p2_lft->Next = p1_lft;
2271 p1_lft->Prev = p2_lft;
2272 p1_rt->Next = p2_rt;
2273 p2_rt->Prev = p1_rt;
2274 outRec1->Pts = p2_rt;
2275 } else
2276 {
2277 //x y z a b c
2278 p2_rt->Next = p1_lft;
2279 p1_lft->Prev = p2_rt;
2280 p2_lft->Prev = p1_rt;
2281 p1_rt->Next = p2_lft;
2282 outRec1->Pts = p2_lft;
2283 }
2284 Side = esLeft;
2285 } else
2286 {
2287 if( e2->Side == esRight )
2288 {
2289 //a b c z y x
2290 ReversePolyPtLinks(p2_lft);
2291 p1_rt->Next = p2_rt;
2292 p2_rt->Prev = p1_rt;
2293 p2_lft->Next = p1_lft;
2294 p1_lft->Prev = p2_lft;
2295 } else
2296 {
2297 //a b c x y z
2298 p1_rt->Next = p2_lft;
2299 p2_lft->Prev = p1_rt;
2300 p1_lft->Prev = p2_rt;
2301 p2_rt->Next = p1_lft;
2302 }
2303 Side = esRight;
2304 }
2305
2306 outRec1->BottomPt = 0;
2307 if (holeStateRec == outRec2)
2308 {
2309 if (outRec2->FirstLeft != outRec1)
2310 outRec1->FirstLeft = outRec2->FirstLeft;
2311 outRec1->IsHole = outRec2->IsHole;
2312 }
2313 outRec2->Pts = 0;
2314 outRec2->BottomPt = 0;
2315 outRec2->FirstLeft = outRec1;
2316
2317 int OKIdx = e1->OutIdx;
2318 int ObsoleteIdx = e2->OutIdx;
2319
2320 e1->OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly
2321 e2->OutIdx = Unassigned;
2322
2323 TEdge* e = m_ActiveEdges;
2324 while( e )
2325 {
2326 if( e->OutIdx == ObsoleteIdx )
2327 {
2328 e->OutIdx = OKIdx;
2329 e->Side = Side;
2330 break;
2331 }
2332 e = e->NextInAEL;
2333 }
2334
2335 outRec2->Idx = outRec1->Idx;
2336 }
2337 //------------------------------------------------------------------------------
2338
2339 OutRec* Clipper::CreateOutRec()
2340 {
2341 OutRec* result = new OutRec;
2342 result->IsHole = false;
2343 result->IsOpen = false;
2344 result->FirstLeft = 0;
2345 result->Pts = 0;
2346 result->BottomPt = 0;
2347 result->PolyNd = 0;
2348 m_PolyOuts.push_back(result);
2349 result->Idx = (int)m_PolyOuts.size()-1;
2350 return result;
2351 }
2352 //------------------------------------------------------------------------------
2353
2354 OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt)
2355 {
2356 if( e->OutIdx < 0 )
2357 {
2358 OutRec *outRec = CreateOutRec();
2359 outRec->IsOpen = (e->WindDelta == 0);
2360 OutPt* newOp = new OutPt;
2361 outRec->Pts = newOp;
2362 newOp->Idx = outRec->Idx;
2363 newOp->Pt = pt;
2364 newOp->Next = newOp;
2365 newOp->Prev = newOp;
2366 if (!outRec->IsOpen)
2367 SetHoleState(e, outRec);
2368 e->OutIdx = outRec->Idx;
2369 return newOp;
2370 } else
2371 {
2372 OutRec *outRec = m_PolyOuts[e->OutIdx];
2373 //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most'
2374 OutPt* op = outRec->Pts;
2375
2376 bool ToFront = (e->Side == esLeft);
2377 if (ToFront && (pt == op->Pt)) return op;
2378 else if (!ToFront && (pt == op->Prev->Pt)) return op->Prev;
2379
2380 OutPt* newOp = new OutPt;
2381 newOp->Idx = outRec->Idx;
2382 newOp->Pt = pt;
2383 newOp->Next = op;
2384 newOp->Prev = op->Prev;
2385 newOp->Prev->Next = newOp;
2386 op->Prev = newOp;
2387 if (ToFront) outRec->Pts = newOp;
2388 return newOp;
2389 }
2390 }
2391 //------------------------------------------------------------------------------
2392
2393 OutPt* Clipper::GetLastOutPt(TEdge *e)
2394 {
2395 OutRec *outRec = m_PolyOuts[e->OutIdx];
2396 if (e->Side == esLeft)
2397 return outRec->Pts;
2398 else
2399 return outRec->Pts->Prev;
2400 }
2401 //------------------------------------------------------------------------------
2402
2403 void Clipper::ProcessHorizontals()
2404 {
2405 TEdge* horzEdge = m_SortedEdges;
2406 while(horzEdge)
2407 {
2408 DeleteFromSEL(horzEdge);
2409 ProcessHorizontal(horzEdge);
2410 horzEdge = m_SortedEdges;
2411 }
2412 }
2413 //------------------------------------------------------------------------------
2414
2415 inline bool IsMinima(TEdge *e)
2416 {
2417 return e && (e->Prev->NextInLML != e) && (e->Next->NextInLML != e);
2418 }
2419 //------------------------------------------------------------------------------
2420
2421 inline bool IsMaxima(TEdge *e, const cInt Y)
2422 {
2423 return e && e->Top.Y == Y && !e->NextInLML;
2424 }
2425 //------------------------------------------------------------------------------
2426
2427 inline bool IsIntermediate(TEdge *e, const cInt Y)
2428 {
2429 return e->Top.Y == Y && e->NextInLML;
2430 }
2431 //------------------------------------------------------------------------------
2432
2433 TEdge *GetMaximaPair(TEdge *e)
2434 {
2435 TEdge* result = 0;
2436 if ((e->Next->Top == e->Top) && !e->Next->NextInLML)
2437 result = e->Next;
2438 else if ((e->Prev->Top == e->Top) && !e->Prev->NextInLML)
2439 result = e->Prev;
2440
2441 if (result && (result->OutIdx == Skip ||
2442 //result is false if both NextInAEL & PrevInAEL are nil & not horizontal ...
2443 (result->NextInAEL == result->PrevInAEL && !IsHorizontal(*result))))
2444 return 0;
2445 return result;
2446 }
2447 //------------------------------------------------------------------------------
2448
2449 void Clipper::SwapPositionsInAEL(TEdge *Edge1, TEdge *Edge2)
2450 {
2451 //check that one or other edge hasn't already been removed from AEL ...
2452 if (Edge1->NextInAEL == Edge1->PrevInAEL ||
2453 Edge2->NextInAEL == Edge2->PrevInAEL) return;
2454
2455 if( Edge1->NextInAEL == Edge2 )
2456 {
2457 TEdge* Next = Edge2->NextInAEL;
2458 if( Next ) Next->PrevInAEL = Edge1;
2459 TEdge* Prev = Edge1->PrevInAEL;
2460 if( Prev ) Prev->NextInAEL = Edge2;
2461 Edge2->PrevInAEL = Prev;
2462 Edge2->NextInAEL = Edge1;
2463 Edge1->PrevInAEL = Edge2;
2464 Edge1->NextInAEL = Next;
2465 }
2466 else if( Edge2->NextInAEL == Edge1 )
2467 {
2468 TEdge* Next = Edge1->NextInAEL;
2469 if( Next ) Next->PrevInAEL = Edge2;
2470 TEdge* Prev = Edge2->PrevInAEL;
2471 if( Prev ) Prev->NextInAEL = Edge1;
2472 Edge1->PrevInAEL = Prev;
2473 Edge1->NextInAEL = Edge2;
2474 Edge2->PrevInAEL = Edge1;
2475 Edge2->NextInAEL = Next;
2476 }
2477 else
2478 {
2479 TEdge* Next = Edge1->NextInAEL;
2480 TEdge* Prev = Edge1->PrevInAEL;
2481 Edge1->NextInAEL = Edge2->NextInAEL;
2482 if( Edge1->NextInAEL ) Edge1->NextInAEL->PrevInAEL = Edge1;
2483 Edge1->PrevInAEL = Edge2->PrevInAEL;
2484 if( Edge1->PrevInAEL ) Edge1->PrevInAEL->NextInAEL = Edge1;
2485 Edge2->NextInAEL = Next;
2486 if( Edge2->NextInAEL ) Edge2->NextInAEL->PrevInAEL = Edge2;
2487 Edge2->PrevInAEL = Prev;
2488 if( Edge2->PrevInAEL ) Edge2->PrevInAEL->NextInAEL = Edge2;
2489 }
2490
2491 if( !Edge1->PrevInAEL ) m_ActiveEdges = Edge1;
2492 else if( !Edge2->PrevInAEL ) m_ActiveEdges = Edge2;
2493 }
2494 //------------------------------------------------------------------------------
2495
2496 void Clipper::SwapPositionsInSEL(TEdge *Edge1, TEdge *Edge2)
2497 {
2498 if( !( Edge1->NextInSEL ) && !( Edge1->PrevInSEL ) ) return;
2499 if( !( Edge2->NextInSEL ) && !( Edge2->PrevInSEL ) ) return;
2500
2501 if( Edge1->NextInSEL == Edge2 )
2502 {
2503 TEdge* Next = Edge2->NextInSEL;
2504 if( Next ) Next->PrevInSEL = Edge1;
2505 TEdge* Prev = Edge1->PrevInSEL;
2506 if( Prev ) Prev->NextInSEL = Edge2;
2507 Edge2->PrevInSEL = Prev;
2508 Edge2->NextInSEL = Edge1;
2509 Edge1->PrevInSEL = Edge2;
2510 Edge1->NextInSEL = Next;
2511 }
2512 else if( Edge2->NextInSEL == Edge1 )
2513 {
2514 TEdge* Next = Edge1->NextInSEL;
2515 if( Next ) Next->PrevInSEL = Edge2;
2516 TEdge* Prev = Edge2->PrevInSEL;
2517 if( Prev ) Prev->NextInSEL = Edge1;
2518 Edge1->PrevInSEL = Prev;
2519 Edge1->NextInSEL = Edge2;
2520 Edge2->PrevInSEL = Edge1;
2521 Edge2->NextInSEL = Next;
2522 }
2523 else
2524 {
2525 TEdge* Next = Edge1->NextInSEL;
2526 TEdge* Prev = Edge1->PrevInSEL;
2527 Edge1->NextInSEL = Edge2->NextInSEL;
2528 if( Edge1->NextInSEL ) Edge1->NextInSEL->PrevInSEL = Edge1;
2529 Edge1->PrevInSEL = Edge2->PrevInSEL;
2530 if( Edge1->PrevInSEL ) Edge1->PrevInSEL->NextInSEL = Edge1;
2531 Edge2->NextInSEL = Next;
2532 if( Edge2->NextInSEL ) Edge2->NextInSEL->PrevInSEL = Edge2;
2533 Edge2->PrevInSEL = Prev;
2534 if( Edge2->PrevInSEL ) Edge2->PrevInSEL->NextInSEL = Edge2;
2535 }
2536
2537 if( !Edge1->PrevInSEL ) m_SortedEdges = Edge1;
2538 else if( !Edge2->PrevInSEL ) m_SortedEdges = Edge2;
2539 }
2540 //------------------------------------------------------------------------------
2541
2542 TEdge* GetNextInAEL(TEdge *e, Direction dir)
2543 {
2544 return dir == dLeftToRight ? e->NextInAEL : e->PrevInAEL;
2545 }
2546 //------------------------------------------------------------------------------
2547
2548 void GetHorzDirection(TEdge& HorzEdge, Direction& Dir, cInt& Left, cInt& Right)
2549 {
2550 if (HorzEdge.Bot.X < HorzEdge.Top.X)
2551 {
2552 Left = HorzEdge.Bot.X;
2553 Right = HorzEdge.Top.X;
2554 Dir = dLeftToRight;
2555 } else
2556 {
2557 Left = HorzEdge.Top.X;
2558 Right = HorzEdge.Bot.X;
2559 Dir = dRightToLeft;
2560 }
2561 }
2562 //------------------------------------------------------------------------
2563
2564 /*******************************************************************************
2565 * Notes: Horizontal edges (HEs) at scanline intersections (ie at the Top or *
2566 * Bottom of a scanbeam) are processed as if layered. The order in which HEs *
2567 * are processed doesn't matter. HEs intersect with other HE Bot.Xs only [#] *
2568 * (or they could intersect with Top.Xs only, ie EITHER Bot.Xs OR Top.Xs), *
2569 * and with other non-horizontal edges [*]. Once these intersections are *
2570 * processed, intermediate HEs then 'promote' the Edge above (NextInLML) into *
2571 * the AEL. These 'promoted' edges may in turn intersect [%] with other HEs. *
2572 *******************************************************************************/
2573
2574 void Clipper::ProcessHorizontal(TEdge *horzEdge)
2575 {
2576 Direction dir;
2577 cInt horzLeft, horzRight;
2578 bool IsOpen = (horzEdge->OutIdx >= 0 && m_PolyOuts[horzEdge->OutIdx]->IsOpen);
2579
2580 GetHorzDirection(*horzEdge, dir, horzLeft, horzRight);
2581
2582 TEdge* eLastHorz = horzEdge, *eMaxPair = 0;
2583 while (eLastHorz->NextInLML && IsHorizontal(*eLastHorz->NextInLML))
2584 eLastHorz = eLastHorz->NextInLML;
2585 if (!eLastHorz->NextInLML)
2586 eMaxPair = GetMaximaPair(eLastHorz);
2587
2588 MaximaList::const_iterator maxIt;
2589 MaximaList::const_reverse_iterator maxRit;
2590 if (!m_Maxima.empty())
2591 {
2592 //get the first maxima in range (X) ...
2593 if (dir == dLeftToRight)
2594 {
2595 maxIt = m_Maxima.begin();
2596 while (maxIt != m_Maxima.end() && *maxIt <= horzEdge->Bot.X) ++maxIt;
2597 if (maxIt != m_Maxima.end() && *maxIt >= eLastHorz->Top.X)
2598 maxIt = m_Maxima.end();
2599 }
2600 else
2601 {
2602 maxRit = m_Maxima.rbegin();
2603 while (maxRit != m_Maxima.rend() && *maxRit > horzEdge->Bot.X) ++maxRit;
2604 if (maxRit != m_Maxima.rend() && *maxRit <= eLastHorz->Top.X)
2605 maxRit = m_Maxima.rend();
2606 }
2607 }
2608
2609 OutPt* op1 = 0;
2610
2611 for (;;) //loop through consec. horizontal edges
2612 {
2613
2614 bool IsLastHorz = (horzEdge == eLastHorz);
2615 TEdge* e = GetNextInAEL(horzEdge, dir);
2616 while(e)
2617 {
2618
2619 //this code block inserts extra coords into horizontal edges (in output
2620 //polygons) whereever maxima touch these horizontal edges. This helps
2621 //'simplifying' polygons (ie if the Simplify property is set).
2622 if (!m_Maxima.empty())
2623 {
2624 if (dir == dLeftToRight)
2625 {
2626 while (maxIt != m_Maxima.end() && *maxIt < e->Curr.X)
2627 {
2628 if (horzEdge->OutIdx >= 0 && !IsOpen)
2629 AddOutPt(horzEdge, IntPoint(*maxIt, horzEdge->Bot.Y));
2630 ++maxIt;
2631 }
2632 }
2633 else
2634 {
2635 while (maxRit != m_Maxima.rend() && *maxRit > e->Curr.X)
2636 {
2637 if (horzEdge->OutIdx >= 0 && !IsOpen)
2638 AddOutPt(horzEdge, IntPoint(*maxRit, horzEdge->Bot.Y));
2639 ++maxRit;
2640 }
2641 }
2642 };
2643
2644 if ((dir == dLeftToRight && e->Curr.X > horzRight) ||
2645 (dir == dRightToLeft && e->Curr.X < horzLeft)) break;
2646
2647 //Also break if we've got to the end of an intermediate horizontal edge ...
2648 //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal.
2649 if (e->Curr.X == horzEdge->Top.X && horzEdge->NextInLML &&
2650 e->Dx < horzEdge->NextInLML->Dx) break;
2651
2652 if (horzEdge->OutIdx >= 0 && !IsOpen) //note: may be done multiple times
2653 {
2654 op1 = AddOutPt(horzEdge, e->Curr);
2655 TEdge* eNextHorz = m_SortedEdges;
2656 while (eNextHorz)
2657 {
2658 if (eNextHorz->OutIdx >= 0 &&
2659 HorzSegmentsOverlap(horzEdge->Bot.X,
2660 horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X))
2661 {
2662 OutPt* op2 = GetLastOutPt(eNextHorz);
2663 AddJoin(op2, op1, eNextHorz->Top);
2664 }
2665 eNextHorz = eNextHorz->NextInSEL;
2666 }
2667 AddGhostJoin(op1, horzEdge->Bot);
2668 }
2669
2670 //OK, so far we're still in range of the horizontal Edge but make sure
2671 //we're at the last of consec. horizontals when matching with eMaxPair
2672 if(e == eMaxPair && IsLastHorz)
2673 {
2674 if (horzEdge->OutIdx >= 0)
2675 AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge->Top);
2676 DeleteFromAEL(horzEdge);
2677 DeleteFromAEL(eMaxPair);
2678 return;
2679 }
2680
2681 if(dir == dLeftToRight)
2682 {
2683 IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y);
2684 IntersectEdges(horzEdge, e, Pt);
2685 }
2686 else
2687 {
2688 IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y);
2689 IntersectEdges( e, horzEdge, Pt);
2690 }
2691 TEdge* eNext = GetNextInAEL(e, dir);
2692 SwapPositionsInAEL( horzEdge, e );
2693 e = eNext;
2694 } //end while(e)
2695
2696 //Break out of loop if HorzEdge.NextInLML is not also horizontal ...
2697 if (!horzEdge->NextInLML || !IsHorizontal(*horzEdge->NextInLML)) break;
2698
2699 UpdateEdgeIntoAEL(horzEdge);
2700 if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Bot);
2701 GetHorzDirection(*horzEdge, dir, horzLeft, horzRight);
2702
2703 } //end for (;;)
2704
2705 if (horzEdge->OutIdx >= 0 && !op1)
2706 {
2707 op1 = GetLastOutPt(horzEdge);
2708 TEdge* eNextHorz = m_SortedEdges;
2709 while (eNextHorz)
2710 {
2711 if (eNextHorz->OutIdx >= 0 &&
2712 HorzSegmentsOverlap(horzEdge->Bot.X,
2713 horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X))
2714 {
2715 OutPt* op2 = GetLastOutPt(eNextHorz);
2716 AddJoin(op2, op1, eNextHorz->Top);
2717 }
2718 eNextHorz = eNextHorz->NextInSEL;
2719 }
2720 AddGhostJoin(op1, horzEdge->Top);
2721 }
2722
2723 if (horzEdge->NextInLML)
2724 {
2725 if(horzEdge->OutIdx >= 0)
2726 {
2727 op1 = AddOutPt( horzEdge, horzEdge->Top);
2728 UpdateEdgeIntoAEL(horzEdge);
2729 if (horzEdge->WindDelta == 0) return;
2730 //nb: HorzEdge is no longer horizontal here
2731 TEdge* ePrev = horzEdge->PrevInAEL;
2732 TEdge* eNext = horzEdge->NextInAEL;
2733 if (ePrev && ePrev->Curr.X == horzEdge->Bot.X &&
2734 ePrev->Curr.Y == horzEdge->Bot.Y && ePrev->WindDelta != 0 &&
2735 (ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y &&
2736 SlopesEqual(*horzEdge, *ePrev, m_UseFullRange)))
2737 {
2738 OutPt* op2 = AddOutPt(ePrev, horzEdge->Bot);
2739 AddJoin(op1, op2, horzEdge->Top);
2740 }
2741 else if (eNext && eNext->Curr.X == horzEdge->Bot.X &&
2742 eNext->Curr.Y == horzEdge->Bot.Y && eNext->WindDelta != 0 &&
2743 eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y &&
2744 SlopesEqual(*horzEdge, *eNext, m_UseFullRange))
2745 {
2746 OutPt* op2 = AddOutPt(eNext, horzEdge->Bot);
2747 AddJoin(op1, op2, horzEdge->Top);
2748 }
2749 }
2750 else
2751 UpdateEdgeIntoAEL(horzEdge);
2752 }
2753 else
2754 {
2755 if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Top);
2756 DeleteFromAEL(horzEdge);
2757 }
2758 }
2759 //------------------------------------------------------------------------------
2760
2761 void Clipper::UpdateEdgeIntoAEL(TEdge *&e)
2762 {
2763 if( !e->NextInLML ) throw
2764 clipperException("UpdateEdgeIntoAEL: invalid call");
2765
2766 e->NextInLML->OutIdx = e->OutIdx;
2767 TEdge* AelPrev = e->PrevInAEL;
2768 TEdge* AelNext = e->NextInAEL;
2769 if (AelPrev) AelPrev->NextInAEL = e->NextInLML;
2770 else m_ActiveEdges = e->NextInLML;
2771 if (AelNext) AelNext->PrevInAEL = e->NextInLML;
2772 e->NextInLML->Side = e->Side;
2773 e->NextInLML->WindDelta = e->WindDelta;
2774 e->NextInLML->WindCnt = e->WindCnt;
2775 e->NextInLML->WindCnt2 = e->WindCnt2;
2776 e = e->NextInLML;
2777 e->Curr = e->Bot;
2778 e->PrevInAEL = AelPrev;
2779 e->NextInAEL = AelNext;
2780 if (!IsHorizontal(*e)) InsertScanbeam(e->Top.Y);
2781 }
2782 //------------------------------------------------------------------------------
2783
2784 bool Clipper::ProcessIntersections(const cInt topY)
2785 {
2786 if( !m_ActiveEdges ) return true;
2787 try {
2788 BuildIntersectList(topY);
2789 size_t IlSize = m_IntersectList.size();
2790 if (IlSize == 0) return true;
2791 if (IlSize == 1 || FixupIntersectionOrder()) ProcessIntersectList();
2792 else return false;
2793 }
2794 catch(...)
2795 {
2796 m_SortedEdges = 0;
2797 DisposeIntersectNodes();
2798 throw clipperException("ProcessIntersections error");
2799 }
2800 m_SortedEdges = 0;
2801 return true;
2802 }
2803 //------------------------------------------------------------------------------
2804
2805 void Clipper::DisposeIntersectNodes()
2806 {
2807 for (size_t i = 0; i < m_IntersectList.size(); ++i )
2808 delete m_IntersectList[i];
2809 m_IntersectList.clear();
2810 }
2811 //------------------------------------------------------------------------------
2812
2813 void Clipper::BuildIntersectList(const cInt topY)
2814 {
2815 if ( !m_ActiveEdges ) return;
2816
2817 //prepare for sorting ...
2818 TEdge* e = m_ActiveEdges;
2819 m_SortedEdges = e;
2820 while( e )
2821 {
2822 e->PrevInSEL = e->PrevInAEL;
2823 e->NextInSEL = e->NextInAEL;
2824 e->Curr.X = TopX( *e, topY );
2825 e = e->NextInAEL;
2826 }
2827
2828 //bubblesort ...
2829 bool isModified;
2830 do
2831 {
2832 isModified = false;
2833 e = m_SortedEdges;
2834 while( e->NextInSEL )
2835 {
2836 TEdge *eNext = e->NextInSEL;
2837 IntPoint Pt;
2838 if(e->Curr.X > eNext->Curr.X)
2839 {
2840 IntersectPoint(*e, *eNext, Pt);
2841 IntersectNode * newNode = new IntersectNode;
2842 newNode->Edge1 = e;
2843 newNode->Edge2 = eNext;
2844 newNode->Pt = Pt;
2845 m_IntersectList.push_back(newNode);
2846
2847 SwapPositionsInSEL(e, eNext);
2848 isModified = true;
2849 }
2850 else
2851 e = eNext;
2852 }
2853 if( e->PrevInSEL ) e->PrevInSEL->NextInSEL = 0;
2854 else break;
2855 }
2856 while ( isModified );
2857 m_SortedEdges = 0; //important
2858 }
2859 //------------------------------------------------------------------------------
2860
2861
2862 void Clipper::ProcessIntersectList()
2863 {
2864 for (size_t i = 0; i < m_IntersectList.size(); ++i)
2865 {
2866 IntersectNode* iNode = m_IntersectList[i];
2867 {
2868 IntersectEdges( iNode->Edge1, iNode->Edge2, iNode->Pt);
2869 SwapPositionsInAEL( iNode->Edge1 , iNode->Edge2 );
2870 }
2871 delete iNode;
2872 }
2873 m_IntersectList.clear();
2874 }
2875 //------------------------------------------------------------------------------
2876
2877 bool IntersectListSort(IntersectNode* node1, IntersectNode* node2)
2878 {
2879 return node2->Pt.Y < node1->Pt.Y;
2880 }
2881 //------------------------------------------------------------------------------
2882
2883 inline bool EdgesAdjacent(const IntersectNode &inode)
2884 {
2885 return (inode.Edge1->NextInSEL == inode.Edge2) ||
2886 (inode.Edge1->PrevInSEL == inode.Edge2);
2887 }
2888 //------------------------------------------------------------------------------
2889
2890 bool Clipper::FixupIntersectionOrder()
2891 {
2892 //pre-condition: intersections are sorted Bottom-most first.
2893 //Now it's crucial that intersections are made only between adjacent edges,
2894 //so to ensure this the order of intersections may need adjusting ...
2895 CopyAELToSEL();
2896 std::sort(m_IntersectList.begin(), m_IntersectList.end(), IntersectListSort);
2897 size_t cnt = m_IntersectList.size();
2898 for (size_t i = 0; i < cnt; ++i)
2899 {
2900 if (!EdgesAdjacent(*m_IntersectList[i]))
2901 {
2902 size_t j = i + 1;
2903 while (j < cnt && !EdgesAdjacent(*m_IntersectList[j])) j++;
2904 if (j == cnt) return false;
2905 std::swap(m_IntersectList[i], m_IntersectList[j]);
2906 }
2907 SwapPositionsInSEL(m_IntersectList[i]->Edge1, m_IntersectList[i]->Edge2);
2908 }
2909 return true;
2910 }
2911 //------------------------------------------------------------------------------
2912
2913 void Clipper::DoMaxima(TEdge *e)
2914 {
2915 TEdge* eMaxPair = GetMaximaPair(e);
2916 if (!eMaxPair)
2917 {
2918 if (e->OutIdx >= 0)
2919 AddOutPt(e, e->Top);
2920 DeleteFromAEL(e);
2921 return;
2922 }
2923
2924 TEdge* eNext = e->NextInAEL;
2925 while(eNext && eNext != eMaxPair)
2926 {
2927 IntersectEdges(e, eNext, e->Top);
2928 SwapPositionsInAEL(e, eNext);
2929 eNext = e->NextInAEL;
2930 }
2931
2932 if(e->OutIdx == Unassigned && eMaxPair->OutIdx == Unassigned)
2933 {
2934 DeleteFromAEL(e);
2935 DeleteFromAEL(eMaxPair);
2936 }
2937 else if( e->OutIdx >= 0 && eMaxPair->OutIdx >= 0 )
2938 {
2939 if (e->OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e->Top);
2940 DeleteFromAEL(e);
2941 DeleteFromAEL(eMaxPair);
2942 }
2943 #ifdef use_lines
2944 else if (e->WindDelta == 0)
2945 {
2946 if (e->OutIdx >= 0)
2947 {
2948 AddOutPt(e, e->Top);
2949 e->OutIdx = Unassigned;
2950 }
2951 DeleteFromAEL(e);
2952
2953 if (eMaxPair->OutIdx >= 0)
2954 {
2955 AddOutPt(eMaxPair, e->Top);
2956 eMaxPair->OutIdx = Unassigned;
2957 }
2958 DeleteFromAEL(eMaxPair);
2959 }
2960 #endif
2961 else throw clipperException("DoMaxima error");
2962 }
2963 //------------------------------------------------------------------------------
2964
2965 void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY)
2966 {
2967 TEdge* e = m_ActiveEdges;
2968 while( e )
2969 {
2970 //1. process maxima, treating them as if they're 'bent' horizontal edges,
2971 // but exclude maxima with horizontal edges. nb: e can't be a horizontal.
2972 bool IsMaximaEdge = IsMaxima(e, topY);
2973
2974 if(IsMaximaEdge)
2975 {
2976 TEdge* eMaxPair = GetMaximaPair(e);
2977 IsMaximaEdge = (!eMaxPair || !IsHorizontal(*eMaxPair));
2978 }
2979
2980 if(IsMaximaEdge)
2981 {
2982 if (m_StrictSimple) m_Maxima.push_back(e->Top.X);
2983 TEdge* ePrev = e->PrevInAEL;
2984 DoMaxima(e);
2985 if( !ePrev ) e = m_ActiveEdges;
2986 else e = ePrev->NextInAEL;
2987 }
2988 else
2989 {
2990 //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ...
2991 if (IsIntermediate(e, topY) && IsHorizontal(*e->NextInLML))
2992 {
2993 UpdateEdgeIntoAEL(e);
2994 if (e->OutIdx >= 0)
2995 AddOutPt(e, e->Bot);
2996 AddEdgeToSEL(e);
2997 }
2998 else
2999 {
3000 e->Curr.X = TopX( *e, topY );
3001 e->Curr.Y = topY;
3002 }
3003
3004 //When StrictlySimple and 'e' is being touched by another edge, then
3005 //make sure both edges have a vertex here ...
3006 if (m_StrictSimple)
3007 {
3008 TEdge* ePrev = e->PrevInAEL;
3009 if ((e->OutIdx >= 0) && (e->WindDelta != 0) && ePrev && (ePrev->OutIdx >= 0) &&
3010 (ePrev->Curr.X == e->Curr.X) && (ePrev->WindDelta != 0))
3011 {
3012 IntPoint pt = e->Curr;
3013 #ifdef use_xyz
3014 SetZ(pt, *ePrev, *e);
3015 #endif
3016 OutPt* op = AddOutPt(ePrev, pt);
3017 OutPt* op2 = AddOutPt(e, pt);
3018 AddJoin(op, op2, pt); //StrictlySimple (type-3) join
3019 }
3020 }
3021
3022 e = e->NextInAEL;
3023 }
3024 }
3025
3026 //3. Process horizontals at the Top of the scanbeam ...
3027 m_Maxima.sort();
3028 ProcessHorizontals();
3029 m_Maxima.clear();
3030
3031 //4. Promote intermediate vertices ...
3032 e = m_ActiveEdges;
3033 while(e)
3034 {
3035 if(IsIntermediate(e, topY))
3036 {
3037 OutPt* op = 0;
3038 if( e->OutIdx >= 0 )
3039 op = AddOutPt(e, e->Top);
3040 UpdateEdgeIntoAEL(e);
3041
3042 //if output polygons share an edge, they'll need joining later ...
3043 TEdge* ePrev = e->PrevInAEL;
3044 TEdge* eNext = e->NextInAEL;
3045 if (ePrev && ePrev->Curr.X == e->Bot.X &&
3046 ePrev->Curr.Y == e->Bot.Y && op &&
3047 ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y &&
3048 SlopesEqual(*e, *ePrev, m_UseFullRange) &&
3049 (e->WindDelta != 0) && (ePrev->WindDelta != 0))
3050 {
3051 OutPt* op2 = AddOutPt(ePrev, e->Bot);
3052 AddJoin(op, op2, e->Top);
3053 }
3054 else if (eNext && eNext->Curr.X == e->Bot.X &&
3055 eNext->Curr.Y == e->Bot.Y && op &&
3056 eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y &&
3057 SlopesEqual(*e, *eNext, m_UseFullRange) &&
3058 (e->WindDelta != 0) && (eNext->WindDelta != 0))
3059 {
3060 OutPt* op2 = AddOutPt(eNext, e->Bot);
3061 AddJoin(op, op2, e->Top);
3062 }
3063 }
3064 e = e->NextInAEL;
3065 }
3066 }
3067 //------------------------------------------------------------------------------
3068
3069 void Clipper::FixupOutPolyline(OutRec &outrec)
3070 {
3071 OutPt *pp = outrec.Pts;
3072 OutPt *lastPP = pp->Prev;
3073 while (pp != lastPP)
3074 {
3075 pp = pp->Next;
3076 if (pp->Pt == pp->Prev->Pt)
3077 {
3078 if (pp == lastPP) lastPP = pp->Prev;
3079 OutPt *tmpPP = pp->Prev;
3080 tmpPP->Next = pp->Next;
3081 pp->Next->Prev = tmpPP;
3082 delete pp;
3083 pp = tmpPP;
3084 }
3085 }
3086
3087 if (pp == pp->Prev)
3088 {
3089 DisposeOutPts(pp);
3090 outrec.Pts = 0;
3091 return;
3092 }
3093 }
3094 //------------------------------------------------------------------------------
3095
3096 void Clipper::FixupOutPolygon(OutRec &outrec)
3097 {
3098 //FixupOutPolygon() - removes duplicate points and simplifies consecutive
3099 //parallel edges by removing the middle vertex.
3100 OutPt *lastOK = 0;
3101 outrec.BottomPt = 0;
3102 OutPt *pp = outrec.Pts;
3103 bool preserveCol = m_PreserveCollinear || m_StrictSimple;
3104
3105 for (;;)
3106 {
3107 if (pp->Prev == pp || pp->Prev == pp->Next)
3108 {
3109 DisposeOutPts(pp);
3110 outrec.Pts = 0;
3111 return;
3112 }
3113
3114 //test for duplicate points and collinear edges ...
3115 if ((pp->Pt == pp->Next->Pt) || (pp->Pt == pp->Prev->Pt) ||
3116 (SlopesEqual(pp->Prev->Pt, pp->Pt, pp->Next->Pt, m_UseFullRange) &&
3117 (!preserveCol || !Pt2IsBetweenPt1AndPt3(pp->Prev->Pt, pp->Pt, pp->Next->Pt))))
3118 {
3119 lastOK = 0;
3120 OutPt *tmp = pp;
3121 pp->Prev->Next = pp->Next;
3122 pp->Next->Prev = pp->Prev;
3123 pp = pp->Prev;
3124 delete tmp;
3125 }
3126 else if (pp == lastOK) break;
3127 else
3128 {
3129 if (!lastOK) lastOK = pp;
3130 pp = pp->Next;
3131 }
3132 }
3133 outrec.Pts = pp;
3134 }
3135 //------------------------------------------------------------------------------
3136
3137 int PointCount(OutPt *Pts)
3138 {
3139 if (!Pts) return 0;
3140 int result = 0;
3141 OutPt* p = Pts;
3142 do
3143 {
3144 result++;
3145 p = p->Next;
3146 }
3147 while (p != Pts);
3148 return result;
3149 }
3150 //------------------------------------------------------------------------------
3151
3152 void Clipper::BuildResult(Paths &polys)
3153 {
3154 polys.reserve(m_PolyOuts.size());
3155 for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
3156 {
3157 if (!m_PolyOuts[i]->Pts) continue;
3158 Path pg;
3159 OutPt* p = m_PolyOuts[i]->Pts->Prev;
3160 int cnt = PointCount(p);
3161 if (cnt < 2) continue;
3162 pg.reserve(cnt);
3163 for (int i = 0; i < cnt; ++i)
3164 {
3165 pg.push_back(p->Pt);
3166 p = p->Prev;
3167 }
3168 polys.push_back(pg);
3169 }
3170 }
3171 //------------------------------------------------------------------------------
3172
3173 void Clipper::BuildResult2(PolyTree& polytree)
3174 {
3175 polytree.Clear();
3176 polytree.AllNodes.reserve(m_PolyOuts.size());
3177 //add each output polygon/contour to polytree ...
3178 for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++)
3179 {
3180 OutRec* outRec = m_PolyOuts[i];
3181 int cnt = PointCount(outRec->Pts);
3182 if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3)) continue;
3183 FixHoleLinkage(*outRec);
3184 PolyNode* pn = new PolyNode();
3185 //nb: polytree takes ownership of all the PolyNodes
3186 polytree.AllNodes.push_back(pn);
3187 outRec->PolyNd = pn;
3188 pn->Parent = 0;
3189 pn->Index = 0;
3190 pn->Contour.reserve(cnt);
3191 OutPt *op = outRec->Pts->Prev;
3192 for (int j = 0; j < cnt; j++)
3193 {
3194 pn->Contour.push_back(op->Pt);
3195 op = op->Prev;
3196 }
3197 }
3198
3199 //fixup PolyNode links etc ...
3200 polytree.Childs.reserve(m_PolyOuts.size());
3201 for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++)
3202 {
3203 OutRec* outRec = m_PolyOuts[i];
3204 if (!outRec->PolyNd) continue;
3205 if (outRec->IsOpen)
3206 {
3207 outRec->PolyNd->m_IsOpen = true;
3208 polytree.AddChild(*outRec->PolyNd);
3209 }
3210 else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd)
3211 outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd);
3212 else
3213 polytree.AddChild(*outRec->PolyNd);
3214 }
3215 }
3216 //------------------------------------------------------------------------------
3217
3218 void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2)
3219 {
3220 //just swap the contents (because fIntersectNodes is a single-linked-list)
3221 IntersectNode inode = int1; //gets a copy of Int1
3222 int1.Edge1 = int2.Edge1;
3223 int1.Edge2 = int2.Edge2;
3224 int1.Pt = int2.Pt;
3225 int2.Edge1 = inode.Edge1;
3226 int2.Edge2 = inode.Edge2;
3227 int2.Pt = inode.Pt;
3228 }
3229 //------------------------------------------------------------------------------
3230
3231 inline bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2)
3232 {
3233 if (e2.Curr.X == e1.Curr.X)
3234 {
3235 if (e2.Top.Y > e1.Top.Y)
3236 return e2.Top.X < TopX(e1, e2.Top.Y);
3237 else return e1.Top.X > TopX(e2, e1.Top.Y);
3238 }
3239 else return e2.Curr.X < e1.Curr.X;
3240 }
3241 //------------------------------------------------------------------------------
3242
3243 bool GetOverlap(const cInt a1, const cInt a2, const cInt b1, const cInt b2,
3244 cInt& Left, cInt& Right)
3245 {
3246 if (a1 < a2)
3247 {
3248 if (b1 < b2) {Left = std::max(a1,b1); Right = std::min(a2,b2);}
3249 else {Left = std::max(a1,b2); Right = std::min(a2,b1);}
3250 }
3251 else
3252 {
3253 if (b1 < b2) {Left = std::max(a2,b1); Right = std::min(a1,b2);}
3254 else {Left = std::max(a2,b2); Right = std::min(a1,b1);}
3255 }
3256 return Left < Right;
3257 }
3258 //------------------------------------------------------------------------------
3259
3260 inline void UpdateOutPtIdxs(OutRec& outrec)
3261 {
3262 OutPt* op = outrec.Pts;
3263 do
3264 {
3265 op->Idx = outrec.Idx;
3266 op = op->Prev;
3267 }
3268 while(op != outrec.Pts);
3269 }
3270 //------------------------------------------------------------------------------
3271
3272 void Clipper::InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge)
3273 {
3274 if(!m_ActiveEdges)
3275 {
3276 edge->PrevInAEL = 0;
3277 edge->NextInAEL = 0;
3278 m_ActiveEdges = edge;
3279 }
3280 else if(!startEdge && E2InsertsBeforeE1(*m_ActiveEdges, *edge))
3281 {
3282 edge->PrevInAEL = 0;
3283 edge->NextInAEL = m_ActiveEdges;
3284 m_ActiveEdges->PrevInAEL = edge;
3285 m_ActiveEdges = edge;
3286 }
3287 else
3288 {
3289 if(!startEdge) startEdge = m_ActiveEdges;
3290 while(startEdge->NextInAEL &&
3291 !E2InsertsBeforeE1(*startEdge->NextInAEL , *edge))
3292 startEdge = startEdge->NextInAEL;
3293 edge->NextInAEL = startEdge->NextInAEL;
3294 if(startEdge->NextInAEL) startEdge->NextInAEL->PrevInAEL = edge;
3295 edge->PrevInAEL = startEdge;
3296 startEdge->NextInAEL = edge;
3297 }
3298 }
3299 //----------------------------------------------------------------------
3300
3301 OutPt* DupOutPt(OutPt* outPt, bool InsertAfter)
3302 {
3303 OutPt* result = new OutPt;
3304 result->Pt = outPt->Pt;
3305 result->Idx = outPt->Idx;
3306 if (InsertAfter)
3307 {
3308 result->Next = outPt->Next;
3309 result->Prev = outPt;
3310 outPt->Next->Prev = result;
3311 outPt->Next = result;
3312 }
3313 else
3314 {
3315 result->Prev = outPt->Prev;
3316 result->Next = outPt;
3317 outPt->Prev->Next = result;
3318 outPt->Prev = result;
3319 }
3320 return result;
3321 }
3322 //------------------------------------------------------------------------------
3323
3324 bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b,
3325 const IntPoint &Pt, bool DiscardLeft)
3326 {
3327 Direction Dir1 = (op1->Pt.X > op1b->Pt.X ? dRightToLeft : dLeftToRight);
3328 Direction Dir2 = (op2->Pt.X > op2b->Pt.X ? dRightToLeft : dLeftToRight);
3329 if (Dir1 == Dir2) return false;
3330
3331 //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we
3332 //want Op1b to be on the Right. (And likewise with Op2 and Op2b.)
3333 //So, to facilitate this while inserting Op1b and Op2b ...
3334 //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b,
3335 //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.)
3336 if (Dir1 == dLeftToRight)
3337 {
3338 while (op1->Next->Pt.X <= Pt.X &&
3339 op1->Next->Pt.X >= op1->Pt.X && op1->Next->Pt.Y == Pt.Y)
3340 op1 = op1->Next;
3341 if (DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next;
3342 op1b = DupOutPt(op1, !DiscardLeft);
3343 if (op1b->Pt != Pt)
3344 {
3345 op1 = op1b;
3346 op1->Pt = Pt;
3347 op1b = DupOutPt(op1, !DiscardLeft);
3348 }
3349 }
3350 else
3351 {
3352 while (op1->Next->Pt.X >= Pt.X &&
3353 op1->Next->Pt.X <= op1->Pt.X && op1->Next->Pt.Y == Pt.Y)
3354 op1 = op1->Next;
3355 if (!DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next;
3356 op1b = DupOutPt(op1, DiscardLeft);
3357 if (op1b->Pt != Pt)
3358 {
3359 op1 = op1b;
3360 op1->Pt = Pt;
3361 op1b = DupOutPt(op1, DiscardLeft);
3362 }
3363 }
3364
3365 if (Dir2 == dLeftToRight)
3366 {
3367 while (op2->Next->Pt.X <= Pt.X &&
3368 op2->Next->Pt.X >= op2->Pt.X && op2->Next->Pt.Y == Pt.Y)
3369 op2 = op2->Next;
3370 if (DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next;
3371 op2b = DupOutPt(op2, !DiscardLeft);
3372 if (op2b->Pt != Pt)
3373 {
3374 op2 = op2b;
3375 op2->Pt = Pt;
3376 op2b = DupOutPt(op2, !DiscardLeft);
3377 };
3378 } else
3379 {
3380 while (op2->Next->Pt.X >= Pt.X &&
3381 op2->Next->Pt.X <= op2->Pt.X && op2->Next->Pt.Y == Pt.Y)
3382 op2 = op2->Next;
3383 if (!DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next;
3384 op2b = DupOutPt(op2, DiscardLeft);
3385 if (op2b->Pt != Pt)
3386 {
3387 op2 = op2b;
3388 op2->Pt = Pt;
3389 op2b = DupOutPt(op2, DiscardLeft);
3390 };
3391 };
3392
3393 if ((Dir1 == dLeftToRight) == DiscardLeft)
3394 {
3395 op1->Prev = op2;
3396 op2->Next = op1;
3397 op1b->Next = op2b;
3398 op2b->Prev = op1b;
3399 }
3400 else
3401 {
3402 op1->Next = op2;
3403 op2->Prev = op1;
3404 op1b->Prev = op2b;
3405 op2b->Next = op1b;
3406 }
3407 return true;
3408 }
3409 //------------------------------------------------------------------------------
3410
3411 bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2)
3412 {
3413 OutPt *op1 = j->OutPt1, *op1b;
3414 OutPt *op2 = j->OutPt2, *op2b;
3415
3416 //There are 3 kinds of joins for output polygons ...
3417 //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are vertices anywhere
3418 //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal).
3419 //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same
3420 //location at the Bottom of the overlapping segment (& Join.OffPt is above).
3421 //3. StrictSimple joins where edges touch but are not collinear and where
3422 //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point.
3423 bool isHorizontal = (j->OutPt1->Pt.Y == j->OffPt.Y);
3424
3425 if (isHorizontal && (j->OffPt == j->OutPt1->Pt) &&
3426 (j->OffPt == j->OutPt2->Pt))
3427 {
3428 //Strictly Simple join ...
3429 if (outRec1 != outRec2) return false;
3430 op1b = j->OutPt1->Next;
3431 while (op1b != op1 && (op1b->Pt == j->OffPt))
3432 op1b = op1b->Next;
3433 bool reverse1 = (op1b->Pt.Y > j->OffPt.Y);
3434 op2b = j->OutPt2->Next;
3435 while (op2b != op2 && (op2b->Pt == j->OffPt))
3436 op2b = op2b->Next;
3437 bool reverse2 = (op2b->Pt.Y > j->OffPt.Y);
3438 if (reverse1 == reverse2) return false;
3439 if (reverse1)
3440 {
3441 op1b = DupOutPt(op1, false);
3442 op2b = DupOutPt(op2, true);
3443 op1->Prev = op2;
3444 op2->Next = op1;
3445 op1b->Next = op2b;
3446 op2b->Prev = op1b;
3447 j->OutPt1 = op1;
3448 j->OutPt2 = op1b;
3449 return true;
3450 } else
3451 {
3452 op1b = DupOutPt(op1, true);
3453 op2b = DupOutPt(op2, false);
3454 op1->Next = op2;
3455 op2->Prev = op1;
3456 op1b->Prev = op2b;
3457 op2b->Next = op1b;
3458 j->OutPt1 = op1;
3459 j->OutPt2 = op1b;
3460 return true;
3461 }
3462 }
3463 else if (isHorizontal)
3464 {
3465 //treat horizontal joins differently to non-horizontal joins since with
3466 //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt
3467 //may be anywhere along the horizontal edge.
3468 op1b = op1;
3469 while (op1->Prev->Pt.Y == op1->Pt.Y && op1->Prev != op1b && op1->Prev != op2)
3470 op1 = op1->Prev;
3471 while (op1b->Next->Pt.Y == op1b->Pt.Y && op1b->Next != op1 && op1b->Next != op2)
3472 op1b = op1b->Next;
3473 if (op1b->Next == op1 || op1b->Next == op2) return false; //a flat 'polygon'
3474
3475 op2b = op2;
3476 while (op2->Prev->Pt.Y == op2->Pt.Y && op2->Prev != op2b && op2->Prev != op1b)
3477 op2 = op2->Prev;
3478 while (op2b->Next->Pt.Y == op2b->Pt.Y && op2b->Next != op2 && op2b->Next != op1)
3479 op2b = op2b->Next;
3480 if (op2b->Next == op2 || op2b->Next == op1) return false; //a flat 'polygon'
3481
3482 cInt Left, Right;
3483 //Op1 --> Op1b & Op2 --> Op2b are the extremites of the horizontal edges
3484 if (!GetOverlap(op1->Pt.X, op1b->Pt.X, op2->Pt.X, op2b->Pt.X, Left, Right))
3485 return false;
3486
3487 //DiscardLeftSide: when overlapping edges are joined, a spike will created
3488 //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up
3489 //on the discard Side as either may still be needed for other joins ...
3490 IntPoint Pt;
3491 bool DiscardLeftSide;
3492 if (op1->Pt.X >= Left && op1->Pt.X <= Right)
3493 {
3494 Pt = op1->Pt; DiscardLeftSide = (op1->Pt.X > op1b->Pt.X);
3495 }
3496 else if (op2->Pt.X >= Left&& op2->Pt.X <= Right)
3497 {
3498 Pt = op2->Pt; DiscardLeftSide = (op2->Pt.X > op2b->Pt.X);
3499 }
3500 else if (op1b->Pt.X >= Left && op1b->Pt.X <= Right)
3501 {
3502 Pt = op1b->Pt; DiscardLeftSide = op1b->Pt.X > op1->Pt.X;
3503 }
3504 else
3505 {
3506 Pt = op2b->Pt; DiscardLeftSide = (op2b->Pt.X > op2->Pt.X);
3507 }
3508 j->OutPt1 = op1; j->OutPt2 = op2;
3509 return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide);
3510 } else
3511 {
3512 //nb: For non-horizontal joins ...
3513 // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y
3514 // 2. Jr.OutPt1.Pt > Jr.OffPt.Y
3515
3516 //make sure the polygons are correctly oriented ...
3517 op1b = op1->Next;
3518 while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Next;
3519 bool Reverse1 = ((op1b->Pt.Y > op1->Pt.Y) ||
3520 !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange));
3521 if (Reverse1)
3522 {
3523 op1b = op1->Prev;
3524 while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Prev;
3525 if ((op1b->Pt.Y > op1->Pt.Y) ||
3526 !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)) return false;
3527 };
3528 op2b = op2->Next;
3529 while ((op2b->Pt == op2->Pt) && (op2b != op2))op2b = op2b->Next;
3530 bool Reverse2 = ((op2b->Pt.Y > op2->Pt.Y) ||
3531 !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange));
3532 if (Reverse2)
3533 {
3534 op2b = op2->Prev;
3535 while ((op2b->Pt == op2->Pt) && (op2b != op2)) op2b = op2b->Prev;
3536 if ((op2b->Pt.Y > op2->Pt.Y) ||
3537 !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)) return false;
3538 }
3539
3540 if ((op1b == op1) || (op2b == op2) || (op1b == op2b) ||
3541 ((outRec1 == outRec2) && (Reverse1 == Reverse2))) return false;
3542
3543 if (Reverse1)
3544 {
3545 op1b = DupOutPt(op1, false);
3546 op2b = DupOutPt(op2, true);
3547 op1->Prev = op2;
3548 op2->Next = op1;
3549 op1b->Next = op2b;
3550 op2b->Prev = op1b;
3551 j->OutPt1 = op1;
3552 j->OutPt2 = op1b;
3553 return true;
3554 } else
3555 {
3556 op1b = DupOutPt(op1, true);
3557 op2b = DupOutPt(op2, false);
3558 op1->Next = op2;
3559 op2->Prev = op1;
3560 op1b->Prev = op2b;
3561 op2b->Next = op1b;
3562 j->OutPt1 = op1;
3563 j->OutPt2 = op1b;
3564 return true;
3565 }
3566 }
3567 }
3568 //----------------------------------------------------------------------
3569
3570 static OutRec* ParseFirstLeft(OutRec* FirstLeft)
3571 {
3572 while (FirstLeft && !FirstLeft->Pts)
3573 FirstLeft = FirstLeft->FirstLeft;
3574 return FirstLeft;
3575 }
3576 //------------------------------------------------------------------------------
3577
3578 void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) const
3579 {
3580 //tests if NewOutRec contains the polygon before reassigning FirstLeft
3581 for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
3582 {
3583 OutRec* outRec = m_PolyOuts[i];
3584 if (!outRec->Pts || !outRec->FirstLeft) continue;
3585 OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft);
3586 if (firstLeft == OldOutRec)
3587 {
3588 if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts))
3589 outRec->FirstLeft = NewOutRec;
3590 }
3591 }
3592 }
3593 //----------------------------------------------------------------------
3594
3595 void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) const
3596 {
3597 //reassigns FirstLeft WITHOUT testing if NewOutRec contains the polygon
3598 for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
3599 {
3600 OutRec* outRec = m_PolyOuts[i];
3601 if (outRec->FirstLeft == OldOutRec) outRec->FirstLeft = NewOutRec;
3602 }
3603 }
3604 //----------------------------------------------------------------------
3605
3606 void Clipper::JoinCommonEdges()
3607 {
3608 for (JoinList::size_type i = 0; i < m_Joins.size(); i++)
3609 {
3610 Join* join = m_Joins[i];
3611
3612 OutRec *outRec1 = GetOutRec(join->OutPt1->Idx);
3613 OutRec *outRec2 = GetOutRec(join->OutPt2->Idx);
3614
3615 if (!outRec1->Pts || !outRec2->Pts) continue;
3616 if (outRec1->IsOpen || outRec2->IsOpen) continue;
3617
3618 //get the polygon fragment with the correct hole state (FirstLeft)
3619 //before calling JoinPoints() ...
3620 OutRec *holeStateRec;
3621 if (outRec1 == outRec2) holeStateRec = outRec1;
3622 else if (Param1RightOfParam2(outRec1, outRec2)) holeStateRec = outRec2;
3623 else if (Param1RightOfParam2(outRec2, outRec1)) holeStateRec = outRec1;
3624 else holeStateRec = GetLowermostRec(outRec1, outRec2);
3625
3626 if (!JoinPoints(join, outRec1, outRec2)) continue;
3627
3628 if (outRec1 == outRec2)
3629 {
3630 //instead of joining two polygons, we've just created a new one by
3631 //splitting one polygon into two.
3632 outRec1->Pts = join->OutPt1;
3633 outRec1->BottomPt = 0;
3634 outRec2 = CreateOutRec();
3635 outRec2->Pts = join->OutPt2;
3636
3637 //update all OutRec2.Pts Idx's ...
3638 UpdateOutPtIdxs(*outRec2);
3639
3640 //We now need to check every OutRec.FirstLeft pointer. If it points
3641 //to OutRec1 it may need to point to OutRec2 instead ...
3642 if (m_UsingPolyTree)
3643 for (PolyOutList::size_type j = 0; j < m_PolyOuts.size() - 1; j++)
3644 {
3645 OutRec* oRec = m_PolyOuts[j];
3646 if (!oRec->Pts || ParseFirstLeft(oRec->FirstLeft) != outRec1 ||
3647 oRec->IsHole == outRec1->IsHole) continue;
3648 if (Poly2ContainsPoly1(oRec->Pts, join->OutPt2))
3649 oRec->FirstLeft = outRec2;
3650 }
3651
3652 if (Poly2ContainsPoly1(outRec2->Pts, outRec1->Pts))
3653 {
3654 //outRec2 is contained by outRec1 ...
3655 outRec2->IsHole = !outRec1->IsHole;
3656 outRec2->FirstLeft = outRec1;
3657
3658 //fixup FirstLeft pointers that may need reassigning to OutRec1
3659 if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1);
3660
3661 if ((outRec2->IsHole ^ m_ReverseOutput) == (Area(*outRec2) > 0))
3662 ReversePolyPtLinks(outRec2->Pts);
3663
3664 } else if (Poly2ContainsPoly1(outRec1->Pts, outRec2->Pts))
3665 {
3666 //outRec1 is contained by outRec2 ...
3667 outRec2->IsHole = outRec1->IsHole;
3668 outRec1->IsHole = !outRec2->IsHole;
3669 outRec2->FirstLeft = outRec1->FirstLeft;
3670 outRec1->FirstLeft = outRec2;
3671
3672 //fixup FirstLeft pointers that may need reassigning to OutRec1
3673 if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2);
3674
3675 if ((outRec1->IsHole ^ m_ReverseOutput) == (Area(*outRec1) > 0))
3676 ReversePolyPtLinks(outRec1->Pts);
3677 }
3678 else
3679 {
3680 //the 2 polygons are completely separate ...
3681 outRec2->IsHole = outRec1->IsHole;
3682 outRec2->FirstLeft = outRec1->FirstLeft;
3683
3684 //fixup FirstLeft pointers that may need reassigning to OutRec2
3685 if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2);
3686 }
3687
3688 } else
3689 {
3690 //joined 2 polygons together ...
3691
3692 outRec2->Pts = 0;
3693 outRec2->BottomPt = 0;
3694 outRec2->Idx = outRec1->Idx;
3695
3696 outRec1->IsHole = holeStateRec->IsHole;
3697 if (holeStateRec == outRec2)
3698 outRec1->FirstLeft = outRec2->FirstLeft;
3699 outRec2->FirstLeft = outRec1;
3700
3701 //fixup FirstLeft pointers that may need reassigning to OutRec1
3702 if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1);
3703 }
3704 }
3705 }
3706
3707 //------------------------------------------------------------------------------
3708 // ClipperOffset support functions ...
3709 //------------------------------------------------------------------------------
3710
3711 DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2)
3712 {
3713 if(pt2.X == pt1.X && pt2.Y == pt1.Y)
3714 return DoublePoint(0, 0);
3715
3716 double Dx = (double)(pt2.X - pt1.X);
3717 double dy = (double)(pt2.Y - pt1.Y);
3718 double f = 1 *1.0/ std::sqrt( Dx*Dx + dy*dy );
3719 Dx *= f;
3720 dy *= f;
3721 return DoublePoint(dy, -Dx);
3722 }
3723
3724 //------------------------------------------------------------------------------
3725 // ClipperOffset class
3726 //------------------------------------------------------------------------------
3727
3728 ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance)
3729 {
3730 this->MiterLimit = miterLimit;
3731 this->ArcTolerance = arcTolerance;
3732 m_lowest.X = -1;
3733 }
3734 //------------------------------------------------------------------------------
3735
3736 ClipperOffset::~ClipperOffset()
3737 {
3738 Clear();
3739 }
3740 //------------------------------------------------------------------------------
3741
3742 void ClipperOffset::Clear()
3743 {
3744 for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
3745 delete m_polyNodes.Childs[i];
3746 m_polyNodes.Childs.clear();
3747 m_lowest.X = -1;
3748 }
3749 //------------------------------------------------------------------------------
3750
3751 void ClipperOffset::AddPath(const Path& path, JoinType joinType, EndType endType)
3752 {
3753 int highI = (int)path.size() - 1;
3754 if (highI < 0) return;
3755 PolyNode* newNode = new PolyNode();
3756 newNode->m_jointype = joinType;
3757 newNode->m_endtype = endType;
3758
3759 //strip duplicate points from path and also get index to the lowest point ...
3760 if (endType == etClosedLine || endType == etClosedPolygon)
3761 while (highI > 0 && path[0] == path[highI]) highI--;
3762 newNode->Contour.reserve(highI + 1);
3763 newNode->Contour.push_back(path[0]);
3764 int j = 0, k = 0;
3765 for (int i = 1; i <= highI; i++)
3766 if (newNode->Contour[j] != path[i])
3767 {
3768 j++;
3769 newNode->Contour.push_back(path[i]);
3770 if (path[i].Y > newNode->Contour[k].Y ||
3771 (path[i].Y == newNode->Contour[k].Y &&
3772 path[i].X < newNode->Contour[k].X)) k = j;
3773 }
3774 if (endType == etClosedPolygon && j < 2)
3775 {
3776 delete newNode;
3777 return;
3778 }
3779 m_polyNodes.AddChild(*newNode);
3780
3781 //if this path's lowest pt is lower than all the others then update m_lowest
3782 if (endType != etClosedPolygon) return;
3783 if (m_lowest.X < 0)
3784 m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);
3785 else
3786 {
3787 IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X]->Contour[(int)m_lowest.Y];
3788 if (newNode->Contour[k].Y > ip.Y ||
3789 (newNode->Contour[k].Y == ip.Y &&
3790 newNode->Contour[k].X < ip.X))
3791 m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);
3792 }
3793 }
3794 //------------------------------------------------------------------------------
3795
3796 void ClipperOffset::AddPaths(const Paths& paths, JoinType joinType, EndType endType)
3797 {
3798 for (Paths::size_type i = 0; i < paths.size(); ++i)
3799 AddPath(paths[i], joinType, endType);
3800 }
3801 //------------------------------------------------------------------------------
3802
3803 void ClipperOffset::FixOrientations()
3804 {
3805 //fixup orientations of all closed paths if the orientation of the
3806 //closed path with the lowermost vertex is wrong ...
3807 if (m_lowest.X >= 0 &&
3808 !Orientation(m_polyNodes.Childs[(int)m_lowest.X]->Contour))
3809 {
3810 for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
3811 {
3812 PolyNode& node = *m_polyNodes.Childs[i];
3813 if (node.m_endtype == etClosedPolygon ||
3814 (node.m_endtype == etClosedLine && Orientation(node.Contour)))
3815 ReversePath(node.Contour);
3816 }
3817 } else
3818 {
3819 for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
3820 {
3821 PolyNode& node = *m_polyNodes.Childs[i];
3822 if (node.m_endtype == etClosedLine && !Orientation(node.Contour))
3823 ReversePath(node.Contour);
3824 }
3825 }
3826 }
3827 //------------------------------------------------------------------------------
3828
3829 void ClipperOffset::Execute(Paths& solution, double delta)
3830 {
3831 solution.clear();
3832 FixOrientations();
3833 DoOffset(delta);
3834
3835 //now clean up 'corners' ...
3836 Clipper clpr;
3837 clpr.AddPaths(m_destPolys, ptSubject, true);
3838 if (delta > 0)
3839 {
3840 clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
3841 }
3842 else
3843 {
3844 IntRect r = clpr.GetBounds();
3845 Path outer(4);
3846 outer[0] = IntPoint(r.left - 10, r.bottom + 10);
3847 outer[1] = IntPoint(r.right + 10, r.bottom + 10);
3848 outer[2] = IntPoint(r.right + 10, r.top - 10);
3849 outer[3] = IntPoint(r.left - 10, r.top - 10);
3850
3851 clpr.AddPath(outer, ptSubject, true);
3852 clpr.ReverseSolution(true);
3853 clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
3854 if (solution.size() > 0) solution.erase(solution.begin());
3855 }
3856 }
3857 //------------------------------------------------------------------------------
3858
3859 void ClipperOffset::Execute(PolyTree& solution, double delta)
3860 {
3861 solution.Clear();
3862 FixOrientations();
3863 DoOffset(delta);
3864
3865 //now clean up 'corners' ...
3866 Clipper clpr;
3867 clpr.AddPaths(m_destPolys, ptSubject, true);
3868 if (delta > 0)
3869 {
3870 clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
3871 }
3872 else
3873 {
3874 IntRect r = clpr.GetBounds();
3875 Path outer(4);
3876 outer[0] = IntPoint(r.left - 10, r.bottom + 10);
3877 outer[1] = IntPoint(r.right + 10, r.bottom + 10);
3878 outer[2] = IntPoint(r.right + 10, r.top - 10);
3879 outer[3] = IntPoint(r.left - 10, r.top - 10);
3880
3881 clpr.AddPath(outer, ptSubject, true);
3882 clpr.ReverseSolution(true);
3883 clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
3884 //remove the outer PolyNode rectangle ...
3885 if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0)
3886 {
3887 PolyNode* outerNode = solution.Childs[0];
3888 solution.Childs.reserve(outerNode->ChildCount());
3889 solution.Childs[0] = outerNode->Childs[0];
3890 solution.Childs[0]->Parent = outerNode->Parent;
3891 for (int i = 1; i < outerNode->ChildCount(); ++i)
3892 solution.AddChild(*outerNode->Childs[i]);
3893 }
3894 else
3895 solution.Clear();
3896 }
3897 }
3898 //------------------------------------------------------------------------------
3899
3900 void ClipperOffset::DoOffset(double delta)
3901 {
3902 m_destPolys.clear();
3903 m_delta = delta;
3904
3905 //if Zero offset, just copy any CLOSED polygons to m_p and return ...
3906 if (NEAR_ZERO(delta))
3907 {
3908 m_destPolys.reserve(m_polyNodes.ChildCount());
3909 for (int i = 0; i < m_polyNodes.ChildCount(); i++)
3910 {
3911 PolyNode& node = *m_polyNodes.Childs[i];
3912 if (node.m_endtype == etClosedPolygon)
3913 m_destPolys.push_back(node.Contour);
3914 }
3915 return;
3916 }
3917
3918 //see offset_triginometry3.svg in the documentation folder ...
3919 if (MiterLimit > 2) m_miterLim = 2/(MiterLimit * MiterLimit);
3920 else m_miterLim = 0.5;
3921
3922 double y;
3923 if (ArcTolerance <= 0.0) y = def_arc_tolerance;
3924 else if (ArcTolerance > std::fabs(delta) * def_arc_tolerance)
3925 y = std::fabs(delta) * def_arc_tolerance;
3926 else y = ArcTolerance;
3927 //see offset_triginometry2.svg in the documentation folder ...
3928 double steps = pi / std::acos(1 - y / std::fabs(delta));
3929 if (steps > std::fabs(delta) * pi)
3930 steps = std::fabs(delta) * pi; //ie excessive precision check
3931 m_sin = std::sin(two_pi / steps);
3932 m_cos = std::cos(two_pi / steps);
3933 m_StepsPerRad = steps / two_pi;
3934 if (delta < 0.0) m_sin = -m_sin;
3935
3936 m_destPolys.reserve(m_polyNodes.ChildCount() * 2);
3937 for (int i = 0; i < m_polyNodes.ChildCount(); i++)
3938 {
3939 PolyNode& node = *m_polyNodes.Childs[i];
3940 m_srcPoly = node.Contour;
3941
3942 int len = (int)m_srcPoly.size();
3943 if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon)))
3944 continue;
3945
3946 m_destPoly.clear();
3947 if (len == 1)
3948 {
3949 if (node.m_jointype == jtRound)
3950 {
3951 double X = 1.0, Y = 0.0;
3952 for (cInt j = 1; j <= steps; j++)
3953 {
3954 m_destPoly.push_back(IntPoint(
3955 Round(m_srcPoly[0].X + X * delta),
3956 Round(m_srcPoly[0].Y + Y * delta)));
3957 double X2 = X;
3958 X = X * m_cos - m_sin * Y;
3959 Y = X2 * m_sin + Y * m_cos;
3960 }
3961 }
3962 else
3963 {
3964 double X = -1.0, Y = -1.0;
3965 for (int j = 0; j < 4; ++j)
3966 {
3967 m_destPoly.push_back(IntPoint(
3968 Round(m_srcPoly[0].X + X * delta),
3969 Round(m_srcPoly[0].Y + Y * delta)));
3970 if (X < 0) X = 1;
3971 else if (Y < 0) Y = 1;
3972 else X = -1;
3973 }
3974 }
3975 m_destPolys.push_back(m_destPoly);
3976 continue;
3977 }
3978 //build m_normals ...
3979 m_normals.clear();
3980 m_normals.reserve(len);
3981 for (int j = 0; j < len - 1; ++j)
3982 m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1]));
3983 if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon)
3984 m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0]));
3985 else
3986 m_normals.push_back(DoublePoint(m_normals[len - 2]));
3987
3988 if (node.m_endtype == etClosedPolygon)
3989 {
3990 int k = len - 1;
3991 for (int j = 0; j < len; ++j)
3992 OffsetPoint(j, k, node.m_jointype);
3993 m_destPolys.push_back(m_destPoly);
3994 }
3995 else if (node.m_endtype == etClosedLine)
3996 {
3997 int k = len - 1;
3998 for (int j = 0; j < len; ++j)
3999 OffsetPoint(j, k, node.m_jointype);
4000 m_destPolys.push_back(m_destPoly);
4001 m_destPoly.clear();
4002 //re-build m_normals ...
4003 DoublePoint n = m_normals[len -1];
4004 for (int j = len - 1; j > 0; j--)
4005 m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);
4006 m_normals[0] = DoublePoint(-n.X, -n.Y);
4007 k = 0;
4008 for (int j = len - 1; j >= 0; j--)
4009 OffsetPoint(j, k, node.m_jointype);
4010 m_destPolys.push_back(m_destPoly);
4011 }
4012 else
4013 {
4014 int k = 0;
4015 for (int j = 1; j < len - 1; ++j)
4016 OffsetPoint(j, k, node.m_jointype);
4017
4018 IntPoint pt1;
4019 if (node.m_endtype == etOpenButt)
4020 {
4021 int j = len - 1;
4022 pt1 = IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X *
4023 delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta));
4024 m_destPoly.push_back(pt1);
4025 pt1 = IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X *
4026 delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta));
4027 m_destPoly.push_back(pt1);
4028 }
4029 else
4030 {
4031 int j = len - 1;
4032 k = len - 2;
4033 m_sinA = 0;
4034 m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y);
4035 if (node.m_endtype == etOpenSquare)
4036 DoSquare(j, k);
4037 else
4038 DoRound(j, k);
4039 }
4040
4041 //re-build m_normals ...
4042 for (int j = len - 1; j > 0; j--)
4043 m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);
4044 m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y);
4045
4046 k = len - 1;
4047 for (int j = k - 1; j > 0; --j) OffsetPoint(j, k, node.m_jointype);
4048
4049 if (node.m_endtype == etOpenButt)
4050 {
4051 pt1 = IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta),
4052 (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta));
4053 m_destPoly.push_back(pt1);
4054 pt1 = IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta),
4055 (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta));
4056 m_destPoly.push_back(pt1);
4057 }
4058 else
4059 {
4060 k = 1;
4061 m_sinA = 0;
4062 if (node.m_endtype == etOpenSquare)
4063 DoSquare(0, 1);
4064 else
4065 DoRound(0, 1);
4066 }
4067 m_destPolys.push_back(m_destPoly);
4068 }
4069 }
4070 }
4071 //------------------------------------------------------------------------------
4072
4073 void ClipperOffset::OffsetPoint(int j, int& k, JoinType jointype)
4074 {
4075 //cross product ...
4076 m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y);
4077 if (std::fabs(m_sinA * m_delta) < 1.0)
4078 {
4079 //dot product ...
4080 double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y );
4081 if (cosA > 0) // angle => 0 degrees
4082 {
4083 m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta),
4084 Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)));
4085 return;
4086 }
4087 //else angle => 180 degrees
4088 }
4089 else if (m_sinA > 1.0) m_sinA = 1.0;
4090 else if (m_sinA < -1.0) m_sinA = -1.0;
4091
4092 if (m_sinA * m_delta < 0)
4093 {
4094 m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta),
4095 Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)));
4096 m_destPoly.push_back(m_srcPoly[j]);
4097 m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta),
4098 Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)));
4099 }
4100 else
4101 switch (jointype)
4102 {
4103 case jtMiter:
4104 {
4105 double r = 1 + (m_normals[j].X * m_normals[k].X +
4106 m_normals[j].Y * m_normals[k].Y);
4107 if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k);
4108 break;
4109 }
4110 case jtSquare: DoSquare(j, k); break;
4111 case jtRound: DoRound(j, k); break;
4112 }
4113 k = j;
4114 }
4115 //------------------------------------------------------------------------------
4116
4117 void ClipperOffset::DoSquare(int j, int k)
4118 {
4119 double dx = std::tan(std::atan2(m_sinA,
4120 m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4);
4121 m_destPoly.push_back(IntPoint(
4122 Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)),
4123 Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx))));
4124 m_destPoly.push_back(IntPoint(
4125 Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)),
4126 Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx))));
4127 }
4128 //------------------------------------------------------------------------------
4129
4130 void ClipperOffset::DoMiter(int j, int k, double r)
4131 {
4132 double q = m_delta / r;
4133 m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q),
4134 Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q)));
4135 }
4136 //------------------------------------------------------------------------------
4137
4138 void ClipperOffset::DoRound(int j, int k)
4139 {
4140 double a = std::atan2(m_sinA,
4141 m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y);
4142 int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1);
4143
4144 double X = m_normals[k].X, Y = m_normals[k].Y, X2;
4145 for (int i = 0; i < steps; ++i)
4146 {
4147 m_destPoly.push_back(IntPoint(
4148 Round(m_srcPoly[j].X + X * m_delta),
4149 Round(m_srcPoly[j].Y + Y * m_delta)));
4150 X2 = X;
4151 X = X * m_cos - m_sin * Y;
4152 Y = X2 * m_sin + Y * m_cos;
4153 }
4154 m_destPoly.push_back(IntPoint(
4155 Round(m_srcPoly[j].X + m_normals[j].X * m_delta),
4156 Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)));
4157 }
4158
4159 //------------------------------------------------------------------------------
4160 // Miscellaneous public functions
4161 //------------------------------------------------------------------------------
4162
4163 void Clipper::DoSimplePolygons()
4164 {
4165 PolyOutList::size_type i = 0;
4166 while (i < m_PolyOuts.size())
4167 {
4168 OutRec* outrec = m_PolyOuts[i++];
4169 OutPt* op = outrec->Pts;
4170 if (!op || outrec->IsOpen) continue;
4171 do //for each Pt in Polygon until duplicate found do ...
4172 {
4173 OutPt* op2 = op->Next;
4174 while (op2 != outrec->Pts)
4175 {
4176 if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op)
4177 {
4178 //split the polygon into two ...
4179 OutPt* op3 = op->Prev;
4180 OutPt* op4 = op2->Prev;
4181 op->Prev = op4;
4182 op4->Next = op;
4183 op2->Prev = op3;
4184 op3->Next = op2;
4185
4186 outrec->Pts = op;
4187 OutRec* outrec2 = CreateOutRec();
4188 outrec2->Pts = op2;
4189 UpdateOutPtIdxs(*outrec2);
4190 if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts))
4191 {
4192 //OutRec2 is contained by OutRec1 ...
4193 outrec2->IsHole = !outrec->IsHole;
4194 outrec2->FirstLeft = outrec;
4195 if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec);
4196 }
4197 else
4198 if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts))
4199 {
4200 //OutRec1 is contained by OutRec2 ...
4201 outrec2->IsHole = outrec->IsHole;
4202 outrec->IsHole = !outrec2->IsHole;
4203 outrec2->FirstLeft = outrec->FirstLeft;
4204 outrec->FirstLeft = outrec2;
4205 if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2);
4206 }
4207 else
4208 {
4209 //the 2 polygons are separate ...
4210 outrec2->IsHole = outrec->IsHole;
4211 outrec2->FirstLeft = outrec->FirstLeft;
4212 if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2);
4213 }
4214 op2 = op; //ie get ready for the Next iteration
4215 }
4216 op2 = op2->Next;
4217 }
4218 op = op->Next;
4219 }
4220 while (op != outrec->Pts);
4221 }
4222 }
4223 //------------------------------------------------------------------------------
4224
4225 void ReversePath(Path& p)
4226 {
4227 std::reverse(p.begin(), p.end());
4228 }
4229 //------------------------------------------------------------------------------
4230
4231 void ReversePaths(Paths& p)
4232 {
4233 for (Paths::size_type i = 0; i < p.size(); ++i)
4234 ReversePath(p[i]);
4235 }
4236 //------------------------------------------------------------------------------
4237
4238 void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType)
4239 {
4240 Clipper c;
4241 c.StrictlySimple(true);
4242 c.AddPath(in_poly, ptSubject, true);
4243 c.Execute(ctUnion, out_polys, fillType, fillType);
4244 }
4245 //------------------------------------------------------------------------------
4246
4247 void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType)
4248 {
4249 Clipper c;
4250 c.StrictlySimple(true);
4251 c.AddPaths(in_polys, ptSubject, true);
4252 c.Execute(ctUnion, out_polys, fillType, fillType);
4253 }
4254 //------------------------------------------------------------------------------
4255
4256 void SimplifyPolygons(Paths &polys, PolyFillType fillType)
4257 {
4258 SimplifyPolygons(polys, polys, fillType);
4259 }
4260 //------------------------------------------------------------------------------
4261
4262 inline double DistanceSqrd(const IntPoint& pt1, const IntPoint& pt2)
4263 {
4264 double Dx = ((double)pt1.X - pt2.X);
4265 double dy = ((double)pt1.Y - pt2.Y);
4266 return (Dx*Dx + dy*dy);
4267 }
4268 //------------------------------------------------------------------------------
4269
4270 double DistanceFromLineSqrd(
4271 const IntPoint& pt, const IntPoint& ln1, const IntPoint& ln2)
4272 {
4273 //The equation of a line in general form (Ax + By + C = 0)
4274 //given 2 points (x¹,y¹) & (x²,y²) is ...
4275 //(y¹ - y²)x + (x² - x¹)y + (y² - y¹)x¹ - (x² - x¹)y¹ = 0
4276 //A = (y¹ - y²); B = (x² - x¹); C = (y² - y¹)x¹ - (x² - x¹)y¹
4277 //perpendicular distance of point (x³,y³) = (Ax³ + By³ + C)/Sqrt(A² + B²)
4278 //see http://en.wikipedia.org/wiki/Perpendicular_distance
4279 double A = double(ln1.Y - ln2.Y);
4280 double B = double(ln2.X - ln1.X);
4281 double C = A * ln1.X + B * ln1.Y;
4282 C = A * pt.X + B * pt.Y - C;
4283 return (C * C) / (A * A + B * B);
4284 }
4285 //---------------------------------------------------------------------------
4286
4287 bool SlopesNearCollinear(const IntPoint& pt1,
4288 const IntPoint& pt2, const IntPoint& pt3, double distSqrd)
4289 {
4290 //this function is more accurate when the point that's geometrically
4291 //between the other 2 points is the one that's tested for distance.
4292 //ie makes it more likely to pick up 'spikes' ...
4293 if (Abs(pt1.X - pt2.X) > Abs(pt1.Y - pt2.Y))
4294 {
4295 if ((pt1.X > pt2.X) == (pt1.X < pt3.X))
4296 return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd;
4297 else if ((pt2.X > pt1.X) == (pt2.X < pt3.X))
4298 return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd;
4299 else
4300 return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd;
4301 }
4302 else
4303 {
4304 if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y))
4305 return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd;
4306 else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y))
4307 return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd;
4308 else
4309 return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd;
4310 }
4311 }
4312 //------------------------------------------------------------------------------
4313
4314 bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd)
4315 {
4316 double Dx = (double)pt1.X - pt2.X;
4317 double dy = (double)pt1.Y - pt2.Y;
4318 return ((Dx * Dx) + (dy * dy) <= distSqrd);
4319 }
4320 //------------------------------------------------------------------------------
4321
4322 OutPt* ExcludeOp(OutPt* op)
4323 {
4324 OutPt* result = op->Prev;
4325 result->Next = op->Next;
4326 op->Next->Prev = result;
4327 result->Idx = 0;
4328 return result;
4329 }
4330 //------------------------------------------------------------------------------
4331
4332 void CleanPolygon(const Path& in_poly, Path& out_poly, double distance)
4333 {
4334 //distance = proximity in units/pixels below which vertices
4335 //will be stripped. Default ~= sqrt(2).
4336
4337 size_t size = in_poly.size();
4338
4339 if (size == 0)
4340 {
4341 out_poly.clear();
4342 return;
4343 }
4344
4345 OutPt* outPts = new OutPt[size];
4346 for (size_t i = 0; i < size; ++i)
4347 {
4348 outPts[i].Pt = in_poly[i];
4349 outPts[i].Next = &outPts[(i + 1) % size];
4350 outPts[i].Next->Prev = &outPts[i];
4351 outPts[i].Idx = 0;
4352 }
4353
4354 double distSqrd = distance * distance;
4355 OutPt* op = &outPts[0];
4356 while (op->Idx == 0 && op->Next != op->Prev)
4357 {
4358 if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd))
4359 {
4360 op = ExcludeOp(op);
4361 size--;
4362 }
4363 else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd))
4364 {
4365 ExcludeOp(op->Next);
4366 op = ExcludeOp(op);
4367 size -= 2;
4368 }
4369 else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd))
4370 {
4371 op = ExcludeOp(op);
4372 size--;
4373 }
4374 else
4375 {
4376 op->Idx = 1;
4377 op = op->Next;
4378 }
4379 }
4380
4381 if (size < 3) size = 0;
4382 out_poly.resize(size);
4383 for (size_t i = 0; i < size; ++i)
4384 {
4385 out_poly[i] = op->Pt;
4386 op = op->Next;
4387 }
4388 delete [] outPts;
4389 }
4390 //------------------------------------------------------------------------------
4391
4392 void CleanPolygon(Path& poly, double distance)
4393 {
4394 CleanPolygon(poly, poly, distance);
4395 }
4396 //------------------------------------------------------------------------------
4397
4398 void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance)
4399 {
4400 for (Paths::size_type i = 0; i < in_polys.size(); ++i)
4401 CleanPolygon(in_polys[i], out_polys[i], distance);
4402 }
4403 //------------------------------------------------------------------------------
4404
4405 void CleanPolygons(Paths& polys, double distance)
4406 {
4407 CleanPolygons(polys, polys, distance);
4408 }
4409 //------------------------------------------------------------------------------
4410
4411 void Minkowski(const Path& poly, const Path& path,
4412 Paths& solution, bool isSum, bool isClosed)
4413 {
4414 int delta = (isClosed ? 1 : 0);
4415 size_t polyCnt = poly.size();
4416 size_t pathCnt = path.size();
4417 Paths pp;
4418 pp.reserve(pathCnt);
4419 if (isSum)
4420 for (size_t i = 0; i < pathCnt; ++i)
4421 {
4422 Path p;
4423 p.reserve(polyCnt);
4424 for (size_t j = 0; j < poly.size(); ++j)
4425 p.push_back(IntPoint(path[i].X + poly[j].X, path[i].Y + poly[j].Y));
4426 pp.push_back(p);
4427 }
4428 else
4429 for (size_t i = 0; i < pathCnt; ++i)
4430 {
4431 Path p;
4432 p.reserve(polyCnt);
4433 for (size_t j = 0; j < poly.size(); ++j)
4434 p.push_back(IntPoint(path[i].X - poly[j].X, path[i].Y - poly[j].Y));
4435 pp.push_back(p);
4436 }
4437
4438 solution.clear();
4439 solution.reserve((pathCnt + delta) * (polyCnt + 1));
4440 for (size_t i = 0; i < pathCnt - 1 + delta; ++i)
4441 for (size_t j = 0; j < polyCnt; ++j)
4442 {
4443 Path quad;
4444 quad.reserve(4);
4445 quad.push_back(pp[i % pathCnt][j % polyCnt]);
4446 quad.push_back(pp[(i + 1) % pathCnt][j % polyCnt]);
4447 quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]);
4448 quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]);
4449 if (!Orientation(quad)) ReversePath(quad);
4450 solution.push_back(quad);
4451 }
4452 }
4453 //------------------------------------------------------------------------------
4454
4455 void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed)
4456 {
4457 Minkowski(pattern, path, solution, true, pathIsClosed);
4458 Clipper c;
4459 c.AddPaths(solution, ptSubject, true);
4460 c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
4461 }
4462 //------------------------------------------------------------------------------
4463
4464 void TranslatePath(const Path& input, Path& output, const IntPoint& delta)
4465 {
4466 //precondition: input != output
4467 output.resize(input.size());
4468 for (size_t i = 0; i < input.size(); ++i)
4469 output[i] = IntPoint(input[i].X + delta.X, input[i].Y + delta.Y);
4470 }
4471 //------------------------------------------------------------------------------
4472
4473 void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed)
4474 {
4475 Clipper c;
4476 for (size_t i = 0; i < paths.size(); ++i)
4477 {
4478 Paths tmp;
4479 Minkowski(pattern, paths[i], tmp, true, pathIsClosed);
4480 c.AddPaths(tmp, ptSubject, true);
4481 if (pathIsClosed)
4482 {
4483 Path tmp2;
4484 TranslatePath(paths[i], tmp2, pattern[0]);
4485 c.AddPath(tmp2, ptClip, true);
4486 }
4487 }
4488 c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
4489 }
4490 //------------------------------------------------------------------------------
4491
4492 void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution)
4493 {
4494 Minkowski(poly1, poly2, solution, false, true);
4495 Clipper c;
4496 c.AddPaths(solution, ptSubject, true);
4497 c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
4498 }
4499 //------------------------------------------------------------------------------
4500
4501 enum NodeType {ntAny, ntOpen, ntClosed};
4502
4503 void AddPolyNodeToPaths(const PolyNode& polynode, NodeType nodetype, Paths& paths)
4504 {
4505 bool match = true;
4506 if (nodetype == ntClosed) match = !polynode.IsOpen();
4507 else if (nodetype == ntOpen) return;
4508
4509 if (!polynode.Contour.empty() && match)
4510 paths.push_back(polynode.Contour);
4511 for (int i = 0; i < polynode.ChildCount(); ++i)
4512 AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths);
4513 }
4514 //------------------------------------------------------------------------------
4515
4516 void PolyTreeToPaths(const PolyTree& polytree, Paths& paths)
4517 {
4518 paths.resize(0);
4519 paths.reserve(polytree.Total());
4520 AddPolyNodeToPaths(polytree, ntAny, paths);
4521 }
4522 //------------------------------------------------------------------------------
4523
4524 void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths)
4525 {
4526 paths.resize(0);
4527 paths.reserve(polytree.Total());
4528 AddPolyNodeToPaths(polytree, ntClosed, paths);
4529 }
4530 //------------------------------------------------------------------------------
4531
4532 void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths)
4533 {
4534 paths.resize(0);
4535 paths.reserve(polytree.Total());
4536 //Open paths are top level only, so ...
4537 for (int i = 0; i < polytree.ChildCount(); ++i)
4538 if (polytree.Childs[i]->IsOpen())
4539 paths.push_back(polytree.Childs[i]->Contour);
4540 }
4541 //------------------------------------------------------------------------------
4542
4543 std::ostream& operator <<(std::ostream &s, const IntPoint &p)
4544 {
4545 s << "(" << p.X << "," << p.Y << ")";
4546 return s;
4547 }
4548 //------------------------------------------------------------------------------
4549
4550 std::ostream& operator <<(std::ostream &s, const Path &p)
4551 {
4552 if (p.empty()) return s;
4553 Path::size_type last = p.size() -1;
4554 for (Path::size_type i = 0; i < last; i++)
4555 s << "(" << p[i].X << "," << p[i].Y << "), ";
4556 s << "(" << p[last].X << "," << p[last].Y << ")\n";
4557 return s;
4558 }
4559 //------------------------------------------------------------------------------
4560
4561 std::ostream& operator <<(std::ostream &s, const Paths &p)
4562 {
4563 for (Paths::size_type i = 0; i < p.size(); i++)
4564 s << p[i];
4565 s << "\n";
4566 return s;
4567 }
4568 //------------------------------------------------------------------------------
4569
4570 } //ClipperLib namespace
0 /*******************************************************************************
1 * *
2 * Author : Angus Johnson *
3 * Version : 6.2.9 *
4 * Date : 16 February 2015 *
5 * Website : http://www.angusj.com *
6 * Copyright : Angus Johnson 2010-2015 *
7 * *
8 * License: *
9 * Use, modification & distribution is subject to Boost Software License Ver 1. *
10 * http://www.boost.org/LICENSE_1_0.txt *
11 * *
12 * Attributions: *
13 * The code in this library is an extension of Bala Vatti's clipping algorithm: *
14 * "A generic solution to polygon clipping" *
15 * Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. *
16 * http://portal.acm.org/citation.cfm?id=129906 *
17 * *
18 * Computer graphics and geometric modeling: implementation and algorithms *
19 * By Max K. Agoston *
20 * Springer; 1 edition (January 4, 2005) *
21 * http://books.google.com/books?q=vatti+clipping+agoston *
22 * *
23 * See also: *
24 * "Polygon Offsetting by Computing Winding Numbers" *
25 * Paper no. DETC2005-85513 pp. 565-575 *
26 * ASME 2005 International Design Engineering Technical Conferences *
27 * and Computers and Information in Engineering Conference (IDETC/CIE2005) *
28 * September 24-28, 2005 , Long Beach, California, USA *
29 * http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf *
30 * *
31 *******************************************************************************/
32
33 #ifndef clipper_hpp
34 #define clipper_hpp
35
36 #define CLIPPER_VERSION "6.2.6"
37
38 //use_int32: When enabled 32bit ints are used instead of 64bit ints. This
39 //improve performance but coordinate values are limited to the range +/- 46340
40 //#define use_int32
41
42 //use_xyz: adds a Z member to IntPoint. Adds a minor cost to perfomance.
43 //#define use_xyz
44
45 //use_lines: Enables line clipping. Adds a very minor cost to performance.
46 #define use_lines
47
48 //use_deprecated: Enables temporary support for the obsolete functions
49 //#define use_deprecated
50
51 #include <vector>
52 #include <list>
53 #include <set>
54 #include <stdexcept>
55 #include <cstring>
56 #include <cstdlib>
57 #include <ostream>
58 #include <functional>
59 #include <queue>
60
61 namespace ClipperLib {
62
63 enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor };
64 enum PolyType { ptSubject, ptClip };
65 //By far the most widely used winding rules for polygon filling are
66 //EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32)
67 //Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL)
68 //see http://glprogramming.com/red/chapter11.html
69 enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative };
70
71 #ifdef use_int32
72 typedef int cInt;
73 static cInt const loRange = 0x7FFF;
74 static cInt const hiRange = 0x7FFF;
75 #else
76 typedef signed long long cInt;
77 static cInt const loRange = 0x3FFFFFFF;
78 static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL;
79 typedef signed long long long64; //used by Int128 class
80 typedef unsigned long long ulong64;
81
82 #endif
83
84 struct IntPoint {
85 cInt X;
86 cInt Y;
87 #ifdef use_xyz
88 cInt Z;
89 IntPoint(cInt x = 0, cInt y = 0, cInt z = 0): X(x), Y(y), Z(z) {};
90 #else
91 IntPoint(cInt x = 0, cInt y = 0): X(x), Y(y) {};
92 #endif
93
94 friend inline bool operator== (const IntPoint& a, const IntPoint& b)
95 {
96 return a.X == b.X && a.Y == b.Y;
97 }
98 friend inline bool operator!= (const IntPoint& a, const IntPoint& b)
99 {
100 return a.X != b.X || a.Y != b.Y;
101 }
102 };
103 //------------------------------------------------------------------------------
104
105 typedef std::vector< IntPoint > Path;
106 typedef std::vector< Path > Paths;
107
108 inline Path& operator <<(Path& poly, const IntPoint& p) {poly.push_back(p); return poly;}
109 inline Paths& operator <<(Paths& polys, const Path& p) {polys.push_back(p); return polys;}
110
111 std::ostream& operator <<(std::ostream &s, const IntPoint &p);
112 std::ostream& operator <<(std::ostream &s, const Path &p);
113 std::ostream& operator <<(std::ostream &s, const Paths &p);
114
115 struct DoublePoint
116 {
117 double X;
118 double Y;
119 DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {}
120 DoublePoint(IntPoint ip) : X((double)ip.X), Y((double)ip.Y) {}
121 };
122 //------------------------------------------------------------------------------
123
124 #ifdef use_xyz
125 typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt);
126 #endif
127
128 enum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4};
129 enum JoinType {jtSquare, jtRound, jtMiter};
130 enum EndType {etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound};
131
132 class PolyNode;
133 typedef std::vector< PolyNode* > PolyNodes;
134
135 class PolyNode
136 {
137 public:
138 PolyNode();
139 virtual ~PolyNode(){};
140 Path Contour;
141 PolyNodes Childs;
142 PolyNode* Parent;
143 PolyNode* GetNext() const;
144 bool IsHole() const;
145 bool IsOpen() const;
146 int ChildCount() const;
147 private:
148 unsigned Index; //node index in Parent.Childs
149 bool m_IsOpen;
150 JoinType m_jointype;
151 EndType m_endtype;
152 PolyNode* GetNextSiblingUp() const;
153 void AddChild(PolyNode& child);
154 friend class Clipper; //to access Index
155 friend class ClipperOffset;
156 };
157
158 class PolyTree: public PolyNode
159 {
160 public:
161 ~PolyTree(){Clear();};
162 PolyNode* GetFirst() const;
163 void Clear();
164 int Total() const;
165 private:
166 PolyNodes AllNodes;
167 friend class Clipper; //to access AllNodes
168 };
169
170 bool Orientation(const Path &poly);
171 double Area(const Path &poly);
172 int PointInPolygon(const IntPoint &pt, const Path &path);
173
174 void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
175 void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
176 void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd);
177
178 void CleanPolygon(const Path& in_poly, Path& out_poly, double distance = 1.415);
179 void CleanPolygon(Path& poly, double distance = 1.415);
180 void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1.415);
181 void CleanPolygons(Paths& polys, double distance = 1.415);
182
183 void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed);
184 void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed);
185 void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution);
186
187 void PolyTreeToPaths(const PolyTree& polytree, Paths& paths);
188 void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths);
189 void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths);
190
191 void ReversePath(Path& p);
192 void ReversePaths(Paths& p);
193
194 struct IntRect { cInt left; cInt top; cInt right; cInt bottom; };
195
196 //enums that are used internally ...
197 enum EdgeSide { esLeft = 1, esRight = 2};
198
199 //forward declarations (for stuff used internally) ...
200 struct TEdge;
201 struct IntersectNode;
202 struct LocalMinimum;
203 struct OutPt;
204 struct OutRec;
205 struct Join;
206
207 typedef std::vector < OutRec* > PolyOutList;
208 typedef std::vector < TEdge* > EdgeList;
209 typedef std::vector < Join* > JoinList;
210 typedef std::vector < IntersectNode* > IntersectList;
211
212 //------------------------------------------------------------------------------
213
214 //ClipperBase is the ancestor to the Clipper class. It should not be
215 //instantiated directly. This class simply abstracts the conversion of sets of
216 //polygon coordinates into edge objects that are stored in a LocalMinima list.
217 class ClipperBase
218 {
219 public:
220 ClipperBase();
221 virtual ~ClipperBase();
222 bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed);
223 bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed);
224 virtual void Clear();
225 IntRect GetBounds();
226 bool PreserveCollinear() const {return m_PreserveCollinear;};
227 void PreserveCollinear(bool value) {m_PreserveCollinear = value;};
228 protected:
229 void DisposeLocalMinimaList();
230 TEdge* AddBoundsToLML(TEdge *e, bool IsClosed);
231 void PopLocalMinima();
232 virtual void Reset();
233 TEdge* ProcessBound(TEdge* E, bool IsClockwise);
234 TEdge* DescendToMin(TEdge *&E);
235 void AscendToMax(TEdge *&E, bool Appending, bool IsClosed);
236
237 typedef std::vector<LocalMinimum> MinimaList;
238 MinimaList::iterator m_CurrentLM;
239 MinimaList m_MinimaList;
240
241 bool m_UseFullRange;
242 EdgeList m_edges;
243 bool m_PreserveCollinear;
244 bool m_HasOpenPaths;
245 };
246 //------------------------------------------------------------------------------
247
248 class Clipper : public virtual ClipperBase
249 {
250 public:
251 Clipper(int initOptions = 0);
252 ~Clipper();
253 bool Execute(ClipType clipType,
254 Paths &solution,
255 PolyFillType fillType = pftEvenOdd);
256 bool Execute(ClipType clipType,
257 Paths &solution,
258 PolyFillType subjFillType,
259 PolyFillType clipFillType);
260 bool Execute(ClipType clipType,
261 PolyTree &polytree,
262 PolyFillType fillType = pftEvenOdd);
263 bool Execute(ClipType clipType,
264 PolyTree &polytree,
265 PolyFillType subjFillType,
266 PolyFillType clipFillType);
267 bool ReverseSolution() const { return m_ReverseOutput; };
268 void ReverseSolution(bool value) {m_ReverseOutput = value;};
269 bool StrictlySimple() const {return m_StrictSimple;};
270 void StrictlySimple(bool value) {m_StrictSimple = value;};
271 //set the callback function for z value filling on intersections (otherwise Z is 0)
272 #ifdef use_xyz
273 void ZFillFunction(ZFillCallback zFillFunc);
274 #endif
275 protected:
276 void Reset();
277 virtual bool ExecuteInternal();
278 private:
279 PolyOutList m_PolyOuts;
280 JoinList m_Joins;
281 JoinList m_GhostJoins;
282 IntersectList m_IntersectList;
283 ClipType m_ClipType;
284 typedef std::priority_queue<cInt> ScanbeamList;
285 ScanbeamList m_Scanbeam;
286 typedef std::list<cInt> MaximaList;
287 MaximaList m_Maxima;
288 TEdge *m_ActiveEdges;
289 TEdge *m_SortedEdges;
290 bool m_ExecuteLocked;
291 PolyFillType m_ClipFillType;
292 PolyFillType m_SubjFillType;
293 bool m_ReverseOutput;
294 bool m_UsingPolyTree;
295 bool m_StrictSimple;
296 #ifdef use_xyz
297 ZFillCallback m_ZFill; //custom callback
298 #endif
299 void SetWindingCount(TEdge& edge) const;
300 bool IsEvenOddFillType(const TEdge& edge) const;
301 bool IsEvenOddAltFillType(const TEdge& edge) const;
302 void InsertScanbeam(const cInt Y);
303 cInt PopScanbeam();
304 void InsertLocalMinimaIntoAEL(const cInt botY);
305 void InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge);
306 void AddEdgeToSEL(TEdge *edge);
307 void CopyAELToSEL();
308 void DeleteFromSEL(TEdge *e);
309 void DeleteFromAEL(TEdge *e);
310 void UpdateEdgeIntoAEL(TEdge *&e);
311 void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2);
312 bool IsContributing(const TEdge& edge) const;
313 bool IsTopHorz(const cInt XPos);
314 void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2);
315 void DoMaxima(TEdge *e);
316 void ProcessHorizontals();
317 void ProcessHorizontal(TEdge *horzEdge);
318 void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt);
319 OutPt* AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt);
320 OutRec* GetOutRec(int idx);
321 void AppendPolygon(TEdge *e1, TEdge *e2) const;
322 void IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &pt);
323 OutRec* CreateOutRec();
324 OutPt* AddOutPt(TEdge *e, const IntPoint &pt);
325 OutPt* GetLastOutPt(TEdge *e);
326 void DisposeAllOutRecs();
327 void DisposeOutRec(PolyOutList::size_type index);
328 bool ProcessIntersections(const cInt topY);
329 void BuildIntersectList(const cInt topY);
330 void ProcessIntersectList();
331 void ProcessEdgesAtTopOfScanbeam(const cInt topY);
332 void BuildResult(Paths& polys);
333 void BuildResult2(PolyTree& polytree);
334 void SetHoleState(TEdge *e, OutRec *outrec) const;
335 void DisposeIntersectNodes();
336 bool FixupIntersectionOrder();
337 void FixupOutPolygon(OutRec &outrec);
338 void FixupOutPolyline(OutRec &outrec);
339 bool IsHole(TEdge *e);
340 bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl);
341 void FixHoleLinkage(OutRec &outrec);
342 void AddJoin(OutPt *op1, OutPt *op2, const IntPoint &offPt);
343 void ClearJoins();
344 void ClearGhostJoins();
345 void AddGhostJoin(OutPt *op, const IntPoint &offPt);
346 bool JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2);
347 void JoinCommonEdges();
348 void DoSimplePolygons();
349 void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) const;
350 void FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) const;
351 #ifdef use_xyz
352 void SetZ(IntPoint& pt, TEdge& e1, TEdge& e2);
353 #endif
354 };
355 //------------------------------------------------------------------------------
356
357 class ClipperOffset
358 {
359 public:
360 ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25);
361 ~ClipperOffset();
362 void AddPath(const Path& path, JoinType joinType, EndType endType);
363 void AddPaths(const Paths& paths, JoinType joinType, EndType endType);
364 void Execute(Paths& solution, double delta);
365 void Execute(PolyTree& solution, double delta);
366 void Clear();
367 double MiterLimit;
368 double ArcTolerance;
369 private:
370 Paths m_destPolys;
371 Path m_srcPoly;
372 Path m_destPoly;
373 std::vector<DoublePoint> m_normals;
374 double m_delta, m_sinA, m_sin, m_cos;
375 double m_miterLim, m_StepsPerRad;
376 IntPoint m_lowest;
377 PolyNode m_polyNodes;
378
379 void FixOrientations();
380 void DoOffset(double delta);
381 void OffsetPoint(int j, int& k, JoinType jointype);
382 void DoSquare(int j, int k);
383 void DoMiter(int j, int k, double r);
384 void DoRound(int j, int k);
385 };
386 //------------------------------------------------------------------------------
387
388 class clipperException : public std::exception
389 {
390 public:
391 clipperException(const char* description): m_descr(description) {}
392 virtual ~clipperException() throw() {}
393 virtual const char* what() const throw() {return m_descr.c_str();}
394 private:
395 std::string m_descr;
396 };
397 //------------------------------------------------------------------------------
398
399 } //ClipperLib namespace
400
401 #endif //clipper_hpp
402
403
0 The OpenGL Extension Wrangler Library
1 Copyright (C) 2002-2007, Milan Ikits <milan ikits[]ieee org>
2 Copyright (C) 2002-2007, Marcelo E. Magallon <mmagallo[]debian org>
3 Copyright (C) 2002, Lev Povalahev
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9 * Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11 * Redistributions in binary form must reproduce the above copyright notice,
12 this list of conditions and the following disclaimer in the documentation
13 and/or other materials provided with the distribution.
14 * The name of the author may be used to endorse or promote products
15 derived from this software without specific prior written permission.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27 THE POSSIBILITY OF SUCH DAMAGE.
28
29
30 Mesa 3-D graphics library
31 Version: 7.0
32
33 Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
34
35 Permission is hereby granted, free of charge, to any person obtaining a
36 copy of this software and associated documentation files (the "Software"),
37 to deal in the Software without restriction, including without limitation
38 the rights to use, copy, modify, merge, publish, distribute, sublicense,
39 and/or sell copies of the Software, and to permit persons to whom the
40 Software is furnished to do so, subject to the following conditions:
41
42 The above copyright notice and this permission notice shall be included
43 in all copies or substantial portions of the Software.
44
45 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
46 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
47 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
48 BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
49 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
50 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
51
52
53 Copyright (c) 2007 The Khronos Group Inc.
54
55 Permission is hereby granted, free of charge, to any person obtaining a
56 copy of this software and/or associated documentation files (the
57 "Materials"), to deal in the Materials without restriction, including
58 without limitation the rights to use, copy, modify, merge, publish,
59 distribute, sublicense, and/or sell copies of the Materials, and to
60 permit persons to whom the Materials are furnished to do so, subject to
61 the following conditions:
62
63 The above copyright notice and this permission notice shall be included
64 in all copies or substantial portions of the Materials.
65
66 THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
67 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
68 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
69 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
70 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
71 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
72 MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
0 THIS IS NOT THE COMPLETE GLEW DISTRIBUTION. ONLY FILES NEEDED FOR COMPILING GLEW INTO SLIC3R WERE PUT INTO THE SLIC3R SOURCE DISTRIBUTION.
1
2 # GLEW - The OpenGL Extension Wrangler Library
3
4 ![](http://glew.sourceforge.net/glew.png)
5
6 http://glew.sourceforge.net/
7
8 https://github.com/nigels-com/glew
9
10 [![Build Status](https://travis-ci.org/nigels-com/glew.svg?branch=master)](https://travis-ci.org/nigels-com/glew)
11 [![Gitter](https://badges.gitter.im/nigels-com/glew.svg)](https://gitter.im/nigels-com/glew?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
12 [![Download](https://img.shields.io/sourceforge/dm/glew.svg)](https://sourceforge.net/projects/glew/files/latest/download)
13
14 ## Downloads
15
16 Current release is [2.0.0](https://sourceforge.net/projects/glew/files/glew/2.0.0/).
17 [(Change Log)](http://glew.sourceforge.net/log.html)
18
19 Sources available as
20 [ZIP](https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.zip/download) or
21 [TGZ](https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.tgz/download).
22
23 Windows binaries for [32-bit and 64-bit](https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0-win32.zip/download).
24
25 ### Recent snapshots
26
27 Snapshots may contain new features, bug-fixes or new OpenGL extensions ahead of tested, official releases.
28
29 [glew-20160708.tgz](http://sourceforge.net/projects/glew/files/glew/snapshots/glew-20160708.tgz/download)
30 *GLEW 2.0.0 RC: Core context, EGL support, no MX*
31
32 [glew-20160402.tgz](http://sourceforge.net/projects/glew/files/glew/snapshots/glew-20160402.tgz/download)
33 *GLEW 2.0.0 RC: Core context, EGL support, no MX*
34
35 ## Build
36
37 From a downloaded tarball or zip archive:
38
39 ### Linux and Mac
40
41 #### Using GNU Make
42
43 ##### Install build tools
44
45 Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev libosmesa-dev git`
46
47 RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel git`
48
49 ##### Build
50
51 $ make
52 $ sudo make install
53 $ make clean
54
55 Targets: `all, glew.lib, glew.bin, clean, install, uninstall`
56
57 Variables: `SYSTEM=linux-clang, GLEW_DEST=/usr/local, STRIP=`
58
59 #### Using cmake
60
61 *CMake 2.8.12 or higher is required.*
62
63 ##### Install build tools
64
65 Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libXmu-dev libXi-dev libgl-dev git cmake`
66
67 RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel git cmake`
68
69 ##### Build
70
71 $ cd build
72 $ cmake ./cmake
73 $ make -j4
74
75 | Target | Description |
76 | ---------- | ----------- |
77 | glew | Build the glew shared library. |
78 | glew_s | Build the glew static library. |
79 | glewinfo | Build the `glewinfo` executable (requires `BUILD_UTILS` to be `ON`). |
80 | visualinfo | Build the `visualinfo` executable (requires `BUILD_UTILS` to be `ON`). |
81 | install | Install all enabled targets into `CMAKE_INSTALL_PREFIX`. |
82 | clean | Clean up build artifacts. |
83 | all | Build all enabled targets (default target). |
84
85 | Variables | Description |
86 | --------------- | ----------- |
87 | BUILD_UTILS | Build the `glewinfo` and `visualinfo` executables. |
88 | GLEW_REGAL | Build in Regal mode. |
89 | GLEW_OSMESA | Build in off-screen Mesa mode. |
90 | BUILD_FRAMEWORK | Build as MacOSX Framework. Setting `CMAKE_INSTALL_PREFIX` to `/Library/Frameworks` is recommended. |
91
92 ### Windows
93
94 #### Visual Studio
95
96 Use the provided Visual Studio project file in build/vc12/
97
98 Projects for vc6 and vc10 are also provided
99
100 #### MSYS/Mingw
101
102 Available from [Mingw](http://www.mingw.org/)
103
104 Requirements: bash, make, gcc
105
106 $ mingw32-make
107 $ mingw32-make install
108 $ mingw32-make install.all
109
110 Alternative toolchain: `SYSTEM=mingw-win32`
111
112 #### MSYS2/Mingw-w64
113
114 Available from [Msys2](http://msys2.github.io/) and/or [Mingw-w64](http://mingw-w64.org/)
115
116 Requirements: bash, make, gcc
117
118 $ pacman -S gcc make mingw-w64-i686-gcc mingw-w64-x86_64-gcc
119 $ make
120 $ make install
121 $ make install.all
122
123 Alternative toolchain: `SYSTEM=msys, SYSTEM=msys-win32, SYSTEM=msys-win64`
124
125 ## glewinfo
126
127 `glewinfo` is a command-line tool useful for inspecting the capabilities of an
128 OpenGL implementation and GLEW support for that. Please include the output of
129 `glewinfo` with bug reports, as appropriate.
130
131 ---------------------------
132 GLEW Extension Info
133 ---------------------------
134
135 GLEW version 2.0.0
136 Reporting capabilities of pixelformat 3
137 Running on a Intel(R) HD Graphics 3000 from Intel
138 OpenGL version 3.1.0 - Build 9.17.10.4229 is supported
139
140 GL_VERSION_1_1: OK
141 ---------------
142
143 GL_VERSION_1_2: OK
144 ---------------
145 glCopyTexSubImage3D: OK
146 glDrawRangeElements: OK
147 glTexImage3D: OK
148 glTexSubImage3D: OK
149
150 ...
151
152 ## Code Generation
153
154 A Unix or Mac environment is neded for building GLEW from scratch to
155 include new extensions, or customize the code generation. The extension
156 data is regenerated from the top level source directory with:
157
158 make extensions
159
160 An alternative to generating the GLEW sources from scratch is to
161 download a pre-generated (unsupported) snapshot:
162
163 https://sourceforge.net/projects/glew/files/glew/snapshots/
164
165 Travis-built snapshots are also available:
166
167 https://glew.s3.amazonaws.com/index.html
168
169 ## Authors
170
171 GLEW is currently maintained by [Nigel Stewart](https://github.com/nigels-com)
172 with bug fixes, new OpenGL extension support and new releases.
173
174 GLEW was developed by [Milan Ikits](http://www.cs.utah.edu/~ikits/)
175 and [Marcelo Magallon](http://wwwvis.informatik.uni-stuttgart.de/~magallon/).
176 Aaron Lefohn, Joe Kniss, and Chris Wyman were the first users and also
177 assisted with the design and debugging process.
178
179 The acronym GLEW originates from Aaron Lefohn.
180 Pasi K&auml;rkk&auml;inen identified and fixed several problems with
181 GLX and SDL. Nate Robins created the `wglinfo` utility, to
182 which modifications were made by Michael Wimmer.
183
184 ## Copyright and Licensing
185
186 GLEW is originally derived from the EXTGL project by Lev Povalahev.
187 The source code is licensed under the
188 [Modified BSD License](http://glew.sourceforge.net/glew.txt), the
189 [Mesa 3-D License](http://glew.sourceforge.net/mesa.txt) (MIT) and the
190 [Khronos License](http://glew.sourceforge.net/khronos.txt) (MIT).
191
192 The automatic code generation scripts are released under the
193 [GNU GPL](http://glew.sourceforge.net/gpl.txt).
0 /*
1 ** The OpenGL Extension Wrangler Library
2 ** Copyright (C) 2008-2015, Nigel Stewart <nigels[]users sourceforge net>
3 ** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
4 ** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
5 ** Copyright (C) 2002, Lev Povalahev
6 ** All rights reserved.
7 **
8 ** Redistribution and use in source and binary forms, with or without
9 ** modification, are permitted provided that the following conditions are met:
10 **
11 ** * Redistributions of source code must retain the above copyright notice,
12 ** this list of conditions and the following disclaimer.
13 ** * Redistributions in binary form must reproduce the above copyright notice,
14 ** this list of conditions and the following disclaimer in the documentation
15 ** and/or other materials provided with the distribution.
16 ** * The name of the author may be used to endorse or promote products
17 ** derived from this software without specific prior written permission.
18 **
19 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29 ** THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 /*
33 * Mesa 3-D graphics library
34 * Version: 7.0
35 *
36 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
37 *
38 * Permission is hereby granted, free of charge, to any person obtaining a
39 * copy of this software and associated documentation files (the "Software"),
40 * to deal in the Software without restriction, including without limitation
41 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
42 * and/or sell copies of the Software, and to permit persons to whom the
43 * Software is furnished to do so, subject to the following conditions:
44 *
45 * The above copyright notice and this permission notice shall be included
46 * in all copies or substantial portions of the Software.
47 *
48 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
49 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
50 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
51 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
52 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
54 */
55
56 /*
57 ** Copyright (c) 2007 The Khronos Group Inc.
58 **
59 ** Permission is hereby granted, free of charge, to any person obtaining a
60 ** copy of this software and/or associated documentation files (the
61 ** "Materials"), to deal in the Materials without restriction, including
62 ** without limitation the rights to use, copy, modify, merge, publish,
63 ** distribute, sublicense, and/or sell copies of the Materials, and to
64 ** permit persons to whom the Materials are furnished to do so, subject to
65 ** the following conditions:
66 **
67 ** The above copyright notice and this permission notice shall be included
68 ** in all copies or substantial portions of the Materials.
69 **
70 ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
71 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
72 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
73 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
74 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
75 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
76 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
77 */
78
79 #ifndef __glew_h__
80 #define __glew_h__
81 #define __GLEW_H__
82
83 #if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H)
84 #error gl.h included before glew.h
85 #endif
86 #if defined(__gl2_h_)
87 #error gl2.h included before glew.h
88 #endif
89 #if defined(__gltypes_h_)
90 #error gltypes.h included before glew.h
91 #endif
92 #if defined(__REGAL_H__)
93 #error Regal.h included before glew.h
94 #endif
95 #if defined(__glext_h_) || defined(__GLEXT_H_)
96 #error glext.h included before glew.h
97 #endif
98 #if defined(__gl_ATI_h_)
99 #error glATI.h included before glew.h
100 #endif
101
102 #define __gl_h_
103 #define __gl2_h_
104 #define __GL_H__
105 #define _GL_H
106 #define __gltypes_h_
107 #define __REGAL_H__
108 #define __X_GL_H
109 #define __glext_h_
110 #define __GLEXT_H_
111 #define __gl_ATI_h_
112
113 #if defined(_WIN32)
114
115 /*
116 * GLEW does not include <windows.h> to avoid name space pollution.
117 * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t
118 * defined properly.
119 */
120 /* <windef.h> and <gl.h>*/
121 #ifdef APIENTRY
122 # ifndef GLAPIENTRY
123 # define GLAPIENTRY APIENTRY
124 # endif
125 # ifndef GLEWAPIENTRY
126 # define GLEWAPIENTRY APIENTRY
127 # endif
128 #else
129 #define GLEW_APIENTRY_DEFINED
130 # if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__)
131 # define APIENTRY __stdcall
132 # ifndef GLAPIENTRY
133 # define GLAPIENTRY __stdcall
134 # endif
135 # ifndef GLEWAPIENTRY
136 # define GLEWAPIENTRY __stdcall
137 # endif
138 # else
139 # define APIENTRY
140 # endif
141 #endif
142 #ifndef GLAPI
143 # if defined(__MINGW32__) || defined(__CYGWIN__)
144 # define GLAPI extern
145 # endif
146 #endif
147 /* <winnt.h> */
148 #ifndef CALLBACK
149 #define GLEW_CALLBACK_DEFINED
150 # if defined(__MINGW32__) || defined(__CYGWIN__)
151 # define CALLBACK __attribute__ ((__stdcall__))
152 # elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
153 # define CALLBACK __stdcall
154 # else
155 # define CALLBACK
156 # endif
157 #endif
158 /* <wingdi.h> and <winnt.h> */
159 #ifndef WINGDIAPI
160 #define GLEW_WINGDIAPI_DEFINED
161 #define WINGDIAPI __declspec(dllimport)
162 #endif
163 /* <ctype.h> */
164 #if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED)
165 typedef unsigned short wchar_t;
166 # define _WCHAR_T_DEFINED
167 #endif
168 /* <stddef.h> */
169 #if !defined(_W64)
170 # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300
171 # define _W64 __w64
172 # else
173 # define _W64
174 # endif
175 #endif
176 #if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__)
177 # ifdef _WIN64
178 typedef __int64 ptrdiff_t;
179 # else
180 typedef _W64 int ptrdiff_t;
181 # endif
182 # define _PTRDIFF_T_DEFINED
183 # define _PTRDIFF_T_
184 #endif
185
186 #ifndef GLAPI
187 # if defined(__MINGW32__) || defined(__CYGWIN__)
188 # define GLAPI extern
189 # else
190 # define GLAPI WINGDIAPI
191 # endif
192 #endif
193
194 /*
195 * GLEW_STATIC is defined for static library.
196 * GLEW_BUILD is defined for building the DLL library.
197 */
198
199 #ifdef GLEW_STATIC
200 # define GLEWAPI extern
201 #else
202 # ifdef GLEW_BUILD
203 # define GLEWAPI extern __declspec(dllexport)
204 # else
205 # define GLEWAPI extern __declspec(dllimport)
206 # endif
207 #endif
208
209 #else /* _UNIX */
210
211 /*
212 * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO
213 * C. On my system, this amounts to _3 lines_ of included code, all of
214 * them pretty much harmless. If you know of a way of detecting 32 vs
215 * 64 _targets_ at compile time you are free to replace this with
216 * something that's portable. For now, _this_ is the portable solution.
217 * (mem, 2004-01-04)
218 */
219
220 #include <stddef.h>
221
222 /* SGI MIPSPro doesn't like stdint.h in C++ mode */
223 /* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */
224
225 #if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__)
226 #include <inttypes.h>
227 #else
228 #include <stdint.h>
229 #endif
230
231 #define GLEW_APIENTRY_DEFINED
232 #define APIENTRY
233
234 /*
235 * GLEW_STATIC is defined for static library.
236 */
237
238 #ifdef GLEW_STATIC
239 # define GLEWAPI extern
240 #else
241 # if defined(__GNUC__) && __GNUC__>=4
242 # define GLEWAPI extern __attribute__ ((visibility("default")))
243 # elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
244 # define GLEWAPI extern __global
245 # else
246 # define GLEWAPI extern
247 # endif
248 #endif
249
250 /* <glu.h> */
251 #ifndef GLAPI
252 #define GLAPI extern
253 #endif
254
255 #endif /* _WIN32 */
256
257 #ifndef GLAPIENTRY
258 #define GLAPIENTRY
259 #endif
260
261 #ifndef GLEWAPIENTRY
262 #define GLEWAPIENTRY
263 #endif
264
265 #ifdef __cplusplus
266 extern "C" {
267 #endif
268
269 /* ----------------------------- GL_VERSION_1_1 ---------------------------- */
270
271 #ifndef GL_VERSION_1_1
272 #define GL_VERSION_1_1 1
273
274 typedef unsigned int GLenum;
275 typedef unsigned int GLbitfield;
276 typedef unsigned int GLuint;
277 typedef int GLint;
278 typedef int GLsizei;
279 typedef unsigned char GLboolean;
280 typedef signed char GLbyte;
281 typedef short GLshort;
282 typedef unsigned char GLubyte;
283 typedef unsigned short GLushort;
284 typedef unsigned long GLulong;
285 typedef float GLfloat;
286 typedef float GLclampf;
287 typedef double GLdouble;
288 typedef double GLclampd;
289 typedef void GLvoid;
290 #if defined(_MSC_VER) && _MSC_VER < 1400
291 typedef __int64 GLint64EXT;
292 typedef unsigned __int64 GLuint64EXT;
293 #elif defined(_MSC_VER) || defined(__BORLANDC__)
294 typedef signed long long GLint64EXT;
295 typedef unsigned long long GLuint64EXT;
296 #else
297 # if defined(__MINGW32__) || defined(__CYGWIN__)
298 #include <inttypes.h>
299 # endif
300 typedef int64_t GLint64EXT;
301 typedef uint64_t GLuint64EXT;
302 #endif
303 typedef GLint64EXT GLint64;
304 typedef GLuint64EXT GLuint64;
305 typedef struct __GLsync *GLsync;
306
307 typedef char GLchar;
308
309 #define GL_ZERO 0
310 #define GL_FALSE 0
311 #define GL_LOGIC_OP 0x0BF1
312 #define GL_NONE 0
313 #define GL_TEXTURE_COMPONENTS 0x1003
314 #define GL_NO_ERROR 0
315 #define GL_POINTS 0x0000
316 #define GL_CURRENT_BIT 0x00000001
317 #define GL_TRUE 1
318 #define GL_ONE 1
319 #define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
320 #define GL_LINES 0x0001
321 #define GL_LINE_LOOP 0x0002
322 #define GL_POINT_BIT 0x00000002
323 #define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
324 #define GL_LINE_STRIP 0x0003
325 #define GL_LINE_BIT 0x00000004
326 #define GL_TRIANGLES 0x0004
327 #define GL_TRIANGLE_STRIP 0x0005
328 #define GL_TRIANGLE_FAN 0x0006
329 #define GL_QUADS 0x0007
330 #define GL_QUAD_STRIP 0x0008
331 #define GL_POLYGON_BIT 0x00000008
332 #define GL_POLYGON 0x0009
333 #define GL_POLYGON_STIPPLE_BIT 0x00000010
334 #define GL_PIXEL_MODE_BIT 0x00000020
335 #define GL_LIGHTING_BIT 0x00000040
336 #define GL_FOG_BIT 0x00000080
337 #define GL_DEPTH_BUFFER_BIT 0x00000100
338 #define GL_ACCUM 0x0100
339 #define GL_LOAD 0x0101
340 #define GL_RETURN 0x0102
341 #define GL_MULT 0x0103
342 #define GL_ADD 0x0104
343 #define GL_NEVER 0x0200
344 #define GL_ACCUM_BUFFER_BIT 0x00000200
345 #define GL_LESS 0x0201
346 #define GL_EQUAL 0x0202
347 #define GL_LEQUAL 0x0203
348 #define GL_GREATER 0x0204
349 #define GL_NOTEQUAL 0x0205
350 #define GL_GEQUAL 0x0206
351 #define GL_ALWAYS 0x0207
352 #define GL_SRC_COLOR 0x0300
353 #define GL_ONE_MINUS_SRC_COLOR 0x0301
354 #define GL_SRC_ALPHA 0x0302
355 #define GL_ONE_MINUS_SRC_ALPHA 0x0303
356 #define GL_DST_ALPHA 0x0304
357 #define GL_ONE_MINUS_DST_ALPHA 0x0305
358 #define GL_DST_COLOR 0x0306
359 #define GL_ONE_MINUS_DST_COLOR 0x0307
360 #define GL_SRC_ALPHA_SATURATE 0x0308
361 #define GL_STENCIL_BUFFER_BIT 0x00000400
362 #define GL_FRONT_LEFT 0x0400
363 #define GL_FRONT_RIGHT 0x0401
364 #define GL_BACK_LEFT 0x0402
365 #define GL_BACK_RIGHT 0x0403
366 #define GL_FRONT 0x0404
367 #define GL_BACK 0x0405
368 #define GL_LEFT 0x0406
369 #define GL_RIGHT 0x0407
370 #define GL_FRONT_AND_BACK 0x0408
371 #define GL_AUX0 0x0409
372 #define GL_AUX1 0x040A
373 #define GL_AUX2 0x040B
374 #define GL_AUX3 0x040C
375 #define GL_INVALID_ENUM 0x0500
376 #define GL_INVALID_VALUE 0x0501
377 #define GL_INVALID_OPERATION 0x0502
378 #define GL_STACK_OVERFLOW 0x0503
379 #define GL_STACK_UNDERFLOW 0x0504
380 #define GL_OUT_OF_MEMORY 0x0505
381 #define GL_2D 0x0600
382 #define GL_3D 0x0601
383 #define GL_3D_COLOR 0x0602
384 #define GL_3D_COLOR_TEXTURE 0x0603
385 #define GL_4D_COLOR_TEXTURE 0x0604
386 #define GL_PASS_THROUGH_TOKEN 0x0700
387 #define GL_POINT_TOKEN 0x0701
388 #define GL_LINE_TOKEN 0x0702
389 #define GL_POLYGON_TOKEN 0x0703
390 #define GL_BITMAP_TOKEN 0x0704
391 #define GL_DRAW_PIXEL_TOKEN 0x0705
392 #define GL_COPY_PIXEL_TOKEN 0x0706
393 #define GL_LINE_RESET_TOKEN 0x0707
394 #define GL_EXP 0x0800
395 #define GL_VIEWPORT_BIT 0x00000800
396 #define GL_EXP2 0x0801
397 #define GL_CW 0x0900
398 #define GL_CCW 0x0901
399 #define GL_COEFF 0x0A00
400 #define GL_ORDER 0x0A01
401 #define GL_DOMAIN 0x0A02
402 #define GL_CURRENT_COLOR 0x0B00
403 #define GL_CURRENT_INDEX 0x0B01
404 #define GL_CURRENT_NORMAL 0x0B02
405 #define GL_CURRENT_TEXTURE_COORDS 0x0B03
406 #define GL_CURRENT_RASTER_COLOR 0x0B04
407 #define GL_CURRENT_RASTER_INDEX 0x0B05
408 #define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06
409 #define GL_CURRENT_RASTER_POSITION 0x0B07
410 #define GL_CURRENT_RASTER_POSITION_VALID 0x0B08
411 #define GL_CURRENT_RASTER_DISTANCE 0x0B09
412 #define GL_POINT_SMOOTH 0x0B10
413 #define GL_POINT_SIZE 0x0B11
414 #define GL_POINT_SIZE_RANGE 0x0B12
415 #define GL_POINT_SIZE_GRANULARITY 0x0B13
416 #define GL_LINE_SMOOTH 0x0B20
417 #define GL_LINE_WIDTH 0x0B21
418 #define GL_LINE_WIDTH_RANGE 0x0B22
419 #define GL_LINE_WIDTH_GRANULARITY 0x0B23
420 #define GL_LINE_STIPPLE 0x0B24
421 #define GL_LINE_STIPPLE_PATTERN 0x0B25
422 #define GL_LINE_STIPPLE_REPEAT 0x0B26
423 #define GL_LIST_MODE 0x0B30
424 #define GL_MAX_LIST_NESTING 0x0B31
425 #define GL_LIST_BASE 0x0B32
426 #define GL_LIST_INDEX 0x0B33
427 #define GL_POLYGON_MODE 0x0B40
428 #define GL_POLYGON_SMOOTH 0x0B41
429 #define GL_POLYGON_STIPPLE 0x0B42
430 #define GL_EDGE_FLAG 0x0B43
431 #define GL_CULL_FACE 0x0B44
432 #define GL_CULL_FACE_MODE 0x0B45
433 #define GL_FRONT_FACE 0x0B46
434 #define GL_LIGHTING 0x0B50
435 #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
436 #define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
437 #define GL_LIGHT_MODEL_AMBIENT 0x0B53
438 #define GL_SHADE_MODEL 0x0B54
439 #define GL_COLOR_MATERIAL_FACE 0x0B55
440 #define GL_COLOR_MATERIAL_PARAMETER 0x0B56
441 #define GL_COLOR_MATERIAL 0x0B57
442 #define GL_FOG 0x0B60
443 #define GL_FOG_INDEX 0x0B61
444 #define GL_FOG_DENSITY 0x0B62
445 #define GL_FOG_START 0x0B63
446 #define GL_FOG_END 0x0B64
447 #define GL_FOG_MODE 0x0B65
448 #define GL_FOG_COLOR 0x0B66
449 #define GL_DEPTH_RANGE 0x0B70
450 #define GL_DEPTH_TEST 0x0B71
451 #define GL_DEPTH_WRITEMASK 0x0B72
452 #define GL_DEPTH_CLEAR_VALUE 0x0B73
453 #define GL_DEPTH_FUNC 0x0B74
454 #define GL_ACCUM_CLEAR_VALUE 0x0B80
455 #define GL_STENCIL_TEST 0x0B90
456 #define GL_STENCIL_CLEAR_VALUE 0x0B91
457 #define GL_STENCIL_FUNC 0x0B92
458 #define GL_STENCIL_VALUE_MASK 0x0B93
459 #define GL_STENCIL_FAIL 0x0B94
460 #define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
461 #define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
462 #define GL_STENCIL_REF 0x0B97
463 #define GL_STENCIL_WRITEMASK 0x0B98
464 #define GL_MATRIX_MODE 0x0BA0
465 #define GL_NORMALIZE 0x0BA1
466 #define GL_VIEWPORT 0x0BA2
467 #define GL_MODELVIEW_STACK_DEPTH 0x0BA3
468 #define GL_PROJECTION_STACK_DEPTH 0x0BA4
469 #define GL_TEXTURE_STACK_DEPTH 0x0BA5
470 #define GL_MODELVIEW_MATRIX 0x0BA6
471 #define GL_PROJECTION_MATRIX 0x0BA7
472 #define GL_TEXTURE_MATRIX 0x0BA8
473 #define GL_ATTRIB_STACK_DEPTH 0x0BB0
474 #define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1
475 #define GL_ALPHA_TEST 0x0BC0
476 #define GL_ALPHA_TEST_FUNC 0x0BC1
477 #define GL_ALPHA_TEST_REF 0x0BC2
478 #define GL_DITHER 0x0BD0
479 #define GL_BLEND_DST 0x0BE0
480 #define GL_BLEND_SRC 0x0BE1
481 #define GL_BLEND 0x0BE2
482 #define GL_LOGIC_OP_MODE 0x0BF0
483 #define GL_INDEX_LOGIC_OP 0x0BF1
484 #define GL_COLOR_LOGIC_OP 0x0BF2
485 #define GL_AUX_BUFFERS 0x0C00
486 #define GL_DRAW_BUFFER 0x0C01
487 #define GL_READ_BUFFER 0x0C02
488 #define GL_SCISSOR_BOX 0x0C10
489 #define GL_SCISSOR_TEST 0x0C11
490 #define GL_INDEX_CLEAR_VALUE 0x0C20
491 #define GL_INDEX_WRITEMASK 0x0C21
492 #define GL_COLOR_CLEAR_VALUE 0x0C22
493 #define GL_COLOR_WRITEMASK 0x0C23
494 #define GL_INDEX_MODE 0x0C30
495 #define GL_RGBA_MODE 0x0C31
496 #define GL_DOUBLEBUFFER 0x0C32
497 #define GL_STEREO 0x0C33
498 #define GL_RENDER_MODE 0x0C40
499 #define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
500 #define GL_POINT_SMOOTH_HINT 0x0C51
501 #define GL_LINE_SMOOTH_HINT 0x0C52
502 #define GL_POLYGON_SMOOTH_HINT 0x0C53
503 #define GL_FOG_HINT 0x0C54
504 #define GL_TEXTURE_GEN_S 0x0C60
505 #define GL_TEXTURE_GEN_T 0x0C61
506 #define GL_TEXTURE_GEN_R 0x0C62
507 #define GL_TEXTURE_GEN_Q 0x0C63
508 #define GL_PIXEL_MAP_I_TO_I 0x0C70
509 #define GL_PIXEL_MAP_S_TO_S 0x0C71
510 #define GL_PIXEL_MAP_I_TO_R 0x0C72
511 #define GL_PIXEL_MAP_I_TO_G 0x0C73
512 #define GL_PIXEL_MAP_I_TO_B 0x0C74
513 #define GL_PIXEL_MAP_I_TO_A 0x0C75
514 #define GL_PIXEL_MAP_R_TO_R 0x0C76
515 #define GL_PIXEL_MAP_G_TO_G 0x0C77
516 #define GL_PIXEL_MAP_B_TO_B 0x0C78
517 #define GL_PIXEL_MAP_A_TO_A 0x0C79
518 #define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0
519 #define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1
520 #define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2
521 #define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3
522 #define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4
523 #define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5
524 #define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6
525 #define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7
526 #define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8
527 #define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9
528 #define GL_UNPACK_SWAP_BYTES 0x0CF0
529 #define GL_UNPACK_LSB_FIRST 0x0CF1
530 #define GL_UNPACK_ROW_LENGTH 0x0CF2
531 #define GL_UNPACK_SKIP_ROWS 0x0CF3
532 #define GL_UNPACK_SKIP_PIXELS 0x0CF4
533 #define GL_UNPACK_ALIGNMENT 0x0CF5
534 #define GL_PACK_SWAP_BYTES 0x0D00
535 #define GL_PACK_LSB_FIRST 0x0D01
536 #define GL_PACK_ROW_LENGTH 0x0D02
537 #define GL_PACK_SKIP_ROWS 0x0D03
538 #define GL_PACK_SKIP_PIXELS 0x0D04
539 #define GL_PACK_ALIGNMENT 0x0D05
540 #define GL_MAP_COLOR 0x0D10
541 #define GL_MAP_STENCIL 0x0D11
542 #define GL_INDEX_SHIFT 0x0D12
543 #define GL_INDEX_OFFSET 0x0D13
544 #define GL_RED_SCALE 0x0D14
545 #define GL_RED_BIAS 0x0D15
546 #define GL_ZOOM_X 0x0D16
547 #define GL_ZOOM_Y 0x0D17
548 #define GL_GREEN_SCALE 0x0D18
549 #define GL_GREEN_BIAS 0x0D19
550 #define GL_BLUE_SCALE 0x0D1A
551 #define GL_BLUE_BIAS 0x0D1B
552 #define GL_ALPHA_SCALE 0x0D1C
553 #define GL_ALPHA_BIAS 0x0D1D
554 #define GL_DEPTH_SCALE 0x0D1E
555 #define GL_DEPTH_BIAS 0x0D1F
556 #define GL_MAX_EVAL_ORDER 0x0D30
557 #define GL_MAX_LIGHTS 0x0D31
558 #define GL_MAX_CLIP_PLANES 0x0D32
559 #define GL_MAX_TEXTURE_SIZE 0x0D33
560 #define GL_MAX_PIXEL_MAP_TABLE 0x0D34
561 #define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35
562 #define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36
563 #define GL_MAX_NAME_STACK_DEPTH 0x0D37
564 #define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38
565 #define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39
566 #define GL_MAX_VIEWPORT_DIMS 0x0D3A
567 #define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B
568 #define GL_SUBPIXEL_BITS 0x0D50
569 #define GL_INDEX_BITS 0x0D51
570 #define GL_RED_BITS 0x0D52
571 #define GL_GREEN_BITS 0x0D53
572 #define GL_BLUE_BITS 0x0D54
573 #define GL_ALPHA_BITS 0x0D55
574 #define GL_DEPTH_BITS 0x0D56
575 #define GL_STENCIL_BITS 0x0D57
576 #define GL_ACCUM_RED_BITS 0x0D58
577 #define GL_ACCUM_GREEN_BITS 0x0D59
578 #define GL_ACCUM_BLUE_BITS 0x0D5A
579 #define GL_ACCUM_ALPHA_BITS 0x0D5B
580 #define GL_NAME_STACK_DEPTH 0x0D70
581 #define GL_AUTO_NORMAL 0x0D80
582 #define GL_MAP1_COLOR_4 0x0D90
583 #define GL_MAP1_INDEX 0x0D91
584 #define GL_MAP1_NORMAL 0x0D92
585 #define GL_MAP1_TEXTURE_COORD_1 0x0D93
586 #define GL_MAP1_TEXTURE_COORD_2 0x0D94
587 #define GL_MAP1_TEXTURE_COORD_3 0x0D95
588 #define GL_MAP1_TEXTURE_COORD_4 0x0D96
589 #define GL_MAP1_VERTEX_3 0x0D97
590 #define GL_MAP1_VERTEX_4 0x0D98
591 #define GL_MAP2_COLOR_4 0x0DB0
592 #define GL_MAP2_INDEX 0x0DB1
593 #define GL_MAP2_NORMAL 0x0DB2
594 #define GL_MAP2_TEXTURE_COORD_1 0x0DB3
595 #define GL_MAP2_TEXTURE_COORD_2 0x0DB4
596 #define GL_MAP2_TEXTURE_COORD_3 0x0DB5
597 #define GL_MAP2_TEXTURE_COORD_4 0x0DB6
598 #define GL_MAP2_VERTEX_3 0x0DB7
599 #define GL_MAP2_VERTEX_4 0x0DB8
600 #define GL_MAP1_GRID_DOMAIN 0x0DD0
601 #define GL_MAP1_GRID_SEGMENTS 0x0DD1
602 #define GL_MAP2_GRID_DOMAIN 0x0DD2
603 #define GL_MAP2_GRID_SEGMENTS 0x0DD3
604 #define GL_TEXTURE_1D 0x0DE0
605 #define GL_TEXTURE_2D 0x0DE1
606 #define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
607 #define GL_FEEDBACK_BUFFER_SIZE 0x0DF1
608 #define GL_FEEDBACK_BUFFER_TYPE 0x0DF2
609 #define GL_SELECTION_BUFFER_POINTER 0x0DF3
610 #define GL_SELECTION_BUFFER_SIZE 0x0DF4
611 #define GL_TEXTURE_WIDTH 0x1000
612 #define GL_TRANSFORM_BIT 0x00001000
613 #define GL_TEXTURE_HEIGHT 0x1001
614 #define GL_TEXTURE_INTERNAL_FORMAT 0x1003
615 #define GL_TEXTURE_BORDER_COLOR 0x1004
616 #define GL_TEXTURE_BORDER 0x1005
617 #define GL_DONT_CARE 0x1100
618 #define GL_FASTEST 0x1101
619 #define GL_NICEST 0x1102
620 #define GL_AMBIENT 0x1200
621 #define GL_DIFFUSE 0x1201
622 #define GL_SPECULAR 0x1202
623 #define GL_POSITION 0x1203
624 #define GL_SPOT_DIRECTION 0x1204
625 #define GL_SPOT_EXPONENT 0x1205
626 #define GL_SPOT_CUTOFF 0x1206
627 #define GL_CONSTANT_ATTENUATION 0x1207
628 #define GL_LINEAR_ATTENUATION 0x1208
629 #define GL_QUADRATIC_ATTENUATION 0x1209
630 #define GL_COMPILE 0x1300
631 #define GL_COMPILE_AND_EXECUTE 0x1301
632 #define GL_BYTE 0x1400
633 #define GL_UNSIGNED_BYTE 0x1401
634 #define GL_SHORT 0x1402
635 #define GL_UNSIGNED_SHORT 0x1403
636 #define GL_INT 0x1404
637 #define GL_UNSIGNED_INT 0x1405
638 #define GL_FLOAT 0x1406
639 #define GL_2_BYTES 0x1407
640 #define GL_3_BYTES 0x1408
641 #define GL_4_BYTES 0x1409
642 #define GL_DOUBLE 0x140A
643 #define GL_CLEAR 0x1500
644 #define GL_AND 0x1501
645 #define GL_AND_REVERSE 0x1502
646 #define GL_COPY 0x1503
647 #define GL_AND_INVERTED 0x1504
648 #define GL_NOOP 0x1505
649 #define GL_XOR 0x1506
650 #define GL_OR 0x1507
651 #define GL_NOR 0x1508
652 #define GL_EQUIV 0x1509
653 #define GL_INVERT 0x150A
654 #define GL_OR_REVERSE 0x150B
655 #define GL_COPY_INVERTED 0x150C
656 #define GL_OR_INVERTED 0x150D
657 #define GL_NAND 0x150E
658 #define GL_SET 0x150F
659 #define GL_EMISSION 0x1600
660 #define GL_SHININESS 0x1601
661 #define GL_AMBIENT_AND_DIFFUSE 0x1602
662 #define GL_COLOR_INDEXES 0x1603
663 #define GL_MODELVIEW 0x1700
664 #define GL_PROJECTION 0x1701
665 #define GL_TEXTURE 0x1702
666 #define GL_COLOR 0x1800
667 #define GL_DEPTH 0x1801
668 #define GL_STENCIL 0x1802
669 #define GL_COLOR_INDEX 0x1900
670 #define GL_STENCIL_INDEX 0x1901
671 #define GL_DEPTH_COMPONENT 0x1902
672 #define GL_RED 0x1903
673 #define GL_GREEN 0x1904
674 #define GL_BLUE 0x1905
675 #define GL_ALPHA 0x1906
676 #define GL_RGB 0x1907
677 #define GL_RGBA 0x1908
678 #define GL_LUMINANCE 0x1909
679 #define GL_LUMINANCE_ALPHA 0x190A
680 #define GL_BITMAP 0x1A00
681 #define GL_POINT 0x1B00
682 #define GL_LINE 0x1B01
683 #define GL_FILL 0x1B02
684 #define GL_RENDER 0x1C00
685 #define GL_FEEDBACK 0x1C01
686 #define GL_SELECT 0x1C02
687 #define GL_FLAT 0x1D00
688 #define GL_SMOOTH 0x1D01
689 #define GL_KEEP 0x1E00
690 #define GL_REPLACE 0x1E01
691 #define GL_INCR 0x1E02
692 #define GL_DECR 0x1E03
693 #define GL_VENDOR 0x1F00
694 #define GL_RENDERER 0x1F01
695 #define GL_VERSION 0x1F02
696 #define GL_EXTENSIONS 0x1F03
697 #define GL_S 0x2000
698 #define GL_ENABLE_BIT 0x00002000
699 #define GL_T 0x2001
700 #define GL_R 0x2002
701 #define GL_Q 0x2003
702 #define GL_MODULATE 0x2100
703 #define GL_DECAL 0x2101
704 #define GL_TEXTURE_ENV_MODE 0x2200
705 #define GL_TEXTURE_ENV_COLOR 0x2201
706 #define GL_TEXTURE_ENV 0x2300
707 #define GL_EYE_LINEAR 0x2400
708 #define GL_OBJECT_LINEAR 0x2401
709 #define GL_SPHERE_MAP 0x2402
710 #define GL_TEXTURE_GEN_MODE 0x2500
711 #define GL_OBJECT_PLANE 0x2501
712 #define GL_EYE_PLANE 0x2502
713 #define GL_NEAREST 0x2600
714 #define GL_LINEAR 0x2601
715 #define GL_NEAREST_MIPMAP_NEAREST 0x2700
716 #define GL_LINEAR_MIPMAP_NEAREST 0x2701
717 #define GL_NEAREST_MIPMAP_LINEAR 0x2702
718 #define GL_LINEAR_MIPMAP_LINEAR 0x2703
719 #define GL_TEXTURE_MAG_FILTER 0x2800
720 #define GL_TEXTURE_MIN_FILTER 0x2801
721 #define GL_TEXTURE_WRAP_S 0x2802
722 #define GL_TEXTURE_WRAP_T 0x2803
723 #define GL_CLAMP 0x2900
724 #define GL_REPEAT 0x2901
725 #define GL_POLYGON_OFFSET_UNITS 0x2A00
726 #define GL_POLYGON_OFFSET_POINT 0x2A01
727 #define GL_POLYGON_OFFSET_LINE 0x2A02
728 #define GL_R3_G3_B2 0x2A10
729 #define GL_V2F 0x2A20
730 #define GL_V3F 0x2A21
731 #define GL_C4UB_V2F 0x2A22
732 #define GL_C4UB_V3F 0x2A23
733 #define GL_C3F_V3F 0x2A24
734 #define GL_N3F_V3F 0x2A25
735 #define GL_C4F_N3F_V3F 0x2A26
736 #define GL_T2F_V3F 0x2A27
737 #define GL_T4F_V4F 0x2A28
738 #define GL_T2F_C4UB_V3F 0x2A29
739 #define GL_T2F_C3F_V3F 0x2A2A
740 #define GL_T2F_N3F_V3F 0x2A2B
741 #define GL_T2F_C4F_N3F_V3F 0x2A2C
742 #define GL_T4F_C4F_N3F_V4F 0x2A2D
743 #define GL_CLIP_PLANE0 0x3000
744 #define GL_CLIP_PLANE1 0x3001
745 #define GL_CLIP_PLANE2 0x3002
746 #define GL_CLIP_PLANE3 0x3003
747 #define GL_CLIP_PLANE4 0x3004
748 #define GL_CLIP_PLANE5 0x3005
749 #define GL_LIGHT0 0x4000
750 #define GL_COLOR_BUFFER_BIT 0x00004000
751 #define GL_LIGHT1 0x4001
752 #define GL_LIGHT2 0x4002
753 #define GL_LIGHT3 0x4003
754 #define GL_LIGHT4 0x4004
755 #define GL_LIGHT5 0x4005
756 #define GL_LIGHT6 0x4006
757 #define GL_LIGHT7 0x4007
758 #define GL_HINT_BIT 0x00008000
759 #define GL_POLYGON_OFFSET_FILL 0x8037
760 #define GL_POLYGON_OFFSET_FACTOR 0x8038
761 #define GL_ALPHA4 0x803B
762 #define GL_ALPHA8 0x803C
763 #define GL_ALPHA12 0x803D
764 #define GL_ALPHA16 0x803E
765 #define GL_LUMINANCE4 0x803F
766 #define GL_LUMINANCE8 0x8040
767 #define GL_LUMINANCE12 0x8041
768 #define GL_LUMINANCE16 0x8042
769 #define GL_LUMINANCE4_ALPHA4 0x8043
770 #define GL_LUMINANCE6_ALPHA2 0x8044
771 #define GL_LUMINANCE8_ALPHA8 0x8045
772 #define GL_LUMINANCE12_ALPHA4 0x8046
773 #define GL_LUMINANCE12_ALPHA12 0x8047
774 #define GL_LUMINANCE16_ALPHA16 0x8048
775 #define GL_INTENSITY 0x8049
776 #define GL_INTENSITY4 0x804A
777 #define GL_INTENSITY8 0x804B
778 #define GL_INTENSITY12 0x804C
779 #define GL_INTENSITY16 0x804D
780 #define GL_RGB4 0x804F
781 #define GL_RGB5 0x8050
782 #define GL_RGB8 0x8051
783 #define GL_RGB10 0x8052
784 #define GL_RGB12 0x8053
785 #define GL_RGB16 0x8054
786 #define GL_RGBA2 0x8055
787 #define GL_RGBA4 0x8056
788 #define GL_RGB5_A1 0x8057
789 #define GL_RGBA8 0x8058
790 #define GL_RGB10_A2 0x8059
791 #define GL_RGBA12 0x805A
792 #define GL_RGBA16 0x805B
793 #define GL_TEXTURE_RED_SIZE 0x805C
794 #define GL_TEXTURE_GREEN_SIZE 0x805D
795 #define GL_TEXTURE_BLUE_SIZE 0x805E
796 #define GL_TEXTURE_ALPHA_SIZE 0x805F
797 #define GL_TEXTURE_LUMINANCE_SIZE 0x8060
798 #define GL_TEXTURE_INTENSITY_SIZE 0x8061
799 #define GL_PROXY_TEXTURE_1D 0x8063
800 #define GL_PROXY_TEXTURE_2D 0x8064
801 #define GL_TEXTURE_PRIORITY 0x8066
802 #define GL_TEXTURE_RESIDENT 0x8067
803 #define GL_TEXTURE_BINDING_1D 0x8068
804 #define GL_TEXTURE_BINDING_2D 0x8069
805 #define GL_VERTEX_ARRAY 0x8074
806 #define GL_NORMAL_ARRAY 0x8075
807 #define GL_COLOR_ARRAY 0x8076
808 #define GL_INDEX_ARRAY 0x8077
809 #define GL_TEXTURE_COORD_ARRAY 0x8078
810 #define GL_EDGE_FLAG_ARRAY 0x8079
811 #define GL_VERTEX_ARRAY_SIZE 0x807A
812 #define GL_VERTEX_ARRAY_TYPE 0x807B
813 #define GL_VERTEX_ARRAY_STRIDE 0x807C
814 #define GL_NORMAL_ARRAY_TYPE 0x807E
815 #define GL_NORMAL_ARRAY_STRIDE 0x807F
816 #define GL_COLOR_ARRAY_SIZE 0x8081
817 #define GL_COLOR_ARRAY_TYPE 0x8082
818 #define GL_COLOR_ARRAY_STRIDE 0x8083
819 #define GL_INDEX_ARRAY_TYPE 0x8085
820 #define GL_INDEX_ARRAY_STRIDE 0x8086
821 #define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
822 #define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
823 #define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A
824 #define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C
825 #define GL_VERTEX_ARRAY_POINTER 0x808E
826 #define GL_NORMAL_ARRAY_POINTER 0x808F
827 #define GL_COLOR_ARRAY_POINTER 0x8090
828 #define GL_INDEX_ARRAY_POINTER 0x8091
829 #define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
830 #define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
831 #define GL_COLOR_INDEX1_EXT 0x80E2
832 #define GL_COLOR_INDEX2_EXT 0x80E3
833 #define GL_COLOR_INDEX4_EXT 0x80E4
834 #define GL_COLOR_INDEX8_EXT 0x80E5
835 #define GL_COLOR_INDEX12_EXT 0x80E6
836 #define GL_COLOR_INDEX16_EXT 0x80E7
837 #define GL_EVAL_BIT 0x00010000
838 #define GL_LIST_BIT 0x00020000
839 #define GL_TEXTURE_BIT 0x00040000
840 #define GL_SCISSOR_BIT 0x00080000
841 #define GL_ALL_ATTRIB_BITS 0x000fffff
842 #define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff
843
844 GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value);
845 GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref);
846 GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences);
847 GLAPI void GLAPIENTRY glArrayElement (GLint i);
848 GLAPI void GLAPIENTRY glBegin (GLenum mode);
849 GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture);
850 GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
851 GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
852 GLAPI void GLAPIENTRY glCallList (GLuint list);
853 GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const void *lists);
854 GLAPI void GLAPIENTRY glClear (GLbitfield mask);
855 GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
856 GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
857 GLAPI void GLAPIENTRY glClearDepth (GLclampd depth);
858 GLAPI void GLAPIENTRY glClearIndex (GLfloat c);
859 GLAPI void GLAPIENTRY glClearStencil (GLint s);
860 GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation);
861 GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue);
862 GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v);
863 GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue);
864 GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v);
865 GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue);
866 GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v);
867 GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue);
868 GLAPI void GLAPIENTRY glColor3iv (const GLint *v);
869 GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue);
870 GLAPI void GLAPIENTRY glColor3sv (const GLshort *v);
871 GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue);
872 GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v);
873 GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue);
874 GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v);
875 GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue);
876 GLAPI void GLAPIENTRY glColor3usv (const GLushort *v);
877 GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
878 GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v);
879 GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
880 GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v);
881 GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
882 GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v);
883 GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha);
884 GLAPI void GLAPIENTRY glColor4iv (const GLint *v);
885 GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha);
886 GLAPI void GLAPIENTRY glColor4sv (const GLshort *v);
887 GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
888 GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v);
889 GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha);
890 GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v);
891 GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha);
892 GLAPI void GLAPIENTRY glColor4usv (const GLushort *v);
893 GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
894 GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode);
895 GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer);
896 GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
897 GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border);
898 GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
899 GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
900 GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
901 GLAPI void GLAPIENTRY glCullFace (GLenum mode);
902 GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range);
903 GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
904 GLAPI void GLAPIENTRY glDepthFunc (GLenum func);
905 GLAPI void GLAPIENTRY glDepthMask (GLboolean flag);
906 GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar);
907 GLAPI void GLAPIENTRY glDisable (GLenum cap);
908 GLAPI void GLAPIENTRY glDisableClientState (GLenum array);
909 GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
910 GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode);
911 GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
912 GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
913 GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag);
914 GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *pointer);
915 GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag);
916 GLAPI void GLAPIENTRY glEnable (GLenum cap);
917 GLAPI void GLAPIENTRY glEnableClientState (GLenum array);
918 GLAPI void GLAPIENTRY glEnd (void);
919 GLAPI void GLAPIENTRY glEndList (void);
920 GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u);
921 GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u);
922 GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u);
923 GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u);
924 GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v);
925 GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u);
926 GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v);
927 GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u);
928 GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2);
929 GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
930 GLAPI void GLAPIENTRY glEvalPoint1 (GLint i);
931 GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j);
932 GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer);
933 GLAPI void GLAPIENTRY glFinish (void);
934 GLAPI void GLAPIENTRY glFlush (void);
935 GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param);
936 GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params);
937 GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param);
938 GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params);
939 GLAPI void GLAPIENTRY glFrontFace (GLenum mode);
940 GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
941 GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range);
942 GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures);
943 GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params);
944 GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation);
945 GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params);
946 GLAPI GLenum GLAPIENTRY glGetError (void);
947 GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params);
948 GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params);
949 GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params);
950 GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params);
951 GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v);
952 GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v);
953 GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v);
954 GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params);
955 GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params);
956 GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values);
957 GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values);
958 GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values);
959 GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, void* *params);
960 GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask);
961 GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name);
962 GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params);
963 GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params);
964 GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params);
965 GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params);
966 GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params);
967 GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
968 GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
969 GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
970 GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
971 GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
972 GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode);
973 GLAPI void GLAPIENTRY glIndexMask (GLuint mask);
974 GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const void *pointer);
975 GLAPI void GLAPIENTRY glIndexd (GLdouble c);
976 GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c);
977 GLAPI void GLAPIENTRY glIndexf (GLfloat c);
978 GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c);
979 GLAPI void GLAPIENTRY glIndexi (GLint c);
980 GLAPI void GLAPIENTRY glIndexiv (const GLint *c);
981 GLAPI void GLAPIENTRY glIndexs (GLshort c);
982 GLAPI void GLAPIENTRY glIndexsv (const GLshort *c);
983 GLAPI void GLAPIENTRY glIndexub (GLubyte c);
984 GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c);
985 GLAPI void GLAPIENTRY glInitNames (void);
986 GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const void *pointer);
987 GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap);
988 GLAPI GLboolean GLAPIENTRY glIsList (GLuint list);
989 GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture);
990 GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param);
991 GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params);
992 GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param);
993 GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params);
994 GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param);
995 GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params);
996 GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param);
997 GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params);
998 GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern);
999 GLAPI void GLAPIENTRY glLineWidth (GLfloat width);
1000 GLAPI void GLAPIENTRY glListBase (GLuint base);
1001 GLAPI void GLAPIENTRY glLoadIdentity (void);
1002 GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m);
1003 GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m);
1004 GLAPI void GLAPIENTRY glLoadName (GLuint name);
1005 GLAPI void GLAPIENTRY glLogicOp (GLenum opcode);
1006 GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
1007 GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
1008 GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
1009 GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
1010 GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2);
1011 GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2);
1012 GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
1013 GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
1014 GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param);
1015 GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);
1016 GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param);
1017 GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params);
1018 GLAPI void GLAPIENTRY glMatrixMode (GLenum mode);
1019 GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m);
1020 GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m);
1021 GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode);
1022 GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz);
1023 GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v);
1024 GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz);
1025 GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v);
1026 GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);
1027 GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v);
1028 GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz);
1029 GLAPI void GLAPIENTRY glNormal3iv (const GLint *v);
1030 GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz);
1031 GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v);
1032 GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer);
1033 GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
1034 GLAPI void GLAPIENTRY glPassThrough (GLfloat token);
1035 GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values);
1036 GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values);
1037 GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values);
1038 GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param);
1039 GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param);
1040 GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param);
1041 GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param);
1042 GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor);
1043 GLAPI void GLAPIENTRY glPointSize (GLfloat size);
1044 GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode);
1045 GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
1046 GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask);
1047 GLAPI void GLAPIENTRY glPopAttrib (void);
1048 GLAPI void GLAPIENTRY glPopClientAttrib (void);
1049 GLAPI void GLAPIENTRY glPopMatrix (void);
1050 GLAPI void GLAPIENTRY glPopName (void);
1051 GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities);
1052 GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask);
1053 GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask);
1054 GLAPI void GLAPIENTRY glPushMatrix (void);
1055 GLAPI void GLAPIENTRY glPushName (GLuint name);
1056 GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y);
1057 GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v);
1058 GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y);
1059 GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v);
1060 GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y);
1061 GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v);
1062 GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y);
1063 GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v);
1064 GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z);
1065 GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v);
1066 GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z);
1067 GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v);
1068 GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z);
1069 GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v);
1070 GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z);
1071 GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v);
1072 GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
1073 GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v);
1074 GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
1075 GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v);
1076 GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w);
1077 GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v);
1078 GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w);
1079 GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v);
1080 GLAPI void GLAPIENTRY glReadBuffer (GLenum mode);
1081 GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
1082 GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
1083 GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2);
1084 GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
1085 GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2);
1086 GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2);
1087 GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2);
1088 GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2);
1089 GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2);
1090 GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode);
1091 GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
1092 GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
1093 GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z);
1094 GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z);
1095 GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
1096 GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer);
1097 GLAPI void GLAPIENTRY glShadeModel (GLenum mode);
1098 GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
1099 GLAPI void GLAPIENTRY glStencilMask (GLuint mask);
1100 GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
1101 GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s);
1102 GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v);
1103 GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s);
1104 GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v);
1105 GLAPI void GLAPIENTRY glTexCoord1i (GLint s);
1106 GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v);
1107 GLAPI void GLAPIENTRY glTexCoord1s (GLshort s);
1108 GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v);
1109 GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t);
1110 GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v);
1111 GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t);
1112 GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v);
1113 GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t);
1114 GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v);
1115 GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t);
1116 GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v);
1117 GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r);
1118 GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v);
1119 GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r);
1120 GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v);
1121 GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r);
1122 GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v);
1123 GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r);
1124 GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v);
1125 GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q);
1126 GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v);
1127 GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q);
1128 GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v);
1129 GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q);
1130 GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v);
1131 GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q);
1132 GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v);
1133 GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer);
1134 GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param);
1135 GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params);
1136 GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param);
1137 GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params);
1138 GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param);
1139 GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params);
1140 GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param);
1141 GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params);
1142 GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param);
1143 GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params);
1144 GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
1145 GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
1146 GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
1147 GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
1148 GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
1149 GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
1150 GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
1151 GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
1152 GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z);
1153 GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);
1154 GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y);
1155 GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v);
1156 GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y);
1157 GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v);
1158 GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y);
1159 GLAPI void GLAPIENTRY glVertex2iv (const GLint *v);
1160 GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y);
1161 GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v);
1162 GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z);
1163 GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v);
1164 GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z);
1165 GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v);
1166 GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z);
1167 GLAPI void GLAPIENTRY glVertex3iv (const GLint *v);
1168 GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z);
1169 GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v);
1170 GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
1171 GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v);
1172 GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
1173 GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v);
1174 GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w);
1175 GLAPI void GLAPIENTRY glVertex4iv (const GLint *v);
1176 GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w);
1177 GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v);
1178 GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer);
1179 GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
1180
1181 #define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1)
1182
1183 #endif /* GL_VERSION_1_1 */
1184
1185 /* ---------------------------------- GLU ---------------------------------- */
1186
1187 #ifndef GLEW_NO_GLU
1188 # ifdef __APPLE__
1189 # include <Availability.h>
1190 # if defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
1191 # define GLEW_NO_GLU
1192 # endif
1193 # endif
1194 #endif
1195
1196 #ifndef GLEW_NO_GLU
1197 /* this is where we can safely include GLU */
1198 # if defined(__APPLE__) && defined(__MACH__)
1199 # include <OpenGL/glu.h>
1200 # else
1201 # include <GL/glu.h>
1202 # endif
1203 #endif
1204
1205 /* ----------------------------- GL_VERSION_1_2 ---------------------------- */
1206
1207 #ifndef GL_VERSION_1_2
1208 #define GL_VERSION_1_2 1
1209
1210 #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
1211 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13
1212 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
1213 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23
1214 #define GL_UNSIGNED_BYTE_3_3_2 0x8032
1215 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
1216 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
1217 #define GL_UNSIGNED_INT_8_8_8_8 0x8035
1218 #define GL_UNSIGNED_INT_10_10_10_2 0x8036
1219 #define GL_RESCALE_NORMAL 0x803A
1220 #define GL_TEXTURE_BINDING_3D 0x806A
1221 #define GL_PACK_SKIP_IMAGES 0x806B
1222 #define GL_PACK_IMAGE_HEIGHT 0x806C
1223 #define GL_UNPACK_SKIP_IMAGES 0x806D
1224 #define GL_UNPACK_IMAGE_HEIGHT 0x806E
1225 #define GL_TEXTURE_3D 0x806F
1226 #define GL_PROXY_TEXTURE_3D 0x8070
1227 #define GL_TEXTURE_DEPTH 0x8071
1228 #define GL_TEXTURE_WRAP_R 0x8072
1229 #define GL_MAX_3D_TEXTURE_SIZE 0x8073
1230 #define GL_BGR 0x80E0
1231 #define GL_BGRA 0x80E1
1232 #define GL_MAX_ELEMENTS_VERTICES 0x80E8
1233 #define GL_MAX_ELEMENTS_INDICES 0x80E9
1234 #define GL_CLAMP_TO_EDGE 0x812F
1235 #define GL_TEXTURE_MIN_LOD 0x813A
1236 #define GL_TEXTURE_MAX_LOD 0x813B
1237 #define GL_TEXTURE_BASE_LEVEL 0x813C
1238 #define GL_TEXTURE_MAX_LEVEL 0x813D
1239 #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
1240 #define GL_SINGLE_COLOR 0x81F9
1241 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA
1242 #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362
1243 #define GL_UNSIGNED_SHORT_5_6_5 0x8363
1244 #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
1245 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
1246 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
1247 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
1248 #define GL_ALIASED_POINT_SIZE_RANGE 0x846D
1249 #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
1250
1251 typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
1252 typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
1253 typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
1254 typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
1255
1256 #define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D)
1257 #define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements)
1258 #define glTexImage3D GLEW_GET_FUN(__glewTexImage3D)
1259 #define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D)
1260
1261 #define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2)
1262
1263 #endif /* GL_VERSION_1_2 */
1264
1265 /* ---------------------------- GL_VERSION_1_2_1 --------------------------- */
1266
1267 #ifndef GL_VERSION_1_2_1
1268 #define GL_VERSION_1_2_1 1
1269
1270 #define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1)
1271
1272 #endif /* GL_VERSION_1_2_1 */
1273
1274 /* ----------------------------- GL_VERSION_1_3 ---------------------------- */
1275
1276 #ifndef GL_VERSION_1_3
1277 #define GL_VERSION_1_3 1
1278
1279 #define GL_MULTISAMPLE 0x809D
1280 #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
1281 #define GL_SAMPLE_ALPHA_TO_ONE 0x809F
1282 #define GL_SAMPLE_COVERAGE 0x80A0
1283 #define GL_SAMPLE_BUFFERS 0x80A8
1284 #define GL_SAMPLES 0x80A9
1285 #define GL_SAMPLE_COVERAGE_VALUE 0x80AA
1286 #define GL_SAMPLE_COVERAGE_INVERT 0x80AB
1287 #define GL_CLAMP_TO_BORDER 0x812D
1288 #define GL_TEXTURE0 0x84C0
1289 #define GL_TEXTURE1 0x84C1
1290 #define GL_TEXTURE2 0x84C2
1291 #define GL_TEXTURE3 0x84C3
1292 #define GL_TEXTURE4 0x84C4
1293 #define GL_TEXTURE5 0x84C5
1294 #define GL_TEXTURE6 0x84C6
1295 #define GL_TEXTURE7 0x84C7
1296 #define GL_TEXTURE8 0x84C8
1297 #define GL_TEXTURE9 0x84C9
1298 #define GL_TEXTURE10 0x84CA
1299 #define GL_TEXTURE11 0x84CB
1300 #define GL_TEXTURE12 0x84CC
1301 #define GL_TEXTURE13 0x84CD
1302 #define GL_TEXTURE14 0x84CE
1303 #define GL_TEXTURE15 0x84CF
1304 #define GL_TEXTURE16 0x84D0
1305 #define GL_TEXTURE17 0x84D1
1306 #define GL_TEXTURE18 0x84D2
1307 #define GL_TEXTURE19 0x84D3
1308 #define GL_TEXTURE20 0x84D4
1309 #define GL_TEXTURE21 0x84D5
1310 #define GL_TEXTURE22 0x84D6
1311 #define GL_TEXTURE23 0x84D7
1312 #define GL_TEXTURE24 0x84D8
1313 #define GL_TEXTURE25 0x84D9
1314 #define GL_TEXTURE26 0x84DA
1315 #define GL_TEXTURE27 0x84DB
1316 #define GL_TEXTURE28 0x84DC
1317 #define GL_TEXTURE29 0x84DD
1318 #define GL_TEXTURE30 0x84DE
1319 #define GL_TEXTURE31 0x84DF
1320 #define GL_ACTIVE_TEXTURE 0x84E0
1321 #define GL_CLIENT_ACTIVE_TEXTURE 0x84E1
1322 #define GL_MAX_TEXTURE_UNITS 0x84E2
1323 #define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3
1324 #define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4
1325 #define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5
1326 #define GL_TRANSPOSE_COLOR_MATRIX 0x84E6
1327 #define GL_SUBTRACT 0x84E7
1328 #define GL_COMPRESSED_ALPHA 0x84E9
1329 #define GL_COMPRESSED_LUMINANCE 0x84EA
1330 #define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB
1331 #define GL_COMPRESSED_INTENSITY 0x84EC
1332 #define GL_COMPRESSED_RGB 0x84ED
1333 #define GL_COMPRESSED_RGBA 0x84EE
1334 #define GL_TEXTURE_COMPRESSION_HINT 0x84EF
1335 #define GL_NORMAL_MAP 0x8511
1336 #define GL_REFLECTION_MAP 0x8512
1337 #define GL_TEXTURE_CUBE_MAP 0x8513
1338 #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
1339 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
1340 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
1341 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
1342 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
1343 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
1344 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
1345 #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B
1346 #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
1347 #define GL_COMBINE 0x8570
1348 #define GL_COMBINE_RGB 0x8571
1349 #define GL_COMBINE_ALPHA 0x8572
1350 #define GL_RGB_SCALE 0x8573
1351 #define GL_ADD_SIGNED 0x8574
1352 #define GL_INTERPOLATE 0x8575
1353 #define GL_CONSTANT 0x8576
1354 #define GL_PRIMARY_COLOR 0x8577
1355 #define GL_PREVIOUS 0x8578
1356 #define GL_SOURCE0_RGB 0x8580
1357 #define GL_SOURCE1_RGB 0x8581
1358 #define GL_SOURCE2_RGB 0x8582
1359 #define GL_SOURCE0_ALPHA 0x8588
1360 #define GL_SOURCE1_ALPHA 0x8589
1361 #define GL_SOURCE2_ALPHA 0x858A
1362 #define GL_OPERAND0_RGB 0x8590
1363 #define GL_OPERAND1_RGB 0x8591
1364 #define GL_OPERAND2_RGB 0x8592
1365 #define GL_OPERAND0_ALPHA 0x8598
1366 #define GL_OPERAND1_ALPHA 0x8599
1367 #define GL_OPERAND2_ALPHA 0x859A
1368 #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0
1369 #define GL_TEXTURE_COMPRESSED 0x86A1
1370 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
1371 #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
1372 #define GL_DOT3_RGB 0x86AE
1373 #define GL_DOT3_RGBA 0x86AF
1374 #define GL_MULTISAMPLE_BIT 0x20000000
1375
1376 typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture);
1377 typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);
1378 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
1379 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
1380 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
1381 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
1382 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
1383 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
1384 typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *img);
1385 typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]);
1386 typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]);
1387 typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]);
1388 typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]);
1389 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s);
1390 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v);
1391 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s);
1392 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v);
1393 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s);
1394 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v);
1395 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s);
1396 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v);
1397 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t);
1398 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v);
1399 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
1400 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v);
1401 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t);
1402 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v);
1403 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t);
1404 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v);
1405 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
1406 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v);
1407 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
1408 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v);
1409 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r);
1410 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v);
1411 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
1412 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v);
1413 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
1414 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v);
1415 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
1416 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v);
1417 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
1418 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v);
1419 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
1420 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v);
1421 typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert);
1422
1423 #define glActiveTexture GLEW_GET_FUN(__glewActiveTexture)
1424 #define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture)
1425 #define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D)
1426 #define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D)
1427 #define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D)
1428 #define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D)
1429 #define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D)
1430 #define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D)
1431 #define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage)
1432 #define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd)
1433 #define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf)
1434 #define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd)
1435 #define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf)
1436 #define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d)
1437 #define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv)
1438 #define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f)
1439 #define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv)
1440 #define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i)
1441 #define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv)
1442 #define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s)
1443 #define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv)
1444 #define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d)
1445 #define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv)
1446 #define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f)
1447 #define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv)
1448 #define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i)
1449 #define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv)
1450 #define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s)
1451 #define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv)
1452 #define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d)
1453 #define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv)
1454 #define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f)
1455 #define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv)
1456 #define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i)
1457 #define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv)
1458 #define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s)
1459 #define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv)
1460 #define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d)
1461 #define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv)
1462 #define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f)
1463 #define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv)
1464 #define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i)
1465 #define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv)
1466 #define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s)
1467 #define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv)
1468 #define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage)
1469
1470 #define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3)
1471
1472 #endif /* GL_VERSION_1_3 */
1473
1474 /* ----------------------------- GL_VERSION_1_4 ---------------------------- */
1475
1476 #ifndef GL_VERSION_1_4
1477 #define GL_VERSION_1_4 1
1478
1479 #define GL_BLEND_DST_RGB 0x80C8
1480 #define GL_BLEND_SRC_RGB 0x80C9
1481 #define GL_BLEND_DST_ALPHA 0x80CA
1482 #define GL_BLEND_SRC_ALPHA 0x80CB
1483 #define GL_POINT_SIZE_MIN 0x8126
1484 #define GL_POINT_SIZE_MAX 0x8127
1485 #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128
1486 #define GL_POINT_DISTANCE_ATTENUATION 0x8129
1487 #define GL_GENERATE_MIPMAP 0x8191
1488 #define GL_GENERATE_MIPMAP_HINT 0x8192
1489 #define GL_DEPTH_COMPONENT16 0x81A5
1490 #define GL_DEPTH_COMPONENT24 0x81A6
1491 #define GL_DEPTH_COMPONENT32 0x81A7
1492 #define GL_MIRRORED_REPEAT 0x8370
1493 #define GL_FOG_COORDINATE_SOURCE 0x8450
1494 #define GL_FOG_COORDINATE 0x8451
1495 #define GL_FRAGMENT_DEPTH 0x8452
1496 #define GL_CURRENT_FOG_COORDINATE 0x8453
1497 #define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454
1498 #define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455
1499 #define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456
1500 #define GL_FOG_COORDINATE_ARRAY 0x8457
1501 #define GL_COLOR_SUM 0x8458
1502 #define GL_CURRENT_SECONDARY_COLOR 0x8459
1503 #define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A
1504 #define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B
1505 #define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C
1506 #define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D
1507 #define GL_SECONDARY_COLOR_ARRAY 0x845E
1508 #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
1509 #define GL_TEXTURE_FILTER_CONTROL 0x8500
1510 #define GL_TEXTURE_LOD_BIAS 0x8501
1511 #define GL_INCR_WRAP 0x8507
1512 #define GL_DECR_WRAP 0x8508
1513 #define GL_TEXTURE_DEPTH_SIZE 0x884A
1514 #define GL_DEPTH_TEXTURE_MODE 0x884B
1515 #define GL_TEXTURE_COMPARE_MODE 0x884C
1516 #define GL_TEXTURE_COMPARE_FUNC 0x884D
1517 #define GL_COMPARE_R_TO_TEXTURE 0x884E
1518
1519 typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
1520 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode);
1521 typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
1522 typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer);
1523 typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord);
1524 typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord);
1525 typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord);
1526 typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord);
1527 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
1528 typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount);
1529 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);
1530 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params);
1531 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);
1532 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params);
1533 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue);
1534 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v);
1535 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue);
1536 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v);
1537 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue);
1538 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v);
1539 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue);
1540 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v);
1541 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue);
1542 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v);
1543 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue);
1544 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v);
1545 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue);
1546 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v);
1547 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue);
1548 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v);
1549 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);
1550 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y);
1551 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p);
1552 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y);
1553 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p);
1554 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y);
1555 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p);
1556 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y);
1557 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p);
1558 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z);
1559 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p);
1560 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z);
1561 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p);
1562 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z);
1563 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p);
1564 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z);
1565 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p);
1566
1567 #define glBlendColor GLEW_GET_FUN(__glewBlendColor)
1568 #define glBlendEquation GLEW_GET_FUN(__glewBlendEquation)
1569 #define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate)
1570 #define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer)
1571 #define glFogCoordd GLEW_GET_FUN(__glewFogCoordd)
1572 #define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv)
1573 #define glFogCoordf GLEW_GET_FUN(__glewFogCoordf)
1574 #define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv)
1575 #define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays)
1576 #define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements)
1577 #define glPointParameterf GLEW_GET_FUN(__glewPointParameterf)
1578 #define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv)
1579 #define glPointParameteri GLEW_GET_FUN(__glewPointParameteri)
1580 #define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv)
1581 #define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b)
1582 #define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv)
1583 #define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d)
1584 #define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv)
1585 #define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f)
1586 #define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv)
1587 #define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i)
1588 #define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv)
1589 #define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s)
1590 #define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv)
1591 #define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub)
1592 #define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv)
1593 #define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui)
1594 #define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv)
1595 #define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us)
1596 #define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv)
1597 #define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer)
1598 #define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d)
1599 #define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv)
1600 #define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f)
1601 #define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv)
1602 #define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i)
1603 #define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv)
1604 #define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s)
1605 #define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv)
1606 #define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d)
1607 #define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv)
1608 #define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f)
1609 #define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv)
1610 #define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i)
1611 #define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv)
1612 #define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s)
1613 #define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv)
1614
1615 #define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4)
1616
1617 #endif /* GL_VERSION_1_4 */
1618
1619 /* ----------------------------- GL_VERSION_1_5 ---------------------------- */
1620
1621 #ifndef GL_VERSION_1_5
1622 #define GL_VERSION_1_5 1
1623
1624 #define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE
1625 #define GL_FOG_COORD GL_FOG_COORDINATE
1626 #define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY
1627 #define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING
1628 #define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER
1629 #define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE
1630 #define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE
1631 #define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE
1632 #define GL_SRC0_ALPHA GL_SOURCE0_ALPHA
1633 #define GL_SRC0_RGB GL_SOURCE0_RGB
1634 #define GL_SRC1_ALPHA GL_SOURCE1_ALPHA
1635 #define GL_SRC1_RGB GL_SOURCE1_RGB
1636 #define GL_SRC2_ALPHA GL_SOURCE2_ALPHA
1637 #define GL_SRC2_RGB GL_SOURCE2_RGB
1638 #define GL_BUFFER_SIZE 0x8764
1639 #define GL_BUFFER_USAGE 0x8765
1640 #define GL_QUERY_COUNTER_BITS 0x8864
1641 #define GL_CURRENT_QUERY 0x8865
1642 #define GL_QUERY_RESULT 0x8866
1643 #define GL_QUERY_RESULT_AVAILABLE 0x8867
1644 #define GL_ARRAY_BUFFER 0x8892
1645 #define GL_ELEMENT_ARRAY_BUFFER 0x8893
1646 #define GL_ARRAY_BUFFER_BINDING 0x8894
1647 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
1648 #define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896
1649 #define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897
1650 #define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898
1651 #define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899
1652 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A
1653 #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B
1654 #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C
1655 #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D
1656 #define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E
1657 #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
1658 #define GL_READ_ONLY 0x88B8
1659 #define GL_WRITE_ONLY 0x88B9
1660 #define GL_READ_WRITE 0x88BA
1661 #define GL_BUFFER_ACCESS 0x88BB
1662 #define GL_BUFFER_MAPPED 0x88BC
1663 #define GL_BUFFER_MAP_POINTER 0x88BD
1664 #define GL_STREAM_DRAW 0x88E0
1665 #define GL_STREAM_READ 0x88E1
1666 #define GL_STREAM_COPY 0x88E2
1667 #define GL_STATIC_DRAW 0x88E4
1668 #define GL_STATIC_READ 0x88E5
1669 #define GL_STATIC_COPY 0x88E6
1670 #define GL_DYNAMIC_DRAW 0x88E8
1671 #define GL_DYNAMIC_READ 0x88E9
1672 #define GL_DYNAMIC_COPY 0x88EA
1673 #define GL_SAMPLES_PASSED 0x8914
1674
1675 typedef ptrdiff_t GLintptr;
1676 typedef ptrdiff_t GLsizeiptr;
1677
1678 typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
1679 typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
1680 typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage);
1681 typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
1682 typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers);
1683 typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids);
1684 typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target);
1685 typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers);
1686 typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids);
1687 typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);
1688 typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void** params);
1689 typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* data);
1690 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params);
1691 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params);
1692 typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params);
1693 typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer);
1694 typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id);
1695 typedef void* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);
1696 typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target);
1697
1698 #define glBeginQuery GLEW_GET_FUN(__glewBeginQuery)
1699 #define glBindBuffer GLEW_GET_FUN(__glewBindBuffer)
1700 #define glBufferData GLEW_GET_FUN(__glewBufferData)
1701 #define glBufferSubData GLEW_GET_FUN(__glewBufferSubData)
1702 #define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers)
1703 #define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries)
1704 #define glEndQuery GLEW_GET_FUN(__glewEndQuery)
1705 #define glGenBuffers GLEW_GET_FUN(__glewGenBuffers)
1706 #define glGenQueries GLEW_GET_FUN(__glewGenQueries)
1707 #define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv)
1708 #define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv)
1709 #define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData)
1710 #define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv)
1711 #define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv)
1712 #define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv)
1713 #define glIsBuffer GLEW_GET_FUN(__glewIsBuffer)
1714 #define glIsQuery GLEW_GET_FUN(__glewIsQuery)
1715 #define glMapBuffer GLEW_GET_FUN(__glewMapBuffer)
1716 #define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer)
1717
1718 #define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5)
1719
1720 #endif /* GL_VERSION_1_5 */
1721
1722 /* ----------------------------- GL_VERSION_2_0 ---------------------------- */
1723
1724 #ifndef GL_VERSION_2_0
1725 #define GL_VERSION_2_0 1
1726
1727 #define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION
1728 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
1729 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
1730 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
1731 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
1732 #define GL_CURRENT_VERTEX_ATTRIB 0x8626
1733 #define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642
1734 #define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643
1735 #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
1736 #define GL_STENCIL_BACK_FUNC 0x8800
1737 #define GL_STENCIL_BACK_FAIL 0x8801
1738 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
1739 #define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
1740 #define GL_MAX_DRAW_BUFFERS 0x8824
1741 #define GL_DRAW_BUFFER0 0x8825
1742 #define GL_DRAW_BUFFER1 0x8826
1743 #define GL_DRAW_BUFFER2 0x8827
1744 #define GL_DRAW_BUFFER3 0x8828
1745 #define GL_DRAW_BUFFER4 0x8829
1746 #define GL_DRAW_BUFFER5 0x882A
1747 #define GL_DRAW_BUFFER6 0x882B
1748 #define GL_DRAW_BUFFER7 0x882C
1749 #define GL_DRAW_BUFFER8 0x882D
1750 #define GL_DRAW_BUFFER9 0x882E
1751 #define GL_DRAW_BUFFER10 0x882F
1752 #define GL_DRAW_BUFFER11 0x8830
1753 #define GL_DRAW_BUFFER12 0x8831
1754 #define GL_DRAW_BUFFER13 0x8832
1755 #define GL_DRAW_BUFFER14 0x8833
1756 #define GL_DRAW_BUFFER15 0x8834
1757 #define GL_BLEND_EQUATION_ALPHA 0x883D
1758 #define GL_POINT_SPRITE 0x8861
1759 #define GL_COORD_REPLACE 0x8862
1760 #define GL_MAX_VERTEX_ATTRIBS 0x8869
1761 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
1762 #define GL_MAX_TEXTURE_COORDS 0x8871
1763 #define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
1764 #define GL_FRAGMENT_SHADER 0x8B30
1765 #define GL_VERTEX_SHADER 0x8B31
1766 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
1767 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
1768 #define GL_MAX_VARYING_FLOATS 0x8B4B
1769 #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
1770 #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
1771 #define GL_SHADER_TYPE 0x8B4F
1772 #define GL_FLOAT_VEC2 0x8B50
1773 #define GL_FLOAT_VEC3 0x8B51
1774 #define GL_FLOAT_VEC4 0x8B52
1775 #define GL_INT_VEC2 0x8B53
1776 #define GL_INT_VEC3 0x8B54
1777 #define GL_INT_VEC4 0x8B55
1778 #define GL_BOOL 0x8B56
1779 #define GL_BOOL_VEC2 0x8B57
1780 #define GL_BOOL_VEC3 0x8B58
1781 #define GL_BOOL_VEC4 0x8B59
1782 #define GL_FLOAT_MAT2 0x8B5A
1783 #define GL_FLOAT_MAT3 0x8B5B
1784 #define GL_FLOAT_MAT4 0x8B5C
1785 #define GL_SAMPLER_1D 0x8B5D
1786 #define GL_SAMPLER_2D 0x8B5E
1787 #define GL_SAMPLER_3D 0x8B5F
1788 #define GL_SAMPLER_CUBE 0x8B60
1789 #define GL_SAMPLER_1D_SHADOW 0x8B61
1790 #define GL_SAMPLER_2D_SHADOW 0x8B62
1791 #define GL_DELETE_STATUS 0x8B80
1792 #define GL_COMPILE_STATUS 0x8B81
1793 #define GL_LINK_STATUS 0x8B82
1794 #define GL_VALIDATE_STATUS 0x8B83
1795 #define GL_INFO_LOG_LENGTH 0x8B84
1796 #define GL_ATTACHED_SHADERS 0x8B85
1797 #define GL_ACTIVE_UNIFORMS 0x8B86
1798 #define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
1799 #define GL_SHADER_SOURCE_LENGTH 0x8B88
1800 #define GL_ACTIVE_ATTRIBUTES 0x8B89
1801 #define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
1802 #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
1803 #define GL_SHADING_LANGUAGE_VERSION 0x8B8C
1804 #define GL_CURRENT_PROGRAM 0x8B8D
1805 #define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0
1806 #define GL_LOWER_LEFT 0x8CA1
1807 #define GL_UPPER_LEFT 0x8CA2
1808 #define GL_STENCIL_BACK_REF 0x8CA3
1809 #define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
1810 #define GL_STENCIL_BACK_WRITEMASK 0x8CA5
1811
1812 typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
1813 typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name);
1814 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
1815 typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader);
1816 typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void);
1817 typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type);
1818 typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program);
1819 typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader);
1820 typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
1821 typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
1822 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs);
1823 typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
1824 typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
1825 typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
1826 typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders);
1827 typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name);
1828 typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
1829 typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param);
1830 typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
1831 typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source);
1832 typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param);
1833 typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name);
1834 typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params);
1835 typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params);
1836 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void** pointer);
1837 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params);
1838 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params);
1839 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params);
1840 typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program);
1841 typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader);
1842 typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program);
1843 typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const* string, const GLint* length);
1844 typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
1845 typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
1846 typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
1847 typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
1848 typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value);
1849 typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
1850 typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value);
1851 typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
1852 typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value);
1853 typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
1854 typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value);
1855 typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
1856 typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value);
1857 typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
1858 typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value);
1859 typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
1860 typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value);
1861 typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
1862 typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value);
1863 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
1864 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
1865 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
1866 typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program);
1867 typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program);
1868 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);
1869 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v);
1870 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
1871 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v);
1872 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x);
1873 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v);
1874 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);
1875 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v);
1876 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
1877 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v);
1878 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);
1879 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v);
1880 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
1881 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v);
1882 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
1883 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v);
1884 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
1885 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v);
1886 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v);
1887 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v);
1888 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v);
1889 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
1890 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v);
1891 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v);
1892 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v);
1893 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v);
1894 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
1895 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v);
1896 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
1897 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v);
1898 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v);
1899 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
1900 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v);
1901 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v);
1902 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v);
1903 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v);
1904 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer);
1905
1906 #define glAttachShader GLEW_GET_FUN(__glewAttachShader)
1907 #define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation)
1908 #define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate)
1909 #define glCompileShader GLEW_GET_FUN(__glewCompileShader)
1910 #define glCreateProgram GLEW_GET_FUN(__glewCreateProgram)
1911 #define glCreateShader GLEW_GET_FUN(__glewCreateShader)
1912 #define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram)
1913 #define glDeleteShader GLEW_GET_FUN(__glewDeleteShader)
1914 #define glDetachShader GLEW_GET_FUN(__glewDetachShader)
1915 #define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray)
1916 #define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers)
1917 #define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray)
1918 #define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib)
1919 #define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform)
1920 #define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders)
1921 #define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation)
1922 #define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog)
1923 #define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv)
1924 #define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog)
1925 #define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource)
1926 #define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv)
1927 #define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation)
1928 #define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv)
1929 #define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv)
1930 #define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv)
1931 #define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv)
1932 #define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv)
1933 #define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv)
1934 #define glIsProgram GLEW_GET_FUN(__glewIsProgram)
1935 #define glIsShader GLEW_GET_FUN(__glewIsShader)
1936 #define glLinkProgram GLEW_GET_FUN(__glewLinkProgram)
1937 #define glShaderSource GLEW_GET_FUN(__glewShaderSource)
1938 #define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate)
1939 #define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate)
1940 #define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate)
1941 #define glUniform1f GLEW_GET_FUN(__glewUniform1f)
1942 #define glUniform1fv GLEW_GET_FUN(__glewUniform1fv)
1943 #define glUniform1i GLEW_GET_FUN(__glewUniform1i)
1944 #define glUniform1iv GLEW_GET_FUN(__glewUniform1iv)
1945 #define glUniform2f GLEW_GET_FUN(__glewUniform2f)
1946 #define glUniform2fv GLEW_GET_FUN(__glewUniform2fv)
1947 #define glUniform2i GLEW_GET_FUN(__glewUniform2i)
1948 #define glUniform2iv GLEW_GET_FUN(__glewUniform2iv)
1949 #define glUniform3f GLEW_GET_FUN(__glewUniform3f)
1950 #define glUniform3fv GLEW_GET_FUN(__glewUniform3fv)
1951 #define glUniform3i GLEW_GET_FUN(__glewUniform3i)
1952 #define glUniform3iv GLEW_GET_FUN(__glewUniform3iv)
1953 #define glUniform4f GLEW_GET_FUN(__glewUniform4f)
1954 #define glUniform4fv GLEW_GET_FUN(__glewUniform4fv)
1955 #define glUniform4i GLEW_GET_FUN(__glewUniform4i)
1956 #define glUniform4iv GLEW_GET_FUN(__glewUniform4iv)
1957 #define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv)
1958 #define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv)
1959 #define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv)
1960 #define glUseProgram GLEW_GET_FUN(__glewUseProgram)
1961 #define glValidateProgram GLEW_GET_FUN(__glewValidateProgram)
1962 #define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d)
1963 #define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv)
1964 #define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f)
1965 #define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv)
1966 #define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s)
1967 #define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv)
1968 #define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d)
1969 #define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv)
1970 #define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f)
1971 #define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv)
1972 #define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s)
1973 #define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv)
1974 #define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d)
1975 #define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv)
1976 #define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f)
1977 #define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv)
1978 #define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s)
1979 #define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv)
1980 #define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv)
1981 #define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv)
1982 #define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv)
1983 #define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub)
1984 #define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv)
1985 #define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv)
1986 #define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv)
1987 #define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv)
1988 #define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d)
1989 #define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv)
1990 #define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f)
1991 #define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv)
1992 #define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv)
1993 #define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s)
1994 #define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv)
1995 #define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv)
1996 #define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv)
1997 #define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv)
1998 #define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer)
1999
2000 #define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0)
2001
2002 #endif /* GL_VERSION_2_0 */
2003
2004 /* ----------------------------- GL_VERSION_2_1 ---------------------------- */
2005
2006 #ifndef GL_VERSION_2_1
2007 #define GL_VERSION_2_1 1
2008
2009 #define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F
2010 #define GL_PIXEL_PACK_BUFFER 0x88EB
2011 #define GL_PIXEL_UNPACK_BUFFER 0x88EC
2012 #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
2013 #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
2014 #define GL_FLOAT_MAT2x3 0x8B65
2015 #define GL_FLOAT_MAT2x4 0x8B66
2016 #define GL_FLOAT_MAT3x2 0x8B67
2017 #define GL_FLOAT_MAT3x4 0x8B68
2018 #define GL_FLOAT_MAT4x2 0x8B69
2019 #define GL_FLOAT_MAT4x3 0x8B6A
2020 #define GL_SRGB 0x8C40
2021 #define GL_SRGB8 0x8C41
2022 #define GL_SRGB_ALPHA 0x8C42
2023 #define GL_SRGB8_ALPHA8 0x8C43
2024 #define GL_SLUMINANCE_ALPHA 0x8C44
2025 #define GL_SLUMINANCE8_ALPHA8 0x8C45
2026 #define GL_SLUMINANCE 0x8C46
2027 #define GL_SLUMINANCE8 0x8C47
2028 #define GL_COMPRESSED_SRGB 0x8C48
2029 #define GL_COMPRESSED_SRGB_ALPHA 0x8C49
2030 #define GL_COMPRESSED_SLUMINANCE 0x8C4A
2031 #define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B
2032
2033 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
2034 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
2035 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
2036 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
2037 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
2038 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
2039
2040 #define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv)
2041 #define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv)
2042 #define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv)
2043 #define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv)
2044 #define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv)
2045 #define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv)
2046
2047 #define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1)
2048
2049 #endif /* GL_VERSION_2_1 */
2050
2051 /* ----------------------------- GL_VERSION_3_0 ---------------------------- */
2052
2053 #ifndef GL_VERSION_3_0
2054 #define GL_VERSION_3_0 1
2055
2056 #define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0
2057 #define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1
2058 #define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2
2059 #define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3
2060 #define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4
2061 #define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5
2062 #define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB
2063 #define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES
2064 #define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS
2065 #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001
2066 #define GL_MAJOR_VERSION 0x821B
2067 #define GL_MINOR_VERSION 0x821C
2068 #define GL_NUM_EXTENSIONS 0x821D
2069 #define GL_CONTEXT_FLAGS 0x821E
2070 #define GL_DEPTH_BUFFER 0x8223
2071 #define GL_STENCIL_BUFFER 0x8224
2072 #define GL_RGBA32F 0x8814
2073 #define GL_RGB32F 0x8815
2074 #define GL_RGBA16F 0x881A
2075 #define GL_RGB16F 0x881B
2076 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
2077 #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
2078 #define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
2079 #define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
2080 #define GL_CLAMP_VERTEX_COLOR 0x891A
2081 #define GL_CLAMP_FRAGMENT_COLOR 0x891B
2082 #define GL_CLAMP_READ_COLOR 0x891C
2083 #define GL_FIXED_ONLY 0x891D
2084 #define GL_TEXTURE_RED_TYPE 0x8C10
2085 #define GL_TEXTURE_GREEN_TYPE 0x8C11
2086 #define GL_TEXTURE_BLUE_TYPE 0x8C12
2087 #define GL_TEXTURE_ALPHA_TYPE 0x8C13
2088 #define GL_TEXTURE_LUMINANCE_TYPE 0x8C14
2089 #define GL_TEXTURE_INTENSITY_TYPE 0x8C15
2090 #define GL_TEXTURE_DEPTH_TYPE 0x8C16
2091 #define GL_TEXTURE_1D_ARRAY 0x8C18
2092 #define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19
2093 #define GL_TEXTURE_2D_ARRAY 0x8C1A
2094 #define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B
2095 #define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C
2096 #define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
2097 #define GL_R11F_G11F_B10F 0x8C3A
2098 #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
2099 #define GL_RGB9_E5 0x8C3D
2100 #define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
2101 #define GL_TEXTURE_SHARED_SIZE 0x8C3F
2102 #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
2103 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
2104 #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
2105 #define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
2106 #define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
2107 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
2108 #define GL_PRIMITIVES_GENERATED 0x8C87
2109 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
2110 #define GL_RASTERIZER_DISCARD 0x8C89
2111 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
2112 #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
2113 #define GL_INTERLEAVED_ATTRIBS 0x8C8C
2114 #define GL_SEPARATE_ATTRIBS 0x8C8D
2115 #define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
2116 #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
2117 #define GL_RGBA32UI 0x8D70
2118 #define GL_RGB32UI 0x8D71
2119 #define GL_RGBA16UI 0x8D76
2120 #define GL_RGB16UI 0x8D77
2121 #define GL_RGBA8UI 0x8D7C
2122 #define GL_RGB8UI 0x8D7D
2123 #define GL_RGBA32I 0x8D82
2124 #define GL_RGB32I 0x8D83
2125 #define GL_RGBA16I 0x8D88
2126 #define GL_RGB16I 0x8D89
2127 #define GL_RGBA8I 0x8D8E
2128 #define GL_RGB8I 0x8D8F
2129 #define GL_RED_INTEGER 0x8D94
2130 #define GL_GREEN_INTEGER 0x8D95
2131 #define GL_BLUE_INTEGER 0x8D96
2132 #define GL_ALPHA_INTEGER 0x8D97
2133 #define GL_RGB_INTEGER 0x8D98
2134 #define GL_RGBA_INTEGER 0x8D99
2135 #define GL_BGR_INTEGER 0x8D9A
2136 #define GL_BGRA_INTEGER 0x8D9B
2137 #define GL_SAMPLER_1D_ARRAY 0x8DC0
2138 #define GL_SAMPLER_2D_ARRAY 0x8DC1
2139 #define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3
2140 #define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
2141 #define GL_SAMPLER_CUBE_SHADOW 0x8DC5
2142 #define GL_UNSIGNED_INT_VEC2 0x8DC6
2143 #define GL_UNSIGNED_INT_VEC3 0x8DC7
2144 #define GL_UNSIGNED_INT_VEC4 0x8DC8
2145 #define GL_INT_SAMPLER_1D 0x8DC9
2146 #define GL_INT_SAMPLER_2D 0x8DCA
2147 #define GL_INT_SAMPLER_3D 0x8DCB
2148 #define GL_INT_SAMPLER_CUBE 0x8DCC
2149 #define GL_INT_SAMPLER_1D_ARRAY 0x8DCE
2150 #define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
2151 #define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1
2152 #define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
2153 #define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
2154 #define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
2155 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6
2156 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
2157 #define GL_QUERY_WAIT 0x8E13
2158 #define GL_QUERY_NO_WAIT 0x8E14
2159 #define GL_QUERY_BY_REGION_WAIT 0x8E15
2160 #define GL_QUERY_BY_REGION_NO_WAIT 0x8E16
2161
2162 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode);
2163 typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);
2164 typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name);
2165 typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp);
2166 typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
2167 typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value);
2168 typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value);
2169 typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value);
2170 typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
2171 typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index);
2172 typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index);
2173 typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void);
2174 typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void);
2175 typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data);
2176 typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name);
2177 typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
2178 typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params);
2179 typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params);
2180 typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name);
2181 typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params);
2182 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params);
2183 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params);
2184 typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index);
2185 typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params);
2186 typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params);
2187 typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
2188 typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
2189 typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value);
2190 typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
2191 typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value);
2192 typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
2193 typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value);
2194 typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
2195 typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value);
2196 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0);
2197 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0);
2198 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0);
2199 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0);
2200 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1);
2201 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0);
2202 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1);
2203 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0);
2204 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2);
2205 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0);
2206 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2);
2207 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0);
2208 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0);
2209 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
2210 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0);
2211 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0);
2212 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0);
2213 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
2214 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0);
2215 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0);
2216 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer);
2217
2218 #define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender)
2219 #define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback)
2220 #define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation)
2221 #define glClampColor GLEW_GET_FUN(__glewClampColor)
2222 #define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi)
2223 #define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv)
2224 #define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv)
2225 #define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv)
2226 #define glColorMaski GLEW_GET_FUN(__glewColorMaski)
2227 #define glDisablei GLEW_GET_FUN(__glewDisablei)
2228 #define glEnablei GLEW_GET_FUN(__glewEnablei)
2229 #define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender)
2230 #define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback)
2231 #define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v)
2232 #define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation)
2233 #define glGetStringi GLEW_GET_FUN(__glewGetStringi)
2234 #define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv)
2235 #define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv)
2236 #define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying)
2237 #define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv)
2238 #define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv)
2239 #define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv)
2240 #define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi)
2241 #define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv)
2242 #define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv)
2243 #define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings)
2244 #define glUniform1ui GLEW_GET_FUN(__glewUniform1ui)
2245 #define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv)
2246 #define glUniform2ui GLEW_GET_FUN(__glewUniform2ui)
2247 #define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv)
2248 #define glUniform3ui GLEW_GET_FUN(__glewUniform3ui)
2249 #define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv)
2250 #define glUniform4ui GLEW_GET_FUN(__glewUniform4ui)
2251 #define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv)
2252 #define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i)
2253 #define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv)
2254 #define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui)
2255 #define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv)
2256 #define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i)
2257 #define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv)
2258 #define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui)
2259 #define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv)
2260 #define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i)
2261 #define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv)
2262 #define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui)
2263 #define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv)
2264 #define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv)
2265 #define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i)
2266 #define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv)
2267 #define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv)
2268 #define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv)
2269 #define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui)
2270 #define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv)
2271 #define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv)
2272 #define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer)
2273
2274 #define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0)
2275
2276 #endif /* GL_VERSION_3_0 */
2277
2278 /* ----------------------------- GL_VERSION_3_1 ---------------------------- */
2279
2280 #ifndef GL_VERSION_3_1
2281 #define GL_VERSION_3_1 1
2282
2283 #define GL_TEXTURE_RECTANGLE 0x84F5
2284 #define GL_TEXTURE_BINDING_RECTANGLE 0x84F6
2285 #define GL_PROXY_TEXTURE_RECTANGLE 0x84F7
2286 #define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8
2287 #define GL_SAMPLER_2D_RECT 0x8B63
2288 #define GL_SAMPLER_2D_RECT_SHADOW 0x8B64
2289 #define GL_TEXTURE_BUFFER 0x8C2A
2290 #define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B
2291 #define GL_TEXTURE_BINDING_BUFFER 0x8C2C
2292 #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D
2293 #define GL_TEXTURE_BUFFER_FORMAT 0x8C2E
2294 #define GL_SAMPLER_BUFFER 0x8DC2
2295 #define GL_INT_SAMPLER_2D_RECT 0x8DCD
2296 #define GL_INT_SAMPLER_BUFFER 0x8DD0
2297 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5
2298 #define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8
2299 #define GL_RED_SNORM 0x8F90
2300 #define GL_RG_SNORM 0x8F91
2301 #define GL_RGB_SNORM 0x8F92
2302 #define GL_RGBA_SNORM 0x8F93
2303 #define GL_R8_SNORM 0x8F94
2304 #define GL_RG8_SNORM 0x8F95
2305 #define GL_RGB8_SNORM 0x8F96
2306 #define GL_RGBA8_SNORM 0x8F97
2307 #define GL_R16_SNORM 0x8F98
2308 #define GL_RG16_SNORM 0x8F99
2309 #define GL_RGB16_SNORM 0x8F9A
2310 #define GL_RGBA16_SNORM 0x8F9B
2311 #define GL_SIGNED_NORMALIZED 0x8F9C
2312 #define GL_PRIMITIVE_RESTART 0x8F9D
2313 #define GL_PRIMITIVE_RESTART_INDEX 0x8F9E
2314 #define GL_BUFFER_ACCESS_FLAGS 0x911F
2315 #define GL_BUFFER_MAP_LENGTH 0x9120
2316 #define GL_BUFFER_MAP_OFFSET 0x9121
2317
2318 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
2319 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount);
2320 typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer);
2321 typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer);
2322
2323 #define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced)
2324 #define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced)
2325 #define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex)
2326 #define glTexBuffer GLEW_GET_FUN(__glewTexBuffer)
2327
2328 #define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1)
2329
2330 #endif /* GL_VERSION_3_1 */
2331
2332 /* ----------------------------- GL_VERSION_3_2 ---------------------------- */
2333
2334 #ifndef GL_VERSION_3_2
2335 #define GL_VERSION_3_2 1
2336
2337 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
2338 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
2339 #define GL_LINES_ADJACENCY 0x000A
2340 #define GL_LINE_STRIP_ADJACENCY 0x000B
2341 #define GL_TRIANGLES_ADJACENCY 0x000C
2342 #define GL_TRIANGLE_STRIP_ADJACENCY 0x000D
2343 #define GL_PROGRAM_POINT_SIZE 0x8642
2344 #define GL_GEOMETRY_VERTICES_OUT 0x8916
2345 #define GL_GEOMETRY_INPUT_TYPE 0x8917
2346 #define GL_GEOMETRY_OUTPUT_TYPE 0x8918
2347 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29
2348 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7
2349 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8
2350 #define GL_GEOMETRY_SHADER 0x8DD9
2351 #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF
2352 #define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0
2353 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
2354 #define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
2355 #define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123
2356 #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124
2357 #define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
2358 #define GL_CONTEXT_PROFILE_MASK 0x9126
2359
2360 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
2361 typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data);
2362 typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data);
2363
2364 #define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture)
2365 #define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v)
2366 #define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v)
2367
2368 #define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2)
2369
2370 #endif /* GL_VERSION_3_2 */
2371
2372 /* ----------------------------- GL_VERSION_3_3 ---------------------------- */
2373
2374 #ifndef GL_VERSION_3_3
2375 #define GL_VERSION_3_3 1
2376
2377 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
2378 #define GL_RGB10_A2UI 0x906F
2379
2380 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
2381
2382 #define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor)
2383
2384 #define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3)
2385
2386 #endif /* GL_VERSION_3_3 */
2387
2388 /* ----------------------------- GL_VERSION_4_0 ---------------------------- */
2389
2390 #ifndef GL_VERSION_4_0
2391 #define GL_VERSION_4_0 1
2392
2393 #define GL_SAMPLE_SHADING 0x8C36
2394 #define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37
2395 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
2396 #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
2397 #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F
2398 #define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009
2399 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A
2400 #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B
2401 #define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C
2402 #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D
2403 #define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E
2404 #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F
2405
2406 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
2407 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);
2408 typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
2409 typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);
2410 typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value);
2411
2412 #define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei)
2413 #define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi)
2414 #define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei)
2415 #define glBlendFunci GLEW_GET_FUN(__glewBlendFunci)
2416 #define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading)
2417
2418 #define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0)
2419
2420 #endif /* GL_VERSION_4_0 */
2421
2422 /* ----------------------------- GL_VERSION_4_1 ---------------------------- */
2423
2424 #ifndef GL_VERSION_4_1
2425 #define GL_VERSION_4_1 1
2426
2427 #define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1)
2428
2429 #endif /* GL_VERSION_4_1 */
2430
2431 /* ----------------------------- GL_VERSION_4_2 ---------------------------- */
2432
2433 #ifndef GL_VERSION_4_2
2434 #define GL_VERSION_4_2 1
2435
2436 #define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
2437 #define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
2438 #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C
2439 #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D
2440 #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E
2441 #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F
2442 #define GL_COPY_READ_BUFFER_BINDING 0x8F36
2443 #define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
2444
2445 #define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2)
2446
2447 #endif /* GL_VERSION_4_2 */
2448
2449 /* ----------------------------- GL_VERSION_4_3 ---------------------------- */
2450
2451 #ifndef GL_VERSION_4_3
2452 #define GL_VERSION_4_3 1
2453
2454 #define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9
2455 #define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E
2456
2457 #define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3)
2458
2459 #endif /* GL_VERSION_4_3 */
2460
2461 /* ----------------------------- GL_VERSION_4_4 ---------------------------- */
2462
2463 #ifndef GL_VERSION_4_4
2464 #define GL_VERSION_4_4 1
2465
2466 #define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221
2467 #define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5
2468 #define GL_TEXTURE_BUFFER_BINDING 0x8C2A
2469
2470 #define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4)
2471
2472 #endif /* GL_VERSION_4_4 */
2473
2474 /* ----------------------------- GL_VERSION_4_5 ---------------------------- */
2475
2476 #ifndef GL_VERSION_4_5
2477 #define GL_VERSION_4_5 1
2478
2479 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004
2480
2481 typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSPROC) (void);
2482 typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *pixels);
2483 typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEPROC) (GLenum tex, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels);
2484 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
2485
2486 #define glGetGraphicsResetStatus GLEW_GET_FUN(__glewGetGraphicsResetStatus)
2487 #define glGetnCompressedTexImage GLEW_GET_FUN(__glewGetnCompressedTexImage)
2488 #define glGetnTexImage GLEW_GET_FUN(__glewGetnTexImage)
2489 #define glGetnUniformdv GLEW_GET_FUN(__glewGetnUniformdv)
2490
2491 #define GLEW_VERSION_4_5 GLEW_GET_VAR(__GLEW_VERSION_4_5)
2492
2493 #endif /* GL_VERSION_4_5 */
2494
2495 /* -------------------------- GL_3DFX_multisample -------------------------- */
2496
2497 #ifndef GL_3DFX_multisample
2498 #define GL_3DFX_multisample 1
2499
2500 #define GL_MULTISAMPLE_3DFX 0x86B2
2501 #define GL_SAMPLE_BUFFERS_3DFX 0x86B3
2502 #define GL_SAMPLES_3DFX 0x86B4
2503 #define GL_MULTISAMPLE_BIT_3DFX 0x20000000
2504
2505 #define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample)
2506
2507 #endif /* GL_3DFX_multisample */
2508
2509 /* ---------------------------- GL_3DFX_tbuffer ---------------------------- */
2510
2511 #ifndef GL_3DFX_tbuffer
2512 #define GL_3DFX_tbuffer 1
2513
2514 typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask);
2515
2516 #define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX)
2517
2518 #define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer)
2519
2520 #endif /* GL_3DFX_tbuffer */
2521
2522 /* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */
2523
2524 #ifndef GL_3DFX_texture_compression_FXT1
2525 #define GL_3DFX_texture_compression_FXT1 1
2526
2527 #define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0
2528 #define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1
2529
2530 #define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1)
2531
2532 #endif /* GL_3DFX_texture_compression_FXT1 */
2533
2534 /* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */
2535
2536 #ifndef GL_AMD_blend_minmax_factor
2537 #define GL_AMD_blend_minmax_factor 1
2538
2539 #define GL_FACTOR_MIN_AMD 0x901C
2540 #define GL_FACTOR_MAX_AMD 0x901D
2541
2542 #define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor)
2543
2544 #endif /* GL_AMD_blend_minmax_factor */
2545
2546 /* ----------------------- GL_AMD_conservative_depth ----------------------- */
2547
2548 #ifndef GL_AMD_conservative_depth
2549 #define GL_AMD_conservative_depth 1
2550
2551 #define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth)
2552
2553 #endif /* GL_AMD_conservative_depth */
2554
2555 /* -------------------------- GL_AMD_debug_output -------------------------- */
2556
2557 #ifndef GL_AMD_debug_output
2558 #define GL_AMD_debug_output 1
2559
2560 #define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143
2561 #define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144
2562 #define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145
2563 #define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146
2564 #define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147
2565 #define GL_DEBUG_SEVERITY_LOW_AMD 0x9148
2566 #define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149
2567 #define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A
2568 #define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B
2569 #define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C
2570 #define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D
2571 #define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E
2572 #define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F
2573 #define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150
2574
2575 typedef void (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam);
2576
2577 typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam);
2578 typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);
2579 typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf);
2580 typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message);
2581
2582 #define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD)
2583 #define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD)
2584 #define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD)
2585 #define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD)
2586
2587 #define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output)
2588
2589 #endif /* GL_AMD_debug_output */
2590
2591 /* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */
2592
2593 #ifndef GL_AMD_depth_clamp_separate
2594 #define GL_AMD_depth_clamp_separate 1
2595
2596 #define GL_DEPTH_CLAMP_NEAR_AMD 0x901E
2597 #define GL_DEPTH_CLAMP_FAR_AMD 0x901F
2598
2599 #define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate)
2600
2601 #endif /* GL_AMD_depth_clamp_separate */
2602
2603 /* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */
2604
2605 #ifndef GL_AMD_draw_buffers_blend
2606 #define GL_AMD_draw_buffers_blend 1
2607
2608 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode);
2609 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
2610 typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst);
2611 typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
2612
2613 #define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD)
2614 #define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD)
2615 #define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD)
2616 #define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD)
2617
2618 #define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend)
2619
2620 #endif /* GL_AMD_draw_buffers_blend */
2621
2622 /* --------------------------- GL_AMD_gcn_shader --------------------------- */
2623
2624 #ifndef GL_AMD_gcn_shader
2625 #define GL_AMD_gcn_shader 1
2626
2627 #define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader)
2628
2629 #endif /* GL_AMD_gcn_shader */
2630
2631 /* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */
2632
2633 #ifndef GL_AMD_gpu_shader_int64
2634 #define GL_AMD_gpu_shader_int64 1
2635
2636 #define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64)
2637
2638 #endif /* GL_AMD_gpu_shader_int64 */
2639
2640 /* ---------------------- GL_AMD_interleaved_elements ---------------------- */
2641
2642 #ifndef GL_AMD_interleaved_elements
2643 #define GL_AMD_interleaved_elements 1
2644
2645 #define GL_RED 0x1903
2646 #define GL_GREEN 0x1904
2647 #define GL_BLUE 0x1905
2648 #define GL_ALPHA 0x1906
2649 #define GL_RG8UI 0x8238
2650 #define GL_RG16UI 0x823A
2651 #define GL_RGBA8UI 0x8D7C
2652 #define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4
2653 #define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5
2654
2655 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param);
2656
2657 #define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD)
2658
2659 #define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements)
2660
2661 #endif /* GL_AMD_interleaved_elements */
2662
2663 /* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */
2664
2665 #ifndef GL_AMD_multi_draw_indirect
2666 #define GL_AMD_multi_draw_indirect 1
2667
2668 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride);
2669 typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride);
2670
2671 #define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD)
2672 #define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD)
2673
2674 #define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect)
2675
2676 #endif /* GL_AMD_multi_draw_indirect */
2677
2678 /* ------------------------- GL_AMD_name_gen_delete ------------------------ */
2679
2680 #ifndef GL_AMD_name_gen_delete
2681 #define GL_AMD_name_gen_delete 1
2682
2683 #define GL_DATA_BUFFER_AMD 0x9151
2684 #define GL_PERFORMANCE_MONITOR_AMD 0x9152
2685 #define GL_QUERY_OBJECT_AMD 0x9153
2686 #define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154
2687 #define GL_SAMPLER_OBJECT_AMD 0x9155
2688
2689 typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names);
2690 typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names);
2691 typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name);
2692
2693 #define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD)
2694 #define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD)
2695 #define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD)
2696
2697 #define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete)
2698
2699 #endif /* GL_AMD_name_gen_delete */
2700
2701 /* ---------------------- GL_AMD_occlusion_query_event --------------------- */
2702
2703 #ifndef GL_AMD_occlusion_query_event
2704 #define GL_AMD_occlusion_query_event 1
2705
2706 #define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001
2707 #define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002
2708 #define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004
2709 #define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008
2710 #define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F
2711 #define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF
2712
2713 typedef void (GLAPIENTRY * PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param);
2714
2715 #define glQueryObjectParameteruiAMD GLEW_GET_FUN(__glewQueryObjectParameteruiAMD)
2716
2717 #define GLEW_AMD_occlusion_query_event GLEW_GET_VAR(__GLEW_AMD_occlusion_query_event)
2718
2719 #endif /* GL_AMD_occlusion_query_event */
2720
2721 /* ----------------------- GL_AMD_performance_monitor ---------------------- */
2722
2723 #ifndef GL_AMD_performance_monitor
2724 #define GL_AMD_performance_monitor 1
2725
2726 #define GL_COUNTER_TYPE_AMD 0x8BC0
2727 #define GL_COUNTER_RANGE_AMD 0x8BC1
2728 #define GL_UNSIGNED_INT64_AMD 0x8BC2
2729 #define GL_PERCENTAGE_AMD 0x8BC3
2730 #define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4
2731 #define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5
2732 #define GL_PERFMON_RESULT_AMD 0x8BC6
2733
2734 typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);
2735 typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors);
2736 typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);
2737 typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors);
2738 typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten);
2739 typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data);
2740 typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString);
2741 typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters);
2742 typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString);
2743 typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups);
2744 typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList);
2745
2746 #define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD)
2747 #define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD)
2748 #define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD)
2749 #define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD)
2750 #define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD)
2751 #define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD)
2752 #define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD)
2753 #define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD)
2754 #define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD)
2755 #define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD)
2756 #define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD)
2757
2758 #define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor)
2759
2760 #endif /* GL_AMD_performance_monitor */
2761
2762 /* -------------------------- GL_AMD_pinned_memory ------------------------- */
2763
2764 #ifndef GL_AMD_pinned_memory
2765 #define GL_AMD_pinned_memory 1
2766
2767 #define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160
2768
2769 #define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory)
2770
2771 #endif /* GL_AMD_pinned_memory */
2772
2773 /* ----------------------- GL_AMD_query_buffer_object ---------------------- */
2774
2775 #ifndef GL_AMD_query_buffer_object
2776 #define GL_AMD_query_buffer_object 1
2777
2778 #define GL_QUERY_BUFFER_AMD 0x9192
2779 #define GL_QUERY_BUFFER_BINDING_AMD 0x9193
2780 #define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194
2781
2782 #define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object)
2783
2784 #endif /* GL_AMD_query_buffer_object */
2785
2786 /* ------------------------ GL_AMD_sample_positions ------------------------ */
2787
2788 #ifndef GL_AMD_sample_positions
2789 #define GL_AMD_sample_positions 1
2790
2791 #define GL_SUBSAMPLE_DISTANCE_AMD 0x883F
2792
2793 typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val);
2794
2795 #define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD)
2796
2797 #define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions)
2798
2799 #endif /* GL_AMD_sample_positions */
2800
2801 /* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */
2802
2803 #ifndef GL_AMD_seamless_cubemap_per_texture
2804 #define GL_AMD_seamless_cubemap_per_texture 1
2805
2806 #define GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB 0x884F
2807
2808 #define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture)
2809
2810 #endif /* GL_AMD_seamless_cubemap_per_texture */
2811
2812 /* -------------------- GL_AMD_shader_atomic_counter_ops ------------------- */
2813
2814 #ifndef GL_AMD_shader_atomic_counter_ops
2815 #define GL_AMD_shader_atomic_counter_ops 1
2816
2817 #define GLEW_AMD_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_AMD_shader_atomic_counter_ops)
2818
2819 #endif /* GL_AMD_shader_atomic_counter_ops */
2820
2821 /* ---------------------- GL_AMD_shader_stencil_export --------------------- */
2822
2823 #ifndef GL_AMD_shader_stencil_export
2824 #define GL_AMD_shader_stencil_export 1
2825
2826 #define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export)
2827
2828 #endif /* GL_AMD_shader_stencil_export */
2829
2830 /* ------------------- GL_AMD_shader_stencil_value_export ------------------ */
2831
2832 #ifndef GL_AMD_shader_stencil_value_export
2833 #define GL_AMD_shader_stencil_value_export 1
2834
2835 #define GLEW_AMD_shader_stencil_value_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_value_export)
2836
2837 #endif /* GL_AMD_shader_stencil_value_export */
2838
2839 /* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */
2840
2841 #ifndef GL_AMD_shader_trinary_minmax
2842 #define GL_AMD_shader_trinary_minmax 1
2843
2844 #define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax)
2845
2846 #endif /* GL_AMD_shader_trinary_minmax */
2847
2848 /* ------------------------- GL_AMD_sparse_texture ------------------------- */
2849
2850 #ifndef GL_AMD_sparse_texture
2851 #define GL_AMD_sparse_texture 1
2852
2853 #define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001
2854 #define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195
2855 #define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196
2856 #define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197
2857 #define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198
2858 #define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199
2859 #define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A
2860 #define GL_MIN_SPARSE_LEVEL_AMD 0x919B
2861 #define GL_MIN_LOD_WARNING_AMD 0x919C
2862
2863 typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags);
2864 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags);
2865
2866 #define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD)
2867 #define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD)
2868
2869 #define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture)
2870
2871 #endif /* GL_AMD_sparse_texture */
2872
2873 /* ------------------- GL_AMD_stencil_operation_extended ------------------- */
2874
2875 #ifndef GL_AMD_stencil_operation_extended
2876 #define GL_AMD_stencil_operation_extended 1
2877
2878 #define GL_SET_AMD 0x874A
2879 #define GL_REPLACE_VALUE_AMD 0x874B
2880 #define GL_STENCIL_OP_VALUE_AMD 0x874C
2881 #define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D
2882
2883 typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value);
2884
2885 #define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD)
2886
2887 #define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended)
2888
2889 #endif /* GL_AMD_stencil_operation_extended */
2890
2891 /* ------------------------ GL_AMD_texture_texture4 ------------------------ */
2892
2893 #ifndef GL_AMD_texture_texture4
2894 #define GL_AMD_texture_texture4 1
2895
2896 #define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4)
2897
2898 #endif /* GL_AMD_texture_texture4 */
2899
2900 /* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */
2901
2902 #ifndef GL_AMD_transform_feedback3_lines_triangles
2903 #define GL_AMD_transform_feedback3_lines_triangles 1
2904
2905 #define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles)
2906
2907 #endif /* GL_AMD_transform_feedback3_lines_triangles */
2908
2909 /* ----------------------- GL_AMD_transform_feedback4 ---------------------- */
2910
2911 #ifndef GL_AMD_transform_feedback4
2912 #define GL_AMD_transform_feedback4 1
2913
2914 #define GL_STREAM_RASTERIZATION_AMD 0x91A0
2915
2916 #define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4)
2917
2918 #endif /* GL_AMD_transform_feedback4 */
2919
2920 /* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */
2921
2922 #ifndef GL_AMD_vertex_shader_layer
2923 #define GL_AMD_vertex_shader_layer 1
2924
2925 #define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer)
2926
2927 #endif /* GL_AMD_vertex_shader_layer */
2928
2929 /* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */
2930
2931 #ifndef GL_AMD_vertex_shader_tessellator
2932 #define GL_AMD_vertex_shader_tessellator 1
2933
2934 #define GL_SAMPLER_BUFFER_AMD 0x9001
2935 #define GL_INT_SAMPLER_BUFFER_AMD 0x9002
2936 #define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003
2937 #define GL_TESSELLATION_MODE_AMD 0x9004
2938 #define GL_TESSELLATION_FACTOR_AMD 0x9005
2939 #define GL_DISCRETE_AMD 0x9006
2940 #define GL_CONTINUOUS_AMD 0x9007
2941
2942 typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor);
2943 typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode);
2944
2945 #define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD)
2946 #define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD)
2947
2948 #define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator)
2949
2950 #endif /* GL_AMD_vertex_shader_tessellator */
2951
2952 /* ------------------ GL_AMD_vertex_shader_viewport_index ------------------ */
2953
2954 #ifndef GL_AMD_vertex_shader_viewport_index
2955 #define GL_AMD_vertex_shader_viewport_index 1
2956
2957 #define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index)
2958
2959 #endif /* GL_AMD_vertex_shader_viewport_index */
2960
2961 /* ------------------------- GL_ANGLE_depth_texture ------------------------ */
2962
2963 #ifndef GL_ANGLE_depth_texture
2964 #define GL_ANGLE_depth_texture 1
2965
2966 #define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture)
2967
2968 #endif /* GL_ANGLE_depth_texture */
2969
2970 /* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */
2971
2972 #ifndef GL_ANGLE_framebuffer_blit
2973 #define GL_ANGLE_framebuffer_blit 1
2974
2975 #define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6
2976 #define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8
2977 #define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9
2978 #define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA
2979
2980 typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
2981
2982 #define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE)
2983
2984 #define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit)
2985
2986 #endif /* GL_ANGLE_framebuffer_blit */
2987
2988 /* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */
2989
2990 #ifndef GL_ANGLE_framebuffer_multisample
2991 #define GL_ANGLE_framebuffer_multisample 1
2992
2993 #define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB
2994 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56
2995 #define GL_MAX_SAMPLES_ANGLE 0x8D57
2996
2997 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
2998
2999 #define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE)
3000
3001 #define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample)
3002
3003 #endif /* GL_ANGLE_framebuffer_multisample */
3004
3005 /* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */
3006
3007 #ifndef GL_ANGLE_instanced_arrays
3008 #define GL_ANGLE_instanced_arrays 1
3009
3010 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE
3011
3012 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
3013 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
3014 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor);
3015
3016 #define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE)
3017 #define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE)
3018 #define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE)
3019
3020 #define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays)
3021
3022 #endif /* GL_ANGLE_instanced_arrays */
3023
3024 /* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */
3025
3026 #ifndef GL_ANGLE_pack_reverse_row_order
3027 #define GL_ANGLE_pack_reverse_row_order 1
3028
3029 #define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4
3030
3031 #define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order)
3032
3033 #endif /* GL_ANGLE_pack_reverse_row_order */
3034
3035 /* ------------------------ GL_ANGLE_program_binary ------------------------ */
3036
3037 #ifndef GL_ANGLE_program_binary
3038 #define GL_ANGLE_program_binary 1
3039
3040 #define GL_PROGRAM_BINARY_ANGLE 0x93A6
3041
3042 #define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary)
3043
3044 #endif /* GL_ANGLE_program_binary */
3045
3046 /* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */
3047
3048 #ifndef GL_ANGLE_texture_compression_dxt1
3049 #define GL_ANGLE_texture_compression_dxt1 1
3050
3051 #define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0
3052 #define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1
3053 #define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2
3054 #define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3
3055
3056 #define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1)
3057
3058 #endif /* GL_ANGLE_texture_compression_dxt1 */
3059
3060 /* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */
3061
3062 #ifndef GL_ANGLE_texture_compression_dxt3
3063 #define GL_ANGLE_texture_compression_dxt3 1
3064
3065 #define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0
3066 #define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1
3067 #define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2
3068 #define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3
3069
3070 #define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3)
3071
3072 #endif /* GL_ANGLE_texture_compression_dxt3 */
3073
3074 /* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */
3075
3076 #ifndef GL_ANGLE_texture_compression_dxt5
3077 #define GL_ANGLE_texture_compression_dxt5 1
3078
3079 #define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0
3080 #define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1
3081 #define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2
3082 #define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3
3083
3084 #define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5)
3085
3086 #endif /* GL_ANGLE_texture_compression_dxt5 */
3087
3088 /* ------------------------- GL_ANGLE_texture_usage ------------------------ */
3089
3090 #ifndef GL_ANGLE_texture_usage
3091 #define GL_ANGLE_texture_usage 1
3092
3093 #define GL_TEXTURE_USAGE_ANGLE 0x93A2
3094 #define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3
3095
3096 #define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage)
3097
3098 #endif /* GL_ANGLE_texture_usage */
3099
3100 /* -------------------------- GL_ANGLE_timer_query ------------------------- */
3101
3102 #ifndef GL_ANGLE_timer_query
3103 #define GL_ANGLE_timer_query 1
3104
3105 #define GL_QUERY_COUNTER_BITS_ANGLE 0x8864
3106 #define GL_CURRENT_QUERY_ANGLE 0x8865
3107 #define GL_QUERY_RESULT_ANGLE 0x8866
3108 #define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867
3109 #define GL_TIME_ELAPSED_ANGLE 0x88BF
3110 #define GL_TIMESTAMP_ANGLE 0x8E28
3111
3112 typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id);
3113 typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids);
3114 typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target);
3115 typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids);
3116 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params);
3117 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params);
3118 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params);
3119 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params);
3120 typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params);
3121 typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id);
3122 typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target);
3123
3124 #define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE)
3125 #define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE)
3126 #define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE)
3127 #define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE)
3128 #define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE)
3129 #define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE)
3130 #define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE)
3131 #define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE)
3132 #define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE)
3133 #define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE)
3134 #define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE)
3135
3136 #define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query)
3137
3138 #endif /* GL_ANGLE_timer_query */
3139
3140 /* ------------------- GL_ANGLE_translated_shader_source ------------------- */
3141
3142 #ifndef GL_ANGLE_translated_shader_source
3143 #define GL_ANGLE_translated_shader_source 1
3144
3145 #define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
3146
3147 typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
3148
3149 #define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE)
3150
3151 #define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source)
3152
3153 #endif /* GL_ANGLE_translated_shader_source */
3154
3155 /* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */
3156
3157 #ifndef GL_APPLE_aux_depth_stencil
3158 #define GL_APPLE_aux_depth_stencil 1
3159
3160 #define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14
3161
3162 #define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil)
3163
3164 #endif /* GL_APPLE_aux_depth_stencil */
3165
3166 /* ------------------------ GL_APPLE_client_storage ------------------------ */
3167
3168 #ifndef GL_APPLE_client_storage
3169 #define GL_APPLE_client_storage 1
3170
3171 #define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2
3172
3173 #define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage)
3174
3175 #endif /* GL_APPLE_client_storage */
3176
3177 /* ------------------------- GL_APPLE_element_array ------------------------ */
3178
3179 #ifndef GL_APPLE_element_array
3180 #define GL_APPLE_element_array 1
3181
3182 #define GL_ELEMENT_ARRAY_APPLE 0x8A0C
3183 #define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D
3184 #define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E
3185
3186 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count);
3187 typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);
3188 typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer);
3189 typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount);
3190 typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount);
3191
3192 #define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE)
3193 #define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE)
3194 #define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE)
3195 #define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE)
3196 #define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE)
3197
3198 #define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array)
3199
3200 #endif /* GL_APPLE_element_array */
3201
3202 /* ----------------------------- GL_APPLE_fence ---------------------------- */
3203
3204 #ifndef GL_APPLE_fence
3205 #define GL_APPLE_fence 1
3206
3207 #define GL_DRAW_PIXELS_APPLE 0x8A0A
3208 #define GL_FENCE_APPLE 0x8A0B
3209
3210 typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences);
3211 typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence);
3212 typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name);
3213 typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences);
3214 typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence);
3215 typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence);
3216 typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence);
3217 typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name);
3218
3219 #define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE)
3220 #define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE)
3221 #define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE)
3222 #define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE)
3223 #define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE)
3224 #define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE)
3225 #define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE)
3226 #define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE)
3227
3228 #define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence)
3229
3230 #endif /* GL_APPLE_fence */
3231
3232 /* ------------------------- GL_APPLE_float_pixels ------------------------- */
3233
3234 #ifndef GL_APPLE_float_pixels
3235 #define GL_APPLE_float_pixels 1
3236
3237 #define GL_HALF_APPLE 0x140B
3238 #define GL_RGBA_FLOAT32_APPLE 0x8814
3239 #define GL_RGB_FLOAT32_APPLE 0x8815
3240 #define GL_ALPHA_FLOAT32_APPLE 0x8816
3241 #define GL_INTENSITY_FLOAT32_APPLE 0x8817
3242 #define GL_LUMINANCE_FLOAT32_APPLE 0x8818
3243 #define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819
3244 #define GL_RGBA_FLOAT16_APPLE 0x881A
3245 #define GL_RGB_FLOAT16_APPLE 0x881B
3246 #define GL_ALPHA_FLOAT16_APPLE 0x881C
3247 #define GL_INTENSITY_FLOAT16_APPLE 0x881D
3248 #define GL_LUMINANCE_FLOAT16_APPLE 0x881E
3249 #define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F
3250 #define GL_COLOR_FLOAT_APPLE 0x8A0F
3251
3252 #define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels)
3253
3254 #endif /* GL_APPLE_float_pixels */
3255
3256 /* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */
3257
3258 #ifndef GL_APPLE_flush_buffer_range
3259 #define GL_APPLE_flush_buffer_range 1
3260
3261 #define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12
3262 #define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13
3263
3264 typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param);
3265 typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size);
3266
3267 #define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE)
3268 #define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE)
3269
3270 #define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range)
3271
3272 #endif /* GL_APPLE_flush_buffer_range */
3273
3274 /* ----------------------- GL_APPLE_object_purgeable ----------------------- */
3275
3276 #ifndef GL_APPLE_object_purgeable
3277 #define GL_APPLE_object_purgeable 1
3278
3279 #define GL_BUFFER_OBJECT_APPLE 0x85B3
3280 #define GL_RELEASED_APPLE 0x8A19
3281 #define GL_VOLATILE_APPLE 0x8A1A
3282 #define GL_RETAINED_APPLE 0x8A1B
3283 #define GL_UNDEFINED_APPLE 0x8A1C
3284 #define GL_PURGEABLE_APPLE 0x8A1D
3285
3286 typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params);
3287 typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);
3288 typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);
3289
3290 #define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE)
3291 #define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE)
3292 #define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE)
3293
3294 #define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable)
3295
3296 #endif /* GL_APPLE_object_purgeable */
3297
3298 /* ------------------------- GL_APPLE_pixel_buffer ------------------------- */
3299
3300 #ifndef GL_APPLE_pixel_buffer
3301 #define GL_APPLE_pixel_buffer 1
3302
3303 #define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10
3304
3305 #define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer)
3306
3307 #endif /* GL_APPLE_pixel_buffer */
3308
3309 /* ---------------------------- GL_APPLE_rgb_422 --------------------------- */
3310
3311 #ifndef GL_APPLE_rgb_422
3312 #define GL_APPLE_rgb_422 1
3313
3314 #define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA
3315 #define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB
3316 #define GL_RGB_422_APPLE 0x8A1F
3317 #define GL_RGB_RAW_422_APPLE 0x8A51
3318
3319 #define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422)
3320
3321 #endif /* GL_APPLE_rgb_422 */
3322
3323 /* --------------------------- GL_APPLE_row_bytes -------------------------- */
3324
3325 #ifndef GL_APPLE_row_bytes
3326 #define GL_APPLE_row_bytes 1
3327
3328 #define GL_PACK_ROW_BYTES_APPLE 0x8A15
3329 #define GL_UNPACK_ROW_BYTES_APPLE 0x8A16
3330
3331 #define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes)
3332
3333 #endif /* GL_APPLE_row_bytes */
3334
3335 /* ------------------------ GL_APPLE_specular_vector ----------------------- */
3336
3337 #ifndef GL_APPLE_specular_vector
3338 #define GL_APPLE_specular_vector 1
3339
3340 #define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0
3341
3342 #define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector)
3343
3344 #endif /* GL_APPLE_specular_vector */
3345
3346 /* ------------------------- GL_APPLE_texture_range ------------------------ */
3347
3348 #ifndef GL_APPLE_texture_range
3349 #define GL_APPLE_texture_range 1
3350
3351 #define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7
3352 #define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8
3353 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
3354 #define GL_STORAGE_PRIVATE_APPLE 0x85BD
3355 #define GL_STORAGE_CACHED_APPLE 0x85BE
3356 #define GL_STORAGE_SHARED_APPLE 0x85BF
3357
3358 typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params);
3359 typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, void *pointer);
3360
3361 #define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE)
3362 #define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE)
3363
3364 #define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range)
3365
3366 #endif /* GL_APPLE_texture_range */
3367
3368 /* ------------------------ GL_APPLE_transform_hint ------------------------ */
3369
3370 #ifndef GL_APPLE_transform_hint
3371 #define GL_APPLE_transform_hint 1
3372
3373 #define GL_TRANSFORM_HINT_APPLE 0x85B1
3374
3375 #define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint)
3376
3377 #endif /* GL_APPLE_transform_hint */
3378
3379 /* ---------------------- GL_APPLE_vertex_array_object --------------------- */
3380
3381 #ifndef GL_APPLE_vertex_array_object
3382 #define GL_APPLE_vertex_array_object 1
3383
3384 #define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5
3385
3386 typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);
3387 typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays);
3388 typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays);
3389 typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);
3390
3391 #define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE)
3392 #define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE)
3393 #define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE)
3394 #define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE)
3395
3396 #define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object)
3397
3398 #endif /* GL_APPLE_vertex_array_object */
3399
3400 /* ---------------------- GL_APPLE_vertex_array_range ---------------------- */
3401
3402 #ifndef GL_APPLE_vertex_array_range
3403 #define GL_APPLE_vertex_array_range 1
3404
3405 #define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D
3406 #define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E
3407 #define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F
3408 #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520
3409 #define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521
3410 #define GL_STORAGE_CLIENT_APPLE 0x85B4
3411 #define GL_STORAGE_CACHED_APPLE 0x85BE
3412 #define GL_STORAGE_SHARED_APPLE 0x85BF
3413
3414 typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer);
3415 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param);
3416 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer);
3417
3418 #define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE)
3419 #define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE)
3420 #define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE)
3421
3422 #define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range)
3423
3424 #endif /* GL_APPLE_vertex_array_range */
3425
3426 /* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */
3427
3428 #ifndef GL_APPLE_vertex_program_evaluators
3429 #define GL_APPLE_vertex_program_evaluators 1
3430
3431 #define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00
3432 #define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01
3433 #define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02
3434 #define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03
3435 #define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04
3436 #define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05
3437 #define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06
3438 #define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07
3439 #define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08
3440 #define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09
3441
3442 typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);
3443 typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);
3444 typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname);
3445 typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points);
3446 typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points);
3447 typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points);
3448 typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points);
3449
3450 #define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE)
3451 #define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE)
3452 #define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE)
3453 #define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE)
3454 #define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE)
3455 #define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE)
3456 #define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE)
3457
3458 #define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators)
3459
3460 #endif /* GL_APPLE_vertex_program_evaluators */
3461
3462 /* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */
3463
3464 #ifndef GL_APPLE_ycbcr_422
3465 #define GL_APPLE_ycbcr_422 1
3466
3467 #define GL_YCBCR_422_APPLE 0x85B9
3468
3469 #define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422)
3470
3471 #endif /* GL_APPLE_ycbcr_422 */
3472
3473 /* ------------------------ GL_ARB_ES2_compatibility ----------------------- */
3474
3475 #ifndef GL_ARB_ES2_compatibility
3476 #define GL_ARB_ES2_compatibility 1
3477
3478 #define GL_FIXED 0x140C
3479 #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
3480 #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
3481 #define GL_RGB565 0x8D62
3482 #define GL_LOW_FLOAT 0x8DF0
3483 #define GL_MEDIUM_FLOAT 0x8DF1
3484 #define GL_HIGH_FLOAT 0x8DF2
3485 #define GL_LOW_INT 0x8DF3
3486 #define GL_MEDIUM_INT 0x8DF4
3487 #define GL_HIGH_INT 0x8DF5
3488 #define GL_SHADER_BINARY_FORMATS 0x8DF8
3489 #define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
3490 #define GL_SHADER_COMPILER 0x8DFA
3491 #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
3492 #define GL_MAX_VARYING_VECTORS 0x8DFC
3493 #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
3494
3495 typedef int GLfixed;
3496
3497 typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d);
3498 typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f);
3499 typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision);
3500 typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void);
3501 typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const void*binary, GLsizei length);
3502
3503 #define glClearDepthf GLEW_GET_FUN(__glewClearDepthf)
3504 #define glDepthRangef GLEW_GET_FUN(__glewDepthRangef)
3505 #define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat)
3506 #define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler)
3507 #define glShaderBinary GLEW_GET_FUN(__glewShaderBinary)
3508
3509 #define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility)
3510
3511 #endif /* GL_ARB_ES2_compatibility */
3512
3513 /* ----------------------- GL_ARB_ES3_1_compatibility ---------------------- */
3514
3515 #ifndef GL_ARB_ES3_1_compatibility
3516 #define GL_ARB_ES3_1_compatibility 1
3517
3518 typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers);
3519
3520 #define glMemoryBarrierByRegion GLEW_GET_FUN(__glewMemoryBarrierByRegion)
3521
3522 #define GLEW_ARB_ES3_1_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_1_compatibility)
3523
3524 #endif /* GL_ARB_ES3_1_compatibility */
3525
3526 /* ----------------------- GL_ARB_ES3_2_compatibility ---------------------- */
3527
3528 #ifndef GL_ARB_ES3_2_compatibility
3529 #define GL_ARB_ES3_2_compatibility 1
3530
3531 #define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE
3532 #define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381
3533 #define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382
3534
3535 typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
3536
3537 #define glPrimitiveBoundingBoxARB GLEW_GET_FUN(__glewPrimitiveBoundingBoxARB)
3538
3539 #define GLEW_ARB_ES3_2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_2_compatibility)
3540
3541 #endif /* GL_ARB_ES3_2_compatibility */
3542
3543 /* ------------------------ GL_ARB_ES3_compatibility ----------------------- */
3544
3545 #ifndef GL_ARB_ES3_compatibility
3546 #define GL_ARB_ES3_compatibility 1
3547
3548 #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
3549 #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
3550 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
3551 #define GL_MAX_ELEMENT_INDEX 0x8D6B
3552 #define GL_COMPRESSED_R11_EAC 0x9270
3553 #define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
3554 #define GL_COMPRESSED_RG11_EAC 0x9272
3555 #define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
3556 #define GL_COMPRESSED_RGB8_ETC2 0x9274
3557 #define GL_COMPRESSED_SRGB8_ETC2 0x9275
3558 #define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
3559 #define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
3560 #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
3561 #define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
3562
3563 #define GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility)
3564
3565 #endif /* GL_ARB_ES3_compatibility */
3566
3567 /* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */
3568
3569 #ifndef GL_ARB_arrays_of_arrays
3570 #define GL_ARB_arrays_of_arrays 1
3571
3572 #define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays)
3573
3574 #endif /* GL_ARB_arrays_of_arrays */
3575
3576 /* -------------------------- GL_ARB_base_instance ------------------------- */
3577
3578 #ifndef GL_ARB_base_instance
3579 #define GL_ARB_base_instance 1
3580
3581 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance);
3582 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLuint baseinstance);
3583 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance);
3584
3585 #define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance)
3586 #define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance)
3587 #define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance)
3588
3589 #define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance)
3590
3591 #endif /* GL_ARB_base_instance */
3592
3593 /* ------------------------ GL_ARB_bindless_texture ------------------------ */
3594
3595 #ifndef GL_ARB_bindless_texture
3596 #define GL_ARB_bindless_texture 1
3597
3598 #define GL_UNSIGNED_INT64_ARB 0x140F
3599
3600 typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
3601 typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture);
3602 typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler);
3603 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params);
3604 typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle);
3605 typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle);
3606 typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle);
3607 typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access);
3608 typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle);
3609 typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle);
3610 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value);
3611 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values);
3612 typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value);
3613 typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value);
3614 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x);
3615 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v);
3616
3617 #define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB)
3618 #define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB)
3619 #define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB)
3620 #define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB)
3621 #define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB)
3622 #define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB)
3623 #define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB)
3624 #define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB)
3625 #define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB)
3626 #define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB)
3627 #define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB)
3628 #define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB)
3629 #define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB)
3630 #define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB)
3631 #define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB)
3632 #define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB)
3633
3634 #define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture)
3635
3636 #endif /* GL_ARB_bindless_texture */
3637
3638 /* ----------------------- GL_ARB_blend_func_extended ---------------------- */
3639
3640 #ifndef GL_ARB_blend_func_extended
3641 #define GL_ARB_blend_func_extended 1
3642
3643 #define GL_SRC1_COLOR 0x88F9
3644 #define GL_ONE_MINUS_SRC1_COLOR 0x88FA
3645 #define GL_ONE_MINUS_SRC1_ALPHA 0x88FB
3646 #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC
3647
3648 typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name);
3649 typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * name);
3650
3651 #define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed)
3652 #define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex)
3653
3654 #define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended)
3655
3656 #endif /* GL_ARB_blend_func_extended */
3657
3658 /* ------------------------- GL_ARB_buffer_storage ------------------------- */
3659
3660 #ifndef GL_ARB_buffer_storage
3661 #define GL_ARB_buffer_storage 1
3662
3663 #define GL_MAP_READ_BIT 0x0001
3664 #define GL_MAP_WRITE_BIT 0x0002
3665 #define GL_MAP_PERSISTENT_BIT 0x00000040
3666 #define GL_MAP_COHERENT_BIT 0x00000080
3667 #define GL_DYNAMIC_STORAGE_BIT 0x0100
3668 #define GL_CLIENT_STORAGE_BIT 0x0200
3669 #define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000
3670 #define GL_BUFFER_IMMUTABLE_STORAGE 0x821F
3671 #define GL_BUFFER_STORAGE_FLAGS 0x8220
3672
3673 typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
3674 typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags);
3675
3676 #define glBufferStorage GLEW_GET_FUN(__glewBufferStorage)
3677 #define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT)
3678
3679 #define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage)
3680
3681 #endif /* GL_ARB_buffer_storage */
3682
3683 /* ---------------------------- GL_ARB_cl_event ---------------------------- */
3684
3685 #ifndef GL_ARB_cl_event
3686 #define GL_ARB_cl_event 1
3687
3688 #define GL_SYNC_CL_EVENT_ARB 0x8240
3689 #define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241
3690
3691 typedef struct _cl_context *cl_context;
3692 typedef struct _cl_event *cl_event;
3693
3694 typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags);
3695
3696 #define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB)
3697
3698 #define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event)
3699
3700 #endif /* GL_ARB_cl_event */
3701
3702 /* ----------------------- GL_ARB_clear_buffer_object ---------------------- */
3703
3704 #ifndef GL_ARB_clear_buffer_object
3705 #define GL_ARB_clear_buffer_object 1
3706
3707 typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
3708 typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
3709 typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
3710 typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
3711
3712 #define glClearBufferData GLEW_GET_FUN(__glewClearBufferData)
3713 #define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData)
3714 #define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT)
3715 #define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT)
3716
3717 #define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object)
3718
3719 #endif /* GL_ARB_clear_buffer_object */
3720
3721 /* -------------------------- GL_ARB_clear_texture ------------------------- */
3722
3723 #ifndef GL_ARB_clear_texture
3724 #define GL_ARB_clear_texture 1
3725
3726 #define GL_CLEAR_TEXTURE 0x9365
3727
3728 typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
3729 typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
3730
3731 #define glClearTexImage GLEW_GET_FUN(__glewClearTexImage)
3732 #define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage)
3733
3734 #define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture)
3735
3736 #endif /* GL_ARB_clear_texture */
3737
3738 /* -------------------------- GL_ARB_clip_control -------------------------- */
3739
3740 #ifndef GL_ARB_clip_control
3741 #define GL_ARB_clip_control 1
3742
3743 #define GL_LOWER_LEFT 0x8CA1
3744 #define GL_UPPER_LEFT 0x8CA2
3745 #define GL_CLIP_ORIGIN 0x935C
3746 #define GL_CLIP_DEPTH_MODE 0x935D
3747 #define GL_NEGATIVE_ONE_TO_ONE 0x935E
3748 #define GL_ZERO_TO_ONE 0x935F
3749
3750 typedef void (GLAPIENTRY * PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth);
3751
3752 #define glClipControl GLEW_GET_FUN(__glewClipControl)
3753
3754 #define GLEW_ARB_clip_control GLEW_GET_VAR(__GLEW_ARB_clip_control)
3755
3756 #endif /* GL_ARB_clip_control */
3757
3758 /* ----------------------- GL_ARB_color_buffer_float ----------------------- */
3759
3760 #ifndef GL_ARB_color_buffer_float
3761 #define GL_ARB_color_buffer_float 1
3762
3763 #define GL_RGBA_FLOAT_MODE_ARB 0x8820
3764 #define GL_CLAMP_VERTEX_COLOR_ARB 0x891A
3765 #define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B
3766 #define GL_CLAMP_READ_COLOR_ARB 0x891C
3767 #define GL_FIXED_ONLY_ARB 0x891D
3768
3769 typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);
3770
3771 #define glClampColorARB GLEW_GET_FUN(__glewClampColorARB)
3772
3773 #define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float)
3774
3775 #endif /* GL_ARB_color_buffer_float */
3776
3777 /* -------------------------- GL_ARB_compatibility ------------------------- */
3778
3779 #ifndef GL_ARB_compatibility
3780 #define GL_ARB_compatibility 1
3781
3782 #define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility)
3783
3784 #endif /* GL_ARB_compatibility */
3785
3786 /* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */
3787
3788 #ifndef GL_ARB_compressed_texture_pixel_storage
3789 #define GL_ARB_compressed_texture_pixel_storage 1
3790
3791 #define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127
3792 #define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128
3793 #define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129
3794 #define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A
3795 #define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B
3796 #define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C
3797 #define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D
3798 #define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E
3799
3800 #define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage)
3801
3802 #endif /* GL_ARB_compressed_texture_pixel_storage */
3803
3804 /* ------------------------- GL_ARB_compute_shader ------------------------- */
3805
3806 #ifndef GL_ARB_compute_shader
3807 #define GL_ARB_compute_shader 1
3808
3809 #define GL_COMPUTE_SHADER_BIT 0x00000020
3810 #define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262
3811 #define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263
3812 #define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264
3813 #define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265
3814 #define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266
3815 #define GL_COMPUTE_WORK_GROUP_SIZE 0x8267
3816 #define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB
3817 #define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC
3818 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED
3819 #define GL_DISPATCH_INDIRECT_BUFFER 0x90EE
3820 #define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF
3821 #define GL_COMPUTE_SHADER 0x91B9
3822 #define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB
3823 #define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC
3824 #define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD
3825 #define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE
3826 #define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF
3827
3828 typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
3829 typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect);
3830
3831 #define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute)
3832 #define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect)
3833
3834 #define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader)
3835
3836 #endif /* GL_ARB_compute_shader */
3837
3838 /* ------------------- GL_ARB_compute_variable_group_size ------------------ */
3839
3840 #ifndef GL_ARB_compute_variable_group_size
3841 #define GL_ARB_compute_variable_group_size 1
3842
3843 #define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB
3844 #define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF
3845 #define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344
3846 #define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345
3847
3848 typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z);
3849
3850 #define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB)
3851
3852 #define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size)
3853
3854 #endif /* GL_ARB_compute_variable_group_size */
3855
3856 /* ------------------- GL_ARB_conditional_render_inverted ------------------ */
3857
3858 #ifndef GL_ARB_conditional_render_inverted
3859 #define GL_ARB_conditional_render_inverted 1
3860
3861 #define GL_QUERY_WAIT_INVERTED 0x8E17
3862 #define GL_QUERY_NO_WAIT_INVERTED 0x8E18
3863 #define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19
3864 #define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A
3865
3866 #define GLEW_ARB_conditional_render_inverted GLEW_GET_VAR(__GLEW_ARB_conditional_render_inverted)
3867
3868 #endif /* GL_ARB_conditional_render_inverted */
3869
3870 /* ----------------------- GL_ARB_conservative_depth ----------------------- */
3871
3872 #ifndef GL_ARB_conservative_depth
3873 #define GL_ARB_conservative_depth 1
3874
3875 #define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth)
3876
3877 #endif /* GL_ARB_conservative_depth */
3878
3879 /* --------------------------- GL_ARB_copy_buffer -------------------------- */
3880
3881 #ifndef GL_ARB_copy_buffer
3882 #define GL_ARB_copy_buffer 1
3883
3884 #define GL_COPY_READ_BUFFER 0x8F36
3885 #define GL_COPY_WRITE_BUFFER 0x8F37
3886
3887 typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
3888
3889 #define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData)
3890
3891 #define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer)
3892
3893 #endif /* GL_ARB_copy_buffer */
3894
3895 /* --------------------------- GL_ARB_copy_image --------------------------- */
3896
3897 #ifndef GL_ARB_copy_image
3898 #define GL_ARB_copy_image 1
3899
3900 typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
3901
3902 #define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData)
3903
3904 #define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image)
3905
3906 #endif /* GL_ARB_copy_image */
3907
3908 /* -------------------------- GL_ARB_cull_distance ------------------------- */
3909
3910 #ifndef GL_ARB_cull_distance
3911 #define GL_ARB_cull_distance 1
3912
3913 #define GL_MAX_CULL_DISTANCES 0x82F9
3914 #define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA
3915
3916 #define GLEW_ARB_cull_distance GLEW_GET_VAR(__GLEW_ARB_cull_distance)
3917
3918 #endif /* GL_ARB_cull_distance */
3919
3920 /* -------------------------- GL_ARB_debug_output -------------------------- */
3921
3922 #ifndef GL_ARB_debug_output
3923 #define GL_ARB_debug_output 1
3924
3925 #define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242
3926 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243
3927 #define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244
3928 #define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245
3929 #define GL_DEBUG_SOURCE_API_ARB 0x8246
3930 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247
3931 #define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248
3932 #define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249
3933 #define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A
3934 #define GL_DEBUG_SOURCE_OTHER_ARB 0x824B
3935 #define GL_DEBUG_TYPE_ERROR_ARB 0x824C
3936 #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D
3937 #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E
3938 #define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F
3939 #define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250
3940 #define GL_DEBUG_TYPE_OTHER_ARB 0x8251
3941 #define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143
3942 #define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144
3943 #define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145
3944 #define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146
3945 #define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147
3946 #define GL_DEBUG_SEVERITY_LOW_ARB 0x9148
3947
3948 typedef void (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam);
3949
3950 typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam);
3951 typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);
3952 typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf);
3953 typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog);
3954
3955 #define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB)
3956 #define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB)
3957 #define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB)
3958 #define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB)
3959
3960 #define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output)
3961
3962 #endif /* GL_ARB_debug_output */
3963
3964 /* ----------------------- GL_ARB_depth_buffer_float ----------------------- */
3965
3966 #ifndef GL_ARB_depth_buffer_float
3967 #define GL_ARB_depth_buffer_float 1
3968
3969 #define GL_DEPTH_COMPONENT32F 0x8CAC
3970 #define GL_DEPTH32F_STENCIL8 0x8CAD
3971 #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
3972
3973 #define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float)
3974
3975 #endif /* GL_ARB_depth_buffer_float */
3976
3977 /* --------------------------- GL_ARB_depth_clamp -------------------------- */
3978
3979 #ifndef GL_ARB_depth_clamp
3980 #define GL_ARB_depth_clamp 1
3981
3982 #define GL_DEPTH_CLAMP 0x864F
3983
3984 #define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp)
3985
3986 #endif /* GL_ARB_depth_clamp */
3987
3988 /* -------------------------- GL_ARB_depth_texture ------------------------- */
3989
3990 #ifndef GL_ARB_depth_texture
3991 #define GL_ARB_depth_texture 1
3992
3993 #define GL_DEPTH_COMPONENT16_ARB 0x81A5
3994 #define GL_DEPTH_COMPONENT24_ARB 0x81A6
3995 #define GL_DEPTH_COMPONENT32_ARB 0x81A7
3996 #define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A
3997 #define GL_DEPTH_TEXTURE_MODE_ARB 0x884B
3998
3999 #define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture)
4000
4001 #endif /* GL_ARB_depth_texture */
4002
4003 /* ----------------------- GL_ARB_derivative_control ----------------------- */
4004
4005 #ifndef GL_ARB_derivative_control
4006 #define GL_ARB_derivative_control 1
4007
4008 #define GLEW_ARB_derivative_control GLEW_GET_VAR(__GLEW_ARB_derivative_control)
4009
4010 #endif /* GL_ARB_derivative_control */
4011
4012 /* ----------------------- GL_ARB_direct_state_access ---------------------- */
4013
4014 #ifndef GL_ARB_direct_state_access
4015 #define GL_ARB_direct_state_access 1
4016
4017 #define GL_TEXTURE_TARGET 0x1006
4018 #define GL_QUERY_TARGET 0x82EA
4019
4020 typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture);
4021 typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
4022 typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target);
4023 typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
4024 typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
4025 typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil);
4026 typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value);
4027 typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value);
4028 typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value);
4029 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
4030 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
4031 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
4032 typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
4033 typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
4034 typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
4035 typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
4036 typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers);
4037 typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers);
4038 typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines);
4039 typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids);
4040 typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers);
4041 typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers);
4042 typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures);
4043 typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids);
4044 typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays);
4045 typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index);
4046 typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index);
4047 typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);
4048 typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture);
4049 typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels);
4050 typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params);
4051 typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params);
4052 typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params);
4053 typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data);
4054 typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params);
4055 typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param);
4056 typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params);
4057 typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset);
4058 typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset);
4059 typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset);
4060 typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset);
4061 typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
4062 typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params);
4063 typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params);
4064 typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params);
4065 typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params);
4066 typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params);
4067 typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params);
4068 typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param);
4069 typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param);
4070 typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param);
4071 typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param);
4072 typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param);
4073 typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param);
4074 typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments);
4075 typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
4076 typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access);
4077 typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);
4078 typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage);
4079 typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags);
4080 typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data);
4081 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode);
4082 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs);
4083 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param);
4084 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode);
4085 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
4086 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
4087 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
4088 typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
4089 typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
4090 typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer);
4091 typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
4092 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params);
4093 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params);
4094 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param);
4095 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param);
4096 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param);
4097 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param);
4098 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);
4099 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
4100 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
4101 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
4102 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
4103 typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
4104 typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
4105 typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
4106 typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer);
4107 typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
4108 typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer);
4109 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex);
4110 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
4111 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
4112 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
4113 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor);
4114 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer);
4115 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
4116 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides);
4117
4118 #define glBindTextureUnit GLEW_GET_FUN(__glewBindTextureUnit)
4119 #define glBlitNamedFramebuffer GLEW_GET_FUN(__glewBlitNamedFramebuffer)
4120 #define glCheckNamedFramebufferStatus GLEW_GET_FUN(__glewCheckNamedFramebufferStatus)
4121 #define glClearNamedBufferData GLEW_GET_FUN(__glewClearNamedBufferData)
4122 #define glClearNamedBufferSubData GLEW_GET_FUN(__glewClearNamedBufferSubData)
4123 #define glClearNamedFramebufferfi GLEW_GET_FUN(__glewClearNamedFramebufferfi)
4124 #define glClearNamedFramebufferfv GLEW_GET_FUN(__glewClearNamedFramebufferfv)
4125 #define glClearNamedFramebufferiv GLEW_GET_FUN(__glewClearNamedFramebufferiv)
4126 #define glClearNamedFramebufferuiv GLEW_GET_FUN(__glewClearNamedFramebufferuiv)
4127 #define glCompressedTextureSubImage1D GLEW_GET_FUN(__glewCompressedTextureSubImage1D)
4128 #define glCompressedTextureSubImage2D GLEW_GET_FUN(__glewCompressedTextureSubImage2D)
4129 #define glCompressedTextureSubImage3D GLEW_GET_FUN(__glewCompressedTextureSubImage3D)
4130 #define glCopyNamedBufferSubData GLEW_GET_FUN(__glewCopyNamedBufferSubData)
4131 #define glCopyTextureSubImage1D GLEW_GET_FUN(__glewCopyTextureSubImage1D)
4132 #define glCopyTextureSubImage2D GLEW_GET_FUN(__glewCopyTextureSubImage2D)
4133 #define glCopyTextureSubImage3D GLEW_GET_FUN(__glewCopyTextureSubImage3D)
4134 #define glCreateBuffers GLEW_GET_FUN(__glewCreateBuffers)
4135 #define glCreateFramebuffers GLEW_GET_FUN(__glewCreateFramebuffers)
4136 #define glCreateProgramPipelines GLEW_GET_FUN(__glewCreateProgramPipelines)
4137 #define glCreateQueries GLEW_GET_FUN(__glewCreateQueries)
4138 #define glCreateRenderbuffers GLEW_GET_FUN(__glewCreateRenderbuffers)
4139 #define glCreateSamplers GLEW_GET_FUN(__glewCreateSamplers)
4140 #define glCreateTextures GLEW_GET_FUN(__glewCreateTextures)
4141 #define glCreateTransformFeedbacks GLEW_GET_FUN(__glewCreateTransformFeedbacks)
4142 #define glCreateVertexArrays GLEW_GET_FUN(__glewCreateVertexArrays)
4143 #define glDisableVertexArrayAttrib GLEW_GET_FUN(__glewDisableVertexArrayAttrib)
4144 #define glEnableVertexArrayAttrib GLEW_GET_FUN(__glewEnableVertexArrayAttrib)
4145 #define glFlushMappedNamedBufferRange GLEW_GET_FUN(__glewFlushMappedNamedBufferRange)
4146 #define glGenerateTextureMipmap GLEW_GET_FUN(__glewGenerateTextureMipmap)
4147 #define glGetCompressedTextureImage GLEW_GET_FUN(__glewGetCompressedTextureImage)
4148 #define glGetNamedBufferParameteri64v GLEW_GET_FUN(__glewGetNamedBufferParameteri64v)
4149 #define glGetNamedBufferParameteriv GLEW_GET_FUN(__glewGetNamedBufferParameteriv)
4150 #define glGetNamedBufferPointerv GLEW_GET_FUN(__glewGetNamedBufferPointerv)
4151 #define glGetNamedBufferSubData GLEW_GET_FUN(__glewGetNamedBufferSubData)
4152 #define glGetNamedFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameteriv)
4153 #define glGetNamedFramebufferParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferParameteriv)
4154 #define glGetNamedRenderbufferParameteriv GLEW_GET_FUN(__glewGetNamedRenderbufferParameteriv)
4155 #define glGetQueryBufferObjecti64v GLEW_GET_FUN(__glewGetQueryBufferObjecti64v)
4156 #define glGetQueryBufferObjectiv GLEW_GET_FUN(__glewGetQueryBufferObjectiv)
4157 #define glGetQueryBufferObjectui64v GLEW_GET_FUN(__glewGetQueryBufferObjectui64v)
4158 #define glGetQueryBufferObjectuiv GLEW_GET_FUN(__glewGetQueryBufferObjectuiv)
4159 #define glGetTextureImage GLEW_GET_FUN(__glewGetTextureImage)
4160 #define glGetTextureLevelParameterfv GLEW_GET_FUN(__glewGetTextureLevelParameterfv)
4161 #define glGetTextureLevelParameteriv GLEW_GET_FUN(__glewGetTextureLevelParameteriv)
4162 #define glGetTextureParameterIiv GLEW_GET_FUN(__glewGetTextureParameterIiv)
4163 #define glGetTextureParameterIuiv GLEW_GET_FUN(__glewGetTextureParameterIuiv)
4164 #define glGetTextureParameterfv GLEW_GET_FUN(__glewGetTextureParameterfv)
4165 #define glGetTextureParameteriv GLEW_GET_FUN(__glewGetTextureParameteriv)
4166 #define glGetTransformFeedbacki64_v GLEW_GET_FUN(__glewGetTransformFeedbacki64_v)
4167 #define glGetTransformFeedbacki_v GLEW_GET_FUN(__glewGetTransformFeedbacki_v)
4168 #define glGetTransformFeedbackiv GLEW_GET_FUN(__glewGetTransformFeedbackiv)
4169 #define glGetVertexArrayIndexed64iv GLEW_GET_FUN(__glewGetVertexArrayIndexed64iv)
4170 #define glGetVertexArrayIndexediv GLEW_GET_FUN(__glewGetVertexArrayIndexediv)
4171 #define glGetVertexArrayiv GLEW_GET_FUN(__glewGetVertexArrayiv)
4172 #define glInvalidateNamedFramebufferData GLEW_GET_FUN(__glewInvalidateNamedFramebufferData)
4173 #define glInvalidateNamedFramebufferSubData GLEW_GET_FUN(__glewInvalidateNamedFramebufferSubData)
4174 #define glMapNamedBuffer GLEW_GET_FUN(__glewMapNamedBuffer)
4175 #define glMapNamedBufferRange GLEW_GET_FUN(__glewMapNamedBufferRange)
4176 #define glNamedBufferData GLEW_GET_FUN(__glewNamedBufferData)
4177 #define glNamedBufferStorage GLEW_GET_FUN(__glewNamedBufferStorage)
4178 #define glNamedBufferSubData GLEW_GET_FUN(__glewNamedBufferSubData)
4179 #define glNamedFramebufferDrawBuffer GLEW_GET_FUN(__glewNamedFramebufferDrawBuffer)
4180 #define glNamedFramebufferDrawBuffers GLEW_GET_FUN(__glewNamedFramebufferDrawBuffers)
4181 #define glNamedFramebufferParameteri GLEW_GET_FUN(__glewNamedFramebufferParameteri)
4182 #define glNamedFramebufferReadBuffer GLEW_GET_FUN(__glewNamedFramebufferReadBuffer)
4183 #define glNamedFramebufferRenderbuffer GLEW_GET_FUN(__glewNamedFramebufferRenderbuffer)
4184 #define glNamedFramebufferTexture GLEW_GET_FUN(__glewNamedFramebufferTexture)
4185 #define glNamedFramebufferTextureLayer GLEW_GET_FUN(__glewNamedFramebufferTextureLayer)
4186 #define glNamedRenderbufferStorage GLEW_GET_FUN(__glewNamedRenderbufferStorage)
4187 #define glNamedRenderbufferStorageMultisample GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisample)
4188 #define glTextureBuffer GLEW_GET_FUN(__glewTextureBuffer)
4189 #define glTextureBufferRange GLEW_GET_FUN(__glewTextureBufferRange)
4190 #define glTextureParameterIiv GLEW_GET_FUN(__glewTextureParameterIiv)
4191 #define glTextureParameterIuiv GLEW_GET_FUN(__glewTextureParameterIuiv)
4192 #define glTextureParameterf GLEW_GET_FUN(__glewTextureParameterf)
4193 #define glTextureParameterfv GLEW_GET_FUN(__glewTextureParameterfv)
4194 #define glTextureParameteri GLEW_GET_FUN(__glewTextureParameteri)
4195 #define glTextureParameteriv GLEW_GET_FUN(__glewTextureParameteriv)
4196 #define glTextureStorage1D GLEW_GET_FUN(__glewTextureStorage1D)
4197 #define glTextureStorage2D GLEW_GET_FUN(__glewTextureStorage2D)
4198 #define glTextureStorage2DMultisample GLEW_GET_FUN(__glewTextureStorage2DMultisample)
4199 #define glTextureStorage3D GLEW_GET_FUN(__glewTextureStorage3D)
4200 #define glTextureStorage3DMultisample GLEW_GET_FUN(__glewTextureStorage3DMultisample)
4201 #define glTextureSubImage1D GLEW_GET_FUN(__glewTextureSubImage1D)
4202 #define glTextureSubImage2D GLEW_GET_FUN(__glewTextureSubImage2D)
4203 #define glTextureSubImage3D GLEW_GET_FUN(__glewTextureSubImage3D)
4204 #define glTransformFeedbackBufferBase GLEW_GET_FUN(__glewTransformFeedbackBufferBase)
4205 #define glTransformFeedbackBufferRange GLEW_GET_FUN(__glewTransformFeedbackBufferRange)
4206 #define glUnmapNamedBuffer GLEW_GET_FUN(__glewUnmapNamedBuffer)
4207 #define glVertexArrayAttribBinding GLEW_GET_FUN(__glewVertexArrayAttribBinding)
4208 #define glVertexArrayAttribFormat GLEW_GET_FUN(__glewVertexArrayAttribFormat)
4209 #define glVertexArrayAttribIFormat GLEW_GET_FUN(__glewVertexArrayAttribIFormat)
4210 #define glVertexArrayAttribLFormat GLEW_GET_FUN(__glewVertexArrayAttribLFormat)
4211 #define glVertexArrayBindingDivisor GLEW_GET_FUN(__glewVertexArrayBindingDivisor)
4212 #define glVertexArrayElementBuffer GLEW_GET_FUN(__glewVertexArrayElementBuffer)
4213 #define glVertexArrayVertexBuffer GLEW_GET_FUN(__glewVertexArrayVertexBuffer)
4214 #define glVertexArrayVertexBuffers GLEW_GET_FUN(__glewVertexArrayVertexBuffers)
4215
4216 #define GLEW_ARB_direct_state_access GLEW_GET_VAR(__GLEW_ARB_direct_state_access)
4217
4218 #endif /* GL_ARB_direct_state_access */
4219
4220 /* -------------------------- GL_ARB_draw_buffers -------------------------- */
4221
4222 #ifndef GL_ARB_draw_buffers
4223 #define GL_ARB_draw_buffers 1
4224
4225 #define GL_MAX_DRAW_BUFFERS_ARB 0x8824
4226 #define GL_DRAW_BUFFER0_ARB 0x8825
4227 #define GL_DRAW_BUFFER1_ARB 0x8826
4228 #define GL_DRAW_BUFFER2_ARB 0x8827
4229 #define GL_DRAW_BUFFER3_ARB 0x8828
4230 #define GL_DRAW_BUFFER4_ARB 0x8829
4231 #define GL_DRAW_BUFFER5_ARB 0x882A
4232 #define GL_DRAW_BUFFER6_ARB 0x882B
4233 #define GL_DRAW_BUFFER7_ARB 0x882C
4234 #define GL_DRAW_BUFFER8_ARB 0x882D
4235 #define GL_DRAW_BUFFER9_ARB 0x882E
4236 #define GL_DRAW_BUFFER10_ARB 0x882F
4237 #define GL_DRAW_BUFFER11_ARB 0x8830
4238 #define GL_DRAW_BUFFER12_ARB 0x8831
4239 #define GL_DRAW_BUFFER13_ARB 0x8832
4240 #define GL_DRAW_BUFFER14_ARB 0x8833
4241 #define GL_DRAW_BUFFER15_ARB 0x8834
4242
4243 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs);
4244
4245 #define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB)
4246
4247 #define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers)
4248
4249 #endif /* GL_ARB_draw_buffers */
4250
4251 /* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */
4252
4253 #ifndef GL_ARB_draw_buffers_blend
4254 #define GL_ARB_draw_buffers_blend 1
4255
4256 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
4257 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode);
4258 typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
4259 typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst);
4260
4261 #define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB)
4262 #define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB)
4263 #define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB)
4264 #define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB)
4265
4266 #define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend)
4267
4268 #endif /* GL_ARB_draw_buffers_blend */
4269
4270 /* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */
4271
4272 #ifndef GL_ARB_draw_elements_base_vertex
4273 #define GL_ARB_draw_elements_base_vertex 1
4274
4275 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
4276 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex);
4277 typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
4278 typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex);
4279
4280 #define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex)
4281 #define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex)
4282 #define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex)
4283 #define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex)
4284
4285 #define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex)
4286
4287 #endif /* GL_ARB_draw_elements_base_vertex */
4288
4289 /* -------------------------- GL_ARB_draw_indirect ------------------------- */
4290
4291 #ifndef GL_ARB_draw_indirect
4292 #define GL_ARB_draw_indirect 1
4293
4294 #define GL_DRAW_INDIRECT_BUFFER 0x8F3F
4295 #define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43
4296
4297 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect);
4298 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect);
4299
4300 #define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect)
4301 #define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect)
4302
4303 #define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect)
4304
4305 #endif /* GL_ARB_draw_indirect */
4306
4307 /* ------------------------- GL_ARB_draw_instanced ------------------------- */
4308
4309 #ifndef GL_ARB_draw_instanced
4310 #define GL_ARB_draw_instanced 1
4311
4312 #define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced)
4313
4314 #endif /* GL_ARB_draw_instanced */
4315
4316 /* ------------------------ GL_ARB_enhanced_layouts ------------------------ */
4317
4318 #ifndef GL_ARB_enhanced_layouts
4319 #define GL_ARB_enhanced_layouts 1
4320
4321 #define GL_LOCATION_COMPONENT 0x934A
4322 #define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B
4323 #define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C
4324
4325 #define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts)
4326
4327 #endif /* GL_ARB_enhanced_layouts */
4328
4329 /* -------------------- GL_ARB_explicit_attrib_location -------------------- */
4330
4331 #ifndef GL_ARB_explicit_attrib_location
4332 #define GL_ARB_explicit_attrib_location 1
4333
4334 #define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location)
4335
4336 #endif /* GL_ARB_explicit_attrib_location */
4337
4338 /* -------------------- GL_ARB_explicit_uniform_location ------------------- */
4339
4340 #ifndef GL_ARB_explicit_uniform_location
4341 #define GL_ARB_explicit_uniform_location 1
4342
4343 #define GL_MAX_UNIFORM_LOCATIONS 0x826E
4344
4345 #define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location)
4346
4347 #endif /* GL_ARB_explicit_uniform_location */
4348
4349 /* ------------------- GL_ARB_fragment_coord_conventions ------------------- */
4350
4351 #ifndef GL_ARB_fragment_coord_conventions
4352 #define GL_ARB_fragment_coord_conventions 1
4353
4354 #define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions)
4355
4356 #endif /* GL_ARB_fragment_coord_conventions */
4357
4358 /* --------------------- GL_ARB_fragment_layer_viewport -------------------- */
4359
4360 #ifndef GL_ARB_fragment_layer_viewport
4361 #define GL_ARB_fragment_layer_viewport 1
4362
4363 #define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport)
4364
4365 #endif /* GL_ARB_fragment_layer_viewport */
4366
4367 /* ------------------------ GL_ARB_fragment_program ------------------------ */
4368
4369 #ifndef GL_ARB_fragment_program
4370 #define GL_ARB_fragment_program 1
4371
4372 #define GL_FRAGMENT_PROGRAM_ARB 0x8804
4373 #define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805
4374 #define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806
4375 #define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807
4376 #define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808
4377 #define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809
4378 #define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A
4379 #define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B
4380 #define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C
4381 #define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D
4382 #define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E
4383 #define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F
4384 #define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810
4385 #define GL_MAX_TEXTURE_COORDS_ARB 0x8871
4386 #define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
4387
4388 #define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program)
4389
4390 #endif /* GL_ARB_fragment_program */
4391
4392 /* --------------------- GL_ARB_fragment_program_shadow -------------------- */
4393
4394 #ifndef GL_ARB_fragment_program_shadow
4395 #define GL_ARB_fragment_program_shadow 1
4396
4397 #define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow)
4398
4399 #endif /* GL_ARB_fragment_program_shadow */
4400
4401 /* ------------------------- GL_ARB_fragment_shader ------------------------ */
4402
4403 #ifndef GL_ARB_fragment_shader
4404 #define GL_ARB_fragment_shader 1
4405
4406 #define GL_FRAGMENT_SHADER_ARB 0x8B30
4407 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49
4408 #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B
4409
4410 #define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader)
4411
4412 #endif /* GL_ARB_fragment_shader */
4413
4414 /* -------------------- GL_ARB_fragment_shader_interlock ------------------- */
4415
4416 #ifndef GL_ARB_fragment_shader_interlock
4417 #define GL_ARB_fragment_shader_interlock 1
4418
4419 #define GLEW_ARB_fragment_shader_interlock GLEW_GET_VAR(__GLEW_ARB_fragment_shader_interlock)
4420
4421 #endif /* GL_ARB_fragment_shader_interlock */
4422
4423 /* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */
4424
4425 #ifndef GL_ARB_framebuffer_no_attachments
4426 #define GL_ARB_framebuffer_no_attachments 1
4427
4428 #define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310
4429 #define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311
4430 #define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312
4431 #define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313
4432 #define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314
4433 #define GL_MAX_FRAMEBUFFER_WIDTH 0x9315
4434 #define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316
4435 #define GL_MAX_FRAMEBUFFER_LAYERS 0x9317
4436 #define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318
4437
4438 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
4439 typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);
4440 typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params);
4441 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param);
4442
4443 #define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri)
4444 #define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv)
4445 #define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT)
4446 #define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT)
4447
4448 #define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments)
4449
4450 #endif /* GL_ARB_framebuffer_no_attachments */
4451
4452 /* ----------------------- GL_ARB_framebuffer_object ----------------------- */
4453
4454 #ifndef GL_ARB_framebuffer_object
4455 #define GL_ARB_framebuffer_object 1
4456
4457 #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
4458 #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
4459 #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
4460 #define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
4461 #define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
4462 #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
4463 #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
4464 #define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
4465 #define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
4466 #define GL_FRAMEBUFFER_DEFAULT 0x8218
4467 #define GL_FRAMEBUFFER_UNDEFINED 0x8219
4468 #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
4469 #define GL_INDEX 0x8222
4470 #define GL_MAX_RENDERBUFFER_SIZE 0x84E8
4471 #define GL_DEPTH_STENCIL 0x84F9
4472 #define GL_UNSIGNED_INT_24_8 0x84FA
4473 #define GL_DEPTH24_STENCIL8 0x88F0
4474 #define GL_TEXTURE_STENCIL_SIZE 0x88F1
4475 #define GL_UNSIGNED_NORMALIZED 0x8C17
4476 #define GL_SRGB 0x8C40
4477 #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
4478 #define GL_FRAMEBUFFER_BINDING 0x8CA6
4479 #define GL_RENDERBUFFER_BINDING 0x8CA7
4480 #define GL_READ_FRAMEBUFFER 0x8CA8
4481 #define GL_DRAW_FRAMEBUFFER 0x8CA9
4482 #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
4483 #define GL_RENDERBUFFER_SAMPLES 0x8CAB
4484 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
4485 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
4486 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
4487 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
4488 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
4489 #define GL_FRAMEBUFFER_COMPLETE 0x8CD5
4490 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
4491 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
4492 #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB
4493 #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC
4494 #define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
4495 #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
4496 #define GL_COLOR_ATTACHMENT0 0x8CE0
4497 #define GL_COLOR_ATTACHMENT1 0x8CE1
4498 #define GL_COLOR_ATTACHMENT2 0x8CE2
4499 #define GL_COLOR_ATTACHMENT3 0x8CE3
4500 #define GL_COLOR_ATTACHMENT4 0x8CE4
4501 #define GL_COLOR_ATTACHMENT5 0x8CE5
4502 #define GL_COLOR_ATTACHMENT6 0x8CE6
4503 #define GL_COLOR_ATTACHMENT7 0x8CE7
4504 #define GL_COLOR_ATTACHMENT8 0x8CE8
4505 #define GL_COLOR_ATTACHMENT9 0x8CE9
4506 #define GL_COLOR_ATTACHMENT10 0x8CEA
4507 #define GL_COLOR_ATTACHMENT11 0x8CEB
4508 #define GL_COLOR_ATTACHMENT12 0x8CEC
4509 #define GL_COLOR_ATTACHMENT13 0x8CED
4510 #define GL_COLOR_ATTACHMENT14 0x8CEE
4511 #define GL_COLOR_ATTACHMENT15 0x8CEF
4512 #define GL_DEPTH_ATTACHMENT 0x8D00
4513 #define GL_STENCIL_ATTACHMENT 0x8D20
4514 #define GL_FRAMEBUFFER 0x8D40
4515 #define GL_RENDERBUFFER 0x8D41
4516 #define GL_RENDERBUFFER_WIDTH 0x8D42
4517 #define GL_RENDERBUFFER_HEIGHT 0x8D43
4518 #define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
4519 #define GL_STENCIL_INDEX1 0x8D46
4520 #define GL_STENCIL_INDEX4 0x8D47
4521 #define GL_STENCIL_INDEX8 0x8D48
4522 #define GL_STENCIL_INDEX16 0x8D49
4523 #define GL_RENDERBUFFER_RED_SIZE 0x8D50
4524 #define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
4525 #define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
4526 #define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
4527 #define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
4528 #define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
4529 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
4530 #define GL_MAX_SAMPLES 0x8D57
4531
4532 typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
4533 typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
4534 typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
4535 typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
4536 typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers);
4537 typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers);
4538 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
4539 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
4540 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
4541 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer);
4542 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer);
4543 typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers);
4544 typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers);
4545 typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target);
4546 typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params);
4547 typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);
4548 typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
4549 typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
4550 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
4551 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
4552
4553 #define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer)
4554 #define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer)
4555 #define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer)
4556 #define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus)
4557 #define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers)
4558 #define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers)
4559 #define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer)
4560 #define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D)
4561 #define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D)
4562 #define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D)
4563 #define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer)
4564 #define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers)
4565 #define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers)
4566 #define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap)
4567 #define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv)
4568 #define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv)
4569 #define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer)
4570 #define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer)
4571 #define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage)
4572 #define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample)
4573
4574 #define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object)
4575
4576 #endif /* GL_ARB_framebuffer_object */
4577
4578 /* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */
4579
4580 #ifndef GL_ARB_framebuffer_sRGB
4581 #define GL_ARB_framebuffer_sRGB 1
4582
4583 #define GL_FRAMEBUFFER_SRGB 0x8DB9
4584
4585 #define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB)
4586
4587 #endif /* GL_ARB_framebuffer_sRGB */
4588
4589 /* ------------------------ GL_ARB_geometry_shader4 ------------------------ */
4590
4591 #ifndef GL_ARB_geometry_shader4
4592 #define GL_ARB_geometry_shader4 1
4593
4594 #define GL_LINES_ADJACENCY_ARB 0xA
4595 #define GL_LINE_STRIP_ADJACENCY_ARB 0xB
4596 #define GL_TRIANGLES_ADJACENCY_ARB 0xC
4597 #define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD
4598 #define GL_PROGRAM_POINT_SIZE_ARB 0x8642
4599 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29
4600 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
4601 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7
4602 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8
4603 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9
4604 #define GL_GEOMETRY_SHADER_ARB 0x8DD9
4605 #define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA
4606 #define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB
4607 #define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC
4608 #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD
4609 #define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE
4610 #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF
4611 #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0
4612 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1
4613
4614 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
4615 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
4616 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
4617 typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value);
4618
4619 #define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB)
4620 #define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB)
4621 #define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB)
4622 #define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB)
4623
4624 #define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4)
4625
4626 #endif /* GL_ARB_geometry_shader4 */
4627
4628 /* ----------------------- GL_ARB_get_program_binary ----------------------- */
4629
4630 #ifndef GL_ARB_get_program_binary
4631 #define GL_ARB_get_program_binary 1
4632
4633 #define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
4634 #define GL_PROGRAM_BINARY_LENGTH 0x8741
4635 #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
4636 #define GL_PROGRAM_BINARY_FORMATS 0x87FF
4637
4638 typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, void*binary);
4639 typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
4640 typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
4641
4642 #define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary)
4643 #define glProgramBinary GLEW_GET_FUN(__glewProgramBinary)
4644 #define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri)
4645
4646 #define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary)
4647
4648 #endif /* GL_ARB_get_program_binary */
4649
4650 /* ---------------------- GL_ARB_get_texture_sub_image --------------------- */
4651
4652 #ifndef GL_ARB_get_texture_sub_image
4653 #define GL_ARB_get_texture_sub_image 1
4654
4655 typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels);
4656 typedef void (GLAPIENTRY * PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
4657
4658 #define glGetCompressedTextureSubImage GLEW_GET_FUN(__glewGetCompressedTextureSubImage)
4659 #define glGetTextureSubImage GLEW_GET_FUN(__glewGetTextureSubImage)
4660
4661 #define GLEW_ARB_get_texture_sub_image GLEW_GET_VAR(__GLEW_ARB_get_texture_sub_image)
4662
4663 #endif /* GL_ARB_get_texture_sub_image */
4664
4665 /* --------------------------- GL_ARB_gpu_shader5 -------------------------- */
4666
4667 #ifndef GL_ARB_gpu_shader5
4668 #define GL_ARB_gpu_shader5 1
4669
4670 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F
4671 #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A
4672 #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B
4673 #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C
4674 #define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D
4675 #define GL_MAX_VERTEX_STREAMS 0x8E71
4676
4677 #define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5)
4678
4679 #endif /* GL_ARB_gpu_shader5 */
4680
4681 /* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */
4682
4683 #ifndef GL_ARB_gpu_shader_fp64
4684 #define GL_ARB_gpu_shader_fp64 1
4685
4686 #define GL_DOUBLE_MAT2 0x8F46
4687 #define GL_DOUBLE_MAT3 0x8F47
4688 #define GL_DOUBLE_MAT4 0x8F48
4689 #define GL_DOUBLE_MAT2x3 0x8F49
4690 #define GL_DOUBLE_MAT2x4 0x8F4A
4691 #define GL_DOUBLE_MAT3x2 0x8F4B
4692 #define GL_DOUBLE_MAT3x4 0x8F4C
4693 #define GL_DOUBLE_MAT4x2 0x8F4D
4694 #define GL_DOUBLE_MAT4x3 0x8F4E
4695 #define GL_DOUBLE_VEC2 0x8FFC
4696 #define GL_DOUBLE_VEC3 0x8FFD
4697 #define GL_DOUBLE_VEC4 0x8FFE
4698
4699 typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params);
4700 typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x);
4701 typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value);
4702 typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y);
4703 typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value);
4704 typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z);
4705 typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value);
4706 typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
4707 typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value);
4708 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
4709 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
4710 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
4711 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
4712 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
4713 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
4714 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
4715 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
4716 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
4717
4718 #define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv)
4719 #define glUniform1d GLEW_GET_FUN(__glewUniform1d)
4720 #define glUniform1dv GLEW_GET_FUN(__glewUniform1dv)
4721 #define glUniform2d GLEW_GET_FUN(__glewUniform2d)
4722 #define glUniform2dv GLEW_GET_FUN(__glewUniform2dv)
4723 #define glUniform3d GLEW_GET_FUN(__glewUniform3d)
4724 #define glUniform3dv GLEW_GET_FUN(__glewUniform3dv)
4725 #define glUniform4d GLEW_GET_FUN(__glewUniform4d)
4726 #define glUniform4dv GLEW_GET_FUN(__glewUniform4dv)
4727 #define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv)
4728 #define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv)
4729 #define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv)
4730 #define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv)
4731 #define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv)
4732 #define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv)
4733 #define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv)
4734 #define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv)
4735 #define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv)
4736
4737 #define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64)
4738
4739 #endif /* GL_ARB_gpu_shader_fp64 */
4740
4741 /* ------------------------ GL_ARB_gpu_shader_int64 ------------------------ */
4742
4743 #ifndef GL_ARB_gpu_shader_int64
4744 #define GL_ARB_gpu_shader_int64 1
4745
4746 #define GL_INT64_ARB 0x140E
4747 #define GL_UNSIGNED_INT64_ARB 0x140F
4748 #define GL_INT64_VEC2_ARB 0x8FE9
4749 #define GL_INT64_VEC3_ARB 0x8FEA
4750 #define GL_INT64_VEC4_ARB 0x8FEB
4751 #define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5
4752 #define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6
4753 #define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7
4754
4755 typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64* params);
4756 typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64* params);
4757 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64* params);
4758 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64* params);
4759 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x);
4760 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value);
4761 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x);
4762 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value);
4763 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y);
4764 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value);
4765 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y);
4766 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value);
4767 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z);
4768 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value);
4769 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z);
4770 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value);
4771 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w);
4772 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value);
4773 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w);
4774 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value);
4775 typedef void (GLAPIENTRY * PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x);
4776 typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64* value);
4777 typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x);
4778 typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value);
4779 typedef void (GLAPIENTRY * PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y);
4780 typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64* value);
4781 typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y);
4782 typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value);
4783 typedef void (GLAPIENTRY * PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z);
4784 typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64* value);
4785 typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z);
4786 typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value);
4787 typedef void (GLAPIENTRY * PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w);
4788 typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64* value);
4789 typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w);
4790 typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value);
4791
4792 #define glGetUniformi64vARB GLEW_GET_FUN(__glewGetUniformi64vARB)
4793 #define glGetUniformui64vARB GLEW_GET_FUN(__glewGetUniformui64vARB)
4794 #define glGetnUniformi64vARB GLEW_GET_FUN(__glewGetnUniformi64vARB)
4795 #define glGetnUniformui64vARB GLEW_GET_FUN(__glewGetnUniformui64vARB)
4796 #define glProgramUniform1i64ARB GLEW_GET_FUN(__glewProgramUniform1i64ARB)
4797 #define glProgramUniform1i64vARB GLEW_GET_FUN(__glewProgramUniform1i64vARB)
4798 #define glProgramUniform1ui64ARB GLEW_GET_FUN(__glewProgramUniform1ui64ARB)
4799 #define glProgramUniform1ui64vARB GLEW_GET_FUN(__glewProgramUniform1ui64vARB)
4800 #define glProgramUniform2i64ARB GLEW_GET_FUN(__glewProgramUniform2i64ARB)
4801 #define glProgramUniform2i64vARB GLEW_GET_FUN(__glewProgramUniform2i64vARB)
4802 #define glProgramUniform2ui64ARB GLEW_GET_FUN(__glewProgramUniform2ui64ARB)
4803 #define glProgramUniform2ui64vARB GLEW_GET_FUN(__glewProgramUniform2ui64vARB)
4804 #define glProgramUniform3i64ARB GLEW_GET_FUN(__glewProgramUniform3i64ARB)
4805 #define glProgramUniform3i64vARB GLEW_GET_FUN(__glewProgramUniform3i64vARB)
4806 #define glProgramUniform3ui64ARB GLEW_GET_FUN(__glewProgramUniform3ui64ARB)
4807 #define glProgramUniform3ui64vARB GLEW_GET_FUN(__glewProgramUniform3ui64vARB)
4808 #define glProgramUniform4i64ARB GLEW_GET_FUN(__glewProgramUniform4i64ARB)
4809 #define glProgramUniform4i64vARB GLEW_GET_FUN(__glewProgramUniform4i64vARB)
4810 #define glProgramUniform4ui64ARB GLEW_GET_FUN(__glewProgramUniform4ui64ARB)
4811 #define glProgramUniform4ui64vARB GLEW_GET_FUN(__glewProgramUniform4ui64vARB)
4812 #define glUniform1i64ARB GLEW_GET_FUN(__glewUniform1i64ARB)
4813 #define glUniform1i64vARB GLEW_GET_FUN(__glewUniform1i64vARB)
4814 #define glUniform1ui64ARB GLEW_GET_FUN(__glewUniform1ui64ARB)
4815 #define glUniform1ui64vARB GLEW_GET_FUN(__glewUniform1ui64vARB)
4816 #define glUniform2i64ARB GLEW_GET_FUN(__glewUniform2i64ARB)
4817 #define glUniform2i64vARB GLEW_GET_FUN(__glewUniform2i64vARB)
4818 #define glUniform2ui64ARB GLEW_GET_FUN(__glewUniform2ui64ARB)
4819 #define glUniform2ui64vARB GLEW_GET_FUN(__glewUniform2ui64vARB)
4820 #define glUniform3i64ARB GLEW_GET_FUN(__glewUniform3i64ARB)
4821 #define glUniform3i64vARB GLEW_GET_FUN(__glewUniform3i64vARB)
4822 #define glUniform3ui64ARB GLEW_GET_FUN(__glewUniform3ui64ARB)
4823 #define glUniform3ui64vARB GLEW_GET_FUN(__glewUniform3ui64vARB)
4824 #define glUniform4i64ARB GLEW_GET_FUN(__glewUniform4i64ARB)
4825 #define glUniform4i64vARB GLEW_GET_FUN(__glewUniform4i64vARB)
4826 #define glUniform4ui64ARB GLEW_GET_FUN(__glewUniform4ui64ARB)
4827 #define glUniform4ui64vARB GLEW_GET_FUN(__glewUniform4ui64vARB)
4828
4829 #define GLEW_ARB_gpu_shader_int64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_int64)
4830
4831 #endif /* GL_ARB_gpu_shader_int64 */
4832
4833 /* ------------------------ GL_ARB_half_float_pixel ------------------------ */
4834
4835 #ifndef GL_ARB_half_float_pixel
4836 #define GL_ARB_half_float_pixel 1
4837
4838 #define GL_HALF_FLOAT_ARB 0x140B
4839
4840 #define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel)
4841
4842 #endif /* GL_ARB_half_float_pixel */
4843
4844 /* ------------------------ GL_ARB_half_float_vertex ----------------------- */
4845
4846 #ifndef GL_ARB_half_float_vertex
4847 #define GL_ARB_half_float_vertex 1
4848
4849 #define GL_HALF_FLOAT 0x140B
4850
4851 #define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex)
4852
4853 #endif /* GL_ARB_half_float_vertex */
4854
4855 /* ----------------------------- GL_ARB_imaging ---------------------------- */
4856
4857 #ifndef GL_ARB_imaging
4858 #define GL_ARB_imaging 1
4859
4860 #define GL_CONSTANT_COLOR 0x8001
4861 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
4862 #define GL_CONSTANT_ALPHA 0x8003
4863 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
4864 #define GL_BLEND_COLOR 0x8005
4865 #define GL_FUNC_ADD 0x8006
4866 #define GL_MIN 0x8007
4867 #define GL_MAX 0x8008
4868 #define GL_BLEND_EQUATION 0x8009
4869 #define GL_FUNC_SUBTRACT 0x800A
4870 #define GL_FUNC_REVERSE_SUBTRACT 0x800B
4871 #define GL_CONVOLUTION_1D 0x8010
4872 #define GL_CONVOLUTION_2D 0x8011
4873 #define GL_SEPARABLE_2D 0x8012
4874 #define GL_CONVOLUTION_BORDER_MODE 0x8013
4875 #define GL_CONVOLUTION_FILTER_SCALE 0x8014
4876 #define GL_CONVOLUTION_FILTER_BIAS 0x8015
4877 #define GL_REDUCE 0x8016
4878 #define GL_CONVOLUTION_FORMAT 0x8017
4879 #define GL_CONVOLUTION_WIDTH 0x8018
4880 #define GL_CONVOLUTION_HEIGHT 0x8019
4881 #define GL_MAX_CONVOLUTION_WIDTH 0x801A
4882 #define GL_MAX_CONVOLUTION_HEIGHT 0x801B
4883 #define GL_POST_CONVOLUTION_RED_SCALE 0x801C
4884 #define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
4885 #define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
4886 #define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
4887 #define GL_POST_CONVOLUTION_RED_BIAS 0x8020
4888 #define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
4889 #define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
4890 #define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
4891 #define GL_HISTOGRAM 0x8024
4892 #define GL_PROXY_HISTOGRAM 0x8025
4893 #define GL_HISTOGRAM_WIDTH 0x8026
4894 #define GL_HISTOGRAM_FORMAT 0x8027
4895 #define GL_HISTOGRAM_RED_SIZE 0x8028
4896 #define GL_HISTOGRAM_GREEN_SIZE 0x8029
4897 #define GL_HISTOGRAM_BLUE_SIZE 0x802A
4898 #define GL_HISTOGRAM_ALPHA_SIZE 0x802B
4899 #define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
4900 #define GL_HISTOGRAM_SINK 0x802D
4901 #define GL_MINMAX 0x802E
4902 #define GL_MINMAX_FORMAT 0x802F
4903 #define GL_MINMAX_SINK 0x8030
4904 #define GL_TABLE_TOO_LARGE 0x8031
4905 #define GL_COLOR_MATRIX 0x80B1
4906 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
4907 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
4908 #define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
4909 #define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
4910 #define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
4911 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
4912 #define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
4913 #define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
4914 #define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
4915 #define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
4916 #define GL_COLOR_TABLE 0x80D0
4917 #define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
4918 #define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
4919 #define GL_PROXY_COLOR_TABLE 0x80D3
4920 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
4921 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
4922 #define GL_COLOR_TABLE_SCALE 0x80D6
4923 #define GL_COLOR_TABLE_BIAS 0x80D7
4924 #define GL_COLOR_TABLE_FORMAT 0x80D8
4925 #define GL_COLOR_TABLE_WIDTH 0x80D9
4926 #define GL_COLOR_TABLE_RED_SIZE 0x80DA
4927 #define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
4928 #define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
4929 #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
4930 #define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
4931 #define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
4932 #define GL_IGNORE_BORDER 0x8150
4933 #define GL_CONSTANT_BORDER 0x8151
4934 #define GL_WRAP_BORDER 0x8152
4935 #define GL_REPLICATE_BORDER 0x8153
4936 #define GL_CONVOLUTION_BORDER_COLOR 0x8154
4937
4938 typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);
4939 typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);
4940 typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
4941 typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
4942 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);
4943 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);
4944 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params);
4945 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
4946 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params);
4947 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
4948 typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
4949 typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
4950 typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
4951 typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
4952 typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table);
4953 typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
4954 typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
4955 typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image);
4956 typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
4957 typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
4958 typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
4959 typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
4960 typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
4961 typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, void *values);
4962 typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
4963 typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
4964 typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);
4965 typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
4966 typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink);
4967 typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target);
4968 typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target);
4969 typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);
4970
4971 #define glColorSubTable GLEW_GET_FUN(__glewColorSubTable)
4972 #define glColorTable GLEW_GET_FUN(__glewColorTable)
4973 #define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv)
4974 #define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv)
4975 #define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D)
4976 #define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D)
4977 #define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf)
4978 #define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv)
4979 #define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri)
4980 #define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv)
4981 #define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable)
4982 #define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable)
4983 #define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D)
4984 #define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D)
4985 #define glGetColorTable GLEW_GET_FUN(__glewGetColorTable)
4986 #define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv)
4987 #define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv)
4988 #define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter)
4989 #define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv)
4990 #define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv)
4991 #define glGetHistogram GLEW_GET_FUN(__glewGetHistogram)
4992 #define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv)
4993 #define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv)
4994 #define glGetMinmax GLEW_GET_FUN(__glewGetMinmax)
4995 #define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv)
4996 #define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv)
4997 #define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter)
4998 #define glHistogram GLEW_GET_FUN(__glewHistogram)
4999 #define glMinmax GLEW_GET_FUN(__glewMinmax)
5000 #define glResetHistogram GLEW_GET_FUN(__glewResetHistogram)
5001 #define glResetMinmax GLEW_GET_FUN(__glewResetMinmax)
5002 #define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D)
5003
5004 #define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging)
5005
5006 #endif /* GL_ARB_imaging */
5007
5008 /* ----------------------- GL_ARB_indirect_parameters ---------------------- */
5009
5010 #ifndef GL_ARB_indirect_parameters
5011 #define GL_ARB_indirect_parameters 1
5012
5013 #define GL_PARAMETER_BUFFER_ARB 0x80EE
5014 #define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF
5015
5016 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);
5017 typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);
5018
5019 #define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB)
5020 #define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB)
5021
5022 #define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters)
5023
5024 #endif /* GL_ARB_indirect_parameters */
5025
5026 /* ------------------------ GL_ARB_instanced_arrays ------------------------ */
5027
5028 #ifndef GL_ARB_instanced_arrays
5029 #define GL_ARB_instanced_arrays 1
5030
5031 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE
5032
5033 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
5034 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount);
5035 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor);
5036
5037 #define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB)
5038 #define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB)
5039 #define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB)
5040
5041 #define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays)
5042
5043 #endif /* GL_ARB_instanced_arrays */
5044
5045 /* ---------------------- GL_ARB_internalformat_query ---------------------- */
5046
5047 #ifndef GL_ARB_internalformat_query
5048 #define GL_ARB_internalformat_query 1
5049
5050 #define GL_NUM_SAMPLE_COUNTS 0x9380
5051
5052 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params);
5053
5054 #define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ)
5055
5056 #define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query)
5057
5058 #endif /* GL_ARB_internalformat_query */
5059
5060 /* ---------------------- GL_ARB_internalformat_query2 --------------------- */
5061
5062 #ifndef GL_ARB_internalformat_query2
5063 #define GL_ARB_internalformat_query2 1
5064
5065 #define GL_INTERNALFORMAT_SUPPORTED 0x826F
5066 #define GL_INTERNALFORMAT_PREFERRED 0x8270
5067 #define GL_INTERNALFORMAT_RED_SIZE 0x8271
5068 #define GL_INTERNALFORMAT_GREEN_SIZE 0x8272
5069 #define GL_INTERNALFORMAT_BLUE_SIZE 0x8273
5070 #define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274
5071 #define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275
5072 #define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276
5073 #define GL_INTERNALFORMAT_SHARED_SIZE 0x8277
5074 #define GL_INTERNALFORMAT_RED_TYPE 0x8278
5075 #define GL_INTERNALFORMAT_GREEN_TYPE 0x8279
5076 #define GL_INTERNALFORMAT_BLUE_TYPE 0x827A
5077 #define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B
5078 #define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C
5079 #define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D
5080 #define GL_MAX_WIDTH 0x827E
5081 #define GL_MAX_HEIGHT 0x827F
5082 #define GL_MAX_DEPTH 0x8280
5083 #define GL_MAX_LAYERS 0x8281
5084 #define GL_MAX_COMBINED_DIMENSIONS 0x8282
5085 #define GL_COLOR_COMPONENTS 0x8283
5086 #define GL_DEPTH_COMPONENTS 0x8284
5087 #define GL_STENCIL_COMPONENTS 0x8285
5088 #define GL_COLOR_RENDERABLE 0x8286
5089 #define GL_DEPTH_RENDERABLE 0x8287
5090 #define GL_STENCIL_RENDERABLE 0x8288
5091 #define GL_FRAMEBUFFER_RENDERABLE 0x8289
5092 #define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A
5093 #define GL_FRAMEBUFFER_BLEND 0x828B
5094 #define GL_READ_PIXELS 0x828C
5095 #define GL_READ_PIXELS_FORMAT 0x828D
5096 #define GL_READ_PIXELS_TYPE 0x828E
5097 #define GL_TEXTURE_IMAGE_FORMAT 0x828F
5098 #define GL_TEXTURE_IMAGE_TYPE 0x8290
5099 #define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291
5100 #define GL_GET_TEXTURE_IMAGE_TYPE 0x8292
5101 #define GL_MIPMAP 0x8293
5102 #define GL_MANUAL_GENERATE_MIPMAP 0x8294
5103 #define GL_AUTO_GENERATE_MIPMAP 0x8295
5104 #define GL_COLOR_ENCODING 0x8296
5105 #define GL_SRGB_READ 0x8297
5106 #define GL_SRGB_WRITE 0x8298
5107 #define GL_SRGB_DECODE_ARB 0x8299
5108 #define GL_FILTER 0x829A
5109 #define GL_VERTEX_TEXTURE 0x829B
5110 #define GL_TESS_CONTROL_TEXTURE 0x829C
5111 #define GL_TESS_EVALUATION_TEXTURE 0x829D
5112 #define GL_GEOMETRY_TEXTURE 0x829E
5113 #define GL_FRAGMENT_TEXTURE 0x829F
5114 #define GL_COMPUTE_TEXTURE 0x82A0
5115 #define GL_TEXTURE_SHADOW 0x82A1
5116 #define GL_TEXTURE_GATHER 0x82A2
5117 #define GL_TEXTURE_GATHER_SHADOW 0x82A3
5118 #define GL_SHADER_IMAGE_LOAD 0x82A4
5119 #define GL_SHADER_IMAGE_STORE 0x82A5
5120 #define GL_SHADER_IMAGE_ATOMIC 0x82A6
5121 #define GL_IMAGE_TEXEL_SIZE 0x82A7
5122 #define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8
5123 #define GL_IMAGE_PIXEL_FORMAT 0x82A9
5124 #define GL_IMAGE_PIXEL_TYPE 0x82AA
5125 #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC
5126 #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD
5127 #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE
5128 #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF
5129 #define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1
5130 #define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2
5131 #define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3
5132 #define GL_CLEAR_BUFFER 0x82B4
5133 #define GL_TEXTURE_VIEW 0x82B5
5134 #define GL_VIEW_COMPATIBILITY_CLASS 0x82B6
5135 #define GL_FULL_SUPPORT 0x82B7
5136 #define GL_CAVEAT_SUPPORT 0x82B8
5137 #define GL_IMAGE_CLASS_4_X_32 0x82B9
5138 #define GL_IMAGE_CLASS_2_X_32 0x82BA
5139 #define GL_IMAGE_CLASS_1_X_32 0x82BB
5140 #define GL_IMAGE_CLASS_4_X_16 0x82BC
5141 #define GL_IMAGE_CLASS_2_X_16 0x82BD
5142 #define GL_IMAGE_CLASS_1_X_16 0x82BE
5143 #define GL_IMAGE_CLASS_4_X_8 0x82BF
5144 #define GL_IMAGE_CLASS_2_X_8 0x82C0
5145 #define GL_IMAGE_CLASS_1_X_8 0x82C1
5146 #define GL_IMAGE_CLASS_11_11_10 0x82C2
5147 #define GL_IMAGE_CLASS_10_10_10_2 0x82C3
5148 #define GL_VIEW_CLASS_128_BITS 0x82C4
5149 #define GL_VIEW_CLASS_96_BITS 0x82C5
5150 #define GL_VIEW_CLASS_64_BITS 0x82C6
5151 #define GL_VIEW_CLASS_48_BITS 0x82C7
5152 #define GL_VIEW_CLASS_32_BITS 0x82C8
5153 #define GL_VIEW_CLASS_24_BITS 0x82C9
5154 #define GL_VIEW_CLASS_16_BITS 0x82CA
5155 #define GL_VIEW_CLASS_8_BITS 0x82CB
5156 #define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC
5157 #define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD
5158 #define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE
5159 #define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF
5160 #define GL_VIEW_CLASS_RGTC1_RED 0x82D0
5161 #define GL_VIEW_CLASS_RGTC2_RG 0x82D1
5162 #define GL_VIEW_CLASS_BPTC_UNORM 0x82D2
5163 #define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3
5164
5165 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params);
5166
5167 #define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v)
5168
5169 #define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2)
5170
5171 #endif /* GL_ARB_internalformat_query2 */
5172
5173 /* ----------------------- GL_ARB_invalidate_subdata ----------------------- */
5174
5175 #ifndef GL_ARB_invalidate_subdata
5176 #define GL_ARB_invalidate_subdata 1
5177
5178 typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer);
5179 typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);
5180 typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments);
5181 typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
5182 typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level);
5183 typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
5184
5185 #define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData)
5186 #define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData)
5187 #define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer)
5188 #define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer)
5189 #define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage)
5190 #define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage)
5191
5192 #define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata)
5193
5194 #endif /* GL_ARB_invalidate_subdata */
5195
5196 /* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */
5197
5198 #ifndef GL_ARB_map_buffer_alignment
5199 #define GL_ARB_map_buffer_alignment 1
5200
5201 #define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC
5202
5203 #define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment)
5204
5205 #endif /* GL_ARB_map_buffer_alignment */
5206
5207 /* ------------------------ GL_ARB_map_buffer_range ------------------------ */
5208
5209 #ifndef GL_ARB_map_buffer_range
5210 #define GL_ARB_map_buffer_range 1
5211
5212 #define GL_MAP_READ_BIT 0x0001
5213 #define GL_MAP_WRITE_BIT 0x0002
5214 #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
5215 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
5216 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
5217 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
5218
5219 typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
5220 typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
5221
5222 #define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange)
5223 #define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange)
5224
5225 #define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range)
5226
5227 #endif /* GL_ARB_map_buffer_range */
5228
5229 /* ------------------------- GL_ARB_matrix_palette ------------------------- */
5230
5231 #ifndef GL_ARB_matrix_palette
5232 #define GL_ARB_matrix_palette 1
5233
5234 #define GL_MATRIX_PALETTE_ARB 0x8840
5235 #define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841
5236 #define GL_MAX_PALETTE_MATRICES_ARB 0x8842
5237 #define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843
5238 #define GL_MATRIX_INDEX_ARRAY_ARB 0x8844
5239 #define GL_CURRENT_MATRIX_INDEX_ARB 0x8845
5240 #define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846
5241 #define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847
5242 #define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848
5243 #define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849
5244
5245 typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index);
5246 typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer);
5247 typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices);
5248 typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices);
5249 typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices);
5250
5251 #define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB)
5252 #define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB)
5253 #define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB)
5254 #define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB)
5255 #define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB)
5256
5257 #define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette)
5258
5259 #endif /* GL_ARB_matrix_palette */
5260
5261 /* --------------------------- GL_ARB_multi_bind --------------------------- */
5262
5263 #ifndef GL_ARB_multi_bind
5264 #define GL_ARB_multi_bind 1
5265
5266 typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers);
5267 typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
5268 typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures);
5269 typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers);
5270 typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures);
5271 typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides);
5272
5273 #define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase)
5274 #define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange)
5275 #define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures)
5276 #define glBindSamplers GLEW_GET_FUN(__glewBindSamplers)
5277 #define glBindTextures GLEW_GET_FUN(__glewBindTextures)
5278 #define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers)
5279
5280 #define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind)
5281
5282 #endif /* GL_ARB_multi_bind */
5283
5284 /* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */
5285
5286 #ifndef GL_ARB_multi_draw_indirect
5287 #define GL_ARB_multi_draw_indirect 1
5288
5289 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride);
5290 typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride);
5291
5292 #define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect)
5293 #define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect)
5294
5295 #define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect)
5296
5297 #endif /* GL_ARB_multi_draw_indirect */
5298
5299 /* --------------------------- GL_ARB_multisample -------------------------- */
5300
5301 #ifndef GL_ARB_multisample
5302 #define GL_ARB_multisample 1
5303
5304 #define GL_MULTISAMPLE_ARB 0x809D
5305 #define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E
5306 #define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F
5307 #define GL_SAMPLE_COVERAGE_ARB 0x80A0
5308 #define GL_SAMPLE_BUFFERS_ARB 0x80A8
5309 #define GL_SAMPLES_ARB 0x80A9
5310 #define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA
5311 #define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB
5312 #define GL_MULTISAMPLE_BIT_ARB 0x20000000
5313
5314 typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert);
5315
5316 #define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB)
5317
5318 #define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample)
5319
5320 #endif /* GL_ARB_multisample */
5321
5322 /* -------------------------- GL_ARB_multitexture -------------------------- */
5323
5324 #ifndef GL_ARB_multitexture
5325 #define GL_ARB_multitexture 1
5326
5327 #define GL_TEXTURE0_ARB 0x84C0
5328 #define GL_TEXTURE1_ARB 0x84C1
5329 #define GL_TEXTURE2_ARB 0x84C2
5330 #define GL_TEXTURE3_ARB 0x84C3
5331 #define GL_TEXTURE4_ARB 0x84C4
5332 #define GL_TEXTURE5_ARB 0x84C5
5333 #define GL_TEXTURE6_ARB 0x84C6
5334 #define GL_TEXTURE7_ARB 0x84C7
5335 #define GL_TEXTURE8_ARB 0x84C8
5336 #define GL_TEXTURE9_ARB 0x84C9
5337 #define GL_TEXTURE10_ARB 0x84CA
5338 #define GL_TEXTURE11_ARB 0x84CB
5339 #define GL_TEXTURE12_ARB 0x84CC
5340 #define GL_TEXTURE13_ARB 0x84CD
5341 #define GL_TEXTURE14_ARB 0x84CE
5342 #define GL_TEXTURE15_ARB 0x84CF
5343 #define GL_TEXTURE16_ARB 0x84D0
5344 #define GL_TEXTURE17_ARB 0x84D1
5345 #define GL_TEXTURE18_ARB 0x84D2
5346 #define GL_TEXTURE19_ARB 0x84D3
5347 #define GL_TEXTURE20_ARB 0x84D4
5348 #define GL_TEXTURE21_ARB 0x84D5
5349 #define GL_TEXTURE22_ARB 0x84D6
5350 #define GL_TEXTURE23_ARB 0x84D7
5351 #define GL_TEXTURE24_ARB 0x84D8
5352 #define GL_TEXTURE25_ARB 0x84D9
5353 #define GL_TEXTURE26_ARB 0x84DA
5354 #define GL_TEXTURE27_ARB 0x84DB
5355 #define GL_TEXTURE28_ARB 0x84DC
5356 #define GL_TEXTURE29_ARB 0x84DD
5357 #define GL_TEXTURE30_ARB 0x84DE
5358 #define GL_TEXTURE31_ARB 0x84DF
5359 #define GL_ACTIVE_TEXTURE_ARB 0x84E0
5360 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
5361 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
5362
5363 typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture);
5364 typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);
5365 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s);
5366 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v);
5367 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);
5368 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);
5369 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s);
5370 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v);
5371 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s);
5372 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v);
5373 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t);
5374 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v);
5375 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
5376 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);
5377 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t);
5378 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v);
5379 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t);
5380 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);
5381 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
5382 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v);
5383 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
5384 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);
5385 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r);
5386 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v);
5387 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
5388 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v);
5389 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
5390 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v);
5391 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
5392 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);
5393 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
5394 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v);
5395 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
5396 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);
5397
5398 #define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB)
5399 #define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB)
5400 #define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB)
5401 #define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB)
5402 #define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB)
5403 #define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB)
5404 #define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB)
5405 #define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB)
5406 #define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB)
5407 #define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB)
5408 #define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB)
5409 #define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB)
5410 #define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB)
5411 #define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB)
5412 #define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB)
5413 #define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB)
5414 #define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB)
5415 #define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB)
5416 #define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB)
5417 #define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB)
5418 #define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB)
5419 #define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB)
5420 #define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB)
5421 #define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB)
5422 #define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB)
5423 #define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB)
5424 #define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB)
5425 #define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB)
5426 #define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB)
5427 #define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB)
5428 #define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB)
5429 #define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB)
5430 #define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB)
5431 #define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB)
5432
5433 #define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture)
5434
5435 #endif /* GL_ARB_multitexture */
5436
5437 /* ------------------------- GL_ARB_occlusion_query ------------------------ */
5438
5439 #ifndef GL_ARB_occlusion_query
5440 #define GL_ARB_occlusion_query 1
5441
5442 #define GL_QUERY_COUNTER_BITS_ARB 0x8864
5443 #define GL_CURRENT_QUERY_ARB 0x8865
5444 #define GL_QUERY_RESULT_ARB 0x8866
5445 #define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867
5446 #define GL_SAMPLES_PASSED_ARB 0x8914
5447
5448 typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id);
5449 typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids);
5450 typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target);
5451 typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids);
5452 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params);
5453 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params);
5454 typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params);
5455 typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id);
5456
5457 #define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB)
5458 #define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB)
5459 #define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB)
5460 #define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB)
5461 #define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB)
5462 #define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB)
5463 #define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB)
5464 #define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB)
5465
5466 #define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query)
5467
5468 #endif /* GL_ARB_occlusion_query */
5469
5470 /* ------------------------ GL_ARB_occlusion_query2 ------------------------ */
5471
5472 #ifndef GL_ARB_occlusion_query2
5473 #define GL_ARB_occlusion_query2 1
5474
5475 #define GL_ANY_SAMPLES_PASSED 0x8C2F
5476
5477 #define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2)
5478
5479 #endif /* GL_ARB_occlusion_query2 */
5480
5481 /* --------------------- GL_ARB_parallel_shader_compile -------------------- */
5482
5483 #ifndef GL_ARB_parallel_shader_compile
5484 #define GL_ARB_parallel_shader_compile 1
5485
5486 #define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0
5487 #define GL_COMPLETION_STATUS_ARB 0x91B1
5488
5489 typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count);
5490
5491 #define glMaxShaderCompilerThreadsARB GLEW_GET_FUN(__glewMaxShaderCompilerThreadsARB)
5492
5493 #define GLEW_ARB_parallel_shader_compile GLEW_GET_VAR(__GLEW_ARB_parallel_shader_compile)
5494
5495 #endif /* GL_ARB_parallel_shader_compile */
5496
5497 /* -------------------- GL_ARB_pipeline_statistics_query ------------------- */
5498
5499 #ifndef GL_ARB_pipeline_statistics_query
5500 #define GL_ARB_pipeline_statistics_query 1
5501
5502 #define GL_VERTICES_SUBMITTED_ARB 0x82EE
5503 #define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF
5504 #define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0
5505 #define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1
5506 #define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2
5507 #define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3
5508 #define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4
5509 #define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5
5510 #define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6
5511 #define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7
5512 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F
5513
5514 #define GLEW_ARB_pipeline_statistics_query GLEW_GET_VAR(__GLEW_ARB_pipeline_statistics_query)
5515
5516 #endif /* GL_ARB_pipeline_statistics_query */
5517
5518 /* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */
5519
5520 #ifndef GL_ARB_pixel_buffer_object
5521 #define GL_ARB_pixel_buffer_object 1
5522
5523 #define GL_PIXEL_PACK_BUFFER_ARB 0x88EB
5524 #define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC
5525 #define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED
5526 #define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF
5527
5528 #define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object)
5529
5530 #endif /* GL_ARB_pixel_buffer_object */
5531
5532 /* ------------------------ GL_ARB_point_parameters ------------------------ */
5533
5534 #ifndef GL_ARB_point_parameters
5535 #define GL_ARB_point_parameters 1
5536
5537 #define GL_POINT_SIZE_MIN_ARB 0x8126
5538 #define GL_POINT_SIZE_MAX_ARB 0x8127
5539 #define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128
5540 #define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129
5541
5542 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);
5543 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params);
5544
5545 #define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB)
5546 #define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB)
5547
5548 #define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters)
5549
5550 #endif /* GL_ARB_point_parameters */
5551
5552 /* -------------------------- GL_ARB_point_sprite -------------------------- */
5553
5554 #ifndef GL_ARB_point_sprite
5555 #define GL_ARB_point_sprite 1
5556
5557 #define GL_POINT_SPRITE_ARB 0x8861
5558 #define GL_COORD_REPLACE_ARB 0x8862
5559
5560 #define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite)
5561
5562 #endif /* GL_ARB_point_sprite */
5563
5564 /* ----------------------- GL_ARB_post_depth_coverage ---------------------- */
5565
5566 #ifndef GL_ARB_post_depth_coverage
5567 #define GL_ARB_post_depth_coverage 1
5568
5569 #define GLEW_ARB_post_depth_coverage GLEW_GET_VAR(__GLEW_ARB_post_depth_coverage)
5570
5571 #endif /* GL_ARB_post_depth_coverage */
5572
5573 /* --------------------- GL_ARB_program_interface_query -------------------- */
5574
5575 #ifndef GL_ARB_program_interface_query
5576 #define GL_ARB_program_interface_query 1
5577
5578 #define GL_UNIFORM 0x92E1
5579 #define GL_UNIFORM_BLOCK 0x92E2
5580 #define GL_PROGRAM_INPUT 0x92E3
5581 #define GL_PROGRAM_OUTPUT 0x92E4
5582 #define GL_BUFFER_VARIABLE 0x92E5
5583 #define GL_SHADER_STORAGE_BLOCK 0x92E6
5584 #define GL_IS_PER_PATCH 0x92E7
5585 #define GL_VERTEX_SUBROUTINE 0x92E8
5586 #define GL_TESS_CONTROL_SUBROUTINE 0x92E9
5587 #define GL_TESS_EVALUATION_SUBROUTINE 0x92EA
5588 #define GL_GEOMETRY_SUBROUTINE 0x92EB
5589 #define GL_FRAGMENT_SUBROUTINE 0x92EC
5590 #define GL_COMPUTE_SUBROUTINE 0x92ED
5591 #define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE
5592 #define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF
5593 #define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0
5594 #define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1
5595 #define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2
5596 #define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3
5597 #define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4
5598 #define GL_ACTIVE_RESOURCES 0x92F5
5599 #define GL_MAX_NAME_LENGTH 0x92F6
5600 #define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7
5601 #define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8
5602 #define GL_NAME_LENGTH 0x92F9
5603 #define GL_TYPE 0x92FA
5604 #define GL_ARRAY_SIZE 0x92FB
5605 #define GL_OFFSET 0x92FC
5606 #define GL_BLOCK_INDEX 0x92FD
5607 #define GL_ARRAY_STRIDE 0x92FE
5608 #define GL_MATRIX_STRIDE 0x92FF
5609 #define GL_IS_ROW_MAJOR 0x9300
5610 #define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301
5611 #define GL_BUFFER_BINDING 0x9302
5612 #define GL_BUFFER_DATA_SIZE 0x9303
5613 #define GL_NUM_ACTIVE_VARIABLES 0x9304
5614 #define GL_ACTIVE_VARIABLES 0x9305
5615 #define GL_REFERENCED_BY_VERTEX_SHADER 0x9306
5616 #define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307
5617 #define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308
5618 #define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309
5619 #define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A
5620 #define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B
5621 #define GL_TOP_LEVEL_ARRAY_SIZE 0x930C
5622 #define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D
5623 #define GL_LOCATION 0x930E
5624 #define GL_LOCATION_INDEX 0x930F
5625
5626 typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params);
5627 typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name);
5628 typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name);
5629 typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name);
5630 typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name);
5631 typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params);
5632
5633 #define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv)
5634 #define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex)
5635 #define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation)
5636 #define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex)
5637 #define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName)
5638 #define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv)
5639
5640 #define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query)
5641
5642 #endif /* GL_ARB_program_interface_query */
5643
5644 /* ------------------------ GL_ARB_provoking_vertex ------------------------ */
5645
5646 #ifndef GL_ARB_provoking_vertex
5647 #define GL_ARB_provoking_vertex 1
5648
5649 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C
5650 #define GL_FIRST_VERTEX_CONVENTION 0x8E4D
5651 #define GL_LAST_VERTEX_CONVENTION 0x8E4E
5652 #define GL_PROVOKING_VERTEX 0x8E4F
5653
5654 typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode);
5655
5656 #define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex)
5657
5658 #define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex)
5659
5660 #endif /* GL_ARB_provoking_vertex */
5661
5662 /* ----------------------- GL_ARB_query_buffer_object ---------------------- */
5663
5664 #ifndef GL_ARB_query_buffer_object
5665 #define GL_ARB_query_buffer_object 1
5666
5667 #define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000
5668 #define GL_QUERY_BUFFER 0x9192
5669 #define GL_QUERY_BUFFER_BINDING 0x9193
5670 #define GL_QUERY_RESULT_NO_WAIT 0x9194
5671
5672 #define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object)
5673
5674 #endif /* GL_ARB_query_buffer_object */
5675
5676 /* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */
5677
5678 #ifndef GL_ARB_robust_buffer_access_behavior
5679 #define GL_ARB_robust_buffer_access_behavior 1
5680
5681 #define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior)
5682
5683 #endif /* GL_ARB_robust_buffer_access_behavior */
5684
5685 /* --------------------------- GL_ARB_robustness --------------------------- */
5686
5687 #ifndef GL_ARB_robustness
5688 #define GL_ARB_robustness 1
5689
5690 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004
5691 #define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
5692 #define GL_GUILTY_CONTEXT_RESET_ARB 0x8253
5693 #define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254
5694 #define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255
5695 #define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
5696 #define GL_NO_RESET_NOTIFICATION_ARB 0x8261
5697
5698 typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void);
5699 typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table);
5700 typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img);
5701 typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image);
5702 typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values);
5703 typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v);
5704 typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v);
5705 typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v);
5706 typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values);
5707 typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values);
5708 typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values);
5709 typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values);
5710 typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern);
5711 typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void*column, void*span);
5712 typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img);
5713 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params);
5714 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params);
5715 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params);
5716 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params);
5717 typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data);
5718
5719 #define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB)
5720 #define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB)
5721 #define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB)
5722 #define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB)
5723 #define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB)
5724 #define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB)
5725 #define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB)
5726 #define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB)
5727 #define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB)
5728 #define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB)
5729 #define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB)
5730 #define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB)
5731 #define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB)
5732 #define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB)
5733 #define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB)
5734 #define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB)
5735 #define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB)
5736 #define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB)
5737 #define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB)
5738 #define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB)
5739
5740 #define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness)
5741
5742 #endif /* GL_ARB_robustness */
5743
5744 /* ---------------- GL_ARB_robustness_application_isolation ---------------- */
5745
5746 #ifndef GL_ARB_robustness_application_isolation
5747 #define GL_ARB_robustness_application_isolation 1
5748
5749 #define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation)
5750
5751 #endif /* GL_ARB_robustness_application_isolation */
5752
5753 /* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */
5754
5755 #ifndef GL_ARB_robustness_share_group_isolation
5756 #define GL_ARB_robustness_share_group_isolation 1
5757
5758 #define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation)
5759
5760 #endif /* GL_ARB_robustness_share_group_isolation */
5761
5762 /* ------------------------ GL_ARB_sample_locations ------------------------ */
5763
5764 #ifndef GL_ARB_sample_locations
5765 #define GL_ARB_sample_locations 1
5766
5767 #define GL_SAMPLE_LOCATION_ARB 0x8E50
5768 #define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D
5769 #define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E
5770 #define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F
5771 #define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340
5772 #define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341
5773 #define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342
5774 #define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343
5775
5776 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v);
5777 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v);
5778
5779 #define glFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewFramebufferSampleLocationsfvARB)
5780 #define glNamedFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvARB)
5781
5782 #define GLEW_ARB_sample_locations GLEW_GET_VAR(__GLEW_ARB_sample_locations)
5783
5784 #endif /* GL_ARB_sample_locations */
5785
5786 /* ------------------------- GL_ARB_sample_shading ------------------------- */
5787
5788 #ifndef GL_ARB_sample_shading
5789 #define GL_ARB_sample_shading 1
5790
5791 #define GL_SAMPLE_SHADING_ARB 0x8C36
5792 #define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37
5793
5794 typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value);
5795
5796 #define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB)
5797
5798 #define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading)
5799
5800 #endif /* GL_ARB_sample_shading */
5801
5802 /* ------------------------- GL_ARB_sampler_objects ------------------------ */
5803
5804 #ifndef GL_ARB_sampler_objects
5805 #define GL_ARB_sampler_objects 1
5806
5807 #define GL_SAMPLER_BINDING 0x8919
5808
5809 typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
5810 typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers);
5811 typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers);
5812 typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params);
5813 typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params);
5814 typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params);
5815 typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params);
5816 typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler);
5817 typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params);
5818 typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params);
5819 typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
5820 typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params);
5821 typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
5822 typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params);
5823
5824 #define glBindSampler GLEW_GET_FUN(__glewBindSampler)
5825 #define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers)
5826 #define glGenSamplers GLEW_GET_FUN(__glewGenSamplers)
5827 #define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv)
5828 #define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv)
5829 #define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv)
5830 #define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv)
5831 #define glIsSampler GLEW_GET_FUN(__glewIsSampler)
5832 #define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv)
5833 #define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv)
5834 #define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf)
5835 #define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv)
5836 #define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri)
5837 #define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv)
5838
5839 #define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects)
5840
5841 #endif /* GL_ARB_sampler_objects */
5842
5843 /* ------------------------ GL_ARB_seamless_cube_map ----------------------- */
5844
5845 #ifndef GL_ARB_seamless_cube_map
5846 #define GL_ARB_seamless_cube_map 1
5847
5848 #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
5849
5850 #define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map)
5851
5852 #endif /* GL_ARB_seamless_cube_map */
5853
5854 /* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */
5855
5856 #ifndef GL_ARB_seamless_cubemap_per_texture
5857 #define GL_ARB_seamless_cubemap_per_texture 1
5858
5859 #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
5860
5861 #define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture)
5862
5863 #endif /* GL_ARB_seamless_cubemap_per_texture */
5864
5865 /* --------------------- GL_ARB_separate_shader_objects -------------------- */
5866
5867 #ifndef GL_ARB_separate_shader_objects
5868 #define GL_ARB_separate_shader_objects 1
5869
5870 #define GL_VERTEX_SHADER_BIT 0x00000001
5871 #define GL_FRAGMENT_SHADER_BIT 0x00000002
5872 #define GL_GEOMETRY_SHADER_BIT 0x00000004
5873 #define GL_TESS_CONTROL_SHADER_BIT 0x00000008
5874 #define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
5875 #define GL_PROGRAM_SEPARABLE 0x8258
5876 #define GL_ACTIVE_PROGRAM 0x8259
5877 #define GL_PROGRAM_PIPELINE_BINDING 0x825A
5878 #define GL_ALL_SHADER_BITS 0xFFFFFFFF
5879
5880 typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);
5881 typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);
5882 typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar * const * strings);
5883 typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines);
5884 typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines);
5885 typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar *infoLog);
5886 typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params);
5887 typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);
5888 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x);
5889 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
5890 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x);
5891 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
5892 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x);
5893 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
5894 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x);
5895 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
5896 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y);
5897 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
5898 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y);
5899 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
5900 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y);
5901 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
5902 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y);
5903 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
5904 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z);
5905 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
5906 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);
5907 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
5908 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z);
5909 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
5910 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z);
5911 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
5912 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
5913 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
5914 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
5915 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
5916 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);
5917 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
5918 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w);
5919 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
5920 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
5921 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
5922 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
5923 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
5924 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
5925 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
5926 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
5927 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
5928 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
5929 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
5930 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
5931 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
5932 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
5933 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
5934 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
5935 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
5936 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
5937 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
5938 typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
5939 typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);
5940
5941 #define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram)
5942 #define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline)
5943 #define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv)
5944 #define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines)
5945 #define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines)
5946 #define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog)
5947 #define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv)
5948 #define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline)
5949 #define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d)
5950 #define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv)
5951 #define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f)
5952 #define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv)
5953 #define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i)
5954 #define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv)
5955 #define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui)
5956 #define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv)
5957 #define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d)
5958 #define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv)
5959 #define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f)
5960 #define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv)
5961 #define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i)
5962 #define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv)
5963 #define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui)
5964 #define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv)
5965 #define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d)
5966 #define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv)
5967 #define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f)
5968 #define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv)
5969 #define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i)
5970 #define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv)
5971 #define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui)
5972 #define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv)
5973 #define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d)
5974 #define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv)
5975 #define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f)
5976 #define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv)
5977 #define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i)
5978 #define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv)
5979 #define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui)
5980 #define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv)
5981 #define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv)
5982 #define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv)
5983 #define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv)
5984 #define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv)
5985 #define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv)
5986 #define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv)
5987 #define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv)
5988 #define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv)
5989 #define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv)
5990 #define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv)
5991 #define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv)
5992 #define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv)
5993 #define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv)
5994 #define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv)
5995 #define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv)
5996 #define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv)
5997 #define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv)
5998 #define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv)
5999 #define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages)
6000 #define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline)
6001
6002 #define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects)
6003
6004 #endif /* GL_ARB_separate_shader_objects */
6005
6006 /* -------------------- GL_ARB_shader_atomic_counter_ops ------------------- */
6007
6008 #ifndef GL_ARB_shader_atomic_counter_ops
6009 #define GL_ARB_shader_atomic_counter_ops 1
6010
6011 #define GLEW_ARB_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counter_ops)
6012
6013 #endif /* GL_ARB_shader_atomic_counter_ops */
6014
6015 /* --------------------- GL_ARB_shader_atomic_counters --------------------- */
6016
6017 #ifndef GL_ARB_shader_atomic_counters
6018 #define GL_ARB_shader_atomic_counters 1
6019
6020 #define GL_ATOMIC_COUNTER_BUFFER 0x92C0
6021 #define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1
6022 #define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2
6023 #define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3
6024 #define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4
6025 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5
6026 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6
6027 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7
6028 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8
6029 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9
6030 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA
6031 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB
6032 #define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC
6033 #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD
6034 #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE
6035 #define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF
6036 #define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0
6037 #define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1
6038 #define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2
6039 #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3
6040 #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4
6041 #define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5
6042 #define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6
6043 #define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7
6044 #define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8
6045 #define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9
6046 #define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA
6047 #define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB
6048 #define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC
6049
6050 typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params);
6051
6052 #define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv)
6053
6054 #define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters)
6055
6056 #endif /* GL_ARB_shader_atomic_counters */
6057
6058 /* -------------------------- GL_ARB_shader_ballot ------------------------- */
6059
6060 #ifndef GL_ARB_shader_ballot
6061 #define GL_ARB_shader_ballot 1
6062
6063 #define GLEW_ARB_shader_ballot GLEW_GET_VAR(__GLEW_ARB_shader_ballot)
6064
6065 #endif /* GL_ARB_shader_ballot */
6066
6067 /* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */
6068
6069 #ifndef GL_ARB_shader_bit_encoding
6070 #define GL_ARB_shader_bit_encoding 1
6071
6072 #define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding)
6073
6074 #endif /* GL_ARB_shader_bit_encoding */
6075
6076 /* -------------------------- GL_ARB_shader_clock -------------------------- */
6077
6078 #ifndef GL_ARB_shader_clock
6079 #define GL_ARB_shader_clock 1
6080
6081 #define GLEW_ARB_shader_clock GLEW_GET_VAR(__GLEW_ARB_shader_clock)
6082
6083 #endif /* GL_ARB_shader_clock */
6084
6085 /* --------------------- GL_ARB_shader_draw_parameters --------------------- */
6086
6087 #ifndef GL_ARB_shader_draw_parameters
6088 #define GL_ARB_shader_draw_parameters 1
6089
6090 #define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters)
6091
6092 #endif /* GL_ARB_shader_draw_parameters */
6093
6094 /* ------------------------ GL_ARB_shader_group_vote ----------------------- */
6095
6096 #ifndef GL_ARB_shader_group_vote
6097 #define GL_ARB_shader_group_vote 1
6098
6099 #define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote)
6100
6101 #endif /* GL_ARB_shader_group_vote */
6102
6103 /* --------------------- GL_ARB_shader_image_load_store -------------------- */
6104
6105 #ifndef GL_ARB_shader_image_load_store
6106 #define GL_ARB_shader_image_load_store 1
6107
6108 #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
6109 #define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
6110 #define GL_UNIFORM_BARRIER_BIT 0x00000004
6111 #define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008
6112 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
6113 #define GL_COMMAND_BARRIER_BIT 0x00000040
6114 #define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080
6115 #define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100
6116 #define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200
6117 #define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400
6118 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
6119 #define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000
6120 #define GL_MAX_IMAGE_UNITS 0x8F38
6121 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39
6122 #define GL_IMAGE_BINDING_NAME 0x8F3A
6123 #define GL_IMAGE_BINDING_LEVEL 0x8F3B
6124 #define GL_IMAGE_BINDING_LAYERED 0x8F3C
6125 #define GL_IMAGE_BINDING_LAYER 0x8F3D
6126 #define GL_IMAGE_BINDING_ACCESS 0x8F3E
6127 #define GL_IMAGE_1D 0x904C
6128 #define GL_IMAGE_2D 0x904D
6129 #define GL_IMAGE_3D 0x904E
6130 #define GL_IMAGE_2D_RECT 0x904F
6131 #define GL_IMAGE_CUBE 0x9050
6132 #define GL_IMAGE_BUFFER 0x9051
6133 #define GL_IMAGE_1D_ARRAY 0x9052
6134 #define GL_IMAGE_2D_ARRAY 0x9053
6135 #define GL_IMAGE_CUBE_MAP_ARRAY 0x9054
6136 #define GL_IMAGE_2D_MULTISAMPLE 0x9055
6137 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056
6138 #define GL_INT_IMAGE_1D 0x9057
6139 #define GL_INT_IMAGE_2D 0x9058
6140 #define GL_INT_IMAGE_3D 0x9059
6141 #define GL_INT_IMAGE_2D_RECT 0x905A
6142 #define GL_INT_IMAGE_CUBE 0x905B
6143 #define GL_INT_IMAGE_BUFFER 0x905C
6144 #define GL_INT_IMAGE_1D_ARRAY 0x905D
6145 #define GL_INT_IMAGE_2D_ARRAY 0x905E
6146 #define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F
6147 #define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060
6148 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061
6149 #define GL_UNSIGNED_INT_IMAGE_1D 0x9062
6150 #define GL_UNSIGNED_INT_IMAGE_2D 0x9063
6151 #define GL_UNSIGNED_INT_IMAGE_3D 0x9064
6152 #define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065
6153 #define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066
6154 #define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067
6155 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068
6156 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069
6157 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A
6158 #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B
6159 #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C
6160 #define GL_MAX_IMAGE_SAMPLES 0x906D
6161 #define GL_IMAGE_BINDING_FORMAT 0x906E
6162 #define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7
6163 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8
6164 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9
6165 #define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA
6166 #define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB
6167 #define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC
6168 #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD
6169 #define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE
6170 #define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF
6171 #define GL_ALL_BARRIER_BITS 0xFFFFFFFF
6172
6173 typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
6174 typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers);
6175
6176 #define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture)
6177 #define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier)
6178
6179 #define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store)
6180
6181 #endif /* GL_ARB_shader_image_load_store */
6182
6183 /* ------------------------ GL_ARB_shader_image_size ----------------------- */
6184
6185 #ifndef GL_ARB_shader_image_size
6186 #define GL_ARB_shader_image_size 1
6187
6188 #define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size)
6189
6190 #endif /* GL_ARB_shader_image_size */
6191
6192 /* ------------------------- GL_ARB_shader_objects ------------------------- */
6193
6194 #ifndef GL_ARB_shader_objects
6195 #define GL_ARB_shader_objects 1
6196
6197 #define GL_PROGRAM_OBJECT_ARB 0x8B40
6198 #define GL_SHADER_OBJECT_ARB 0x8B48
6199 #define GL_OBJECT_TYPE_ARB 0x8B4E
6200 #define GL_OBJECT_SUBTYPE_ARB 0x8B4F
6201 #define GL_FLOAT_VEC2_ARB 0x8B50
6202 #define GL_FLOAT_VEC3_ARB 0x8B51
6203 #define GL_FLOAT_VEC4_ARB 0x8B52
6204 #define GL_INT_VEC2_ARB 0x8B53
6205 #define GL_INT_VEC3_ARB 0x8B54
6206 #define GL_INT_VEC4_ARB 0x8B55
6207 #define GL_BOOL_ARB 0x8B56
6208 #define GL_BOOL_VEC2_ARB 0x8B57
6209 #define GL_BOOL_VEC3_ARB 0x8B58
6210 #define GL_BOOL_VEC4_ARB 0x8B59
6211 #define GL_FLOAT_MAT2_ARB 0x8B5A
6212 #define GL_FLOAT_MAT3_ARB 0x8B5B
6213 #define GL_FLOAT_MAT4_ARB 0x8B5C
6214 #define GL_SAMPLER_1D_ARB 0x8B5D
6215 #define GL_SAMPLER_2D_ARB 0x8B5E
6216 #define GL_SAMPLER_3D_ARB 0x8B5F
6217 #define GL_SAMPLER_CUBE_ARB 0x8B60
6218 #define GL_SAMPLER_1D_SHADOW_ARB 0x8B61
6219 #define GL_SAMPLER_2D_SHADOW_ARB 0x8B62
6220 #define GL_SAMPLER_2D_RECT_ARB 0x8B63
6221 #define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
6222 #define GL_OBJECT_DELETE_STATUS_ARB 0x8B80
6223 #define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
6224 #define GL_OBJECT_LINK_STATUS_ARB 0x8B82
6225 #define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83
6226 #define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
6227 #define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85
6228 #define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86
6229 #define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
6230 #define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88
6231
6232 typedef char GLcharARB;
6233 typedef unsigned int GLhandleARB;
6234
6235 typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);
6236 typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);
6237 typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void);
6238 typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);
6239 typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);
6240 typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj);
6241 typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name);
6242 typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj);
6243 typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname);
6244 typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog);
6245 typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params);
6246 typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params);
6247 typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source);
6248 typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name);
6249 typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params);
6250 typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params);
6251 typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);
6252 typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length);
6253 typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);
6254 typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
6255 typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);
6256 typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value);
6257 typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1);
6258 typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
6259 typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1);
6260 typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value);
6261 typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
6262 typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
6263 typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2);
6264 typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value);
6265 typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
6266 typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
6267 typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
6268 typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value);
6269 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
6270 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
6271 typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
6272 typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);
6273 typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);
6274
6275 #define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB)
6276 #define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB)
6277 #define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB)
6278 #define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB)
6279 #define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB)
6280 #define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB)
6281 #define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB)
6282 #define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB)
6283 #define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB)
6284 #define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB)
6285 #define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB)
6286 #define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB)
6287 #define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB)
6288 #define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB)
6289 #define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB)
6290 #define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB)
6291 #define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB)
6292 #define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB)
6293 #define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB)
6294 #define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB)
6295 #define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB)
6296 #define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB)
6297 #define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB)
6298 #define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB)
6299 #define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB)
6300 #define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB)
6301 #define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB)
6302 #define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB)
6303 #define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB)
6304 #define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB)
6305 #define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB)
6306 #define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB)
6307 #define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB)
6308 #define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB)
6309 #define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB)
6310 #define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB)
6311 #define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB)
6312 #define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB)
6313 #define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB)
6314
6315 #define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects)
6316
6317 #endif /* GL_ARB_shader_objects */
6318
6319 /* ------------------------ GL_ARB_shader_precision ------------------------ */
6320
6321 #ifndef GL_ARB_shader_precision
6322 #define GL_ARB_shader_precision 1
6323
6324 #define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision)
6325
6326 #endif /* GL_ARB_shader_precision */
6327
6328 /* ---------------------- GL_ARB_shader_stencil_export --------------------- */
6329
6330 #ifndef GL_ARB_shader_stencil_export
6331 #define GL_ARB_shader_stencil_export 1
6332
6333 #define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export)
6334
6335 #endif /* GL_ARB_shader_stencil_export */
6336
6337 /* ------------------ GL_ARB_shader_storage_buffer_object ------------------ */
6338
6339 #ifndef GL_ARB_shader_storage_buffer_object
6340 #define GL_ARB_shader_storage_buffer_object 1
6341
6342 #define GL_SHADER_STORAGE_BARRIER_BIT 0x2000
6343 #define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39
6344 #define GL_SHADER_STORAGE_BUFFER 0x90D2
6345 #define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3
6346 #define GL_SHADER_STORAGE_BUFFER_START 0x90D4
6347 #define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5
6348 #define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6
6349 #define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7
6350 #define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8
6351 #define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9
6352 #define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA
6353 #define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB
6354 #define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC
6355 #define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD
6356 #define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE
6357 #define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF
6358
6359 typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
6360
6361 #define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding)
6362
6363 #define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object)
6364
6365 #endif /* GL_ARB_shader_storage_buffer_object */
6366
6367 /* ------------------------ GL_ARB_shader_subroutine ----------------------- */
6368
6369 #ifndef GL_ARB_shader_subroutine
6370 #define GL_ARB_shader_subroutine 1
6371
6372 #define GL_ACTIVE_SUBROUTINES 0x8DE5
6373 #define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6
6374 #define GL_MAX_SUBROUTINES 0x8DE7
6375 #define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8
6376 #define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47
6377 #define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48
6378 #define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49
6379 #define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A
6380 #define GL_COMPATIBLE_SUBROUTINES 0x8E4B
6381
6382 typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name);
6383 typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name);
6384 typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values);
6385 typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values);
6386 typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar* name);
6387 typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* name);
6388 typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params);
6389 typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices);
6390
6391 #define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName)
6392 #define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName)
6393 #define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv)
6394 #define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv)
6395 #define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex)
6396 #define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation)
6397 #define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv)
6398 #define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv)
6399
6400 #define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine)
6401
6402 #endif /* GL_ARB_shader_subroutine */
6403
6404 /* ------------------ GL_ARB_shader_texture_image_samples ------------------ */
6405
6406 #ifndef GL_ARB_shader_texture_image_samples
6407 #define GL_ARB_shader_texture_image_samples 1
6408
6409 #define GLEW_ARB_shader_texture_image_samples GLEW_GET_VAR(__GLEW_ARB_shader_texture_image_samples)
6410
6411 #endif /* GL_ARB_shader_texture_image_samples */
6412
6413 /* ----------------------- GL_ARB_shader_texture_lod ----------------------- */
6414
6415 #ifndef GL_ARB_shader_texture_lod
6416 #define GL_ARB_shader_texture_lod 1
6417
6418 #define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod)
6419
6420 #endif /* GL_ARB_shader_texture_lod */
6421
6422 /* ------------------- GL_ARB_shader_viewport_layer_array ------------------ */
6423
6424 #ifndef GL_ARB_shader_viewport_layer_array
6425 #define GL_ARB_shader_viewport_layer_array 1
6426
6427 #define GLEW_ARB_shader_viewport_layer_array GLEW_GET_VAR(__GLEW_ARB_shader_viewport_layer_array)
6428
6429 #endif /* GL_ARB_shader_viewport_layer_array */
6430
6431 /* ---------------------- GL_ARB_shading_language_100 ---------------------- */
6432
6433 #ifndef GL_ARB_shading_language_100
6434 #define GL_ARB_shading_language_100 1
6435
6436 #define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
6437
6438 #define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100)
6439
6440 #endif /* GL_ARB_shading_language_100 */
6441
6442 /* -------------------- GL_ARB_shading_language_420pack -------------------- */
6443
6444 #ifndef GL_ARB_shading_language_420pack
6445 #define GL_ARB_shading_language_420pack 1
6446
6447 #define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack)
6448
6449 #endif /* GL_ARB_shading_language_420pack */
6450
6451 /* -------------------- GL_ARB_shading_language_include -------------------- */
6452
6453 #ifndef GL_ARB_shading_language_include
6454 #define GL_ARB_shading_language_include 1
6455
6456 #define GL_SHADER_INCLUDE_ARB 0x8DAE
6457 #define GL_NAMED_STRING_LENGTH_ARB 0x8DE9
6458 #define GL_NAMED_STRING_TYPE_ARB 0x8DEA
6459
6460 typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length);
6461 typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name);
6462 typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string);
6463 typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params);
6464 typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name);
6465 typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *string);
6466
6467 #define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB)
6468 #define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB)
6469 #define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB)
6470 #define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB)
6471 #define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB)
6472 #define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB)
6473
6474 #define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include)
6475
6476 #endif /* GL_ARB_shading_language_include */
6477
6478 /* -------------------- GL_ARB_shading_language_packing -------------------- */
6479
6480 #ifndef GL_ARB_shading_language_packing
6481 #define GL_ARB_shading_language_packing 1
6482
6483 #define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing)
6484
6485 #endif /* GL_ARB_shading_language_packing */
6486
6487 /* ----------------------------- GL_ARB_shadow ----------------------------- */
6488
6489 #ifndef GL_ARB_shadow
6490 #define GL_ARB_shadow 1
6491
6492 #define GL_TEXTURE_COMPARE_MODE_ARB 0x884C
6493 #define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D
6494 #define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E
6495
6496 #define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow)
6497
6498 #endif /* GL_ARB_shadow */
6499
6500 /* ------------------------- GL_ARB_shadow_ambient ------------------------- */
6501
6502 #ifndef GL_ARB_shadow_ambient
6503 #define GL_ARB_shadow_ambient 1
6504
6505 #define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF
6506
6507 #define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient)
6508
6509 #endif /* GL_ARB_shadow_ambient */
6510
6511 /* -------------------------- GL_ARB_sparse_buffer ------------------------- */
6512
6513 #ifndef GL_ARB_sparse_buffer
6514 #define GL_ARB_sparse_buffer 1
6515
6516 #define GL_SPARSE_STORAGE_BIT_ARB 0x0400
6517 #define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8
6518
6519 typedef void (GLAPIENTRY * PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit);
6520
6521 #define glBufferPageCommitmentARB GLEW_GET_FUN(__glewBufferPageCommitmentARB)
6522
6523 #define GLEW_ARB_sparse_buffer GLEW_GET_VAR(__GLEW_ARB_sparse_buffer)
6524
6525 #endif /* GL_ARB_sparse_buffer */
6526
6527 /* ------------------------- GL_ARB_sparse_texture ------------------------- */
6528
6529 #ifndef GL_ARB_sparse_texture
6530 #define GL_ARB_sparse_texture 1
6531
6532 #define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195
6533 #define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196
6534 #define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197
6535 #define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198
6536 #define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199
6537 #define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A
6538 #define GL_TEXTURE_SPARSE_ARB 0x91A6
6539 #define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7
6540 #define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8
6541 #define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9
6542 #define GL_NUM_SPARSE_LEVELS_ARB 0x91AA
6543
6544 typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit);
6545 typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit);
6546
6547 #define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB)
6548 #define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT)
6549
6550 #define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture)
6551
6552 #endif /* GL_ARB_sparse_texture */
6553
6554 /* ------------------------- GL_ARB_sparse_texture2 ------------------------ */
6555
6556 #ifndef GL_ARB_sparse_texture2
6557 #define GL_ARB_sparse_texture2 1
6558
6559 #define GLEW_ARB_sparse_texture2 GLEW_GET_VAR(__GLEW_ARB_sparse_texture2)
6560
6561 #endif /* GL_ARB_sparse_texture2 */
6562
6563 /* ---------------------- GL_ARB_sparse_texture_clamp ---------------------- */
6564
6565 #ifndef GL_ARB_sparse_texture_clamp
6566 #define GL_ARB_sparse_texture_clamp 1
6567
6568 #define GLEW_ARB_sparse_texture_clamp GLEW_GET_VAR(__GLEW_ARB_sparse_texture_clamp)
6569
6570 #endif /* GL_ARB_sparse_texture_clamp */
6571
6572 /* ------------------------ GL_ARB_stencil_texturing ----------------------- */
6573
6574 #ifndef GL_ARB_stencil_texturing
6575 #define GL_ARB_stencil_texturing 1
6576
6577 #define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA
6578
6579 #define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing)
6580
6581 #endif /* GL_ARB_stencil_texturing */
6582
6583 /* ------------------------------ GL_ARB_sync ------------------------------ */
6584
6585 #ifndef GL_ARB_sync
6586 #define GL_ARB_sync 1
6587
6588 #define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
6589 #define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
6590 #define GL_OBJECT_TYPE 0x9112
6591 #define GL_SYNC_CONDITION 0x9113
6592 #define GL_SYNC_STATUS 0x9114
6593 #define GL_SYNC_FLAGS 0x9115
6594 #define GL_SYNC_FENCE 0x9116
6595 #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
6596 #define GL_UNSIGNALED 0x9118
6597 #define GL_SIGNALED 0x9119
6598 #define GL_ALREADY_SIGNALED 0x911A
6599 #define GL_TIMEOUT_EXPIRED 0x911B
6600 #define GL_CONDITION_SATISFIED 0x911C
6601 #define GL_WAIT_FAILED 0x911D
6602 #define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF
6603
6604 typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout);
6605 typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync);
6606 typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags);
6607 typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params);
6608 typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values);
6609 typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync);
6610 typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout);
6611
6612 #define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync)
6613 #define glDeleteSync GLEW_GET_FUN(__glewDeleteSync)
6614 #define glFenceSync GLEW_GET_FUN(__glewFenceSync)
6615 #define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v)
6616 #define glGetSynciv GLEW_GET_FUN(__glewGetSynciv)
6617 #define glIsSync GLEW_GET_FUN(__glewIsSync)
6618 #define glWaitSync GLEW_GET_FUN(__glewWaitSync)
6619
6620 #define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync)
6621
6622 #endif /* GL_ARB_sync */
6623
6624 /* ----------------------- GL_ARB_tessellation_shader ---------------------- */
6625
6626 #ifndef GL_ARB_tessellation_shader
6627 #define GL_ARB_tessellation_shader 1
6628
6629 #define GL_PATCHES 0xE
6630 #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0
6631 #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1
6632 #define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C
6633 #define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D
6634 #define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E
6635 #define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F
6636 #define GL_PATCH_VERTICES 0x8E72
6637 #define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73
6638 #define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74
6639 #define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75
6640 #define GL_TESS_GEN_MODE 0x8E76
6641 #define GL_TESS_GEN_SPACING 0x8E77
6642 #define GL_TESS_GEN_VERTEX_ORDER 0x8E78
6643 #define GL_TESS_GEN_POINT_MODE 0x8E79
6644 #define GL_ISOLINES 0x8E7A
6645 #define GL_FRACTIONAL_ODD 0x8E7B
6646 #define GL_FRACTIONAL_EVEN 0x8E7C
6647 #define GL_MAX_PATCH_VERTICES 0x8E7D
6648 #define GL_MAX_TESS_GEN_LEVEL 0x8E7E
6649 #define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F
6650 #define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80
6651 #define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81
6652 #define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82
6653 #define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83
6654 #define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84
6655 #define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85
6656 #define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86
6657 #define GL_TESS_EVALUATION_SHADER 0x8E87
6658 #define GL_TESS_CONTROL_SHADER 0x8E88
6659 #define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89
6660 #define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A
6661
6662 typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values);
6663 typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value);
6664
6665 #define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv)
6666 #define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri)
6667
6668 #define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader)
6669
6670 #endif /* GL_ARB_tessellation_shader */
6671
6672 /* ------------------------- GL_ARB_texture_barrier ------------------------ */
6673
6674 #ifndef GL_ARB_texture_barrier
6675 #define GL_ARB_texture_barrier 1
6676
6677 typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERPROC) (void);
6678
6679 #define glTextureBarrier GLEW_GET_FUN(__glewTextureBarrier)
6680
6681 #define GLEW_ARB_texture_barrier GLEW_GET_VAR(__GLEW_ARB_texture_barrier)
6682
6683 #endif /* GL_ARB_texture_barrier */
6684
6685 /* ---------------------- GL_ARB_texture_border_clamp ---------------------- */
6686
6687 #ifndef GL_ARB_texture_border_clamp
6688 #define GL_ARB_texture_border_clamp 1
6689
6690 #define GL_CLAMP_TO_BORDER_ARB 0x812D
6691
6692 #define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp)
6693
6694 #endif /* GL_ARB_texture_border_clamp */
6695
6696 /* ---------------------- GL_ARB_texture_buffer_object --------------------- */
6697
6698 #ifndef GL_ARB_texture_buffer_object
6699 #define GL_ARB_texture_buffer_object 1
6700
6701 #define GL_TEXTURE_BUFFER_ARB 0x8C2A
6702 #define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B
6703 #define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C
6704 #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D
6705 #define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E
6706
6707 typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer);
6708
6709 #define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB)
6710
6711 #define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object)
6712
6713 #endif /* GL_ARB_texture_buffer_object */
6714
6715 /* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */
6716
6717 #ifndef GL_ARB_texture_buffer_object_rgb32
6718 #define GL_ARB_texture_buffer_object_rgb32 1
6719
6720 #define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32)
6721
6722 #endif /* GL_ARB_texture_buffer_object_rgb32 */
6723
6724 /* ---------------------- GL_ARB_texture_buffer_range ---------------------- */
6725
6726 #ifndef GL_ARB_texture_buffer_range
6727 #define GL_ARB_texture_buffer_range 1
6728
6729 #define GL_TEXTURE_BUFFER_OFFSET 0x919D
6730 #define GL_TEXTURE_BUFFER_SIZE 0x919E
6731 #define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F
6732
6733 typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
6734 typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
6735
6736 #define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange)
6737 #define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT)
6738
6739 #define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range)
6740
6741 #endif /* GL_ARB_texture_buffer_range */
6742
6743 /* ----------------------- GL_ARB_texture_compression ---------------------- */
6744
6745 #ifndef GL_ARB_texture_compression
6746 #define GL_ARB_texture_compression 1
6747
6748 #define GL_COMPRESSED_ALPHA_ARB 0x84E9
6749 #define GL_COMPRESSED_LUMINANCE_ARB 0x84EA
6750 #define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB
6751 #define GL_COMPRESSED_INTENSITY_ARB 0x84EC
6752 #define GL_COMPRESSED_RGB_ARB 0x84ED
6753 #define GL_COMPRESSED_RGBA_ARB 0x84EE
6754 #define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF
6755 #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0
6756 #define GL_TEXTURE_COMPRESSED_ARB 0x86A1
6757 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2
6758 #define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3
6759
6760 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
6761 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
6762 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
6763 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
6764 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
6765 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
6766 typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void *img);
6767
6768 #define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB)
6769 #define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB)
6770 #define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB)
6771 #define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB)
6772 #define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB)
6773 #define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB)
6774 #define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB)
6775
6776 #define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression)
6777
6778 #endif /* GL_ARB_texture_compression */
6779
6780 /* -------------------- GL_ARB_texture_compression_bptc -------------------- */
6781
6782 #ifndef GL_ARB_texture_compression_bptc
6783 #define GL_ARB_texture_compression_bptc 1
6784
6785 #define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C
6786 #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D
6787 #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E
6788 #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F
6789
6790 #define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc)
6791
6792 #endif /* GL_ARB_texture_compression_bptc */
6793
6794 /* -------------------- GL_ARB_texture_compression_rgtc -------------------- */
6795
6796 #ifndef GL_ARB_texture_compression_rgtc
6797 #define GL_ARB_texture_compression_rgtc 1
6798
6799 #define GL_COMPRESSED_RED_RGTC1 0x8DBB
6800 #define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC
6801 #define GL_COMPRESSED_RG_RGTC2 0x8DBD
6802 #define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE
6803
6804 #define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc)
6805
6806 #endif /* GL_ARB_texture_compression_rgtc */
6807
6808 /* ------------------------ GL_ARB_texture_cube_map ------------------------ */
6809
6810 #ifndef GL_ARB_texture_cube_map
6811 #define GL_ARB_texture_cube_map 1
6812
6813 #define GL_NORMAL_MAP_ARB 0x8511
6814 #define GL_REFLECTION_MAP_ARB 0x8512
6815 #define GL_TEXTURE_CUBE_MAP_ARB 0x8513
6816 #define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514
6817 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515
6818 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516
6819 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517
6820 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518
6821 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519
6822 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A
6823 #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B
6824 #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C
6825
6826 #define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map)
6827
6828 #endif /* GL_ARB_texture_cube_map */
6829
6830 /* --------------------- GL_ARB_texture_cube_map_array --------------------- */
6831
6832 #ifndef GL_ARB_texture_cube_map_array
6833 #define GL_ARB_texture_cube_map_array 1
6834
6835 #define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009
6836 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A
6837 #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B
6838 #define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C
6839 #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D
6840 #define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E
6841 #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F
6842
6843 #define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array)
6844
6845 #endif /* GL_ARB_texture_cube_map_array */
6846
6847 /* ------------------------- GL_ARB_texture_env_add ------------------------ */
6848
6849 #ifndef GL_ARB_texture_env_add
6850 #define GL_ARB_texture_env_add 1
6851
6852 #define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add)
6853
6854 #endif /* GL_ARB_texture_env_add */
6855
6856 /* ----------------------- GL_ARB_texture_env_combine ---------------------- */
6857
6858 #ifndef GL_ARB_texture_env_combine
6859 #define GL_ARB_texture_env_combine 1
6860
6861 #define GL_SUBTRACT_ARB 0x84E7
6862 #define GL_COMBINE_ARB 0x8570
6863 #define GL_COMBINE_RGB_ARB 0x8571
6864 #define GL_COMBINE_ALPHA_ARB 0x8572
6865 #define GL_RGB_SCALE_ARB 0x8573
6866 #define GL_ADD_SIGNED_ARB 0x8574
6867 #define GL_INTERPOLATE_ARB 0x8575
6868 #define GL_CONSTANT_ARB 0x8576
6869 #define GL_PRIMARY_COLOR_ARB 0x8577
6870 #define GL_PREVIOUS_ARB 0x8578
6871 #define GL_SOURCE0_RGB_ARB 0x8580
6872 #define GL_SOURCE1_RGB_ARB 0x8581
6873 #define GL_SOURCE2_RGB_ARB 0x8582
6874 #define GL_SOURCE0_ALPHA_ARB 0x8588
6875 #define GL_SOURCE1_ALPHA_ARB 0x8589
6876 #define GL_SOURCE2_ALPHA_ARB 0x858A
6877 #define GL_OPERAND0_RGB_ARB 0x8590
6878 #define GL_OPERAND1_RGB_ARB 0x8591
6879 #define GL_OPERAND2_RGB_ARB 0x8592
6880 #define GL_OPERAND0_ALPHA_ARB 0x8598
6881 #define GL_OPERAND1_ALPHA_ARB 0x8599
6882 #define GL_OPERAND2_ALPHA_ARB 0x859A
6883
6884 #define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine)
6885
6886 #endif /* GL_ARB_texture_env_combine */
6887
6888 /* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */
6889
6890 #ifndef GL_ARB_texture_env_crossbar
6891 #define GL_ARB_texture_env_crossbar 1
6892
6893 #define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar)
6894
6895 #endif /* GL_ARB_texture_env_crossbar */
6896
6897 /* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */
6898
6899 #ifndef GL_ARB_texture_env_dot3
6900 #define GL_ARB_texture_env_dot3 1
6901
6902 #define GL_DOT3_RGB_ARB 0x86AE
6903 #define GL_DOT3_RGBA_ARB 0x86AF
6904
6905 #define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3)
6906
6907 #endif /* GL_ARB_texture_env_dot3 */
6908
6909 /* ---------------------- GL_ARB_texture_filter_minmax --------------------- */
6910
6911 #ifndef GL_ARB_texture_filter_minmax
6912 #define GL_ARB_texture_filter_minmax 1
6913
6914 #define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366
6915 #define GL_WEIGHTED_AVERAGE_ARB 0x9367
6916
6917 #define GLEW_ARB_texture_filter_minmax GLEW_GET_VAR(__GLEW_ARB_texture_filter_minmax)
6918
6919 #endif /* GL_ARB_texture_filter_minmax */
6920
6921 /* -------------------------- GL_ARB_texture_float ------------------------- */
6922
6923 #ifndef GL_ARB_texture_float
6924 #define GL_ARB_texture_float 1
6925
6926 #define GL_RGBA32F_ARB 0x8814
6927 #define GL_RGB32F_ARB 0x8815
6928 #define GL_ALPHA32F_ARB 0x8816
6929 #define GL_INTENSITY32F_ARB 0x8817
6930 #define GL_LUMINANCE32F_ARB 0x8818
6931 #define GL_LUMINANCE_ALPHA32F_ARB 0x8819
6932 #define GL_RGBA16F_ARB 0x881A
6933 #define GL_RGB16F_ARB 0x881B
6934 #define GL_ALPHA16F_ARB 0x881C
6935 #define GL_INTENSITY16F_ARB 0x881D
6936 #define GL_LUMINANCE16F_ARB 0x881E
6937 #define GL_LUMINANCE_ALPHA16F_ARB 0x881F
6938 #define GL_TEXTURE_RED_TYPE_ARB 0x8C10
6939 #define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11
6940 #define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12
6941 #define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13
6942 #define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14
6943 #define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15
6944 #define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16
6945 #define GL_UNSIGNED_NORMALIZED_ARB 0x8C17
6946
6947 #define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float)
6948
6949 #endif /* GL_ARB_texture_float */
6950
6951 /* ------------------------- GL_ARB_texture_gather ------------------------- */
6952
6953 #ifndef GL_ARB_texture_gather
6954 #define GL_ARB_texture_gather 1
6955
6956 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E
6957 #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F
6958 #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F
6959
6960 #define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather)
6961
6962 #endif /* GL_ARB_texture_gather */
6963
6964 /* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */
6965
6966 #ifndef GL_ARB_texture_mirror_clamp_to_edge
6967 #define GL_ARB_texture_mirror_clamp_to_edge 1
6968
6969 #define GL_MIRROR_CLAMP_TO_EDGE 0x8743
6970
6971 #define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge)
6972
6973 #endif /* GL_ARB_texture_mirror_clamp_to_edge */
6974
6975 /* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */
6976
6977 #ifndef GL_ARB_texture_mirrored_repeat
6978 #define GL_ARB_texture_mirrored_repeat 1
6979
6980 #define GL_MIRRORED_REPEAT_ARB 0x8370
6981
6982 #define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat)
6983
6984 #endif /* GL_ARB_texture_mirrored_repeat */
6985
6986 /* ----------------------- GL_ARB_texture_multisample ---------------------- */
6987
6988 #ifndef GL_ARB_texture_multisample
6989 #define GL_ARB_texture_multisample 1
6990
6991 #define GL_SAMPLE_POSITION 0x8E50
6992 #define GL_SAMPLE_MASK 0x8E51
6993 #define GL_SAMPLE_MASK_VALUE 0x8E52
6994 #define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
6995 #define GL_TEXTURE_2D_MULTISAMPLE 0x9100
6996 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101
6997 #define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102
6998 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103
6999 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
7000 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
7001 #define GL_TEXTURE_SAMPLES 0x9106
7002 #define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
7003 #define GL_SAMPLER_2D_MULTISAMPLE 0x9108
7004 #define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
7005 #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
7006 #define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B
7007 #define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
7008 #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
7009 #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
7010 #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
7011 #define GL_MAX_INTEGER_SAMPLES 0x9110
7012
7013 typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val);
7014 typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask);
7015 typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
7016 typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
7017
7018 #define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv)
7019 #define glSampleMaski GLEW_GET_FUN(__glewSampleMaski)
7020 #define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample)
7021 #define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample)
7022
7023 #define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample)
7024
7025 #endif /* GL_ARB_texture_multisample */
7026
7027 /* -------------------- GL_ARB_texture_non_power_of_two -------------------- */
7028
7029 #ifndef GL_ARB_texture_non_power_of_two
7030 #define GL_ARB_texture_non_power_of_two 1
7031
7032 #define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two)
7033
7034 #endif /* GL_ARB_texture_non_power_of_two */
7035
7036 /* ---------------------- GL_ARB_texture_query_levels ---------------------- */
7037
7038 #ifndef GL_ARB_texture_query_levels
7039 #define GL_ARB_texture_query_levels 1
7040
7041 #define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels)
7042
7043 #endif /* GL_ARB_texture_query_levels */
7044
7045 /* ------------------------ GL_ARB_texture_query_lod ----------------------- */
7046
7047 #ifndef GL_ARB_texture_query_lod
7048 #define GL_ARB_texture_query_lod 1
7049
7050 #define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod)
7051
7052 #endif /* GL_ARB_texture_query_lod */
7053
7054 /* ------------------------ GL_ARB_texture_rectangle ----------------------- */
7055
7056 #ifndef GL_ARB_texture_rectangle
7057 #define GL_ARB_texture_rectangle 1
7058
7059 #define GL_TEXTURE_RECTANGLE_ARB 0x84F5
7060 #define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6
7061 #define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7
7062 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8
7063 #define GL_SAMPLER_2D_RECT_ARB 0x8B63
7064 #define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
7065
7066 #define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle)
7067
7068 #endif /* GL_ARB_texture_rectangle */
7069
7070 /* --------------------------- GL_ARB_texture_rg --------------------------- */
7071
7072 #ifndef GL_ARB_texture_rg
7073 #define GL_ARB_texture_rg 1
7074
7075 #define GL_COMPRESSED_RED 0x8225
7076 #define GL_COMPRESSED_RG 0x8226
7077 #define GL_RG 0x8227
7078 #define GL_RG_INTEGER 0x8228
7079 #define GL_R8 0x8229
7080 #define GL_R16 0x822A
7081 #define GL_RG8 0x822B
7082 #define GL_RG16 0x822C
7083 #define GL_R16F 0x822D
7084 #define GL_R32F 0x822E
7085 #define GL_RG16F 0x822F
7086 #define GL_RG32F 0x8230
7087 #define GL_R8I 0x8231
7088 #define GL_R8UI 0x8232
7089 #define GL_R16I 0x8233
7090 #define GL_R16UI 0x8234
7091 #define GL_R32I 0x8235
7092 #define GL_R32UI 0x8236
7093 #define GL_RG8I 0x8237
7094 #define GL_RG8UI 0x8238
7095 #define GL_RG16I 0x8239
7096 #define GL_RG16UI 0x823A
7097 #define GL_RG32I 0x823B
7098 #define GL_RG32UI 0x823C
7099
7100 #define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg)
7101
7102 #endif /* GL_ARB_texture_rg */
7103
7104 /* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */
7105
7106 #ifndef GL_ARB_texture_rgb10_a2ui
7107 #define GL_ARB_texture_rgb10_a2ui 1
7108
7109 #define GL_RGB10_A2UI 0x906F
7110
7111 #define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui)
7112
7113 #endif /* GL_ARB_texture_rgb10_a2ui */
7114
7115 /* ------------------------ GL_ARB_texture_stencil8 ------------------------ */
7116
7117 #ifndef GL_ARB_texture_stencil8
7118 #define GL_ARB_texture_stencil8 1
7119
7120 #define GL_STENCIL_INDEX 0x1901
7121 #define GL_STENCIL_INDEX8 0x8D48
7122
7123 #define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8)
7124
7125 #endif /* GL_ARB_texture_stencil8 */
7126
7127 /* ------------------------- GL_ARB_texture_storage ------------------------ */
7128
7129 #ifndef GL_ARB_texture_storage
7130 #define GL_ARB_texture_storage 1
7131
7132 #define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
7133
7134 typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
7135 typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
7136 typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
7137 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
7138 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
7139 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
7140
7141 #define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D)
7142 #define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D)
7143 #define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D)
7144 #define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT)
7145 #define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT)
7146 #define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT)
7147
7148 #define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage)
7149
7150 #endif /* GL_ARB_texture_storage */
7151
7152 /* ------------------- GL_ARB_texture_storage_multisample ------------------ */
7153
7154 #ifndef GL_ARB_texture_storage_multisample
7155 #define GL_ARB_texture_storage_multisample 1
7156
7157 typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
7158 typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
7159 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
7160 typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
7161
7162 #define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample)
7163 #define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample)
7164 #define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT)
7165 #define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT)
7166
7167 #define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample)
7168
7169 #endif /* GL_ARB_texture_storage_multisample */
7170
7171 /* ------------------------- GL_ARB_texture_swizzle ------------------------ */
7172
7173 #ifndef GL_ARB_texture_swizzle
7174 #define GL_ARB_texture_swizzle 1
7175
7176 #define GL_TEXTURE_SWIZZLE_R 0x8E42
7177 #define GL_TEXTURE_SWIZZLE_G 0x8E43
7178 #define GL_TEXTURE_SWIZZLE_B 0x8E44
7179 #define GL_TEXTURE_SWIZZLE_A 0x8E45
7180 #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46
7181
7182 #define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle)
7183
7184 #endif /* GL_ARB_texture_swizzle */
7185
7186 /* -------------------------- GL_ARB_texture_view -------------------------- */
7187
7188 #ifndef GL_ARB_texture_view
7189 #define GL_ARB_texture_view 1
7190
7191 #define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB
7192 #define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC
7193 #define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD
7194 #define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE
7195 #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
7196
7197 typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
7198
7199 #define glTextureView GLEW_GET_FUN(__glewTextureView)
7200
7201 #define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view)
7202
7203 #endif /* GL_ARB_texture_view */
7204
7205 /* --------------------------- GL_ARB_timer_query -------------------------- */
7206
7207 #ifndef GL_ARB_timer_query
7208 #define GL_ARB_timer_query 1
7209
7210 #define GL_TIME_ELAPSED 0x88BF
7211 #define GL_TIMESTAMP 0x8E28
7212
7213 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params);
7214 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params);
7215 typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);
7216
7217 #define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v)
7218 #define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v)
7219 #define glQueryCounter GLEW_GET_FUN(__glewQueryCounter)
7220
7221 #define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query)
7222
7223 #endif /* GL_ARB_timer_query */
7224
7225 /* ----------------------- GL_ARB_transform_feedback2 ---------------------- */
7226
7227 #ifndef GL_ARB_transform_feedback2
7228 #define GL_ARB_transform_feedback2 1
7229
7230 #define GL_TRANSFORM_FEEDBACK 0x8E22
7231 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23
7232 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24
7233 #define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
7234
7235 typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
7236 typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids);
7237 typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id);
7238 typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids);
7239 typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
7240 typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
7241 typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
7242
7243 #define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback)
7244 #define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks)
7245 #define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback)
7246 #define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks)
7247 #define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback)
7248 #define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback)
7249 #define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback)
7250
7251 #define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2)
7252
7253 #endif /* GL_ARB_transform_feedback2 */
7254
7255 /* ----------------------- GL_ARB_transform_feedback3 ---------------------- */
7256
7257 #ifndef GL_ARB_transform_feedback3
7258 #define GL_ARB_transform_feedback3 1
7259
7260 #define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70
7261 #define GL_MAX_VERTEX_STREAMS 0x8E71
7262
7263 typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id);
7264 typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream);
7265 typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index);
7266 typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params);
7267
7268 #define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed)
7269 #define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream)
7270 #define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed)
7271 #define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv)
7272
7273 #define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3)
7274
7275 #endif /* GL_ARB_transform_feedback3 */
7276
7277 /* ------------------ GL_ARB_transform_feedback_instanced ------------------ */
7278
7279 #ifndef GL_ARB_transform_feedback_instanced
7280 #define GL_ARB_transform_feedback_instanced 1
7281
7282 typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount);
7283 typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount);
7284
7285 #define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced)
7286 #define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced)
7287
7288 #define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced)
7289
7290 #endif /* GL_ARB_transform_feedback_instanced */
7291
7292 /* ---------------- GL_ARB_transform_feedback_overflow_query --------------- */
7293
7294 #ifndef GL_ARB_transform_feedback_overflow_query
7295 #define GL_ARB_transform_feedback_overflow_query 1
7296
7297 #define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC
7298 #define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED
7299
7300 #define GLEW_ARB_transform_feedback_overflow_query GLEW_GET_VAR(__GLEW_ARB_transform_feedback_overflow_query)
7301
7302 #endif /* GL_ARB_transform_feedback_overflow_query */
7303
7304 /* ------------------------ GL_ARB_transpose_matrix ------------------------ */
7305
7306 #ifndef GL_ARB_transpose_matrix
7307 #define GL_ARB_transpose_matrix 1
7308
7309 #define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3
7310 #define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4
7311 #define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5
7312 #define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6
7313
7314 typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]);
7315 typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]);
7316 typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]);
7317 typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]);
7318
7319 #define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB)
7320 #define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB)
7321 #define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB)
7322 #define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB)
7323
7324 #define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix)
7325
7326 #endif /* GL_ARB_transpose_matrix */
7327
7328 /* ---------------------- GL_ARB_uniform_buffer_object --------------------- */
7329
7330 #ifndef GL_ARB_uniform_buffer_object
7331 #define GL_ARB_uniform_buffer_object 1
7332
7333 #define GL_UNIFORM_BUFFER 0x8A11
7334 #define GL_UNIFORM_BUFFER_BINDING 0x8A28
7335 #define GL_UNIFORM_BUFFER_START 0x8A29
7336 #define GL_UNIFORM_BUFFER_SIZE 0x8A2A
7337 #define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
7338 #define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C
7339 #define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
7340 #define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
7341 #define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
7342 #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
7343 #define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
7344 #define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32
7345 #define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
7346 #define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
7347 #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
7348 #define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
7349 #define GL_UNIFORM_TYPE 0x8A37
7350 #define GL_UNIFORM_SIZE 0x8A38
7351 #define GL_UNIFORM_NAME_LENGTH 0x8A39
7352 #define GL_UNIFORM_BLOCK_INDEX 0x8A3A
7353 #define GL_UNIFORM_OFFSET 0x8A3B
7354 #define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
7355 #define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
7356 #define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
7357 #define GL_UNIFORM_BLOCK_BINDING 0x8A3F
7358 #define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
7359 #define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
7360 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
7361 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
7362 #define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
7363 #define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45
7364 #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
7365 #define GL_INVALID_INDEX 0xFFFFFFFF
7366
7367 typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
7368 typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
7369 typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName);
7370 typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
7371 typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName);
7372 typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
7373 typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data);
7374 typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar* uniformBlockName);
7375 typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const * uniformNames, GLuint* uniformIndices);
7376 typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
7377
7378 #define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase)
7379 #define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange)
7380 #define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName)
7381 #define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv)
7382 #define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName)
7383 #define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv)
7384 #define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v)
7385 #define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex)
7386 #define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices)
7387 #define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding)
7388
7389 #define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object)
7390
7391 #endif /* GL_ARB_uniform_buffer_object */
7392
7393 /* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */
7394
7395 #ifndef GL_ARB_vertex_array_bgra
7396 #define GL_ARB_vertex_array_bgra 1
7397
7398 #define GL_BGRA 0x80E1
7399
7400 #define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra)
7401
7402 #endif /* GL_ARB_vertex_array_bgra */
7403
7404 /* ----------------------- GL_ARB_vertex_array_object ---------------------- */
7405
7406 #ifndef GL_ARB_vertex_array_object
7407 #define GL_ARB_vertex_array_object 1
7408
7409 #define GL_VERTEX_ARRAY_BINDING 0x85B5
7410
7411 typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array);
7412 typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays);
7413 typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays);
7414 typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array);
7415
7416 #define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray)
7417 #define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays)
7418 #define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays)
7419 #define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray)
7420
7421 #define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object)
7422
7423 #endif /* GL_ARB_vertex_array_object */
7424
7425 /* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */
7426
7427 #ifndef GL_ARB_vertex_attrib_64bit
7428 #define GL_ARB_vertex_attrib_64bit 1
7429
7430 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params);
7431 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x);
7432 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v);
7433 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y);
7434 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v);
7435 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
7436 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v);
7437 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
7438 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v);
7439 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);
7440
7441 #define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv)
7442 #define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d)
7443 #define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv)
7444 #define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d)
7445 #define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv)
7446 #define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d)
7447 #define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv)
7448 #define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d)
7449 #define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv)
7450 #define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer)
7451
7452 #define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit)
7453
7454 #endif /* GL_ARB_vertex_attrib_64bit */
7455
7456 /* ---------------------- GL_ARB_vertex_attrib_binding --------------------- */
7457
7458 #ifndef GL_ARB_vertex_attrib_binding
7459 #define GL_ARB_vertex_attrib_binding 1
7460
7461 #define GL_VERTEX_ATTRIB_BINDING 0x82D4
7462 #define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5
7463 #define GL_VERTEX_BINDING_DIVISOR 0x82D6
7464 #define GL_VERTEX_BINDING_OFFSET 0x82D7
7465 #define GL_VERTEX_BINDING_STRIDE 0x82D8
7466 #define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9
7467 #define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA
7468 #define GL_VERTEX_BINDING_BUFFER 0x8F4F
7469
7470 typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
7471 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
7472 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex);
7473 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
7474 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
7475 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
7476 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor);
7477 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex);
7478 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
7479 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
7480 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
7481 typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor);
7482
7483 #define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer)
7484 #define glVertexArrayBindVertexBufferEXT GLEW_GET_FUN(__glewVertexArrayBindVertexBufferEXT)
7485 #define glVertexArrayVertexAttribBindingEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribBindingEXT)
7486 #define glVertexArrayVertexAttribFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribFormatEXT)
7487 #define glVertexArrayVertexAttribIFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIFormatEXT)
7488 #define glVertexArrayVertexAttribLFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLFormatEXT)
7489 #define glVertexArrayVertexBindingDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexBindingDivisorEXT)
7490 #define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding)
7491 #define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat)
7492 #define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat)
7493 #define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat)
7494 #define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor)
7495
7496 #define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding)
7497
7498 #endif /* GL_ARB_vertex_attrib_binding */
7499
7500 /* -------------------------- GL_ARB_vertex_blend -------------------------- */
7501
7502 #ifndef GL_ARB_vertex_blend
7503 #define GL_ARB_vertex_blend 1
7504
7505 #define GL_MODELVIEW0_ARB 0x1700
7506 #define GL_MODELVIEW1_ARB 0x850A
7507 #define GL_MAX_VERTEX_UNITS_ARB 0x86A4
7508 #define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5
7509 #define GL_WEIGHT_SUM_UNITY_ARB 0x86A6
7510 #define GL_VERTEX_BLEND_ARB 0x86A7
7511 #define GL_CURRENT_WEIGHT_ARB 0x86A8
7512 #define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9
7513 #define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA
7514 #define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB
7515 #define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC
7516 #define GL_WEIGHT_ARRAY_ARB 0x86AD
7517 #define GL_MODELVIEW2_ARB 0x8722
7518 #define GL_MODELVIEW3_ARB 0x8723
7519 #define GL_MODELVIEW4_ARB 0x8724
7520 #define GL_MODELVIEW5_ARB 0x8725
7521 #define GL_MODELVIEW6_ARB 0x8726
7522 #define GL_MODELVIEW7_ARB 0x8727
7523 #define GL_MODELVIEW8_ARB 0x8728
7524 #define GL_MODELVIEW9_ARB 0x8729
7525 #define GL_MODELVIEW10_ARB 0x872A
7526 #define GL_MODELVIEW11_ARB 0x872B
7527 #define GL_MODELVIEW12_ARB 0x872C
7528 #define GL_MODELVIEW13_ARB 0x872D
7529 #define GL_MODELVIEW14_ARB 0x872E
7530 #define GL_MODELVIEW15_ARB 0x872F
7531 #define GL_MODELVIEW16_ARB 0x8730
7532 #define GL_MODELVIEW17_ARB 0x8731
7533 #define GL_MODELVIEW18_ARB 0x8732
7534 #define GL_MODELVIEW19_ARB 0x8733
7535 #define GL_MODELVIEW20_ARB 0x8734
7536 #define GL_MODELVIEW21_ARB 0x8735
7537 #define GL_MODELVIEW22_ARB 0x8736
7538 #define GL_MODELVIEW23_ARB 0x8737
7539 #define GL_MODELVIEW24_ARB 0x8738
7540 #define GL_MODELVIEW25_ARB 0x8739
7541 #define GL_MODELVIEW26_ARB 0x873A
7542 #define GL_MODELVIEW27_ARB 0x873B
7543 #define GL_MODELVIEW28_ARB 0x873C
7544 #define GL_MODELVIEW29_ARB 0x873D
7545 #define GL_MODELVIEW30_ARB 0x873E
7546 #define GL_MODELVIEW31_ARB 0x873F
7547
7548 typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count);
7549 typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer);
7550 typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights);
7551 typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights);
7552 typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights);
7553 typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights);
7554 typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights);
7555 typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights);
7556 typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights);
7557 typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights);
7558
7559 #define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB)
7560 #define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB)
7561 #define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB)
7562 #define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB)
7563 #define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB)
7564 #define glWeightivARB GLEW_GET_FUN(__glewWeightivARB)
7565 #define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB)
7566 #define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB)
7567 #define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB)
7568 #define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB)
7569
7570 #define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend)
7571
7572 #endif /* GL_ARB_vertex_blend */
7573
7574 /* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */
7575
7576 #ifndef GL_ARB_vertex_buffer_object
7577 #define GL_ARB_vertex_buffer_object 1
7578
7579 #define GL_BUFFER_SIZE_ARB 0x8764
7580 #define GL_BUFFER_USAGE_ARB 0x8765
7581 #define GL_ARRAY_BUFFER_ARB 0x8892
7582 #define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
7583 #define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
7584 #define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
7585 #define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
7586 #define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
7587 #define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
7588 #define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
7589 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
7590 #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
7591 #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
7592 #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
7593 #define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
7594 #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
7595 #define GL_READ_ONLY_ARB 0x88B8
7596 #define GL_WRITE_ONLY_ARB 0x88B9
7597 #define GL_READ_WRITE_ARB 0x88BA
7598 #define GL_BUFFER_ACCESS_ARB 0x88BB
7599 #define GL_BUFFER_MAPPED_ARB 0x88BC
7600 #define GL_BUFFER_MAP_POINTER_ARB 0x88BD
7601 #define GL_STREAM_DRAW_ARB 0x88E0
7602 #define GL_STREAM_READ_ARB 0x88E1
7603 #define GL_STREAM_COPY_ARB 0x88E2
7604 #define GL_STATIC_DRAW_ARB 0x88E4
7605 #define GL_STATIC_READ_ARB 0x88E5
7606 #define GL_STATIC_COPY_ARB 0x88E6
7607 #define GL_DYNAMIC_DRAW_ARB 0x88E8
7608 #define GL_DYNAMIC_READ_ARB 0x88E9
7609 #define GL_DYNAMIC_COPY_ARB 0x88EA
7610
7611 typedef ptrdiff_t GLintptrARB;
7612 typedef ptrdiff_t GLsizeiptrARB;
7613
7614 typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
7615 typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage);
7616 typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data);
7617 typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers);
7618 typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers);
7619 typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params);
7620 typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void** params);
7621 typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data);
7622 typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer);
7623 typedef void * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access);
7624 typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target);
7625
7626 #define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB)
7627 #define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB)
7628 #define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB)
7629 #define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB)
7630 #define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB)
7631 #define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB)
7632 #define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB)
7633 #define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB)
7634 #define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB)
7635 #define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB)
7636 #define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB)
7637
7638 #define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object)
7639
7640 #endif /* GL_ARB_vertex_buffer_object */
7641
7642 /* ------------------------- GL_ARB_vertex_program ------------------------- */
7643
7644 #ifndef GL_ARB_vertex_program
7645 #define GL_ARB_vertex_program 1
7646
7647 #define GL_COLOR_SUM_ARB 0x8458
7648 #define GL_VERTEX_PROGRAM_ARB 0x8620
7649 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
7650 #define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
7651 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
7652 #define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
7653 #define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
7654 #define GL_PROGRAM_LENGTH_ARB 0x8627
7655 #define GL_PROGRAM_STRING_ARB 0x8628
7656 #define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
7657 #define GL_MAX_PROGRAM_MATRICES_ARB 0x862F
7658 #define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
7659 #define GL_CURRENT_MATRIX_ARB 0x8641
7660 #define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
7661 #define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
7662 #define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
7663 #define GL_PROGRAM_ERROR_POSITION_ARB 0x864B
7664 #define GL_PROGRAM_BINDING_ARB 0x8677
7665 #define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
7666 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
7667 #define GL_PROGRAM_ERROR_STRING_ARB 0x8874
7668 #define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
7669 #define GL_PROGRAM_FORMAT_ARB 0x8876
7670 #define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0
7671 #define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1
7672 #define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
7673 #define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
7674 #define GL_PROGRAM_TEMPORARIES_ARB 0x88A4
7675 #define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5
7676 #define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
7677 #define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
7678 #define GL_PROGRAM_PARAMETERS_ARB 0x88A8
7679 #define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9
7680 #define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA
7681 #define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
7682 #define GL_PROGRAM_ATTRIBS_ARB 0x88AC
7683 #define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD
7684 #define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE
7685 #define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
7686 #define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0
7687 #define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
7688 #define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
7689 #define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
7690 #define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
7691 #define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
7692 #define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
7693 #define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7
7694 #define GL_MATRIX0_ARB 0x88C0
7695 #define GL_MATRIX1_ARB 0x88C1
7696 #define GL_MATRIX2_ARB 0x88C2
7697 #define GL_MATRIX3_ARB 0x88C3
7698 #define GL_MATRIX4_ARB 0x88C4
7699 #define GL_MATRIX5_ARB 0x88C5
7700 #define GL_MATRIX6_ARB 0x88C6
7701 #define GL_MATRIX7_ARB 0x88C7
7702 #define GL_MATRIX8_ARB 0x88C8
7703 #define GL_MATRIX9_ARB 0x88C9
7704 #define GL_MATRIX10_ARB 0x88CA
7705 #define GL_MATRIX11_ARB 0x88CB
7706 #define GL_MATRIX12_ARB 0x88CC
7707 #define GL_MATRIX13_ARB 0x88CD
7708 #define GL_MATRIX14_ARB 0x88CE
7709 #define GL_MATRIX15_ARB 0x88CF
7710 #define GL_MATRIX16_ARB 0x88D0
7711 #define GL_MATRIX17_ARB 0x88D1
7712 #define GL_MATRIX18_ARB 0x88D2
7713 #define GL_MATRIX19_ARB 0x88D3
7714 #define GL_MATRIX20_ARB 0x88D4
7715 #define GL_MATRIX21_ARB 0x88D5
7716 #define GL_MATRIX22_ARB 0x88D6
7717 #define GL_MATRIX23_ARB 0x88D7
7718 #define GL_MATRIX24_ARB 0x88D8
7719 #define GL_MATRIX25_ARB 0x88D9
7720 #define GL_MATRIX26_ARB 0x88DA
7721 #define GL_MATRIX27_ARB 0x88DB
7722 #define GL_MATRIX28_ARB 0x88DC
7723 #define GL_MATRIX29_ARB 0x88DD
7724 #define GL_MATRIX30_ARB 0x88DE
7725 #define GL_MATRIX31_ARB 0x88DF
7726
7727 typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program);
7728 typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs);
7729 typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
7730 typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
7731 typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs);
7732 typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params);
7733 typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params);
7734 typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params);
7735 typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params);
7736 typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string);
7737 typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params);
7738 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void** pointer);
7739 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params);
7740 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params);
7741 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params);
7742 typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program);
7743 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
7744 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params);
7745 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
7746 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params);
7747 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
7748 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params);
7749 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
7750 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params);
7751 typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string);
7752 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);
7753 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v);
7754 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);
7755 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v);
7756 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);
7757 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v);
7758 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);
7759 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v);
7760 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);
7761 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v);
7762 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);
7763 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v);
7764 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
7765 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v);
7766 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
7767 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v);
7768 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
7769 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v);
7770 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v);
7771 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v);
7772 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v);
7773 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
7774 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v);
7775 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v);
7776 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v);
7777 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v);
7778 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
7779 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v);
7780 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
7781 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v);
7782 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v);
7783 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
7784 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v);
7785 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v);
7786 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v);
7787 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v);
7788 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
7789
7790 #define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB)
7791 #define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB)
7792 #define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB)
7793 #define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB)
7794 #define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB)
7795 #define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB)
7796 #define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB)
7797 #define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB)
7798 #define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB)
7799 #define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB)
7800 #define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB)
7801 #define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB)
7802 #define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB)
7803 #define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB)
7804 #define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB)
7805 #define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB)
7806 #define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB)
7807 #define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB)
7808 #define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB)
7809 #define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB)
7810 #define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB)
7811 #define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB)
7812 #define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB)
7813 #define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB)
7814 #define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB)
7815 #define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB)
7816 #define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB)
7817 #define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB)
7818 #define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB)
7819 #define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB)
7820 #define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB)
7821 #define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB)
7822 #define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB)
7823 #define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB)
7824 #define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB)
7825 #define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB)
7826 #define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB)
7827 #define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB)
7828 #define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB)
7829 #define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB)
7830 #define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB)
7831 #define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB)
7832 #define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB)
7833 #define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB)
7834 #define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB)
7835 #define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB)
7836 #define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB)
7837 #define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB)
7838 #define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB)
7839 #define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB)
7840 #define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB)
7841 #define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB)
7842 #define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB)
7843 #define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB)
7844 #define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB)
7845 #define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB)
7846 #define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB)
7847 #define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB)
7848 #define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB)
7849 #define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB)
7850 #define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB)
7851 #define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB)
7852
7853 #define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program)
7854
7855 #endif /* GL_ARB_vertex_program */
7856
7857 /* -------------------------- GL_ARB_vertex_shader ------------------------- */
7858
7859 #ifndef GL_ARB_vertex_shader
7860 #define GL_ARB_vertex_shader 1
7861
7862 #define GL_VERTEX_SHADER_ARB 0x8B31
7863 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A
7864 #define GL_MAX_VARYING_FLOATS_ARB 0x8B4B
7865 #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
7866 #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D
7867 #define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89
7868 #define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A
7869
7870 typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name);
7871 typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name);
7872 typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name);
7873
7874 #define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB)
7875 #define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB)
7876 #define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB)
7877
7878 #define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader)
7879
7880 #endif /* GL_ARB_vertex_shader */
7881
7882 /* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */
7883
7884 #ifndef GL_ARB_vertex_type_10f_11f_11f_rev
7885 #define GL_ARB_vertex_type_10f_11f_11f_rev 1
7886
7887 #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
7888
7889 #define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev)
7890
7891 #endif /* GL_ARB_vertex_type_10f_11f_11f_rev */
7892
7893 /* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */
7894
7895 #ifndef GL_ARB_vertex_type_2_10_10_10_rev
7896 #define GL_ARB_vertex_type_2_10_10_10_rev 1
7897
7898 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
7899 #define GL_INT_2_10_10_10_REV 0x8D9F
7900
7901 typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color);
7902 typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color);
7903 typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color);
7904 typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color);
7905 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords);
7906 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
7907 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords);
7908 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
7909 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords);
7910 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
7911 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords);
7912 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
7913 typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords);
7914 typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords);
7915 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color);
7916 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color);
7917 typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords);
7918 typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords);
7919 typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords);
7920 typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords);
7921 typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords);
7922 typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords);
7923 typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords);
7924 typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords);
7925 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
7926 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
7927 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
7928 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
7929 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
7930 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
7931 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
7932 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
7933 typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value);
7934 typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value);
7935 typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value);
7936 typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value);
7937 typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value);
7938 typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value);
7939
7940 #define glColorP3ui GLEW_GET_FUN(__glewColorP3ui)
7941 #define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv)
7942 #define glColorP4ui GLEW_GET_FUN(__glewColorP4ui)
7943 #define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv)
7944 #define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui)
7945 #define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv)
7946 #define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui)
7947 #define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv)
7948 #define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui)
7949 #define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv)
7950 #define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui)
7951 #define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv)
7952 #define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui)
7953 #define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv)
7954 #define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui)
7955 #define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv)
7956 #define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui)
7957 #define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv)
7958 #define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui)
7959 #define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv)
7960 #define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui)
7961 #define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv)
7962 #define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui)
7963 #define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv)
7964 #define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui)
7965 #define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv)
7966 #define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui)
7967 #define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv)
7968 #define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui)
7969 #define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv)
7970 #define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui)
7971 #define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv)
7972 #define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui)
7973 #define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv)
7974 #define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui)
7975 #define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv)
7976 #define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui)
7977 #define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv)
7978
7979 #define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev)
7980
7981 #endif /* GL_ARB_vertex_type_2_10_10_10_rev */
7982
7983 /* ------------------------- GL_ARB_viewport_array ------------------------- */
7984
7985 #ifndef GL_ARB_viewport_array
7986 #define GL_ARB_viewport_array 1
7987
7988 #define GL_DEPTH_RANGE 0x0B70
7989 #define GL_VIEWPORT 0x0BA2
7990 #define GL_SCISSOR_BOX 0x0C10
7991 #define GL_SCISSOR_TEST 0x0C11
7992 #define GL_MAX_VIEWPORTS 0x825B
7993 #define GL_VIEWPORT_SUBPIXEL_BITS 0x825C
7994 #define GL_VIEWPORT_BOUNDS_RANGE 0x825D
7995 #define GL_LAYER_PROVOKING_VERTEX 0x825E
7996 #define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F
7997 #define GL_UNDEFINED_VERTEX 0x8260
7998 #define GL_FIRST_VERTEX_CONVENTION 0x8E4D
7999 #define GL_LAST_VERTEX_CONVENTION 0x8E4E
8000 #define GL_PROVOKING_VERTEX 0x8E4F
8001
8002 typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v);
8003 typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f);
8004 typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data);
8005 typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data);
8006 typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v);
8007 typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
8008 typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v);
8009 typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v);
8010 typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
8011 typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v);
8012
8013 #define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv)
8014 #define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed)
8015 #define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v)
8016 #define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v)
8017 #define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv)
8018 #define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed)
8019 #define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv)
8020 #define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv)
8021 #define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf)
8022 #define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv)
8023
8024 #define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array)
8025
8026 #endif /* GL_ARB_viewport_array */
8027
8028 /* --------------------------- GL_ARB_window_pos --------------------------- */
8029
8030 #ifndef GL_ARB_window_pos
8031 #define GL_ARB_window_pos 1
8032
8033 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y);
8034 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p);
8035 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y);
8036 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p);
8037 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y);
8038 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p);
8039 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y);
8040 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p);
8041 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z);
8042 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p);
8043 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z);
8044 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p);
8045 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z);
8046 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p);
8047 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z);
8048 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p);
8049
8050 #define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB)
8051 #define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB)
8052 #define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB)
8053 #define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB)
8054 #define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB)
8055 #define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB)
8056 #define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB)
8057 #define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB)
8058 #define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB)
8059 #define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB)
8060 #define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB)
8061 #define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB)
8062 #define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB)
8063 #define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB)
8064 #define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB)
8065 #define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB)
8066
8067 #define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos)
8068
8069 #endif /* GL_ARB_window_pos */
8070
8071 /* ------------------------- GL_ATIX_point_sprites ------------------------- */
8072
8073 #ifndef GL_ATIX_point_sprites
8074 #define GL_ATIX_point_sprites 1
8075
8076 #define GL_TEXTURE_POINT_MODE_ATIX 0x60B0
8077 #define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1
8078 #define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2
8079 #define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3
8080 #define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4
8081 #define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5
8082
8083 #define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites)
8084
8085 #endif /* GL_ATIX_point_sprites */
8086
8087 /* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */
8088
8089 #ifndef GL_ATIX_texture_env_combine3
8090 #define GL_ATIX_texture_env_combine3 1
8091
8092 #define GL_MODULATE_ADD_ATIX 0x8744
8093 #define GL_MODULATE_SIGNED_ADD_ATIX 0x8745
8094 #define GL_MODULATE_SUBTRACT_ATIX 0x8746
8095
8096 #define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3)
8097
8098 #endif /* GL_ATIX_texture_env_combine3 */
8099
8100 /* ----------------------- GL_ATIX_texture_env_route ----------------------- */
8101
8102 #ifndef GL_ATIX_texture_env_route
8103 #define GL_ATIX_texture_env_route 1
8104
8105 #define GL_SECONDARY_COLOR_ATIX 0x8747
8106 #define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748
8107 #define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749
8108
8109 #define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route)
8110
8111 #endif /* GL_ATIX_texture_env_route */
8112
8113 /* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */
8114
8115 #ifndef GL_ATIX_vertex_shader_output_point_size
8116 #define GL_ATIX_vertex_shader_output_point_size 1
8117
8118 #define GL_OUTPUT_POINT_SIZE_ATIX 0x610E
8119
8120 #define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size)
8121
8122 #endif /* GL_ATIX_vertex_shader_output_point_size */
8123
8124 /* -------------------------- GL_ATI_draw_buffers -------------------------- */
8125
8126 #ifndef GL_ATI_draw_buffers
8127 #define GL_ATI_draw_buffers 1
8128
8129 #define GL_MAX_DRAW_BUFFERS_ATI 0x8824
8130 #define GL_DRAW_BUFFER0_ATI 0x8825
8131 #define GL_DRAW_BUFFER1_ATI 0x8826
8132 #define GL_DRAW_BUFFER2_ATI 0x8827
8133 #define GL_DRAW_BUFFER3_ATI 0x8828
8134 #define GL_DRAW_BUFFER4_ATI 0x8829
8135 #define GL_DRAW_BUFFER5_ATI 0x882A
8136 #define GL_DRAW_BUFFER6_ATI 0x882B
8137 #define GL_DRAW_BUFFER7_ATI 0x882C
8138 #define GL_DRAW_BUFFER8_ATI 0x882D
8139 #define GL_DRAW_BUFFER9_ATI 0x882E
8140 #define GL_DRAW_BUFFER10_ATI 0x882F
8141 #define GL_DRAW_BUFFER11_ATI 0x8830
8142 #define GL_DRAW_BUFFER12_ATI 0x8831
8143 #define GL_DRAW_BUFFER13_ATI 0x8832
8144 #define GL_DRAW_BUFFER14_ATI 0x8833
8145 #define GL_DRAW_BUFFER15_ATI 0x8834
8146
8147 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs);
8148
8149 #define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI)
8150
8151 #define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers)
8152
8153 #endif /* GL_ATI_draw_buffers */
8154
8155 /* -------------------------- GL_ATI_element_array ------------------------- */
8156
8157 #ifndef GL_ATI_element_array
8158 #define GL_ATI_element_array 1
8159
8160 #define GL_ELEMENT_ARRAY_ATI 0x8768
8161 #define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769
8162 #define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A
8163
8164 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count);
8165 typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count);
8166 typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer);
8167
8168 #define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI)
8169 #define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI)
8170 #define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI)
8171
8172 #define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array)
8173
8174 #endif /* GL_ATI_element_array */
8175
8176 /* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */
8177
8178 #ifndef GL_ATI_envmap_bumpmap
8179 #define GL_ATI_envmap_bumpmap 1
8180
8181 #define GL_BUMP_ROT_MATRIX_ATI 0x8775
8182 #define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776
8183 #define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777
8184 #define GL_BUMP_TEX_UNITS_ATI 0x8778
8185 #define GL_DUDV_ATI 0x8779
8186 #define GL_DU8DV8_ATI 0x877A
8187 #define GL_BUMP_ENVMAP_ATI 0x877B
8188 #define GL_BUMP_TARGET_ATI 0x877C
8189
8190 typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);
8191 typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);
8192 typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);
8193 typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);
8194
8195 #define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI)
8196 #define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI)
8197 #define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI)
8198 #define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI)
8199
8200 #define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap)
8201
8202 #endif /* GL_ATI_envmap_bumpmap */
8203
8204 /* ------------------------- GL_ATI_fragment_shader ------------------------ */
8205
8206 #ifndef GL_ATI_fragment_shader
8207 #define GL_ATI_fragment_shader 1
8208
8209 #define GL_2X_BIT_ATI 0x00000001
8210 #define GL_RED_BIT_ATI 0x00000001
8211 #define GL_4X_BIT_ATI 0x00000002
8212 #define GL_COMP_BIT_ATI 0x00000002
8213 #define GL_GREEN_BIT_ATI 0x00000002
8214 #define GL_8X_BIT_ATI 0x00000004
8215 #define GL_BLUE_BIT_ATI 0x00000004
8216 #define GL_NEGATE_BIT_ATI 0x00000004
8217 #define GL_BIAS_BIT_ATI 0x00000008
8218 #define GL_HALF_BIT_ATI 0x00000008
8219 #define GL_QUARTER_BIT_ATI 0x00000010
8220 #define GL_EIGHTH_BIT_ATI 0x00000020
8221 #define GL_SATURATE_BIT_ATI 0x00000040
8222 #define GL_FRAGMENT_SHADER_ATI 0x8920
8223 #define GL_REG_0_ATI 0x8921
8224 #define GL_REG_1_ATI 0x8922
8225 #define GL_REG_2_ATI 0x8923
8226 #define GL_REG_3_ATI 0x8924
8227 #define GL_REG_4_ATI 0x8925
8228 #define GL_REG_5_ATI 0x8926
8229 #define GL_CON_0_ATI 0x8941
8230 #define GL_CON_1_ATI 0x8942
8231 #define GL_CON_2_ATI 0x8943
8232 #define GL_CON_3_ATI 0x8944
8233 #define GL_CON_4_ATI 0x8945
8234 #define GL_CON_5_ATI 0x8946
8235 #define GL_CON_6_ATI 0x8947
8236 #define GL_CON_7_ATI 0x8948
8237 #define GL_MOV_ATI 0x8961
8238 #define GL_ADD_ATI 0x8963
8239 #define GL_MUL_ATI 0x8964
8240 #define GL_SUB_ATI 0x8965
8241 #define GL_DOT3_ATI 0x8966
8242 #define GL_DOT4_ATI 0x8967
8243 #define GL_MAD_ATI 0x8968
8244 #define GL_LERP_ATI 0x8969
8245 #define GL_CND_ATI 0x896A
8246 #define GL_CND0_ATI 0x896B
8247 #define GL_DOT2_ADD_ATI 0x896C
8248 #define GL_SECONDARY_INTERPOLATOR_ATI 0x896D
8249 #define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E
8250 #define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F
8251 #define GL_NUM_PASSES_ATI 0x8970
8252 #define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971
8253 #define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972
8254 #define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973
8255 #define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974
8256 #define GL_COLOR_ALPHA_PAIRING_ATI 0x8975
8257 #define GL_SWIZZLE_STR_ATI 0x8976
8258 #define GL_SWIZZLE_STQ_ATI 0x8977
8259 #define GL_SWIZZLE_STR_DR_ATI 0x8978
8260 #define GL_SWIZZLE_STQ_DQ_ATI 0x8979
8261 #define GL_SWIZZLE_STRQ_ATI 0x897A
8262 #define GL_SWIZZLE_STRQ_DQ_ATI 0x897B
8263
8264 typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
8265 typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
8266 typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
8267 typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void);
8268 typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id);
8269 typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
8270 typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
8271 typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
8272 typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id);
8273 typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void);
8274 typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range);
8275 typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle);
8276 typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle);
8277 typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value);
8278
8279 #define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI)
8280 #define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI)
8281 #define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI)
8282 #define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI)
8283 #define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI)
8284 #define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI)
8285 #define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI)
8286 #define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI)
8287 #define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI)
8288 #define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI)
8289 #define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI)
8290 #define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI)
8291 #define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI)
8292 #define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI)
8293
8294 #define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader)
8295
8296 #endif /* GL_ATI_fragment_shader */
8297
8298 /* ------------------------ GL_ATI_map_object_buffer ----------------------- */
8299
8300 #ifndef GL_ATI_map_object_buffer
8301 #define GL_ATI_map_object_buffer 1
8302
8303 typedef void * (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer);
8304 typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer);
8305
8306 #define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI)
8307 #define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI)
8308
8309 #define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer)
8310
8311 #endif /* GL_ATI_map_object_buffer */
8312
8313 /* ----------------------------- GL_ATI_meminfo ---------------------------- */
8314
8315 #ifndef GL_ATI_meminfo
8316 #define GL_ATI_meminfo 1
8317
8318 #define GL_VBO_FREE_MEMORY_ATI 0x87FB
8319 #define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC
8320 #define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD
8321
8322 #define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo)
8323
8324 #endif /* GL_ATI_meminfo */
8325
8326 /* -------------------------- GL_ATI_pn_triangles -------------------------- */
8327
8328 #ifndef GL_ATI_pn_triangles
8329 #define GL_ATI_pn_triangles 1
8330
8331 #define GL_PN_TRIANGLES_ATI 0x87F0
8332 #define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1
8333 #define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2
8334 #define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3
8335 #define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4
8336 #define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5
8337 #define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6
8338 #define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7
8339 #define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8
8340
8341 typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param);
8342 typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param);
8343
8344 #define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI)
8345 #define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI)
8346
8347 #define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles)
8348
8349 #endif /* GL_ATI_pn_triangles */
8350
8351 /* ------------------------ GL_ATI_separate_stencil ------------------------ */
8352
8353 #ifndef GL_ATI_separate_stencil
8354 #define GL_ATI_separate_stencil 1
8355
8356 #define GL_STENCIL_BACK_FUNC_ATI 0x8800
8357 #define GL_STENCIL_BACK_FAIL_ATI 0x8801
8358 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802
8359 #define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803
8360
8361 typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
8362 typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
8363
8364 #define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI)
8365 #define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI)
8366
8367 #define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil)
8368
8369 #endif /* GL_ATI_separate_stencil */
8370
8371 /* ----------------------- GL_ATI_shader_texture_lod ----------------------- */
8372
8373 #ifndef GL_ATI_shader_texture_lod
8374 #define GL_ATI_shader_texture_lod 1
8375
8376 #define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod)
8377
8378 #endif /* GL_ATI_shader_texture_lod */
8379
8380 /* ---------------------- GL_ATI_text_fragment_shader ---------------------- */
8381
8382 #ifndef GL_ATI_text_fragment_shader
8383 #define GL_ATI_text_fragment_shader 1
8384
8385 #define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200
8386
8387 #define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader)
8388
8389 #endif /* GL_ATI_text_fragment_shader */
8390
8391 /* --------------------- GL_ATI_texture_compression_3dc -------------------- */
8392
8393 #ifndef GL_ATI_texture_compression_3dc
8394 #define GL_ATI_texture_compression_3dc 1
8395
8396 #define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837
8397
8398 #define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc)
8399
8400 #endif /* GL_ATI_texture_compression_3dc */
8401
8402 /* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */
8403
8404 #ifndef GL_ATI_texture_env_combine3
8405 #define GL_ATI_texture_env_combine3 1
8406
8407 #define GL_MODULATE_ADD_ATI 0x8744
8408 #define GL_MODULATE_SIGNED_ADD_ATI 0x8745
8409 #define GL_MODULATE_SUBTRACT_ATI 0x8746
8410
8411 #define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3)
8412
8413 #endif /* GL_ATI_texture_env_combine3 */
8414
8415 /* -------------------------- GL_ATI_texture_float ------------------------- */
8416
8417 #ifndef GL_ATI_texture_float
8418 #define GL_ATI_texture_float 1
8419
8420 #define GL_RGBA_FLOAT32_ATI 0x8814
8421 #define GL_RGB_FLOAT32_ATI 0x8815
8422 #define GL_ALPHA_FLOAT32_ATI 0x8816
8423 #define GL_INTENSITY_FLOAT32_ATI 0x8817
8424 #define GL_LUMINANCE_FLOAT32_ATI 0x8818
8425 #define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819
8426 #define GL_RGBA_FLOAT16_ATI 0x881A
8427 #define GL_RGB_FLOAT16_ATI 0x881B
8428 #define GL_ALPHA_FLOAT16_ATI 0x881C
8429 #define GL_INTENSITY_FLOAT16_ATI 0x881D
8430 #define GL_LUMINANCE_FLOAT16_ATI 0x881E
8431 #define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F
8432
8433 #define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float)
8434
8435 #endif /* GL_ATI_texture_float */
8436
8437 /* ----------------------- GL_ATI_texture_mirror_once ---------------------- */
8438
8439 #ifndef GL_ATI_texture_mirror_once
8440 #define GL_ATI_texture_mirror_once 1
8441
8442 #define GL_MIRROR_CLAMP_ATI 0x8742
8443 #define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743
8444
8445 #define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once)
8446
8447 #endif /* GL_ATI_texture_mirror_once */
8448
8449 /* ----------------------- GL_ATI_vertex_array_object ---------------------- */
8450
8451 #ifndef GL_ATI_vertex_array_object
8452 #define GL_ATI_vertex_array_object 1
8453
8454 #define GL_STATIC_ATI 0x8760
8455 #define GL_DYNAMIC_ATI 0x8761
8456 #define GL_PRESERVE_ATI 0x8762
8457 #define GL_DISCARD_ATI 0x8763
8458 #define GL_OBJECT_BUFFER_SIZE_ATI 0x8764
8459 #define GL_OBJECT_BUFFER_USAGE_ATI 0x8765
8460 #define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766
8461 #define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767
8462
8463 typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
8464 typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer);
8465 typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params);
8466 typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params);
8467 typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params);
8468 typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params);
8469 typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params);
8470 typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params);
8471 typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer);
8472 typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage);
8473 typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve);
8474 typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
8475
8476 #define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI)
8477 #define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI)
8478 #define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI)
8479 #define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI)
8480 #define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI)
8481 #define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI)
8482 #define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI)
8483 #define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI)
8484 #define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI)
8485 #define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI)
8486 #define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI)
8487 #define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI)
8488
8489 #define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object)
8490
8491 #endif /* GL_ATI_vertex_array_object */
8492
8493 /* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */
8494
8495 #ifndef GL_ATI_vertex_attrib_array_object
8496 #define GL_ATI_vertex_attrib_array_object 1
8497
8498 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params);
8499 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params);
8500 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset);
8501
8502 #define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI)
8503 #define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI)
8504 #define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI)
8505
8506 #define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object)
8507
8508 #endif /* GL_ATI_vertex_attrib_array_object */
8509
8510 /* ------------------------- GL_ATI_vertex_streams ------------------------- */
8511
8512 #ifndef GL_ATI_vertex_streams
8513 #define GL_ATI_vertex_streams 1
8514
8515 #define GL_MAX_VERTEX_STREAMS_ATI 0x876B
8516 #define GL_VERTEX_SOURCE_ATI 0x876C
8517 #define GL_VERTEX_STREAM0_ATI 0x876D
8518 #define GL_VERTEX_STREAM1_ATI 0x876E
8519 #define GL_VERTEX_STREAM2_ATI 0x876F
8520 #define GL_VERTEX_STREAM3_ATI 0x8770
8521 #define GL_VERTEX_STREAM4_ATI 0x8771
8522 #define GL_VERTEX_STREAM5_ATI 0x8772
8523 #define GL_VERTEX_STREAM6_ATI 0x8773
8524 #define GL_VERTEX_STREAM7_ATI 0x8774
8525
8526 typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream);
8527 typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z);
8528 typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords);
8529 typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);
8530 typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords);
8531 typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);
8532 typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords);
8533 typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);
8534 typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords);
8535 typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);
8536 typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords);
8537 typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param);
8538 typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param);
8539 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x);
8540 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords);
8541 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x);
8542 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords);
8543 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x);
8544 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords);
8545 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x);
8546 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords);
8547 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y);
8548 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords);
8549 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y);
8550 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords);
8551 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y);
8552 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords);
8553 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y);
8554 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords);
8555 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);
8556 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords);
8557 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);
8558 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords);
8559 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);
8560 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords);
8561 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);
8562 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords);
8563 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
8564 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords);
8565 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
8566 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords);
8567 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w);
8568 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords);
8569 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w);
8570 typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords);
8571
8572 #define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI)
8573 #define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI)
8574 #define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI)
8575 #define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI)
8576 #define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI)
8577 #define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI)
8578 #define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI)
8579 #define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI)
8580 #define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI)
8581 #define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI)
8582 #define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI)
8583 #define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI)
8584 #define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI)
8585 #define glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI)
8586 #define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI)
8587 #define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI)
8588 #define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI)
8589 #define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI)
8590 #define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI)
8591 #define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI)
8592 #define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI)
8593 #define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI)
8594 #define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI)
8595 #define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI)
8596 #define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI)
8597 #define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI)
8598 #define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI)
8599 #define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI)
8600 #define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI)
8601 #define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI)
8602 #define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI)
8603 #define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI)
8604 #define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI)
8605 #define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI)
8606 #define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI)
8607 #define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI)
8608 #define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI)
8609 #define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI)
8610 #define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI)
8611 #define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI)
8612 #define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI)
8613 #define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI)
8614 #define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI)
8615 #define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI)
8616 #define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI)
8617
8618 #define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams)
8619
8620 #endif /* GL_ATI_vertex_streams */
8621
8622 /* --------------------------- GL_EXT_422_pixels --------------------------- */
8623
8624 #ifndef GL_EXT_422_pixels
8625 #define GL_EXT_422_pixels 1
8626
8627 #define GL_422_EXT 0x80CC
8628 #define GL_422_REV_EXT 0x80CD
8629 #define GL_422_AVERAGE_EXT 0x80CE
8630 #define GL_422_REV_AVERAGE_EXT 0x80CF
8631
8632 #define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels)
8633
8634 #endif /* GL_EXT_422_pixels */
8635
8636 /* ---------------------------- GL_EXT_Cg_shader --------------------------- */
8637
8638 #ifndef GL_EXT_Cg_shader
8639 #define GL_EXT_Cg_shader 1
8640
8641 #define GL_CG_VERTEX_SHADER_EXT 0x890E
8642 #define GL_CG_FRAGMENT_SHADER_EXT 0x890F
8643
8644 #define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader)
8645
8646 #endif /* GL_EXT_Cg_shader */
8647
8648 /* ------------------------------ GL_EXT_abgr ------------------------------ */
8649
8650 #ifndef GL_EXT_abgr
8651 #define GL_EXT_abgr 1
8652
8653 #define GL_ABGR_EXT 0x8000
8654
8655 #define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr)
8656
8657 #endif /* GL_EXT_abgr */
8658
8659 /* ------------------------------ GL_EXT_bgra ------------------------------ */
8660
8661 #ifndef GL_EXT_bgra
8662 #define GL_EXT_bgra 1
8663
8664 #define GL_BGR_EXT 0x80E0
8665 #define GL_BGRA_EXT 0x80E1
8666
8667 #define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra)
8668
8669 #endif /* GL_EXT_bgra */
8670
8671 /* ------------------------ GL_EXT_bindable_uniform ------------------------ */
8672
8673 #ifndef GL_EXT_bindable_uniform
8674 #define GL_EXT_bindable_uniform 1
8675
8676 #define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2
8677 #define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3
8678 #define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4
8679 #define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED
8680 #define GL_UNIFORM_BUFFER_EXT 0x8DEE
8681 #define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF
8682
8683 typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location);
8684 typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location);
8685 typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer);
8686
8687 #define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT)
8688 #define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT)
8689 #define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT)
8690
8691 #define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform)
8692
8693 #endif /* GL_EXT_bindable_uniform */
8694
8695 /* --------------------------- GL_EXT_blend_color -------------------------- */
8696
8697 #ifndef GL_EXT_blend_color
8698 #define GL_EXT_blend_color 1
8699
8700 #define GL_CONSTANT_COLOR_EXT 0x8001
8701 #define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002
8702 #define GL_CONSTANT_ALPHA_EXT 0x8003
8703 #define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004
8704 #define GL_BLEND_COLOR_EXT 0x8005
8705
8706 typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
8707
8708 #define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT)
8709
8710 #define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color)
8711
8712 #endif /* GL_EXT_blend_color */
8713
8714 /* --------------------- GL_EXT_blend_equation_separate -------------------- */
8715
8716 #ifndef GL_EXT_blend_equation_separate
8717 #define GL_EXT_blend_equation_separate 1
8718
8719 #define GL_BLEND_EQUATION_RGB_EXT 0x8009
8720 #define GL_BLEND_EQUATION_ALPHA_EXT 0x883D
8721
8722 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha);
8723
8724 #define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT)
8725
8726 #define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate)
8727
8728 #endif /* GL_EXT_blend_equation_separate */
8729
8730 /* ----------------------- GL_EXT_blend_func_separate ---------------------- */
8731
8732 #ifndef GL_EXT_blend_func_separate
8733 #define GL_EXT_blend_func_separate 1
8734
8735 #define GL_BLEND_DST_RGB_EXT 0x80C8
8736 #define GL_BLEND_SRC_RGB_EXT 0x80C9
8737 #define GL_BLEND_DST_ALPHA_EXT 0x80CA
8738 #define GL_BLEND_SRC_ALPHA_EXT 0x80CB
8739
8740 typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
8741
8742 #define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT)
8743
8744 #define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate)
8745
8746 #endif /* GL_EXT_blend_func_separate */
8747
8748 /* ------------------------- GL_EXT_blend_logic_op ------------------------- */
8749
8750 #ifndef GL_EXT_blend_logic_op
8751 #define GL_EXT_blend_logic_op 1
8752
8753 #define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op)
8754
8755 #endif /* GL_EXT_blend_logic_op */
8756
8757 /* -------------------------- GL_EXT_blend_minmax -------------------------- */
8758
8759 #ifndef GL_EXT_blend_minmax
8760 #define GL_EXT_blend_minmax 1
8761
8762 #define GL_FUNC_ADD_EXT 0x8006
8763 #define GL_MIN_EXT 0x8007
8764 #define GL_MAX_EXT 0x8008
8765 #define GL_BLEND_EQUATION_EXT 0x8009
8766
8767 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode);
8768
8769 #define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT)
8770
8771 #define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax)
8772
8773 #endif /* GL_EXT_blend_minmax */
8774
8775 /* ------------------------- GL_EXT_blend_subtract ------------------------- */
8776
8777 #ifndef GL_EXT_blend_subtract
8778 #define GL_EXT_blend_subtract 1
8779
8780 #define GL_FUNC_SUBTRACT_EXT 0x800A
8781 #define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
8782
8783 #define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract)
8784
8785 #endif /* GL_EXT_blend_subtract */
8786
8787 /* ------------------------ GL_EXT_clip_volume_hint ------------------------ */
8788
8789 #ifndef GL_EXT_clip_volume_hint
8790 #define GL_EXT_clip_volume_hint 1
8791
8792 #define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0
8793
8794 #define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint)
8795
8796 #endif /* GL_EXT_clip_volume_hint */
8797
8798 /* ------------------------------ GL_EXT_cmyka ----------------------------- */
8799
8800 #ifndef GL_EXT_cmyka
8801 #define GL_EXT_cmyka 1
8802
8803 #define GL_CMYK_EXT 0x800C
8804 #define GL_CMYKA_EXT 0x800D
8805 #define GL_PACK_CMYK_HINT_EXT 0x800E
8806 #define GL_UNPACK_CMYK_HINT_EXT 0x800F
8807
8808 #define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka)
8809
8810 #endif /* GL_EXT_cmyka */
8811
8812 /* ------------------------- GL_EXT_color_subtable ------------------------- */
8813
8814 #ifndef GL_EXT_color_subtable
8815 #define GL_EXT_color_subtable 1
8816
8817 typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);
8818 typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
8819
8820 #define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT)
8821 #define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT)
8822
8823 #define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable)
8824
8825 #endif /* GL_EXT_color_subtable */
8826
8827 /* ---------------------- GL_EXT_compiled_vertex_array --------------------- */
8828
8829 #ifndef GL_EXT_compiled_vertex_array
8830 #define GL_EXT_compiled_vertex_array 1
8831
8832 #define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8
8833 #define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9
8834
8835 typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count);
8836 typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void);
8837
8838 #define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT)
8839 #define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT)
8840
8841 #define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array)
8842
8843 #endif /* GL_EXT_compiled_vertex_array */
8844
8845 /* --------------------------- GL_EXT_convolution -------------------------- */
8846
8847 #ifndef GL_EXT_convolution
8848 #define GL_EXT_convolution 1
8849
8850 #define GL_CONVOLUTION_1D_EXT 0x8010
8851 #define GL_CONVOLUTION_2D_EXT 0x8011
8852 #define GL_SEPARABLE_2D_EXT 0x8012
8853 #define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013
8854 #define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014
8855 #define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015
8856 #define GL_REDUCE_EXT 0x8016
8857 #define GL_CONVOLUTION_FORMAT_EXT 0x8017
8858 #define GL_CONVOLUTION_WIDTH_EXT 0x8018
8859 #define GL_CONVOLUTION_HEIGHT_EXT 0x8019
8860 #define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A
8861 #define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B
8862 #define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C
8863 #define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D
8864 #define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E
8865 #define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F
8866 #define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020
8867 #define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021
8868 #define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022
8869 #define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023
8870
8871 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);
8872 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);
8873 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param);
8874 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);
8875 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param);
8876 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);
8877 typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
8878 typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
8879 typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image);
8880 typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
8881 typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
8882 typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);
8883 typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);
8884
8885 #define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT)
8886 #define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT)
8887 #define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT)
8888 #define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT)
8889 #define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT)
8890 #define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT)
8891 #define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT)
8892 #define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT)
8893 #define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT)
8894 #define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT)
8895 #define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT)
8896 #define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT)
8897 #define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT)
8898
8899 #define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution)
8900
8901 #endif /* GL_EXT_convolution */
8902
8903 /* ------------------------ GL_EXT_coordinate_frame ------------------------ */
8904
8905 #ifndef GL_EXT_coordinate_frame
8906 #define GL_EXT_coordinate_frame 1
8907
8908 #define GL_TANGENT_ARRAY_EXT 0x8439
8909 #define GL_BINORMAL_ARRAY_EXT 0x843A
8910 #define GL_CURRENT_TANGENT_EXT 0x843B
8911 #define GL_CURRENT_BINORMAL_EXT 0x843C
8912 #define GL_TANGENT_ARRAY_TYPE_EXT 0x843E
8913 #define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F
8914 #define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440
8915 #define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441
8916 #define GL_TANGENT_ARRAY_POINTER_EXT 0x8442
8917 #define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443
8918 #define GL_MAP1_TANGENT_EXT 0x8444
8919 #define GL_MAP2_TANGENT_EXT 0x8445
8920 #define GL_MAP1_BINORMAL_EXT 0x8446
8921 #define GL_MAP2_BINORMAL_EXT 0x8447
8922
8923 typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer);
8924 typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer);
8925
8926 #define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT)
8927 #define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT)
8928
8929 #define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame)
8930
8931 #endif /* GL_EXT_coordinate_frame */
8932
8933 /* -------------------------- GL_EXT_copy_texture -------------------------- */
8934
8935 #ifndef GL_EXT_copy_texture
8936 #define GL_EXT_copy_texture 1
8937
8938 typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
8939 typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
8940 typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
8941 typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
8942 typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
8943
8944 #define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT)
8945 #define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT)
8946 #define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT)
8947 #define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT)
8948 #define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT)
8949
8950 #define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture)
8951
8952 #endif /* GL_EXT_copy_texture */
8953
8954 /* --------------------------- GL_EXT_cull_vertex -------------------------- */
8955
8956 #ifndef GL_EXT_cull_vertex
8957 #define GL_EXT_cull_vertex 1
8958
8959 #define GL_CULL_VERTEX_EXT 0x81AA
8960 #define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB
8961 #define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC
8962
8963 typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params);
8964 typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params);
8965
8966 #define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT)
8967 #define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT)
8968
8969 #define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex)
8970
8971 #endif /* GL_EXT_cull_vertex */
8972
8973 /* --------------------------- GL_EXT_debug_label -------------------------- */
8974
8975 #ifndef GL_EXT_debug_label
8976 #define GL_EXT_debug_label 1
8977
8978 #define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F
8979 #define GL_PROGRAM_OBJECT_EXT 0x8B40
8980 #define GL_SHADER_OBJECT_EXT 0x8B48
8981 #define GL_BUFFER_OBJECT_EXT 0x9151
8982 #define GL_QUERY_OBJECT_EXT 0x9153
8983 #define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154
8984
8985 typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar *label);
8986 typedef void (GLAPIENTRY * PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar* label);
8987
8988 #define glGetObjectLabelEXT GLEW_GET_FUN(__glewGetObjectLabelEXT)
8989 #define glLabelObjectEXT GLEW_GET_FUN(__glewLabelObjectEXT)
8990
8991 #define GLEW_EXT_debug_label GLEW_GET_VAR(__GLEW_EXT_debug_label)
8992
8993 #endif /* GL_EXT_debug_label */
8994
8995 /* -------------------------- GL_EXT_debug_marker -------------------------- */
8996
8997 #ifndef GL_EXT_debug_marker
8998 #define GL_EXT_debug_marker 1
8999
9000 typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker);
9001 typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void);
9002 typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker);
9003
9004 #define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT)
9005 #define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT)
9006 #define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT)
9007
9008 #define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker)
9009
9010 #endif /* GL_EXT_debug_marker */
9011
9012 /* ------------------------ GL_EXT_depth_bounds_test ----------------------- */
9013
9014 #ifndef GL_EXT_depth_bounds_test
9015 #define GL_EXT_depth_bounds_test 1
9016
9017 #define GL_DEPTH_BOUNDS_TEST_EXT 0x8890
9018 #define GL_DEPTH_BOUNDS_EXT 0x8891
9019
9020 typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax);
9021
9022 #define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT)
9023
9024 #define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test)
9025
9026 #endif /* GL_EXT_depth_bounds_test */
9027
9028 /* ----------------------- GL_EXT_direct_state_access ---------------------- */
9029
9030 #ifndef GL_EXT_direct_state_access
9031 #define GL_EXT_direct_state_access 1
9032
9033 #define GL_PROGRAM_MATRIX_EXT 0x8E2D
9034 #define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E
9035 #define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F
9036
9037 typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture);
9038 typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target);
9039 typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask);
9040 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
9041 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
9042 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
9043 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
9044 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
9045 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
9046 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
9047 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
9048 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
9049 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
9050 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
9051 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
9052 typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
9053 typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
9054 typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
9055 typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
9056 typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
9057 typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
9058 typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
9059 typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
9060 typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
9061 typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
9062 typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);
9063 typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index);
9064 typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index);
9065 typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array);
9066 typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);
9067 typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index);
9068 typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index);
9069 typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array);
9070 typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);
9071 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);
9072 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs);
9073 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);
9074 typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target);
9075 typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target);
9076 typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void *img);
9077 typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void *img);
9078 typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params);
9079 typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params);
9080 typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params);
9081 typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params);
9082 typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param);
9083 typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params);
9084 typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params);
9085 typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params);
9086 typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params);
9087 typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params);
9088 typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
9089 typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params);
9090 typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params);
9091 typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params);
9092 typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params);
9093 typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params);
9094 typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params);
9095 typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params);
9096 typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params);
9097 typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data);
9098 typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params);
9099 typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params);
9100 typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params);
9101 typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params);
9102 typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params);
9103 typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string);
9104 typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params);
9105 typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params);
9106 typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void** params);
9107 typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void** params);
9108 typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
9109 typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params);
9110 typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params);
9111 typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params);
9112 typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params);
9113 typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params);
9114 typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params);
9115 typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param);
9116 typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param);
9117 typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void** param);
9118 typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void** param);
9119 typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access);
9120 typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);
9121 typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f);
9122 typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode);
9123 typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m);
9124 typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m);
9125 typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m);
9126 typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m);
9127 typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m);
9128 typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m);
9129 typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m);
9130 typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m);
9131 typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f);
9132 typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode);
9133 typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode);
9134 typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
9135 typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
9136 typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z);
9137 typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z);
9138 typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z);
9139 typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z);
9140 typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer);
9141 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer);
9142 typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param);
9143 typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params);
9144 typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param);
9145 typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params);
9146 typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param);
9147 typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params);
9148 typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param);
9149 typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params);
9150 typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param);
9151 typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params);
9152 typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
9153 typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
9154 typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
9155 typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params);
9156 typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params);
9157 typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param);
9158 typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param);
9159 typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param);
9160 typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param);
9161 typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer);
9162 typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
9163 typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
9164 typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
9165 typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage);
9166 typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data);
9167 typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
9168 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
9169 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
9170 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
9171 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
9172 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
9173 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face);
9174 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
9175 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
9176 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params);
9177 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
9178 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params);
9179 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);
9180 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params);
9181 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
9182 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params);
9183 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params);
9184 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params);
9185 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params);
9186 typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string);
9187 typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
9188 typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);
9189 typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
9190 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0);
9191 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
9192 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0);
9193 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
9194 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0);
9195 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
9196 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
9197 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
9198 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1);
9199 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
9200 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);
9201 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
9202 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
9203 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
9204 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
9205 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
9206 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
9207 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
9208 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
9209 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
9210 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
9211 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
9212 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
9213 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
9214 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
9215 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
9216 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
9217 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
9218 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
9219 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
9220 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
9221 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
9222 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
9223 typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask);
9224 typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer);
9225 typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
9226 typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
9227 typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
9228 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params);
9229 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params);
9230 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param);
9231 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param);
9232 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param);
9233 typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param);
9234 typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer);
9235 typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
9236 typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
9237 typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
9238 typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);
9239 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
9240 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset);
9241 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);
9242 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);
9243 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset);
9244 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);
9245 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
9246 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
9247 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor);
9248 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);
9249 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset);
9250 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
9251
9252 #define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT)
9253 #define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT)
9254 #define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT)
9255 #define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT)
9256 #define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT)
9257 #define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT)
9258 #define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT)
9259 #define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT)
9260 #define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT)
9261 #define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT)
9262 #define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT)
9263 #define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT)
9264 #define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT)
9265 #define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT)
9266 #define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT)
9267 #define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT)
9268 #define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT)
9269 #define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT)
9270 #define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT)
9271 #define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT)
9272 #define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT)
9273 #define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT)
9274 #define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT)
9275 #define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT)
9276 #define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT)
9277 #define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT)
9278 #define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT)
9279 #define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT)
9280 #define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT)
9281 #define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT)
9282 #define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT)
9283 #define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT)
9284 #define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT)
9285 #define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT)
9286 #define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT)
9287 #define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT)
9288 #define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT)
9289 #define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT)
9290 #define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT)
9291 #define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT)
9292 #define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT)
9293 #define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT)
9294 #define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT)
9295 #define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT)
9296 #define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT)
9297 #define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT)
9298 #define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT)
9299 #define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT)
9300 #define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT)
9301 #define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT)
9302 #define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT)
9303 #define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT)
9304 #define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT)
9305 #define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT)
9306 #define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT)
9307 #define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT)
9308 #define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT)
9309 #define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT)
9310 #define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT)
9311 #define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT)
9312 #define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT)
9313 #define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT)
9314 #define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT)
9315 #define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT)
9316 #define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT)
9317 #define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT)
9318 #define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT)
9319 #define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT)
9320 #define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT)
9321 #define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT)
9322 #define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT)
9323 #define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT)
9324 #define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT)
9325 #define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT)
9326 #define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT)
9327 #define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT)
9328 #define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT)
9329 #define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT)
9330 #define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT)
9331 #define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT)
9332 #define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT)
9333 #define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT)
9334 #define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT)
9335 #define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT)
9336 #define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT)
9337 #define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT)
9338 #define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT)
9339 #define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT)
9340 #define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT)
9341 #define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT)
9342 #define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT)
9343 #define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT)
9344 #define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT)
9345 #define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT)
9346 #define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT)
9347 #define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT)
9348 #define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT)
9349 #define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT)
9350 #define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT)
9351 #define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT)
9352 #define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT)
9353 #define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT)
9354 #define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT)
9355 #define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT)
9356 #define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT)
9357 #define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT)
9358 #define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT)
9359 #define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT)
9360 #define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT)
9361 #define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT)
9362 #define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT)
9363 #define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT)
9364 #define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT)
9365 #define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT)
9366 #define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT)
9367 #define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT)
9368 #define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT)
9369 #define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT)
9370 #define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT)
9371 #define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT)
9372 #define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT)
9373 #define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT)
9374 #define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT)
9375 #define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT)
9376 #define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT)
9377 #define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT)
9378 #define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT)
9379 #define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT)
9380 #define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT)
9381 #define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT)
9382 #define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT)
9383 #define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT)
9384 #define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT)
9385 #define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT)
9386 #define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT)
9387 #define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT)
9388 #define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT)
9389 #define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT)
9390 #define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT)
9391 #define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT)
9392 #define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT)
9393 #define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT)
9394 #define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT)
9395 #define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT)
9396 #define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT)
9397 #define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT)
9398 #define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT)
9399 #define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT)
9400 #define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT)
9401 #define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT)
9402 #define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT)
9403 #define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT)
9404 #define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT)
9405 #define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT)
9406 #define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT)
9407 #define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT)
9408 #define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT)
9409 #define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT)
9410 #define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT)
9411 #define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT)
9412 #define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT)
9413 #define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT)
9414 #define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT)
9415 #define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT)
9416 #define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT)
9417 #define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT)
9418 #define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT)
9419 #define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT)
9420 #define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT)
9421 #define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT)
9422 #define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT)
9423 #define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT)
9424 #define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT)
9425 #define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT)
9426 #define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT)
9427 #define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT)
9428 #define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT)
9429 #define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT)
9430 #define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT)
9431 #define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT)
9432 #define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT)
9433 #define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT)
9434 #define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT)
9435 #define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT)
9436 #define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT)
9437 #define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT)
9438 #define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT)
9439 #define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT)
9440 #define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT)
9441 #define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT)
9442 #define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT)
9443 #define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT)
9444 #define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT)
9445 #define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT)
9446 #define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT)
9447 #define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT)
9448 #define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT)
9449 #define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT)
9450 #define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT)
9451 #define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT)
9452 #define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT)
9453 #define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT)
9454 #define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT)
9455 #define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT)
9456 #define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT)
9457 #define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT)
9458 #define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT)
9459 #define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT)
9460 #define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT)
9461 #define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT)
9462 #define glVertexArrayVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribDivisorEXT)
9463 #define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT)
9464 #define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT)
9465 #define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT)
9466
9467 #define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access)
9468
9469 #endif /* GL_EXT_direct_state_access */
9470
9471 /* -------------------------- GL_EXT_draw_buffers2 ------------------------- */
9472
9473 #ifndef GL_EXT_draw_buffers2
9474 #define GL_EXT_draw_buffers2 1
9475
9476 typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
9477 typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index);
9478 typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index);
9479 typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data);
9480 typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data);
9481 typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index);
9482
9483 #define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT)
9484 #define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT)
9485 #define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT)
9486 #define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT)
9487 #define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT)
9488 #define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT)
9489
9490 #define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2)
9491
9492 #endif /* GL_EXT_draw_buffers2 */
9493
9494 /* ------------------------- GL_EXT_draw_instanced ------------------------- */
9495
9496 #ifndef GL_EXT_draw_instanced
9497 #define GL_EXT_draw_instanced 1
9498
9499 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount);
9500 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
9501
9502 #define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT)
9503 #define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT)
9504
9505 #define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced)
9506
9507 #endif /* GL_EXT_draw_instanced */
9508
9509 /* ----------------------- GL_EXT_draw_range_elements ---------------------- */
9510
9511 #ifndef GL_EXT_draw_range_elements
9512 #define GL_EXT_draw_range_elements 1
9513
9514 #define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8
9515 #define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9
9516
9517 typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
9518
9519 #define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT)
9520
9521 #define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements)
9522
9523 #endif /* GL_EXT_draw_range_elements */
9524
9525 /* ---------------------------- GL_EXT_fog_coord --------------------------- */
9526
9527 #ifndef GL_EXT_fog_coord
9528 #define GL_EXT_fog_coord 1
9529
9530 #define GL_FOG_COORDINATE_SOURCE_EXT 0x8450
9531 #define GL_FOG_COORDINATE_EXT 0x8451
9532 #define GL_FRAGMENT_DEPTH_EXT 0x8452
9533 #define GL_CURRENT_FOG_COORDINATE_EXT 0x8453
9534 #define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454
9535 #define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455
9536 #define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456
9537 #define GL_FOG_COORDINATE_ARRAY_EXT 0x8457
9538
9539 typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer);
9540 typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord);
9541 typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);
9542 typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord);
9543 typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);
9544
9545 #define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT)
9546 #define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT)
9547 #define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT)
9548 #define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT)
9549 #define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT)
9550
9551 #define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord)
9552
9553 #endif /* GL_EXT_fog_coord */
9554
9555 /* ------------------------ GL_EXT_fragment_lighting ----------------------- */
9556
9557 #ifndef GL_EXT_fragment_lighting
9558 #define GL_EXT_fragment_lighting 1
9559
9560 #define GL_FRAGMENT_LIGHTING_EXT 0x8400
9561 #define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401
9562 #define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402
9563 #define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403
9564 #define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404
9565 #define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405
9566 #define GL_CURRENT_RASTER_NORMAL_EXT 0x8406
9567 #define GL_LIGHT_ENV_MODE_EXT 0x8407
9568 #define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408
9569 #define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409
9570 #define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A
9571 #define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B
9572 #define GL_FRAGMENT_LIGHT0_EXT 0x840C
9573 #define GL_FRAGMENT_LIGHT7_EXT 0x8413
9574
9575 typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode);
9576 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param);
9577 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params);
9578 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param);
9579 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params);
9580 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param);
9581 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params);
9582 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param);
9583 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params);
9584 typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param);
9585 typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params);
9586 typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param);
9587 typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params);
9588 typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params);
9589 typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params);
9590 typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params);
9591 typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params);
9592 typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param);
9593
9594 #define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT)
9595 #define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT)
9596 #define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT)
9597 #define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT)
9598 #define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT)
9599 #define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT)
9600 #define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT)
9601 #define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT)
9602 #define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT)
9603 #define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT)
9604 #define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT)
9605 #define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT)
9606 #define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT)
9607 #define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT)
9608 #define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT)
9609 #define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT)
9610 #define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT)
9611 #define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT)
9612
9613 #define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting)
9614
9615 #endif /* GL_EXT_fragment_lighting */
9616
9617 /* ------------------------ GL_EXT_framebuffer_blit ------------------------ */
9618
9619 #ifndef GL_EXT_framebuffer_blit
9620 #define GL_EXT_framebuffer_blit 1
9621
9622 #define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6
9623 #define GL_READ_FRAMEBUFFER_EXT 0x8CA8
9624 #define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
9625 #define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
9626
9627 typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
9628
9629 #define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT)
9630
9631 #define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit)
9632
9633 #endif /* GL_EXT_framebuffer_blit */
9634
9635 /* --------------------- GL_EXT_framebuffer_multisample -------------------- */
9636
9637 #ifndef GL_EXT_framebuffer_multisample
9638 #define GL_EXT_framebuffer_multisample 1
9639
9640 #define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB
9641 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
9642 #define GL_MAX_SAMPLES_EXT 0x8D57
9643
9644 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
9645
9646 #define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT)
9647
9648 #define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample)
9649
9650 #endif /* GL_EXT_framebuffer_multisample */
9651
9652 /* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */
9653
9654 #ifndef GL_EXT_framebuffer_multisample_blit_scaled
9655 #define GL_EXT_framebuffer_multisample_blit_scaled 1
9656
9657 #define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA
9658 #define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB
9659
9660 #define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled)
9661
9662 #endif /* GL_EXT_framebuffer_multisample_blit_scaled */
9663
9664 /* ----------------------- GL_EXT_framebuffer_object ----------------------- */
9665
9666 #ifndef GL_EXT_framebuffer_object
9667 #define GL_EXT_framebuffer_object 1
9668
9669 #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
9670 #define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
9671 #define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
9672 #define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
9673 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
9674 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
9675 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
9676 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
9677 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
9678 #define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
9679 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
9680 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
9681 #define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
9682 #define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
9683 #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
9684 #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
9685 #define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
9686 #define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
9687 #define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
9688 #define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
9689 #define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
9690 #define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
9691 #define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
9692 #define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
9693 #define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
9694 #define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
9695 #define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
9696 #define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
9697 #define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
9698 #define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
9699 #define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
9700 #define GL_COLOR_ATTACHMENT13_EXT 0x8CED
9701 #define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
9702 #define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
9703 #define GL_DEPTH_ATTACHMENT_EXT 0x8D00
9704 #define GL_STENCIL_ATTACHMENT_EXT 0x8D20
9705 #define GL_FRAMEBUFFER_EXT 0x8D40
9706 #define GL_RENDERBUFFER_EXT 0x8D41
9707 #define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
9708 #define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
9709 #define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
9710 #define GL_STENCIL_INDEX1_EXT 0x8D46
9711 #define GL_STENCIL_INDEX4_EXT 0x8D47
9712 #define GL_STENCIL_INDEX8_EXT 0x8D48
9713 #define GL_STENCIL_INDEX16_EXT 0x8D49
9714 #define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50
9715 #define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51
9716 #define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52
9717 #define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53
9718 #define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54
9719 #define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55
9720
9721 typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer);
9722 typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer);
9723 typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target);
9724 typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers);
9725 typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers);
9726 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
9727 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
9728 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
9729 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
9730 typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers);
9731 typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers);
9732 typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target);
9733 typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params);
9734 typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
9735 typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer);
9736 typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer);
9737 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
9738
9739 #define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT)
9740 #define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT)
9741 #define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT)
9742 #define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT)
9743 #define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT)
9744 #define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT)
9745 #define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT)
9746 #define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT)
9747 #define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT)
9748 #define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT)
9749 #define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT)
9750 #define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT)
9751 #define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT)
9752 #define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT)
9753 #define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT)
9754 #define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT)
9755 #define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT)
9756
9757 #define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object)
9758
9759 #endif /* GL_EXT_framebuffer_object */
9760
9761 /* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */
9762
9763 #ifndef GL_EXT_framebuffer_sRGB
9764 #define GL_EXT_framebuffer_sRGB 1
9765
9766 #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9
9767 #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA
9768
9769 #define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB)
9770
9771 #endif /* GL_EXT_framebuffer_sRGB */
9772
9773 /* ------------------------ GL_EXT_geometry_shader4 ------------------------ */
9774
9775 #ifndef GL_EXT_geometry_shader4
9776 #define GL_EXT_geometry_shader4 1
9777
9778 #define GL_LINES_ADJACENCY_EXT 0xA
9779 #define GL_LINE_STRIP_ADJACENCY_EXT 0xB
9780 #define GL_TRIANGLES_ADJACENCY_EXT 0xC
9781 #define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD
9782 #define GL_PROGRAM_POINT_SIZE_EXT 0x8642
9783 #define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B
9784 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29
9785 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4
9786 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7
9787 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
9788 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9
9789 #define GL_GEOMETRY_SHADER_EXT 0x8DD9
9790 #define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA
9791 #define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB
9792 #define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC
9793 #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD
9794 #define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE
9795 #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF
9796 #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
9797 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1
9798
9799 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
9800 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
9801 typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);
9802
9803 #define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT)
9804 #define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT)
9805 #define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT)
9806
9807 #define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4)
9808
9809 #endif /* GL_EXT_geometry_shader4 */
9810
9811 /* --------------------- GL_EXT_gpu_program_parameters --------------------- */
9812
9813 #ifndef GL_EXT_gpu_program_parameters
9814 #define GL_EXT_gpu_program_parameters 1
9815
9816 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params);
9817 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params);
9818
9819 #define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT)
9820 #define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT)
9821
9822 #define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters)
9823
9824 #endif /* GL_EXT_gpu_program_parameters */
9825
9826 /* --------------------------- GL_EXT_gpu_shader4 -------------------------- */
9827
9828 #ifndef GL_EXT_gpu_shader4
9829 #define GL_EXT_gpu_shader4 1
9830
9831 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD
9832 #define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0
9833 #define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1
9834 #define GL_SAMPLER_BUFFER_EXT 0x8DC2
9835 #define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3
9836 #define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4
9837 #define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5
9838 #define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6
9839 #define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7
9840 #define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8
9841 #define GL_INT_SAMPLER_1D_EXT 0x8DC9
9842 #define GL_INT_SAMPLER_2D_EXT 0x8DCA
9843 #define GL_INT_SAMPLER_3D_EXT 0x8DCB
9844 #define GL_INT_SAMPLER_CUBE_EXT 0x8DCC
9845 #define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD
9846 #define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE
9847 #define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF
9848 #define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0
9849 #define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1
9850 #define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2
9851 #define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3
9852 #define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4
9853 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5
9854 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6
9855 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7
9856 #define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8
9857
9858 typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name);
9859 typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name);
9860 typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params);
9861 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params);
9862 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params);
9863 typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0);
9864 typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
9865 typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1);
9866 typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
9867 typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
9868 typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
9869 typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
9870 typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
9871 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x);
9872 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v);
9873 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x);
9874 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v);
9875 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y);
9876 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v);
9877 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y);
9878 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v);
9879 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z);
9880 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v);
9881 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z);
9882 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v);
9883 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v);
9884 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
9885 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v);
9886 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v);
9887 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v);
9888 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
9889 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v);
9890 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v);
9891 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
9892
9893 #define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT)
9894 #define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT)
9895 #define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT)
9896 #define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT)
9897 #define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT)
9898 #define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT)
9899 #define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT)
9900 #define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT)
9901 #define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT)
9902 #define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT)
9903 #define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT)
9904 #define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT)
9905 #define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT)
9906 #define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT)
9907 #define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT)
9908 #define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT)
9909 #define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT)
9910 #define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT)
9911 #define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT)
9912 #define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT)
9913 #define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT)
9914 #define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT)
9915 #define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT)
9916 #define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT)
9917 #define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT)
9918 #define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT)
9919 #define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT)
9920 #define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT)
9921 #define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT)
9922 #define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT)
9923 #define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT)
9924 #define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT)
9925 #define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT)
9926 #define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT)
9927
9928 #define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4)
9929
9930 #endif /* GL_EXT_gpu_shader4 */
9931
9932 /* ---------------------------- GL_EXT_histogram --------------------------- */
9933
9934 #ifndef GL_EXT_histogram
9935 #define GL_EXT_histogram 1
9936
9937 #define GL_HISTOGRAM_EXT 0x8024
9938 #define GL_PROXY_HISTOGRAM_EXT 0x8025
9939 #define GL_HISTOGRAM_WIDTH_EXT 0x8026
9940 #define GL_HISTOGRAM_FORMAT_EXT 0x8027
9941 #define GL_HISTOGRAM_RED_SIZE_EXT 0x8028
9942 #define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029
9943 #define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A
9944 #define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B
9945 #define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C
9946 #define GL_HISTOGRAM_SINK_EXT 0x802D
9947 #define GL_MINMAX_EXT 0x802E
9948 #define GL_MINMAX_FORMAT_EXT 0x802F
9949 #define GL_MINMAX_SINK_EXT 0x8030
9950
9951 typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
9952 typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
9953 typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
9954 typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
9955 typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
9956 typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
9957 typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
9958 typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink);
9959 typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target);
9960 typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target);
9961
9962 #define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT)
9963 #define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT)
9964 #define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT)
9965 #define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT)
9966 #define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT)
9967 #define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT)
9968 #define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT)
9969 #define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT)
9970 #define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT)
9971 #define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT)
9972
9973 #define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram)
9974
9975 #endif /* GL_EXT_histogram */
9976
9977 /* ----------------------- GL_EXT_index_array_formats ---------------------- */
9978
9979 #ifndef GL_EXT_index_array_formats
9980 #define GL_EXT_index_array_formats 1
9981
9982 #define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats)
9983
9984 #endif /* GL_EXT_index_array_formats */
9985
9986 /* --------------------------- GL_EXT_index_func --------------------------- */
9987
9988 #ifndef GL_EXT_index_func
9989 #define GL_EXT_index_func 1
9990
9991 typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref);
9992
9993 #define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT)
9994
9995 #define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func)
9996
9997 #endif /* GL_EXT_index_func */
9998
9999 /* ------------------------- GL_EXT_index_material ------------------------- */
10000
10001 #ifndef GL_EXT_index_material
10002 #define GL_EXT_index_material 1
10003
10004 typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode);
10005
10006 #define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT)
10007
10008 #define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material)
10009
10010 #endif /* GL_EXT_index_material */
10011
10012 /* -------------------------- GL_EXT_index_texture ------------------------- */
10013
10014 #ifndef GL_EXT_index_texture
10015 #define GL_EXT_index_texture 1
10016
10017 #define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture)
10018
10019 #endif /* GL_EXT_index_texture */
10020
10021 /* -------------------------- GL_EXT_light_texture ------------------------- */
10022
10023 #ifndef GL_EXT_light_texture
10024 #define GL_EXT_light_texture 1
10025
10026 #define GL_FRAGMENT_MATERIAL_EXT 0x8349
10027 #define GL_FRAGMENT_NORMAL_EXT 0x834A
10028 #define GL_FRAGMENT_COLOR_EXT 0x834C
10029 #define GL_ATTENUATION_EXT 0x834D
10030 #define GL_SHADOW_ATTENUATION_EXT 0x834E
10031 #define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F
10032 #define GL_TEXTURE_LIGHT_EXT 0x8350
10033 #define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351
10034 #define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352
10035
10036 typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode);
10037 typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname);
10038 typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode);
10039
10040 #define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT)
10041 #define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT)
10042 #define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT)
10043
10044 #define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture)
10045
10046 #endif /* GL_EXT_light_texture */
10047
10048 /* ------------------------- GL_EXT_misc_attribute ------------------------- */
10049
10050 #ifndef GL_EXT_misc_attribute
10051 #define GL_EXT_misc_attribute 1
10052
10053 #define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute)
10054
10055 #endif /* GL_EXT_misc_attribute */
10056
10057 /* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */
10058
10059 #ifndef GL_EXT_multi_draw_arrays
10060 #define GL_EXT_multi_draw_arrays 1
10061
10062 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount);
10063 typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount);
10064
10065 #define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT)
10066 #define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT)
10067
10068 #define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays)
10069
10070 #endif /* GL_EXT_multi_draw_arrays */
10071
10072 /* --------------------------- GL_EXT_multisample -------------------------- */
10073
10074 #ifndef GL_EXT_multisample
10075 #define GL_EXT_multisample 1
10076
10077 #define GL_MULTISAMPLE_EXT 0x809D
10078 #define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E
10079 #define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F
10080 #define GL_SAMPLE_MASK_EXT 0x80A0
10081 #define GL_1PASS_EXT 0x80A1
10082 #define GL_2PASS_0_EXT 0x80A2
10083 #define GL_2PASS_1_EXT 0x80A3
10084 #define GL_4PASS_0_EXT 0x80A4
10085 #define GL_4PASS_1_EXT 0x80A5
10086 #define GL_4PASS_2_EXT 0x80A6
10087 #define GL_4PASS_3_EXT 0x80A7
10088 #define GL_SAMPLE_BUFFERS_EXT 0x80A8
10089 #define GL_SAMPLES_EXT 0x80A9
10090 #define GL_SAMPLE_MASK_VALUE_EXT 0x80AA
10091 #define GL_SAMPLE_MASK_INVERT_EXT 0x80AB
10092 #define GL_SAMPLE_PATTERN_EXT 0x80AC
10093 #define GL_MULTISAMPLE_BIT_EXT 0x20000000
10094
10095 typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert);
10096 typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern);
10097
10098 #define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT)
10099 #define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT)
10100
10101 #define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample)
10102
10103 #endif /* GL_EXT_multisample */
10104
10105 /* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */
10106
10107 #ifndef GL_EXT_packed_depth_stencil
10108 #define GL_EXT_packed_depth_stencil 1
10109
10110 #define GL_DEPTH_STENCIL_EXT 0x84F9
10111 #define GL_UNSIGNED_INT_24_8_EXT 0x84FA
10112 #define GL_DEPTH24_STENCIL8_EXT 0x88F0
10113 #define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1
10114
10115 #define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil)
10116
10117 #endif /* GL_EXT_packed_depth_stencil */
10118
10119 /* -------------------------- GL_EXT_packed_float -------------------------- */
10120
10121 #ifndef GL_EXT_packed_float
10122 #define GL_EXT_packed_float 1
10123
10124 #define GL_R11F_G11F_B10F_EXT 0x8C3A
10125 #define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B
10126 #define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C
10127
10128 #define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float)
10129
10130 #endif /* GL_EXT_packed_float */
10131
10132 /* -------------------------- GL_EXT_packed_pixels ------------------------- */
10133
10134 #ifndef GL_EXT_packed_pixels
10135 #define GL_EXT_packed_pixels 1
10136
10137 #define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032
10138 #define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033
10139 #define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034
10140 #define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035
10141 #define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036
10142
10143 #define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels)
10144
10145 #endif /* GL_EXT_packed_pixels */
10146
10147 /* ------------------------ GL_EXT_paletted_texture ------------------------ */
10148
10149 #ifndef GL_EXT_paletted_texture
10150 #define GL_EXT_paletted_texture 1
10151
10152 #define GL_TEXTURE_1D 0x0DE0
10153 #define GL_TEXTURE_2D 0x0DE1
10154 #define GL_PROXY_TEXTURE_1D 0x8063
10155 #define GL_PROXY_TEXTURE_2D 0x8064
10156 #define GL_COLOR_TABLE_FORMAT_EXT 0x80D8
10157 #define GL_COLOR_TABLE_WIDTH_EXT 0x80D9
10158 #define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA
10159 #define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB
10160 #define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC
10161 #define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD
10162 #define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE
10163 #define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF
10164 #define GL_COLOR_INDEX1_EXT 0x80E2
10165 #define GL_COLOR_INDEX2_EXT 0x80E3
10166 #define GL_COLOR_INDEX4_EXT 0x80E4
10167 #define GL_COLOR_INDEX8_EXT 0x80E5
10168 #define GL_COLOR_INDEX12_EXT 0x80E6
10169 #define GL_COLOR_INDEX16_EXT 0x80E7
10170 #define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
10171 #define GL_TEXTURE_CUBE_MAP_ARB 0x8513
10172 #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B
10173
10174 typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
10175 typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data);
10176 typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
10177 typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
10178
10179 #define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT)
10180 #define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT)
10181 #define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT)
10182 #define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT)
10183
10184 #define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture)
10185
10186 #endif /* GL_EXT_paletted_texture */
10187
10188 /* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */
10189
10190 #ifndef GL_EXT_pixel_buffer_object
10191 #define GL_EXT_pixel_buffer_object 1
10192
10193 #define GL_PIXEL_PACK_BUFFER_EXT 0x88EB
10194 #define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC
10195 #define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED
10196 #define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF
10197
10198 #define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object)
10199
10200 #endif /* GL_EXT_pixel_buffer_object */
10201
10202 /* ------------------------- GL_EXT_pixel_transform ------------------------ */
10203
10204 #ifndef GL_EXT_pixel_transform
10205 #define GL_EXT_pixel_transform 1
10206
10207 #define GL_PIXEL_TRANSFORM_2D_EXT 0x8330
10208 #define GL_PIXEL_MAG_FILTER_EXT 0x8331
10209 #define GL_PIXEL_MIN_FILTER_EXT 0x8332
10210 #define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333
10211 #define GL_CUBIC_EXT 0x8334
10212 #define GL_AVERAGE_EXT 0x8335
10213 #define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336
10214 #define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337
10215 #define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338
10216
10217 typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);
10218 typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);
10219 typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param);
10220 typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);
10221 typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param);
10222 typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);
10223
10224 #define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT)
10225 #define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT)
10226 #define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT)
10227 #define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT)
10228 #define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT)
10229 #define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT)
10230
10231 #define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform)
10232
10233 #endif /* GL_EXT_pixel_transform */
10234
10235 /* ------------------- GL_EXT_pixel_transform_color_table ------------------ */
10236
10237 #ifndef GL_EXT_pixel_transform_color_table
10238 #define GL_EXT_pixel_transform_color_table 1
10239
10240 #define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table)
10241
10242 #endif /* GL_EXT_pixel_transform_color_table */
10243
10244 /* ------------------------ GL_EXT_point_parameters ------------------------ */
10245
10246 #ifndef GL_EXT_point_parameters
10247 #define GL_EXT_point_parameters 1
10248
10249 #define GL_POINT_SIZE_MIN_EXT 0x8126
10250 #define GL_POINT_SIZE_MAX_EXT 0x8127
10251 #define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128
10252 #define GL_DISTANCE_ATTENUATION_EXT 0x8129
10253
10254 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
10255 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params);
10256
10257 #define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT)
10258 #define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT)
10259
10260 #define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters)
10261
10262 #endif /* GL_EXT_point_parameters */
10263
10264 /* ------------------------- GL_EXT_polygon_offset ------------------------- */
10265
10266 #ifndef GL_EXT_polygon_offset
10267 #define GL_EXT_polygon_offset 1
10268
10269 #define GL_POLYGON_OFFSET_EXT 0x8037
10270 #define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038
10271 #define GL_POLYGON_OFFSET_BIAS_EXT 0x8039
10272
10273 typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias);
10274
10275 #define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT)
10276
10277 #define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset)
10278
10279 #endif /* GL_EXT_polygon_offset */
10280
10281 /* ---------------------- GL_EXT_polygon_offset_clamp ---------------------- */
10282
10283 #ifndef GL_EXT_polygon_offset_clamp
10284 #define GL_EXT_polygon_offset_clamp 1
10285
10286 #define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B
10287
10288 typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp);
10289
10290 #define glPolygonOffsetClampEXT GLEW_GET_FUN(__glewPolygonOffsetClampEXT)
10291
10292 #define GLEW_EXT_polygon_offset_clamp GLEW_GET_VAR(__GLEW_EXT_polygon_offset_clamp)
10293
10294 #endif /* GL_EXT_polygon_offset_clamp */
10295
10296 /* ----------------------- GL_EXT_post_depth_coverage ---------------------- */
10297
10298 #ifndef GL_EXT_post_depth_coverage
10299 #define GL_EXT_post_depth_coverage 1
10300
10301 #define GLEW_EXT_post_depth_coverage GLEW_GET_VAR(__GLEW_EXT_post_depth_coverage)
10302
10303 #endif /* GL_EXT_post_depth_coverage */
10304
10305 /* ------------------------ GL_EXT_provoking_vertex ------------------------ */
10306
10307 #ifndef GL_EXT_provoking_vertex
10308 #define GL_EXT_provoking_vertex 1
10309
10310 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C
10311 #define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D
10312 #define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E
10313 #define GL_PROVOKING_VERTEX_EXT 0x8E4F
10314
10315 typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode);
10316
10317 #define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT)
10318
10319 #define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex)
10320
10321 #endif /* GL_EXT_provoking_vertex */
10322
10323 /* ----------------------- GL_EXT_raster_multisample ----------------------- */
10324
10325 #ifndef GL_EXT_raster_multisample
10326 #define GL_EXT_raster_multisample 1
10327
10328 #define GL_COLOR_SAMPLES_NV 0x8E20
10329 #define GL_RASTER_MULTISAMPLE_EXT 0x9327
10330 #define GL_RASTER_SAMPLES_EXT 0x9328
10331 #define GL_MAX_RASTER_SAMPLES_EXT 0x9329
10332 #define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A
10333 #define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B
10334 #define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C
10335 #define GL_DEPTH_SAMPLES_NV 0x932D
10336 #define GL_STENCIL_SAMPLES_NV 0x932E
10337 #define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F
10338 #define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330
10339 #define GL_COVERAGE_MODULATION_TABLE_NV 0x9331
10340 #define GL_COVERAGE_MODULATION_NV 0x9332
10341 #define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333
10342
10343 typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components);
10344 typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat* v);
10345 typedef void (GLAPIENTRY * PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat* v);
10346 typedef void (GLAPIENTRY * PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations);
10347
10348 #define glCoverageModulationNV GLEW_GET_FUN(__glewCoverageModulationNV)
10349 #define glCoverageModulationTableNV GLEW_GET_FUN(__glewCoverageModulationTableNV)
10350 #define glGetCoverageModulationTableNV GLEW_GET_FUN(__glewGetCoverageModulationTableNV)
10351 #define glRasterSamplesEXT GLEW_GET_FUN(__glewRasterSamplesEXT)
10352
10353 #define GLEW_EXT_raster_multisample GLEW_GET_VAR(__GLEW_EXT_raster_multisample)
10354
10355 #endif /* GL_EXT_raster_multisample */
10356
10357 /* ------------------------- GL_EXT_rescale_normal ------------------------- */
10358
10359 #ifndef GL_EXT_rescale_normal
10360 #define GL_EXT_rescale_normal 1
10361
10362 #define GL_RESCALE_NORMAL_EXT 0x803A
10363
10364 #define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal)
10365
10366 #endif /* GL_EXT_rescale_normal */
10367
10368 /* -------------------------- GL_EXT_scene_marker -------------------------- */
10369
10370 #ifndef GL_EXT_scene_marker
10371 #define GL_EXT_scene_marker 1
10372
10373 typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void);
10374 typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void);
10375
10376 #define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT)
10377 #define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT)
10378
10379 #define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker)
10380
10381 #endif /* GL_EXT_scene_marker */
10382
10383 /* ------------------------- GL_EXT_secondary_color ------------------------ */
10384
10385 #ifndef GL_EXT_secondary_color
10386 #define GL_EXT_secondary_color 1
10387
10388 #define GL_COLOR_SUM_EXT 0x8458
10389 #define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459
10390 #define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A
10391 #define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B
10392 #define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C
10393 #define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D
10394 #define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E
10395
10396 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue);
10397 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v);
10398 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue);
10399 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v);
10400 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);
10401 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v);
10402 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue);
10403 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v);
10404 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue);
10405 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v);
10406 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);
10407 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v);
10408 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue);
10409 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v);
10410 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);
10411 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v);
10412 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);
10413
10414 #define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT)
10415 #define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT)
10416 #define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT)
10417 #define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT)
10418 #define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT)
10419 #define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT)
10420 #define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT)
10421 #define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT)
10422 #define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT)
10423 #define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT)
10424 #define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT)
10425 #define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT)
10426 #define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT)
10427 #define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT)
10428 #define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT)
10429 #define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT)
10430 #define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT)
10431
10432 #define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color)
10433
10434 #endif /* GL_EXT_secondary_color */
10435
10436 /* --------------------- GL_EXT_separate_shader_objects -------------------- */
10437
10438 #ifndef GL_EXT_separate_shader_objects
10439 #define GL_EXT_separate_shader_objects 1
10440
10441 #define GL_ACTIVE_PROGRAM_EXT 0x8B8D
10442
10443 typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program);
10444 typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar* string);
10445 typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program);
10446
10447 #define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT)
10448 #define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT)
10449 #define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT)
10450
10451 #define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects)
10452
10453 #endif /* GL_EXT_separate_shader_objects */
10454
10455 /* --------------------- GL_EXT_separate_specular_color -------------------- */
10456
10457 #ifndef GL_EXT_separate_specular_color
10458 #define GL_EXT_separate_specular_color 1
10459
10460 #define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8
10461 #define GL_SINGLE_COLOR_EXT 0x81F9
10462 #define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA
10463
10464 #define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color)
10465
10466 #endif /* GL_EXT_separate_specular_color */
10467
10468 /* ------------------- GL_EXT_shader_image_load_formatted ------------------ */
10469
10470 #ifndef GL_EXT_shader_image_load_formatted
10471 #define GL_EXT_shader_image_load_formatted 1
10472
10473 #define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted)
10474
10475 #endif /* GL_EXT_shader_image_load_formatted */
10476
10477 /* --------------------- GL_EXT_shader_image_load_store -------------------- */
10478
10479 #ifndef GL_EXT_shader_image_load_store
10480 #define GL_EXT_shader_image_load_store 1
10481
10482 #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001
10483 #define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002
10484 #define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004
10485 #define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008
10486 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020
10487 #define GL_COMMAND_BARRIER_BIT_EXT 0x00000040
10488 #define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080
10489 #define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100
10490 #define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200
10491 #define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400
10492 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800
10493 #define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000
10494 #define GL_MAX_IMAGE_UNITS_EXT 0x8F38
10495 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39
10496 #define GL_IMAGE_BINDING_NAME_EXT 0x8F3A
10497 #define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B
10498 #define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C
10499 #define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D
10500 #define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E
10501 #define GL_IMAGE_1D_EXT 0x904C
10502 #define GL_IMAGE_2D_EXT 0x904D
10503 #define GL_IMAGE_3D_EXT 0x904E
10504 #define GL_IMAGE_2D_RECT_EXT 0x904F
10505 #define GL_IMAGE_CUBE_EXT 0x9050
10506 #define GL_IMAGE_BUFFER_EXT 0x9051
10507 #define GL_IMAGE_1D_ARRAY_EXT 0x9052
10508 #define GL_IMAGE_2D_ARRAY_EXT 0x9053
10509 #define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054
10510 #define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055
10511 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056
10512 #define GL_INT_IMAGE_1D_EXT 0x9057
10513 #define GL_INT_IMAGE_2D_EXT 0x9058
10514 #define GL_INT_IMAGE_3D_EXT 0x9059
10515 #define GL_INT_IMAGE_2D_RECT_EXT 0x905A
10516 #define GL_INT_IMAGE_CUBE_EXT 0x905B
10517 #define GL_INT_IMAGE_BUFFER_EXT 0x905C
10518 #define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D
10519 #define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E
10520 #define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F
10521 #define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060
10522 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061
10523 #define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062
10524 #define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063
10525 #define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064
10526 #define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065
10527 #define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066
10528 #define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067
10529 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068
10530 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069
10531 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A
10532 #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B
10533 #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C
10534 #define GL_MAX_IMAGE_SAMPLES_EXT 0x906D
10535 #define GL_IMAGE_BINDING_FORMAT_EXT 0x906E
10536 #define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF
10537
10538 typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format);
10539 typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers);
10540
10541 #define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT)
10542 #define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT)
10543
10544 #define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store)
10545
10546 #endif /* GL_EXT_shader_image_load_store */
10547
10548 /* ----------------------- GL_EXT_shader_integer_mix ----------------------- */
10549
10550 #ifndef GL_EXT_shader_integer_mix
10551 #define GL_EXT_shader_integer_mix 1
10552
10553 #define GLEW_EXT_shader_integer_mix GLEW_GET_VAR(__GLEW_EXT_shader_integer_mix)
10554
10555 #endif /* GL_EXT_shader_integer_mix */
10556
10557 /* -------------------------- GL_EXT_shadow_funcs -------------------------- */
10558
10559 #ifndef GL_EXT_shadow_funcs
10560 #define GL_EXT_shadow_funcs 1
10561
10562 #define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs)
10563
10564 #endif /* GL_EXT_shadow_funcs */
10565
10566 /* --------------------- GL_EXT_shared_texture_palette --------------------- */
10567
10568 #ifndef GL_EXT_shared_texture_palette
10569 #define GL_EXT_shared_texture_palette 1
10570
10571 #define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB
10572
10573 #define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette)
10574
10575 #endif /* GL_EXT_shared_texture_palette */
10576
10577 /* ------------------------- GL_EXT_sparse_texture2 ------------------------ */
10578
10579 #ifndef GL_EXT_sparse_texture2
10580 #define GL_EXT_sparse_texture2 1
10581
10582 #define GLEW_EXT_sparse_texture2 GLEW_GET_VAR(__GLEW_EXT_sparse_texture2)
10583
10584 #endif /* GL_EXT_sparse_texture2 */
10585
10586 /* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */
10587
10588 #ifndef GL_EXT_stencil_clear_tag
10589 #define GL_EXT_stencil_clear_tag 1
10590
10591 #define GL_STENCIL_TAG_BITS_EXT 0x88F2
10592 #define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3
10593
10594 #define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag)
10595
10596 #endif /* GL_EXT_stencil_clear_tag */
10597
10598 /* ------------------------ GL_EXT_stencil_two_side ------------------------ */
10599
10600 #ifndef GL_EXT_stencil_two_side
10601 #define GL_EXT_stencil_two_side 1
10602
10603 #define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910
10604 #define GL_ACTIVE_STENCIL_FACE_EXT 0x8911
10605
10606 typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face);
10607
10608 #define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT)
10609
10610 #define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side)
10611
10612 #endif /* GL_EXT_stencil_two_side */
10613
10614 /* -------------------------- GL_EXT_stencil_wrap -------------------------- */
10615
10616 #ifndef GL_EXT_stencil_wrap
10617 #define GL_EXT_stencil_wrap 1
10618
10619 #define GL_INCR_WRAP_EXT 0x8507
10620 #define GL_DECR_WRAP_EXT 0x8508
10621
10622 #define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap)
10623
10624 #endif /* GL_EXT_stencil_wrap */
10625
10626 /* --------------------------- GL_EXT_subtexture --------------------------- */
10627
10628 #ifndef GL_EXT_subtexture
10629 #define GL_EXT_subtexture 1
10630
10631 typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
10632 typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
10633 typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
10634
10635 #define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT)
10636 #define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT)
10637 #define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT)
10638
10639 #define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture)
10640
10641 #endif /* GL_EXT_subtexture */
10642
10643 /* ----------------------------- GL_EXT_texture ---------------------------- */
10644
10645 #ifndef GL_EXT_texture
10646 #define GL_EXT_texture 1
10647
10648 #define GL_ALPHA4_EXT 0x803B
10649 #define GL_ALPHA8_EXT 0x803C
10650 #define GL_ALPHA12_EXT 0x803D
10651 #define GL_ALPHA16_EXT 0x803E
10652 #define GL_LUMINANCE4_EXT 0x803F
10653 #define GL_LUMINANCE8_EXT 0x8040
10654 #define GL_LUMINANCE12_EXT 0x8041
10655 #define GL_LUMINANCE16_EXT 0x8042
10656 #define GL_LUMINANCE4_ALPHA4_EXT 0x8043
10657 #define GL_LUMINANCE6_ALPHA2_EXT 0x8044
10658 #define GL_LUMINANCE8_ALPHA8_EXT 0x8045
10659 #define GL_LUMINANCE12_ALPHA4_EXT 0x8046
10660 #define GL_LUMINANCE12_ALPHA12_EXT 0x8047
10661 #define GL_LUMINANCE16_ALPHA16_EXT 0x8048
10662 #define GL_INTENSITY_EXT 0x8049
10663 #define GL_INTENSITY4_EXT 0x804A
10664 #define GL_INTENSITY8_EXT 0x804B
10665 #define GL_INTENSITY12_EXT 0x804C
10666 #define GL_INTENSITY16_EXT 0x804D
10667 #define GL_RGB2_EXT 0x804E
10668 #define GL_RGB4_EXT 0x804F
10669 #define GL_RGB5_EXT 0x8050
10670 #define GL_RGB8_EXT 0x8051
10671 #define GL_RGB10_EXT 0x8052
10672 #define GL_RGB12_EXT 0x8053
10673 #define GL_RGB16_EXT 0x8054
10674 #define GL_RGBA2_EXT 0x8055
10675 #define GL_RGBA4_EXT 0x8056
10676 #define GL_RGB5_A1_EXT 0x8057
10677 #define GL_RGBA8_EXT 0x8058
10678 #define GL_RGB10_A2_EXT 0x8059
10679 #define GL_RGBA12_EXT 0x805A
10680 #define GL_RGBA16_EXT 0x805B
10681 #define GL_TEXTURE_RED_SIZE_EXT 0x805C
10682 #define GL_TEXTURE_GREEN_SIZE_EXT 0x805D
10683 #define GL_TEXTURE_BLUE_SIZE_EXT 0x805E
10684 #define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F
10685 #define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060
10686 #define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061
10687 #define GL_REPLACE_EXT 0x8062
10688 #define GL_PROXY_TEXTURE_1D_EXT 0x8063
10689 #define GL_PROXY_TEXTURE_2D_EXT 0x8064
10690
10691 #define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture)
10692
10693 #endif /* GL_EXT_texture */
10694
10695 /* ---------------------------- GL_EXT_texture3D --------------------------- */
10696
10697 #ifndef GL_EXT_texture3D
10698 #define GL_EXT_texture3D 1
10699
10700 #define GL_PACK_SKIP_IMAGES_EXT 0x806B
10701 #define GL_PACK_IMAGE_HEIGHT_EXT 0x806C
10702 #define GL_UNPACK_SKIP_IMAGES_EXT 0x806D
10703 #define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E
10704 #define GL_TEXTURE_3D_EXT 0x806F
10705 #define GL_PROXY_TEXTURE_3D_EXT 0x8070
10706 #define GL_TEXTURE_DEPTH_EXT 0x8071
10707 #define GL_TEXTURE_WRAP_R_EXT 0x8072
10708 #define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073
10709
10710 typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
10711
10712 #define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT)
10713
10714 #define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D)
10715
10716 #endif /* GL_EXT_texture3D */
10717
10718 /* -------------------------- GL_EXT_texture_array ------------------------- */
10719
10720 #ifndef GL_EXT_texture_array
10721 #define GL_EXT_texture_array 1
10722
10723 #define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E
10724 #define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF
10725 #define GL_TEXTURE_1D_ARRAY_EXT 0x8C18
10726 #define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19
10727 #define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A
10728 #define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B
10729 #define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C
10730 #define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D
10731
10732 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
10733
10734 #define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT)
10735
10736 #define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array)
10737
10738 #endif /* GL_EXT_texture_array */
10739
10740 /* ---------------------- GL_EXT_texture_buffer_object --------------------- */
10741
10742 #ifndef GL_EXT_texture_buffer_object
10743 #define GL_EXT_texture_buffer_object 1
10744
10745 #define GL_TEXTURE_BUFFER_EXT 0x8C2A
10746 #define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B
10747 #define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C
10748 #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D
10749 #define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E
10750
10751 typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer);
10752
10753 #define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT)
10754
10755 #define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object)
10756
10757 #endif /* GL_EXT_texture_buffer_object */
10758
10759 /* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */
10760
10761 #ifndef GL_EXT_texture_compression_dxt1
10762 #define GL_EXT_texture_compression_dxt1 1
10763
10764 #define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1)
10765
10766 #endif /* GL_EXT_texture_compression_dxt1 */
10767
10768 /* -------------------- GL_EXT_texture_compression_latc -------------------- */
10769
10770 #ifndef GL_EXT_texture_compression_latc
10771 #define GL_EXT_texture_compression_latc 1
10772
10773 #define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70
10774 #define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71
10775 #define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72
10776 #define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73
10777
10778 #define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc)
10779
10780 #endif /* GL_EXT_texture_compression_latc */
10781
10782 /* -------------------- GL_EXT_texture_compression_rgtc -------------------- */
10783
10784 #ifndef GL_EXT_texture_compression_rgtc
10785 #define GL_EXT_texture_compression_rgtc 1
10786
10787 #define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB
10788 #define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC
10789 #define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD
10790 #define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE
10791
10792 #define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc)
10793
10794 #endif /* GL_EXT_texture_compression_rgtc */
10795
10796 /* -------------------- GL_EXT_texture_compression_s3tc -------------------- */
10797
10798 #ifndef GL_EXT_texture_compression_s3tc
10799 #define GL_EXT_texture_compression_s3tc 1
10800
10801 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
10802 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
10803 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
10804 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
10805
10806 #define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc)
10807
10808 #endif /* GL_EXT_texture_compression_s3tc */
10809
10810 /* ------------------------ GL_EXT_texture_cube_map ------------------------ */
10811
10812 #ifndef GL_EXT_texture_cube_map
10813 #define GL_EXT_texture_cube_map 1
10814
10815 #define GL_NORMAL_MAP_EXT 0x8511
10816 #define GL_REFLECTION_MAP_EXT 0x8512
10817 #define GL_TEXTURE_CUBE_MAP_EXT 0x8513
10818 #define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514
10819 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515
10820 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516
10821 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517
10822 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518
10823 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519
10824 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A
10825 #define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B
10826 #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C
10827
10828 #define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map)
10829
10830 #endif /* GL_EXT_texture_cube_map */
10831
10832 /* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */
10833
10834 #ifndef GL_EXT_texture_edge_clamp
10835 #define GL_EXT_texture_edge_clamp 1
10836
10837 #define GL_CLAMP_TO_EDGE_EXT 0x812F
10838
10839 #define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp)
10840
10841 #endif /* GL_EXT_texture_edge_clamp */
10842
10843 /* --------------------------- GL_EXT_texture_env -------------------------- */
10844
10845 #ifndef GL_EXT_texture_env
10846 #define GL_EXT_texture_env 1
10847
10848 #define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env)
10849
10850 #endif /* GL_EXT_texture_env */
10851
10852 /* ------------------------- GL_EXT_texture_env_add ------------------------ */
10853
10854 #ifndef GL_EXT_texture_env_add
10855 #define GL_EXT_texture_env_add 1
10856
10857 #define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add)
10858
10859 #endif /* GL_EXT_texture_env_add */
10860
10861 /* ----------------------- GL_EXT_texture_env_combine ---------------------- */
10862
10863 #ifndef GL_EXT_texture_env_combine
10864 #define GL_EXT_texture_env_combine 1
10865
10866 #define GL_COMBINE_EXT 0x8570
10867 #define GL_COMBINE_RGB_EXT 0x8571
10868 #define GL_COMBINE_ALPHA_EXT 0x8572
10869 #define GL_RGB_SCALE_EXT 0x8573
10870 #define GL_ADD_SIGNED_EXT 0x8574
10871 #define GL_INTERPOLATE_EXT 0x8575
10872 #define GL_CONSTANT_EXT 0x8576
10873 #define GL_PRIMARY_COLOR_EXT 0x8577
10874 #define GL_PREVIOUS_EXT 0x8578
10875 #define GL_SOURCE0_RGB_EXT 0x8580
10876 #define GL_SOURCE1_RGB_EXT 0x8581
10877 #define GL_SOURCE2_RGB_EXT 0x8582
10878 #define GL_SOURCE0_ALPHA_EXT 0x8588
10879 #define GL_SOURCE1_ALPHA_EXT 0x8589
10880 #define GL_SOURCE2_ALPHA_EXT 0x858A
10881 #define GL_OPERAND0_RGB_EXT 0x8590
10882 #define GL_OPERAND1_RGB_EXT 0x8591
10883 #define GL_OPERAND2_RGB_EXT 0x8592
10884 #define GL_OPERAND0_ALPHA_EXT 0x8598
10885 #define GL_OPERAND1_ALPHA_EXT 0x8599
10886 #define GL_OPERAND2_ALPHA_EXT 0x859A
10887
10888 #define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine)
10889
10890 #endif /* GL_EXT_texture_env_combine */
10891
10892 /* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */
10893
10894 #ifndef GL_EXT_texture_env_dot3
10895 #define GL_EXT_texture_env_dot3 1
10896
10897 #define GL_DOT3_RGB_EXT 0x8740
10898 #define GL_DOT3_RGBA_EXT 0x8741
10899
10900 #define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3)
10901
10902 #endif /* GL_EXT_texture_env_dot3 */
10903
10904 /* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */
10905
10906 #ifndef GL_EXT_texture_filter_anisotropic
10907 #define GL_EXT_texture_filter_anisotropic 1
10908
10909 #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
10910 #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
10911
10912 #define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic)
10913
10914 #endif /* GL_EXT_texture_filter_anisotropic */
10915
10916 /* ---------------------- GL_EXT_texture_filter_minmax --------------------- */
10917
10918 #ifndef GL_EXT_texture_filter_minmax
10919 #define GL_EXT_texture_filter_minmax 1
10920
10921 #define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366
10922 #define GL_WEIGHTED_AVERAGE_EXT 0x9367
10923
10924 #define GLEW_EXT_texture_filter_minmax GLEW_GET_VAR(__GLEW_EXT_texture_filter_minmax)
10925
10926 #endif /* GL_EXT_texture_filter_minmax */
10927
10928 /* ------------------------- GL_EXT_texture_integer ------------------------ */
10929
10930 #ifndef GL_EXT_texture_integer
10931 #define GL_EXT_texture_integer 1
10932
10933 #define GL_RGBA32UI_EXT 0x8D70
10934 #define GL_RGB32UI_EXT 0x8D71
10935 #define GL_ALPHA32UI_EXT 0x8D72
10936 #define GL_INTENSITY32UI_EXT 0x8D73
10937 #define GL_LUMINANCE32UI_EXT 0x8D74
10938 #define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75
10939 #define GL_RGBA16UI_EXT 0x8D76
10940 #define GL_RGB16UI_EXT 0x8D77
10941 #define GL_ALPHA16UI_EXT 0x8D78
10942 #define GL_INTENSITY16UI_EXT 0x8D79
10943 #define GL_LUMINANCE16UI_EXT 0x8D7A
10944 #define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B
10945 #define GL_RGBA8UI_EXT 0x8D7C
10946 #define GL_RGB8UI_EXT 0x8D7D
10947 #define GL_ALPHA8UI_EXT 0x8D7E
10948 #define GL_INTENSITY8UI_EXT 0x8D7F
10949 #define GL_LUMINANCE8UI_EXT 0x8D80
10950 #define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81
10951 #define GL_RGBA32I_EXT 0x8D82
10952 #define GL_RGB32I_EXT 0x8D83
10953 #define GL_ALPHA32I_EXT 0x8D84
10954 #define GL_INTENSITY32I_EXT 0x8D85
10955 #define GL_LUMINANCE32I_EXT 0x8D86
10956 #define GL_LUMINANCE_ALPHA32I_EXT 0x8D87
10957 #define GL_RGBA16I_EXT 0x8D88
10958 #define GL_RGB16I_EXT 0x8D89
10959 #define GL_ALPHA16I_EXT 0x8D8A
10960 #define GL_INTENSITY16I_EXT 0x8D8B
10961 #define GL_LUMINANCE16I_EXT 0x8D8C
10962 #define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D
10963 #define GL_RGBA8I_EXT 0x8D8E
10964 #define GL_RGB8I_EXT 0x8D8F
10965 #define GL_ALPHA8I_EXT 0x8D90
10966 #define GL_INTENSITY8I_EXT 0x8D91
10967 #define GL_LUMINANCE8I_EXT 0x8D92
10968 #define GL_LUMINANCE_ALPHA8I_EXT 0x8D93
10969 #define GL_RED_INTEGER_EXT 0x8D94
10970 #define GL_GREEN_INTEGER_EXT 0x8D95
10971 #define GL_BLUE_INTEGER_EXT 0x8D96
10972 #define GL_ALPHA_INTEGER_EXT 0x8D97
10973 #define GL_RGB_INTEGER_EXT 0x8D98
10974 #define GL_RGBA_INTEGER_EXT 0x8D99
10975 #define GL_BGR_INTEGER_EXT 0x8D9A
10976 #define GL_BGRA_INTEGER_EXT 0x8D9B
10977 #define GL_LUMINANCE_INTEGER_EXT 0x8D9C
10978 #define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D
10979 #define GL_RGBA_INTEGER_MODE_EXT 0x8D9E
10980
10981 typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha);
10982 typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha);
10983 typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
10984 typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params);
10985 typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);
10986 typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params);
10987
10988 #define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT)
10989 #define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT)
10990 #define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT)
10991 #define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT)
10992 #define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT)
10993 #define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT)
10994
10995 #define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer)
10996
10997 #endif /* GL_EXT_texture_integer */
10998
10999 /* ------------------------ GL_EXT_texture_lod_bias ------------------------ */
11000
11001 #ifndef GL_EXT_texture_lod_bias
11002 #define GL_EXT_texture_lod_bias 1
11003
11004 #define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD
11005 #define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500
11006 #define GL_TEXTURE_LOD_BIAS_EXT 0x8501
11007
11008 #define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias)
11009
11010 #endif /* GL_EXT_texture_lod_bias */
11011
11012 /* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */
11013
11014 #ifndef GL_EXT_texture_mirror_clamp
11015 #define GL_EXT_texture_mirror_clamp 1
11016
11017 #define GL_MIRROR_CLAMP_EXT 0x8742
11018 #define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743
11019 #define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912
11020
11021 #define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp)
11022
11023 #endif /* GL_EXT_texture_mirror_clamp */
11024
11025 /* ------------------------- GL_EXT_texture_object ------------------------- */
11026
11027 #ifndef GL_EXT_texture_object
11028 #define GL_EXT_texture_object 1
11029
11030 #define GL_TEXTURE_PRIORITY_EXT 0x8066
11031 #define GL_TEXTURE_RESIDENT_EXT 0x8067
11032 #define GL_TEXTURE_1D_BINDING_EXT 0x8068
11033 #define GL_TEXTURE_2D_BINDING_EXT 0x8069
11034 #define GL_TEXTURE_3D_BINDING_EXT 0x806A
11035
11036 typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences);
11037 typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture);
11038 typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures);
11039 typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures);
11040 typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture);
11041 typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities);
11042
11043 #define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT)
11044 #define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT)
11045 #define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT)
11046 #define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT)
11047 #define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT)
11048 #define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT)
11049
11050 #define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object)
11051
11052 #endif /* GL_EXT_texture_object */
11053
11054 /* --------------------- GL_EXT_texture_perturb_normal --------------------- */
11055
11056 #ifndef GL_EXT_texture_perturb_normal
11057 #define GL_EXT_texture_perturb_normal 1
11058
11059 #define GL_PERTURB_EXT 0x85AE
11060 #define GL_TEXTURE_NORMAL_EXT 0x85AF
11061
11062 typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode);
11063
11064 #define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT)
11065
11066 #define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal)
11067
11068 #endif /* GL_EXT_texture_perturb_normal */
11069
11070 /* ------------------------ GL_EXT_texture_rectangle ----------------------- */
11071
11072 #ifndef GL_EXT_texture_rectangle
11073 #define GL_EXT_texture_rectangle 1
11074
11075 #define GL_TEXTURE_RECTANGLE_EXT 0x84F5
11076 #define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6
11077 #define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7
11078 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8
11079
11080 #define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle)
11081
11082 #endif /* GL_EXT_texture_rectangle */
11083
11084 /* -------------------------- GL_EXT_texture_sRGB -------------------------- */
11085
11086 #ifndef GL_EXT_texture_sRGB
11087 #define GL_EXT_texture_sRGB 1
11088
11089 #define GL_SRGB_EXT 0x8C40
11090 #define GL_SRGB8_EXT 0x8C41
11091 #define GL_SRGB_ALPHA_EXT 0x8C42
11092 #define GL_SRGB8_ALPHA8_EXT 0x8C43
11093 #define GL_SLUMINANCE_ALPHA_EXT 0x8C44
11094 #define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45
11095 #define GL_SLUMINANCE_EXT 0x8C46
11096 #define GL_SLUMINANCE8_EXT 0x8C47
11097 #define GL_COMPRESSED_SRGB_EXT 0x8C48
11098 #define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49
11099 #define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A
11100 #define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B
11101 #define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C
11102 #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
11103 #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
11104 #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
11105
11106 #define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB)
11107
11108 #endif /* GL_EXT_texture_sRGB */
11109
11110 /* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */
11111
11112 #ifndef GL_EXT_texture_sRGB_decode
11113 #define GL_EXT_texture_sRGB_decode 1
11114
11115 #define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48
11116 #define GL_DECODE_EXT 0x8A49
11117 #define GL_SKIP_DECODE_EXT 0x8A4A
11118
11119 #define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode)
11120
11121 #endif /* GL_EXT_texture_sRGB_decode */
11122
11123 /* --------------------- GL_EXT_texture_shared_exponent -------------------- */
11124
11125 #ifndef GL_EXT_texture_shared_exponent
11126 #define GL_EXT_texture_shared_exponent 1
11127
11128 #define GL_RGB9_E5_EXT 0x8C3D
11129 #define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E
11130 #define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F
11131
11132 #define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent)
11133
11134 #endif /* GL_EXT_texture_shared_exponent */
11135
11136 /* -------------------------- GL_EXT_texture_snorm ------------------------- */
11137
11138 #ifndef GL_EXT_texture_snorm
11139 #define GL_EXT_texture_snorm 1
11140
11141 #define GL_RED_SNORM 0x8F90
11142 #define GL_RG_SNORM 0x8F91
11143 #define GL_RGB_SNORM 0x8F92
11144 #define GL_RGBA_SNORM 0x8F93
11145 #define GL_R8_SNORM 0x8F94
11146 #define GL_RG8_SNORM 0x8F95
11147 #define GL_RGB8_SNORM 0x8F96
11148 #define GL_RGBA8_SNORM 0x8F97
11149 #define GL_R16_SNORM 0x8F98
11150 #define GL_RG16_SNORM 0x8F99
11151 #define GL_RGB16_SNORM 0x8F9A
11152 #define GL_RGBA16_SNORM 0x8F9B
11153 #define GL_SIGNED_NORMALIZED 0x8F9C
11154 #define GL_ALPHA_SNORM 0x9010
11155 #define GL_LUMINANCE_SNORM 0x9011
11156 #define GL_LUMINANCE_ALPHA_SNORM 0x9012
11157 #define GL_INTENSITY_SNORM 0x9013
11158 #define GL_ALPHA8_SNORM 0x9014
11159 #define GL_LUMINANCE8_SNORM 0x9015
11160 #define GL_LUMINANCE8_ALPHA8_SNORM 0x9016
11161 #define GL_INTENSITY8_SNORM 0x9017
11162 #define GL_ALPHA16_SNORM 0x9018
11163 #define GL_LUMINANCE16_SNORM 0x9019
11164 #define GL_LUMINANCE16_ALPHA16_SNORM 0x901A
11165 #define GL_INTENSITY16_SNORM 0x901B
11166
11167 #define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm)
11168
11169 #endif /* GL_EXT_texture_snorm */
11170
11171 /* ------------------------- GL_EXT_texture_swizzle ------------------------ */
11172
11173 #ifndef GL_EXT_texture_swizzle
11174 #define GL_EXT_texture_swizzle 1
11175
11176 #define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42
11177 #define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43
11178 #define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44
11179 #define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45
11180 #define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46
11181
11182 #define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle)
11183
11184 #endif /* GL_EXT_texture_swizzle */
11185
11186 /* --------------------------- GL_EXT_timer_query -------------------------- */
11187
11188 #ifndef GL_EXT_timer_query
11189 #define GL_EXT_timer_query 1
11190
11191 #define GL_TIME_ELAPSED_EXT 0x88BF
11192
11193 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params);
11194 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params);
11195
11196 #define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT)
11197 #define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT)
11198
11199 #define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query)
11200
11201 #endif /* GL_EXT_timer_query */
11202
11203 /* ----------------------- GL_EXT_transform_feedback ----------------------- */
11204
11205 #ifndef GL_EXT_transform_feedback
11206 #define GL_EXT_transform_feedback 1
11207
11208 #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76
11209 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F
11210 #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80
11211 #define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83
11212 #define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84
11213 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85
11214 #define GL_PRIMITIVES_GENERATED_EXT 0x8C87
11215 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88
11216 #define GL_RASTERIZER_DISCARD_EXT 0x8C89
11217 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A
11218 #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B
11219 #define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C
11220 #define GL_SEPARATE_ATTRIBS_EXT 0x8C8D
11221 #define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E
11222 #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F
11223
11224 typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode);
11225 typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer);
11226 typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);
11227 typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
11228 typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void);
11229 typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name);
11230 typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode);
11231
11232 #define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT)
11233 #define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT)
11234 #define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT)
11235 #define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT)
11236 #define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT)
11237 #define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT)
11238 #define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT)
11239
11240 #define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback)
11241
11242 #endif /* GL_EXT_transform_feedback */
11243
11244 /* -------------------------- GL_EXT_vertex_array -------------------------- */
11245
11246 #ifndef GL_EXT_vertex_array
11247 #define GL_EXT_vertex_array 1
11248
11249 #define GL_DOUBLE_EXT 0x140A
11250 #define GL_VERTEX_ARRAY_EXT 0x8074
11251 #define GL_NORMAL_ARRAY_EXT 0x8075
11252 #define GL_COLOR_ARRAY_EXT 0x8076
11253 #define GL_INDEX_ARRAY_EXT 0x8077
11254 #define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
11255 #define GL_EDGE_FLAG_ARRAY_EXT 0x8079
11256 #define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
11257 #define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
11258 #define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
11259 #define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
11260 #define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
11261 #define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
11262 #define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
11263 #define GL_COLOR_ARRAY_SIZE_EXT 0x8081
11264 #define GL_COLOR_ARRAY_TYPE_EXT 0x8082
11265 #define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
11266 #define GL_COLOR_ARRAY_COUNT_EXT 0x8084
11267 #define GL_INDEX_ARRAY_TYPE_EXT 0x8085
11268 #define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
11269 #define GL_INDEX_ARRAY_COUNT_EXT 0x8087
11270 #define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
11271 #define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
11272 #define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
11273 #define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
11274 #define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
11275 #define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
11276 #define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
11277 #define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
11278 #define GL_COLOR_ARRAY_POINTER_EXT 0x8090
11279 #define GL_INDEX_ARRAY_POINTER_EXT 0x8091
11280 #define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
11281 #define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
11282
11283 typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i);
11284 typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);
11285 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);
11286 typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer);
11287 typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer);
11288 typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer);
11289 typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);
11290 typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);
11291
11292 #define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT)
11293 #define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT)
11294 #define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT)
11295 #define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT)
11296 #define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT)
11297 #define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT)
11298 #define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT)
11299 #define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT)
11300
11301 #define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array)
11302
11303 #endif /* GL_EXT_vertex_array */
11304
11305 /* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */
11306
11307 #ifndef GL_EXT_vertex_array_bgra
11308 #define GL_EXT_vertex_array_bgra 1
11309
11310 #define GL_BGRA 0x80E1
11311
11312 #define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra)
11313
11314 #endif /* GL_EXT_vertex_array_bgra */
11315
11316 /* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */
11317
11318 #ifndef GL_EXT_vertex_attrib_64bit
11319 #define GL_EXT_vertex_attrib_64bit 1
11320
11321 #define GL_DOUBLE_MAT2_EXT 0x8F46
11322 #define GL_DOUBLE_MAT3_EXT 0x8F47
11323 #define GL_DOUBLE_MAT4_EXT 0x8F48
11324 #define GL_DOUBLE_MAT2x3_EXT 0x8F49
11325 #define GL_DOUBLE_MAT2x4_EXT 0x8F4A
11326 #define GL_DOUBLE_MAT3x2_EXT 0x8F4B
11327 #define GL_DOUBLE_MAT3x4_EXT 0x8F4C
11328 #define GL_DOUBLE_MAT4x2_EXT 0x8F4D
11329 #define GL_DOUBLE_MAT4x3_EXT 0x8F4E
11330 #define GL_DOUBLE_VEC2_EXT 0x8FFC
11331 #define GL_DOUBLE_VEC3_EXT 0x8FFD
11332 #define GL_DOUBLE_VEC4_EXT 0x8FFE
11333
11334 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params);
11335 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);
11336 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x);
11337 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v);
11338 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y);
11339 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v);
11340 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
11341 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v);
11342 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
11343 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v);
11344 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
11345
11346 #define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT)
11347 #define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT)
11348 #define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT)
11349 #define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT)
11350 #define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT)
11351 #define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT)
11352 #define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT)
11353 #define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT)
11354 #define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT)
11355 #define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT)
11356 #define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT)
11357
11358 #define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit)
11359
11360 #endif /* GL_EXT_vertex_attrib_64bit */
11361
11362 /* -------------------------- GL_EXT_vertex_shader ------------------------- */
11363
11364 #ifndef GL_EXT_vertex_shader
11365 #define GL_EXT_vertex_shader 1
11366
11367 #define GL_VERTEX_SHADER_EXT 0x8780
11368 #define GL_VERTEX_SHADER_BINDING_EXT 0x8781
11369 #define GL_OP_INDEX_EXT 0x8782
11370 #define GL_OP_NEGATE_EXT 0x8783
11371 #define GL_OP_DOT3_EXT 0x8784
11372 #define GL_OP_DOT4_EXT 0x8785
11373 #define GL_OP_MUL_EXT 0x8786
11374 #define GL_OP_ADD_EXT 0x8787
11375 #define GL_OP_MADD_EXT 0x8788
11376 #define GL_OP_FRAC_EXT 0x8789
11377 #define GL_OP_MAX_EXT 0x878A
11378 #define GL_OP_MIN_EXT 0x878B
11379 #define GL_OP_SET_GE_EXT 0x878C
11380 #define GL_OP_SET_LT_EXT 0x878D
11381 #define GL_OP_CLAMP_EXT 0x878E
11382 #define GL_OP_FLOOR_EXT 0x878F
11383 #define GL_OP_ROUND_EXT 0x8790
11384 #define GL_OP_EXP_BASE_2_EXT 0x8791
11385 #define GL_OP_LOG_BASE_2_EXT 0x8792
11386 #define GL_OP_POWER_EXT 0x8793
11387 #define GL_OP_RECIP_EXT 0x8794
11388 #define GL_OP_RECIP_SQRT_EXT 0x8795
11389 #define GL_OP_SUB_EXT 0x8796
11390 #define GL_OP_CROSS_PRODUCT_EXT 0x8797
11391 #define GL_OP_MULTIPLY_MATRIX_EXT 0x8798
11392 #define GL_OP_MOV_EXT 0x8799
11393 #define GL_OUTPUT_VERTEX_EXT 0x879A
11394 #define GL_OUTPUT_COLOR0_EXT 0x879B
11395 #define GL_OUTPUT_COLOR1_EXT 0x879C
11396 #define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D
11397 #define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E
11398 #define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F
11399 #define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0
11400 #define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1
11401 #define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2
11402 #define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3
11403 #define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4
11404 #define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5
11405 #define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6
11406 #define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7
11407 #define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8
11408 #define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9
11409 #define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA
11410 #define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB
11411 #define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC
11412 #define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD
11413 #define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE
11414 #define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF
11415 #define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0
11416 #define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1
11417 #define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2
11418 #define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3
11419 #define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4
11420 #define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5
11421 #define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6
11422 #define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7
11423 #define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8
11424 #define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9
11425 #define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA
11426 #define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB
11427 #define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC
11428 #define GL_OUTPUT_FOG_EXT 0x87BD
11429 #define GL_SCALAR_EXT 0x87BE
11430 #define GL_VECTOR_EXT 0x87BF
11431 #define GL_MATRIX_EXT 0x87C0
11432 #define GL_VARIANT_EXT 0x87C1
11433 #define GL_INVARIANT_EXT 0x87C2
11434 #define GL_LOCAL_CONSTANT_EXT 0x87C3
11435 #define GL_LOCAL_EXT 0x87C4
11436 #define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5
11437 #define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6
11438 #define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7
11439 #define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8
11440 #define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9
11441 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA
11442 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB
11443 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC
11444 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD
11445 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE
11446 #define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF
11447 #define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0
11448 #define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1
11449 #define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2
11450 #define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3
11451 #define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4
11452 #define GL_X_EXT 0x87D5
11453 #define GL_Y_EXT 0x87D6
11454 #define GL_Z_EXT 0x87D7
11455 #define GL_W_EXT 0x87D8
11456 #define GL_NEGATIVE_X_EXT 0x87D9
11457 #define GL_NEGATIVE_Y_EXT 0x87DA
11458 #define GL_NEGATIVE_Z_EXT 0x87DB
11459 #define GL_NEGATIVE_W_EXT 0x87DC
11460 #define GL_ZERO_EXT 0x87DD
11461 #define GL_ONE_EXT 0x87DE
11462 #define GL_NEGATIVE_ONE_EXT 0x87DF
11463 #define GL_NORMALIZED_RANGE_EXT 0x87E0
11464 #define GL_FULL_RANGE_EXT 0x87E1
11465 #define GL_CURRENT_VERTEX_EXT 0x87E2
11466 #define GL_MVP_MATRIX_EXT 0x87E3
11467 #define GL_VARIANT_VALUE_EXT 0x87E4
11468 #define GL_VARIANT_DATATYPE_EXT 0x87E5
11469 #define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6
11470 #define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7
11471 #define GL_VARIANT_ARRAY_EXT 0x87E8
11472 #define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9
11473 #define GL_INVARIANT_VALUE_EXT 0x87EA
11474 #define GL_INVARIANT_DATATYPE_EXT 0x87EB
11475 #define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC
11476 #define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED
11477
11478 typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void);
11479 typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value);
11480 typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value);
11481 typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value);
11482 typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value);
11483 typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value);
11484 typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id);
11485 typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id);
11486 typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);
11487 typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);
11488 typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void);
11489 typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);
11490 typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components);
11491 typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range);
11492 typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
11493 typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
11494 typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
11495 typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
11496 typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
11497 typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
11498 typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
11499 typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
11500 typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
11501 typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data);
11502 typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);
11503 typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap);
11504 typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, void *addr);
11505 typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, void *addr);
11506 typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1);
11507 typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2);
11508 typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3);
11509 typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
11510 typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, void *addr);
11511 typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr);
11512 typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr);
11513 typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr);
11514 typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr);
11515 typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr);
11516 typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr);
11517 typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr);
11518 typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr);
11519 typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
11520
11521 #define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT)
11522 #define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT)
11523 #define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT)
11524 #define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT)
11525 #define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT)
11526 #define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT)
11527 #define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT)
11528 #define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT)
11529 #define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT)
11530 #define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT)
11531 #define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT)
11532 #define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT)
11533 #define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT)
11534 #define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT)
11535 #define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT)
11536 #define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT)
11537 #define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT)
11538 #define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT)
11539 #define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT)
11540 #define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT)
11541 #define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT)
11542 #define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT)
11543 #define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT)
11544 #define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT)
11545 #define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT)
11546 #define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT)
11547 #define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT)
11548 #define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT)
11549 #define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT)
11550 #define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT)
11551 #define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT)
11552 #define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT)
11553 #define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT)
11554 #define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT)
11555 #define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT)
11556 #define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT)
11557 #define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT)
11558 #define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT)
11559 #define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT)
11560 #define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT)
11561 #define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT)
11562 #define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT)
11563
11564 #define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader)
11565
11566 #endif /* GL_EXT_vertex_shader */
11567
11568 /* ------------------------ GL_EXT_vertex_weighting ------------------------ */
11569
11570 #ifndef GL_EXT_vertex_weighting
11571 #define GL_EXT_vertex_weighting 1
11572
11573 #define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3
11574 #define GL_MODELVIEW0_MATRIX_EXT 0x0BA6
11575 #define GL_MODELVIEW0_EXT 0x1700
11576 #define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502
11577 #define GL_MODELVIEW1_MATRIX_EXT 0x8506
11578 #define GL_VERTEX_WEIGHTING_EXT 0x8509
11579 #define GL_MODELVIEW1_EXT 0x850A
11580 #define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B
11581 #define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C
11582 #define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D
11583 #define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E
11584 #define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F
11585 #define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510
11586
11587 typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void *pointer);
11588 typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight);
11589 typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight);
11590
11591 #define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT)
11592 #define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT)
11593 #define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT)
11594
11595 #define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting)
11596
11597 #endif /* GL_EXT_vertex_weighting */
11598
11599 /* ------------------------- GL_EXT_x11_sync_object ------------------------ */
11600
11601 #ifndef GL_EXT_x11_sync_object
11602 #define GL_EXT_x11_sync_object 1
11603
11604 #define GL_SYNC_X11_FENCE_EXT 0x90E1
11605
11606 typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags);
11607
11608 #define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT)
11609
11610 #define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object)
11611
11612 #endif /* GL_EXT_x11_sync_object */
11613
11614 /* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */
11615
11616 #ifndef GL_GREMEDY_frame_terminator
11617 #define GL_GREMEDY_frame_terminator 1
11618
11619 typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void);
11620
11621 #define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY)
11622
11623 #define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator)
11624
11625 #endif /* GL_GREMEDY_frame_terminator */
11626
11627 /* ------------------------ GL_GREMEDY_string_marker ----------------------- */
11628
11629 #ifndef GL_GREMEDY_string_marker
11630 #define GL_GREMEDY_string_marker 1
11631
11632 typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string);
11633
11634 #define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY)
11635
11636 #define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker)
11637
11638 #endif /* GL_GREMEDY_string_marker */
11639
11640 /* --------------------- GL_HP_convolution_border_modes -------------------- */
11641
11642 #ifndef GL_HP_convolution_border_modes
11643 #define GL_HP_convolution_border_modes 1
11644
11645 #define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes)
11646
11647 #endif /* GL_HP_convolution_border_modes */
11648
11649 /* ------------------------- GL_HP_image_transform ------------------------- */
11650
11651 #ifndef GL_HP_image_transform
11652 #define GL_HP_image_transform 1
11653
11654 typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params);
11655 typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params);
11656 typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param);
11657 typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params);
11658 typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param);
11659 typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params);
11660
11661 #define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP)
11662 #define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP)
11663 #define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP)
11664 #define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP)
11665 #define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP)
11666 #define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP)
11667
11668 #define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform)
11669
11670 #endif /* GL_HP_image_transform */
11671
11672 /* -------------------------- GL_HP_occlusion_test ------------------------- */
11673
11674 #ifndef GL_HP_occlusion_test
11675 #define GL_HP_occlusion_test 1
11676
11677 #define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test)
11678
11679 #endif /* GL_HP_occlusion_test */
11680
11681 /* ------------------------- GL_HP_texture_lighting ------------------------ */
11682
11683 #ifndef GL_HP_texture_lighting
11684 #define GL_HP_texture_lighting 1
11685
11686 #define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting)
11687
11688 #endif /* GL_HP_texture_lighting */
11689
11690 /* --------------------------- GL_IBM_cull_vertex -------------------------- */
11691
11692 #ifndef GL_IBM_cull_vertex
11693 #define GL_IBM_cull_vertex 1
11694
11695 #define GL_CULL_VERTEX_IBM 103050
11696
11697 #define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex)
11698
11699 #endif /* GL_IBM_cull_vertex */
11700
11701 /* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */
11702
11703 #ifndef GL_IBM_multimode_draw_arrays
11704 #define GL_IBM_multimode_draw_arrays 1
11705
11706 typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride);
11707 typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount, GLint modestride);
11708
11709 #define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM)
11710 #define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM)
11711
11712 #define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays)
11713
11714 #endif /* GL_IBM_multimode_draw_arrays */
11715
11716 /* ------------------------- GL_IBM_rasterpos_clip ------------------------- */
11717
11718 #ifndef GL_IBM_rasterpos_clip
11719 #define GL_IBM_rasterpos_clip 1
11720
11721 #define GL_RASTER_POSITION_UNCLIPPED_IBM 103010
11722
11723 #define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip)
11724
11725 #endif /* GL_IBM_rasterpos_clip */
11726
11727 /* --------------------------- GL_IBM_static_data -------------------------- */
11728
11729 #ifndef GL_IBM_static_data
11730 #define GL_IBM_static_data 1
11731
11732 #define GL_ALL_STATIC_DATA_IBM 103060
11733 #define GL_STATIC_VERTEX_ARRAY_IBM 103061
11734
11735 #define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data)
11736
11737 #endif /* GL_IBM_static_data */
11738
11739 /* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */
11740
11741 #ifndef GL_IBM_texture_mirrored_repeat
11742 #define GL_IBM_texture_mirrored_repeat 1
11743
11744 #define GL_MIRRORED_REPEAT_IBM 0x8370
11745
11746 #define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat)
11747
11748 #endif /* GL_IBM_texture_mirrored_repeat */
11749
11750 /* ----------------------- GL_IBM_vertex_array_lists ----------------------- */
11751
11752 #ifndef GL_IBM_vertex_array_lists
11753 #define GL_IBM_vertex_array_lists 1
11754
11755 #define GL_VERTEX_ARRAY_LIST_IBM 103070
11756 #define GL_NORMAL_ARRAY_LIST_IBM 103071
11757 #define GL_COLOR_ARRAY_LIST_IBM 103072
11758 #define GL_INDEX_ARRAY_LIST_IBM 103073
11759 #define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074
11760 #define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075
11761 #define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076
11762 #define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077
11763 #define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080
11764 #define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081
11765 #define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082
11766 #define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083
11767 #define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084
11768 #define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085
11769 #define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086
11770 #define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087
11771
11772 typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride);
11773 typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride);
11774 typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride);
11775 typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride);
11776 typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride);
11777 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride);
11778 typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride);
11779 typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride);
11780
11781 #define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM)
11782 #define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM)
11783 #define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM)
11784 #define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM)
11785 #define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM)
11786 #define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM)
11787 #define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM)
11788 #define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM)
11789
11790 #define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists)
11791
11792 #endif /* GL_IBM_vertex_array_lists */
11793
11794 /* -------------------------- GL_INGR_color_clamp -------------------------- */
11795
11796 #ifndef GL_INGR_color_clamp
11797 #define GL_INGR_color_clamp 1
11798
11799 #define GL_RED_MIN_CLAMP_INGR 0x8560
11800 #define GL_GREEN_MIN_CLAMP_INGR 0x8561
11801 #define GL_BLUE_MIN_CLAMP_INGR 0x8562
11802 #define GL_ALPHA_MIN_CLAMP_INGR 0x8563
11803 #define GL_RED_MAX_CLAMP_INGR 0x8564
11804 #define GL_GREEN_MAX_CLAMP_INGR 0x8565
11805 #define GL_BLUE_MAX_CLAMP_INGR 0x8566
11806 #define GL_ALPHA_MAX_CLAMP_INGR 0x8567
11807
11808 #define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp)
11809
11810 #endif /* GL_INGR_color_clamp */
11811
11812 /* ------------------------- GL_INGR_interlace_read ------------------------ */
11813
11814 #ifndef GL_INGR_interlace_read
11815 #define GL_INGR_interlace_read 1
11816
11817 #define GL_INTERLACE_READ_INGR 0x8568
11818
11819 #define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read)
11820
11821 #endif /* GL_INGR_interlace_read */
11822
11823 /* ------------------- GL_INTEL_fragment_shader_ordering ------------------- */
11824
11825 #ifndef GL_INTEL_fragment_shader_ordering
11826 #define GL_INTEL_fragment_shader_ordering 1
11827
11828 #define GLEW_INTEL_fragment_shader_ordering GLEW_GET_VAR(__GLEW_INTEL_fragment_shader_ordering)
11829
11830 #endif /* GL_INTEL_fragment_shader_ordering */
11831
11832 /* ----------------------- GL_INTEL_framebuffer_CMAA ----------------------- */
11833
11834 #ifndef GL_INTEL_framebuffer_CMAA
11835 #define GL_INTEL_framebuffer_CMAA 1
11836
11837 #define GLEW_INTEL_framebuffer_CMAA GLEW_GET_VAR(__GLEW_INTEL_framebuffer_CMAA)
11838
11839 #endif /* GL_INTEL_framebuffer_CMAA */
11840
11841 /* -------------------------- GL_INTEL_map_texture ------------------------- */
11842
11843 #ifndef GL_INTEL_map_texture
11844 #define GL_INTEL_map_texture 1
11845
11846 #define GL_LAYOUT_DEFAULT_INTEL 0
11847 #define GL_LAYOUT_LINEAR_INTEL 1
11848 #define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2
11849 #define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF
11850
11851 typedef void * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout);
11852 typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture);
11853 typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level);
11854
11855 #define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL)
11856 #define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL)
11857 #define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL)
11858
11859 #define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture)
11860
11861 #endif /* GL_INTEL_map_texture */
11862
11863 /* ------------------------ GL_INTEL_parallel_arrays ----------------------- */
11864
11865 #ifndef GL_INTEL_parallel_arrays
11866 #define GL_INTEL_parallel_arrays 1
11867
11868 #define GL_PARALLEL_ARRAYS_INTEL 0x83F4
11869 #define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5
11870 #define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6
11871 #define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7
11872 #define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8
11873
11874 typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);
11875 typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer);
11876 typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);
11877 typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);
11878
11879 #define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL)
11880 #define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL)
11881 #define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL)
11882 #define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL)
11883
11884 #define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays)
11885
11886 #endif /* GL_INTEL_parallel_arrays */
11887
11888 /* ----------------------- GL_INTEL_performance_query ---------------------- */
11889
11890 #ifndef GL_INTEL_performance_query
11891 #define GL_INTEL_performance_query 1
11892
11893 #define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x0000
11894 #define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x0001
11895 #define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9
11896 #define GL_PERFQUERY_FLUSH_INTEL 0x83FA
11897 #define GL_PERFQUERY_WAIT_INTEL 0x83FB
11898 #define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0
11899 #define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1
11900 #define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2
11901 #define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3
11902 #define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4
11903 #define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5
11904 #define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8
11905 #define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9
11906 #define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA
11907 #define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB
11908 #define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC
11909 #define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD
11910 #define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE
11911 #define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF
11912 #define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500
11913
11914 typedef void (GLAPIENTRY * PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle);
11915 typedef void (GLAPIENTRY * PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint* queryHandle);
11916 typedef void (GLAPIENTRY * PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle);
11917 typedef void (GLAPIENTRY * PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle);
11918 typedef void (GLAPIENTRY * PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint* queryId);
11919 typedef void (GLAPIENTRY * PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint* nextQueryId);
11920 typedef void (GLAPIENTRY * PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue);
11921 typedef void (GLAPIENTRY * PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten);
11922 typedef void (GLAPIENTRY * PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar* queryName, GLuint *queryId);
11923 typedef void (GLAPIENTRY * PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask);
11924
11925 #define glBeginPerfQueryINTEL GLEW_GET_FUN(__glewBeginPerfQueryINTEL)
11926 #define glCreatePerfQueryINTEL GLEW_GET_FUN(__glewCreatePerfQueryINTEL)
11927 #define glDeletePerfQueryINTEL GLEW_GET_FUN(__glewDeletePerfQueryINTEL)
11928 #define glEndPerfQueryINTEL GLEW_GET_FUN(__glewEndPerfQueryINTEL)
11929 #define glGetFirstPerfQueryIdINTEL GLEW_GET_FUN(__glewGetFirstPerfQueryIdINTEL)
11930 #define glGetNextPerfQueryIdINTEL GLEW_GET_FUN(__glewGetNextPerfQueryIdINTEL)
11931 #define glGetPerfCounterInfoINTEL GLEW_GET_FUN(__glewGetPerfCounterInfoINTEL)
11932 #define glGetPerfQueryDataINTEL GLEW_GET_FUN(__glewGetPerfQueryDataINTEL)
11933 #define glGetPerfQueryIdByNameINTEL GLEW_GET_FUN(__glewGetPerfQueryIdByNameINTEL)
11934 #define glGetPerfQueryInfoINTEL GLEW_GET_FUN(__glewGetPerfQueryInfoINTEL)
11935
11936 #define GLEW_INTEL_performance_query GLEW_GET_VAR(__GLEW_INTEL_performance_query)
11937
11938 #endif /* GL_INTEL_performance_query */
11939
11940 /* ------------------------ GL_INTEL_texture_scissor ----------------------- */
11941
11942 #ifndef GL_INTEL_texture_scissor
11943 #define GL_INTEL_texture_scissor 1
11944
11945 typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc);
11946 typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh);
11947
11948 #define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL)
11949 #define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL)
11950
11951 #define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor)
11952
11953 #endif /* GL_INTEL_texture_scissor */
11954
11955 /* --------------------- GL_KHR_blend_equation_advanced -------------------- */
11956
11957 #ifndef GL_KHR_blend_equation_advanced
11958 #define GL_KHR_blend_equation_advanced 1
11959
11960 #define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285
11961 #define GL_MULTIPLY_KHR 0x9294
11962 #define GL_SCREEN_KHR 0x9295
11963 #define GL_OVERLAY_KHR 0x9296
11964 #define GL_DARKEN_KHR 0x9297
11965 #define GL_LIGHTEN_KHR 0x9298
11966 #define GL_COLORDODGE_KHR 0x9299
11967 #define GL_COLORBURN_KHR 0x929A
11968 #define GL_HARDLIGHT_KHR 0x929B
11969 #define GL_SOFTLIGHT_KHR 0x929C
11970 #define GL_DIFFERENCE_KHR 0x929E
11971 #define GL_EXCLUSION_KHR 0x92A0
11972 #define GL_HSL_HUE_KHR 0x92AD
11973 #define GL_HSL_SATURATION_KHR 0x92AE
11974 #define GL_HSL_COLOR_KHR 0x92AF
11975 #define GL_HSL_LUMINOSITY_KHR 0x92B0
11976
11977 typedef void (GLAPIENTRY * PFNGLBLENDBARRIERKHRPROC) (void);
11978
11979 #define glBlendBarrierKHR GLEW_GET_FUN(__glewBlendBarrierKHR)
11980
11981 #define GLEW_KHR_blend_equation_advanced GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced)
11982
11983 #endif /* GL_KHR_blend_equation_advanced */
11984
11985 /* ---------------- GL_KHR_blend_equation_advanced_coherent ---------------- */
11986
11987 #ifndef GL_KHR_blend_equation_advanced_coherent
11988 #define GL_KHR_blend_equation_advanced_coherent 1
11989
11990 #define GLEW_KHR_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced_coherent)
11991
11992 #endif /* GL_KHR_blend_equation_advanced_coherent */
11993
11994 /* ---------------------- GL_KHR_context_flush_control --------------------- */
11995
11996 #ifndef GL_KHR_context_flush_control
11997 #define GL_KHR_context_flush_control 1
11998
11999 #define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB
12000 #define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC
12001
12002 #define GLEW_KHR_context_flush_control GLEW_GET_VAR(__GLEW_KHR_context_flush_control)
12003
12004 #endif /* GL_KHR_context_flush_control */
12005
12006 /* ------------------------------ GL_KHR_debug ----------------------------- */
12007
12008 #ifndef GL_KHR_debug
12009 #define GL_KHR_debug 1
12010
12011 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
12012 #define GL_STACK_OVERFLOW 0x0503
12013 #define GL_STACK_UNDERFLOW 0x0504
12014 #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
12015 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
12016 #define GL_DEBUG_CALLBACK_FUNCTION 0x8244
12017 #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
12018 #define GL_DEBUG_SOURCE_API 0x8246
12019 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
12020 #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
12021 #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
12022 #define GL_DEBUG_SOURCE_APPLICATION 0x824A
12023 #define GL_DEBUG_SOURCE_OTHER 0x824B
12024 #define GL_DEBUG_TYPE_ERROR 0x824C
12025 #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
12026 #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
12027 #define GL_DEBUG_TYPE_PORTABILITY 0x824F
12028 #define GL_DEBUG_TYPE_PERFORMANCE 0x8250
12029 #define GL_DEBUG_TYPE_OTHER 0x8251
12030 #define GL_DEBUG_TYPE_MARKER 0x8268
12031 #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
12032 #define GL_DEBUG_TYPE_POP_GROUP 0x826A
12033 #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
12034 #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
12035 #define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
12036 #define GL_BUFFER 0x82E0
12037 #define GL_SHADER 0x82E1
12038 #define GL_PROGRAM 0x82E2
12039 #define GL_QUERY 0x82E3
12040 #define GL_PROGRAM_PIPELINE 0x82E4
12041 #define GL_SAMPLER 0x82E6
12042 #define GL_DISPLAY_LIST 0x82E7
12043 #define GL_MAX_LABEL_LENGTH 0x82E8
12044 #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
12045 #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
12046 #define GL_DEBUG_LOGGED_MESSAGES 0x9145
12047 #define GL_DEBUG_SEVERITY_HIGH 0x9146
12048 #define GL_DEBUG_SEVERITY_MEDIUM 0x9147
12049 #define GL_DEBUG_SEVERITY_LOW 0x9148
12050 #define GL_DEBUG_OUTPUT 0x92E0
12051
12052 typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam);
12053
12054 typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam);
12055 typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);
12056 typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf);
12057 typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog);
12058 typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label);
12059 typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei* length, GLchar *label);
12060 typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label);
12061 typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar* label);
12062 typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void);
12063 typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message);
12064
12065 #define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback)
12066 #define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl)
12067 #define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert)
12068 #define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog)
12069 #define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel)
12070 #define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel)
12071 #define glObjectLabel GLEW_GET_FUN(__glewObjectLabel)
12072 #define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel)
12073 #define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup)
12074 #define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup)
12075
12076 #define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug)
12077
12078 #endif /* GL_KHR_debug */
12079
12080 /* ---------------------------- GL_KHR_no_error ---------------------------- */
12081
12082 #ifndef GL_KHR_no_error
12083 #define GL_KHR_no_error 1
12084
12085 #define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008
12086
12087 #define GLEW_KHR_no_error GLEW_GET_VAR(__GLEW_KHR_no_error)
12088
12089 #endif /* GL_KHR_no_error */
12090
12091 /* ------------------ GL_KHR_robust_buffer_access_behavior ----------------- */
12092
12093 #ifndef GL_KHR_robust_buffer_access_behavior
12094 #define GL_KHR_robust_buffer_access_behavior 1
12095
12096 #define GLEW_KHR_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_KHR_robust_buffer_access_behavior)
12097
12098 #endif /* GL_KHR_robust_buffer_access_behavior */
12099
12100 /* --------------------------- GL_KHR_robustness --------------------------- */
12101
12102 #ifndef GL_KHR_robustness
12103 #define GL_KHR_robustness 1
12104
12105 #define GL_CONTEXT_LOST 0x0507
12106 #define GL_LOSE_CONTEXT_ON_RESET 0x8252
12107 #define GL_GUILTY_CONTEXT_RESET 0x8253
12108 #define GL_INNOCENT_CONTEXT_RESET 0x8254
12109 #define GL_UNKNOWN_CONTEXT_RESET 0x8255
12110 #define GL_RESET_NOTIFICATION_STRATEGY 0x8256
12111 #define GL_NO_RESET_NOTIFICATION 0x8261
12112 #define GL_CONTEXT_ROBUST_ACCESS 0x90F3
12113
12114 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params);
12115 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params);
12116 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params);
12117 typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
12118
12119 #define glGetnUniformfv GLEW_GET_FUN(__glewGetnUniformfv)
12120 #define glGetnUniformiv GLEW_GET_FUN(__glewGetnUniformiv)
12121 #define glGetnUniformuiv GLEW_GET_FUN(__glewGetnUniformuiv)
12122 #define glReadnPixels GLEW_GET_FUN(__glewReadnPixels)
12123
12124 #define GLEW_KHR_robustness GLEW_GET_VAR(__GLEW_KHR_robustness)
12125
12126 #endif /* GL_KHR_robustness */
12127
12128 /* ------------------ GL_KHR_texture_compression_astc_hdr ------------------ */
12129
12130 #ifndef GL_KHR_texture_compression_astc_hdr
12131 #define GL_KHR_texture_compression_astc_hdr 1
12132
12133 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0
12134 #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1
12135 #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2
12136 #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3
12137 #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4
12138 #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5
12139 #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6
12140 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7
12141 #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8
12142 #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9
12143 #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA
12144 #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB
12145 #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC
12146 #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD
12147 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0
12148 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1
12149 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2
12150 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3
12151 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4
12152 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5
12153 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6
12154 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7
12155 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8
12156 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9
12157 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA
12158 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB
12159 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC
12160 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD
12161
12162 #define GLEW_KHR_texture_compression_astc_hdr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_hdr)
12163
12164 #endif /* GL_KHR_texture_compression_astc_hdr */
12165
12166 /* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */
12167
12168 #ifndef GL_KHR_texture_compression_astc_ldr
12169 #define GL_KHR_texture_compression_astc_ldr 1
12170
12171 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0
12172 #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1
12173 #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2
12174 #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3
12175 #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4
12176 #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5
12177 #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6
12178 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7
12179 #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8
12180 #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9
12181 #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA
12182 #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB
12183 #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC
12184 #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD
12185 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0
12186 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1
12187 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2
12188 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3
12189 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4
12190 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5
12191 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6
12192 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7
12193 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8
12194 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9
12195 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA
12196 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB
12197 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC
12198 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD
12199
12200 #define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr)
12201
12202 #endif /* GL_KHR_texture_compression_astc_ldr */
12203
12204 /* -------------------------- GL_KTX_buffer_region ------------------------- */
12205
12206 #ifndef GL_KTX_buffer_region
12207 #define GL_KTX_buffer_region 1
12208
12209 #define GL_KTX_FRONT_REGION 0x0
12210 #define GL_KTX_BACK_REGION 0x1
12211 #define GL_KTX_Z_REGION 0x2
12212 #define GL_KTX_STENCIL_REGION 0x3
12213
12214 typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void);
12215 typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region);
12216 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest);
12217 typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region);
12218 typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height);
12219
12220 #define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled)
12221 #define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion)
12222 #define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion)
12223 #define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion)
12224 #define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion)
12225
12226 #define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region)
12227
12228 #endif /* GL_KTX_buffer_region */
12229
12230 /* ------------------------- GL_MESAX_texture_stack ------------------------ */
12231
12232 #ifndef GL_MESAX_texture_stack
12233 #define GL_MESAX_texture_stack 1
12234
12235 #define GL_TEXTURE_1D_STACK_MESAX 0x8759
12236 #define GL_TEXTURE_2D_STACK_MESAX 0x875A
12237 #define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B
12238 #define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C
12239 #define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D
12240 #define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E
12241
12242 #define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack)
12243
12244 #endif /* GL_MESAX_texture_stack */
12245
12246 /* -------------------------- GL_MESA_pack_invert -------------------------- */
12247
12248 #ifndef GL_MESA_pack_invert
12249 #define GL_MESA_pack_invert 1
12250
12251 #define GL_PACK_INVERT_MESA 0x8758
12252
12253 #define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert)
12254
12255 #endif /* GL_MESA_pack_invert */
12256
12257 /* ------------------------- GL_MESA_resize_buffers ------------------------ */
12258
12259 #ifndef GL_MESA_resize_buffers
12260 #define GL_MESA_resize_buffers 1
12261
12262 typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void);
12263
12264 #define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA)
12265
12266 #define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers)
12267
12268 #endif /* GL_MESA_resize_buffers */
12269
12270 /* --------------------------- GL_MESA_window_pos -------------------------- */
12271
12272 #ifndef GL_MESA_window_pos
12273 #define GL_MESA_window_pos 1
12274
12275 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y);
12276 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p);
12277 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y);
12278 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p);
12279 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y);
12280 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p);
12281 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y);
12282 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p);
12283 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z);
12284 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p);
12285 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z);
12286 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p);
12287 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z);
12288 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p);
12289 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z);
12290 typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p);
12291 typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble);
12292 typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p);
12293 typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
12294 typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p);
12295 typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w);
12296 typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p);
12297 typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w);
12298 typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p);
12299
12300 #define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA)
12301 #define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA)
12302 #define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA)
12303 #define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA)
12304 #define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA)
12305 #define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA)
12306 #define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA)
12307 #define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA)
12308 #define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA)
12309 #define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA)
12310 #define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA)
12311 #define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA)
12312 #define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA)
12313 #define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA)
12314 #define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA)
12315 #define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA)
12316 #define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA)
12317 #define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA)
12318 #define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA)
12319 #define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA)
12320 #define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA)
12321 #define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA)
12322 #define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA)
12323 #define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA)
12324
12325 #define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos)
12326
12327 #endif /* GL_MESA_window_pos */
12328
12329 /* ------------------------- GL_MESA_ycbcr_texture ------------------------- */
12330
12331 #ifndef GL_MESA_ycbcr_texture
12332 #define GL_MESA_ycbcr_texture 1
12333
12334 #define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA
12335 #define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB
12336 #define GL_YCBCR_MESA 0x8757
12337
12338 #define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture)
12339
12340 #endif /* GL_MESA_ycbcr_texture */
12341
12342 /* ----------------------- GL_NVX_conditional_render ----------------------- */
12343
12344 #ifndef GL_NVX_conditional_render
12345 #define GL_NVX_conditional_render 1
12346
12347 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id);
12348 typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void);
12349
12350 #define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX)
12351 #define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX)
12352
12353 #define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render)
12354
12355 #endif /* GL_NVX_conditional_render */
12356
12357 /* ------------------------- GL_NVX_gpu_memory_info ------------------------ */
12358
12359 #ifndef GL_NVX_gpu_memory_info
12360 #define GL_NVX_gpu_memory_info 1
12361
12362 #define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
12363 #define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
12364 #define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
12365 #define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
12366 #define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
12367
12368 #define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info)
12369
12370 #endif /* GL_NVX_gpu_memory_info */
12371
12372 /* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */
12373
12374 #ifndef GL_NV_bindless_multi_draw_indirect
12375 #define GL_NV_bindless_multi_draw_indirect 1
12376
12377 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount);
12378 typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount);
12379
12380 #define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV)
12381 #define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV)
12382
12383 #define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect)
12384
12385 #endif /* GL_NV_bindless_multi_draw_indirect */
12386
12387 /* ---------------- GL_NV_bindless_multi_draw_indirect_count --------------- */
12388
12389 #ifndef GL_NV_bindless_multi_draw_indirect_count
12390 #define GL_NV_bindless_multi_draw_indirect_count 1
12391
12392 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount);
12393 typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount);
12394
12395 #define glMultiDrawArraysIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessCountNV)
12396 #define glMultiDrawElementsIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessCountNV)
12397
12398 #define GLEW_NV_bindless_multi_draw_indirect_count GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect_count)
12399
12400 #endif /* GL_NV_bindless_multi_draw_indirect_count */
12401
12402 /* ------------------------- GL_NV_bindless_texture ------------------------ */
12403
12404 #ifndef GL_NV_bindless_texture
12405 #define GL_NV_bindless_texture 1
12406
12407 typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
12408 typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture);
12409 typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler);
12410 typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle);
12411 typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle);
12412 typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle);
12413 typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access);
12414 typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle);
12415 typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle);
12416 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value);
12417 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values);
12418 typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value);
12419 typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value);
12420
12421 #define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV)
12422 #define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV)
12423 #define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV)
12424 #define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV)
12425 #define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV)
12426 #define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV)
12427 #define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV)
12428 #define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV)
12429 #define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV)
12430 #define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV)
12431 #define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV)
12432 #define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV)
12433 #define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV)
12434
12435 #define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture)
12436
12437 #endif /* GL_NV_bindless_texture */
12438
12439 /* --------------------- GL_NV_blend_equation_advanced --------------------- */
12440
12441 #ifndef GL_NV_blend_equation_advanced
12442 #define GL_NV_blend_equation_advanced 1
12443
12444 #define GL_XOR_NV 0x1506
12445 #define GL_RED_NV 0x1903
12446 #define GL_GREEN_NV 0x1904
12447 #define GL_BLUE_NV 0x1905
12448 #define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280
12449 #define GL_BLEND_OVERLAP_NV 0x9281
12450 #define GL_UNCORRELATED_NV 0x9282
12451 #define GL_DISJOINT_NV 0x9283
12452 #define GL_CONJOINT_NV 0x9284
12453 #define GL_BLEND_ADVANCED_COHERENT_NV 0x9285
12454 #define GL_SRC_NV 0x9286
12455 #define GL_DST_NV 0x9287
12456 #define GL_SRC_OVER_NV 0x9288
12457 #define GL_DST_OVER_NV 0x9289
12458 #define GL_SRC_IN_NV 0x928A
12459 #define GL_DST_IN_NV 0x928B
12460 #define GL_SRC_OUT_NV 0x928C
12461 #define GL_DST_OUT_NV 0x928D
12462 #define GL_SRC_ATOP_NV 0x928E
12463 #define GL_DST_ATOP_NV 0x928F
12464 #define GL_PLUS_NV 0x9291
12465 #define GL_PLUS_DARKER_NV 0x9292
12466 #define GL_MULTIPLY_NV 0x9294
12467 #define GL_SCREEN_NV 0x9295
12468 #define GL_OVERLAY_NV 0x9296
12469 #define GL_DARKEN_NV 0x9297
12470 #define GL_LIGHTEN_NV 0x9298
12471 #define GL_COLORDODGE_NV 0x9299
12472 #define GL_COLORBURN_NV 0x929A
12473 #define GL_HARDLIGHT_NV 0x929B
12474 #define GL_SOFTLIGHT_NV 0x929C
12475 #define GL_DIFFERENCE_NV 0x929E
12476 #define GL_MINUS_NV 0x929F
12477 #define GL_EXCLUSION_NV 0x92A0
12478 #define GL_CONTRAST_NV 0x92A1
12479 #define GL_INVERT_RGB_NV 0x92A3
12480 #define GL_LINEARDODGE_NV 0x92A4
12481 #define GL_LINEARBURN_NV 0x92A5
12482 #define GL_VIVIDLIGHT_NV 0x92A6
12483 #define GL_LINEARLIGHT_NV 0x92A7
12484 #define GL_PINLIGHT_NV 0x92A8
12485 #define GL_HARDMIX_NV 0x92A9
12486 #define GL_HSL_HUE_NV 0x92AD
12487 #define GL_HSL_SATURATION_NV 0x92AE
12488 #define GL_HSL_COLOR_NV 0x92AF
12489 #define GL_HSL_LUMINOSITY_NV 0x92B0
12490 #define GL_PLUS_CLAMPED_NV 0x92B1
12491 #define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2
12492 #define GL_MINUS_CLAMPED_NV 0x92B3
12493 #define GL_INVERT_OVG_NV 0x92B4
12494
12495 typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void);
12496 typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value);
12497
12498 #define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV)
12499 #define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV)
12500
12501 #define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced)
12502
12503 #endif /* GL_NV_blend_equation_advanced */
12504
12505 /* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */
12506
12507 #ifndef GL_NV_blend_equation_advanced_coherent
12508 #define GL_NV_blend_equation_advanced_coherent 1
12509
12510 #define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent)
12511
12512 #endif /* GL_NV_blend_equation_advanced_coherent */
12513
12514 /* --------------------------- GL_NV_blend_square -------------------------- */
12515
12516 #ifndef GL_NV_blend_square
12517 #define GL_NV_blend_square 1
12518
12519 #define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square)
12520
12521 #endif /* GL_NV_blend_square */
12522
12523 /* ------------------------- GL_NV_compute_program5 ------------------------ */
12524
12525 #ifndef GL_NV_compute_program5
12526 #define GL_NV_compute_program5 1
12527
12528 #define GL_COMPUTE_PROGRAM_NV 0x90FB
12529 #define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC
12530
12531 #define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5)
12532
12533 #endif /* GL_NV_compute_program5 */
12534
12535 /* ------------------------ GL_NV_conditional_render ----------------------- */
12536
12537 #ifndef GL_NV_conditional_render
12538 #define GL_NV_conditional_render 1
12539
12540 #define GL_QUERY_WAIT_NV 0x8E13
12541 #define GL_QUERY_NO_WAIT_NV 0x8E14
12542 #define GL_QUERY_BY_REGION_WAIT_NV 0x8E15
12543 #define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16
12544
12545 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode);
12546 typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void);
12547
12548 #define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV)
12549 #define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV)
12550
12551 #define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render)
12552
12553 #endif /* GL_NV_conditional_render */
12554
12555 /* ----------------------- GL_NV_conservative_raster ----------------------- */
12556
12557 #ifndef GL_NV_conservative_raster
12558 #define GL_NV_conservative_raster 1
12559
12560 #define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346
12561 #define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347
12562 #define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348
12563 #define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349
12564
12565 typedef void (GLAPIENTRY * PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits);
12566
12567 #define glSubpixelPrecisionBiasNV GLEW_GET_FUN(__glewSubpixelPrecisionBiasNV)
12568
12569 #define GLEW_NV_conservative_raster GLEW_GET_VAR(__GLEW_NV_conservative_raster)
12570
12571 #endif /* GL_NV_conservative_raster */
12572
12573 /* -------------------- GL_NV_conservative_raster_dilate ------------------- */
12574
12575 #ifndef GL_NV_conservative_raster_dilate
12576 #define GL_NV_conservative_raster_dilate 1
12577
12578 #define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379
12579 #define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A
12580 #define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B
12581
12582 typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value);
12583
12584 #define glConservativeRasterParameterfNV GLEW_GET_FUN(__glewConservativeRasterParameterfNV)
12585
12586 #define GLEW_NV_conservative_raster_dilate GLEW_GET_VAR(__GLEW_NV_conservative_raster_dilate)
12587
12588 #endif /* GL_NV_conservative_raster_dilate */
12589
12590 /* ----------------------- GL_NV_copy_depth_to_color ----------------------- */
12591
12592 #ifndef GL_NV_copy_depth_to_color
12593 #define GL_NV_copy_depth_to_color 1
12594
12595 #define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E
12596 #define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F
12597
12598 #define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color)
12599
12600 #endif /* GL_NV_copy_depth_to_color */
12601
12602 /* ---------------------------- GL_NV_copy_image --------------------------- */
12603
12604 #ifndef GL_NV_copy_image
12605 #define GL_NV_copy_image 1
12606
12607 typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
12608
12609 #define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV)
12610
12611 #define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image)
12612
12613 #endif /* GL_NV_copy_image */
12614
12615 /* -------------------------- GL_NV_deep_texture3D ------------------------- */
12616
12617 #ifndef GL_NV_deep_texture3D
12618 #define GL_NV_deep_texture3D 1
12619
12620 #define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0
12621 #define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1
12622
12623 #define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D)
12624
12625 #endif /* GL_NV_deep_texture3D */
12626
12627 /* ------------------------ GL_NV_depth_buffer_float ----------------------- */
12628
12629 #ifndef GL_NV_depth_buffer_float
12630 #define GL_NV_depth_buffer_float 1
12631
12632 #define GL_DEPTH_COMPONENT32F_NV 0x8DAB
12633 #define GL_DEPTH32F_STENCIL8_NV 0x8DAC
12634 #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD
12635 #define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF
12636
12637 typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth);
12638 typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax);
12639 typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar);
12640
12641 #define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV)
12642 #define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV)
12643 #define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV)
12644
12645 #define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float)
12646
12647 #endif /* GL_NV_depth_buffer_float */
12648
12649 /* --------------------------- GL_NV_depth_clamp --------------------------- */
12650
12651 #ifndef GL_NV_depth_clamp
12652 #define GL_NV_depth_clamp 1
12653
12654 #define GL_DEPTH_CLAMP_NV 0x864F
12655
12656 #define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp)
12657
12658 #endif /* GL_NV_depth_clamp */
12659
12660 /* ---------------------- GL_NV_depth_range_unclamped ---------------------- */
12661
12662 #ifndef GL_NV_depth_range_unclamped
12663 #define GL_NV_depth_range_unclamped 1
12664
12665 #define GL_SAMPLE_COUNT_BITS_NV 0x8864
12666 #define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865
12667 #define GL_QUERY_RESULT_NV 0x8866
12668 #define GL_QUERY_RESULT_AVAILABLE_NV 0x8867
12669 #define GL_SAMPLE_COUNT_NV 0x8914
12670
12671 #define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped)
12672
12673 #endif /* GL_NV_depth_range_unclamped */
12674
12675 /* --------------------------- GL_NV_draw_texture -------------------------- */
12676
12677 #ifndef GL_NV_draw_texture
12678 #define GL_NV_draw_texture 1
12679
12680 typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1);
12681
12682 #define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV)
12683
12684 #define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture)
12685
12686 #endif /* GL_NV_draw_texture */
12687
12688 /* ---------------------------- GL_NV_evaluators --------------------------- */
12689
12690 #ifndef GL_NV_evaluators
12691 #define GL_NV_evaluators 1
12692
12693 #define GL_EVAL_2D_NV 0x86C0
12694 #define GL_EVAL_TRIANGULAR_2D_NV 0x86C1
12695 #define GL_MAP_TESSELLATION_NV 0x86C2
12696 #define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3
12697 #define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4
12698 #define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5
12699 #define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6
12700 #define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7
12701 #define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8
12702 #define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9
12703 #define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA
12704 #define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB
12705 #define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC
12706 #define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD
12707 #define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE
12708 #define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF
12709 #define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0
12710 #define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1
12711 #define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2
12712 #define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3
12713 #define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4
12714 #define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5
12715 #define GL_MAX_MAP_TESSELLATION_NV 0x86D6
12716 #define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7
12717
12718 typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode);
12719 typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params);
12720 typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params);
12721 typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points);
12722 typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params);
12723 typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params);
12724 typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points);
12725 typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params);
12726 typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params);
12727
12728 #define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV)
12729 #define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV)
12730 #define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV)
12731 #define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV)
12732 #define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV)
12733 #define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV)
12734 #define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV)
12735 #define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV)
12736 #define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV)
12737
12738 #define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators)
12739
12740 #endif /* GL_NV_evaluators */
12741
12742 /* ----------------------- GL_NV_explicit_multisample ---------------------- */
12743
12744 #ifndef GL_NV_explicit_multisample
12745 #define GL_NV_explicit_multisample 1
12746
12747 #define GL_SAMPLE_POSITION_NV 0x8E50
12748 #define GL_SAMPLE_MASK_NV 0x8E51
12749 #define GL_SAMPLE_MASK_VALUE_NV 0x8E52
12750 #define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53
12751 #define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54
12752 #define GL_TEXTURE_RENDERBUFFER_NV 0x8E55
12753 #define GL_SAMPLER_RENDERBUFFER_NV 0x8E56
12754 #define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57
12755 #define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58
12756 #define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59
12757
12758 typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val);
12759 typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask);
12760 typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer);
12761
12762 #define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV)
12763 #define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV)
12764 #define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV)
12765
12766 #define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample)
12767
12768 #endif /* GL_NV_explicit_multisample */
12769
12770 /* ------------------------------ GL_NV_fence ------------------------------ */
12771
12772 #ifndef GL_NV_fence
12773 #define GL_NV_fence 1
12774
12775 #define GL_ALL_COMPLETED_NV 0x84F2
12776 #define GL_FENCE_STATUS_NV 0x84F3
12777 #define GL_FENCE_CONDITION_NV 0x84F4
12778
12779 typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences);
12780 typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence);
12781 typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences);
12782 typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params);
12783 typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence);
12784 typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);
12785 typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence);
12786
12787 #define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV)
12788 #define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV)
12789 #define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV)
12790 #define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV)
12791 #define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV)
12792 #define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV)
12793 #define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV)
12794
12795 #define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence)
12796
12797 #endif /* GL_NV_fence */
12798
12799 /* -------------------------- GL_NV_fill_rectangle ------------------------- */
12800
12801 #ifndef GL_NV_fill_rectangle
12802 #define GL_NV_fill_rectangle 1
12803
12804 #define GL_FILL_RECTANGLE_NV 0x933C
12805
12806 #define GLEW_NV_fill_rectangle GLEW_GET_VAR(__GLEW_NV_fill_rectangle)
12807
12808 #endif /* GL_NV_fill_rectangle */
12809
12810 /* --------------------------- GL_NV_float_buffer -------------------------- */
12811
12812 #ifndef GL_NV_float_buffer
12813 #define GL_NV_float_buffer 1
12814
12815 #define GL_FLOAT_R_NV 0x8880
12816 #define GL_FLOAT_RG_NV 0x8881
12817 #define GL_FLOAT_RGB_NV 0x8882
12818 #define GL_FLOAT_RGBA_NV 0x8883
12819 #define GL_FLOAT_R16_NV 0x8884
12820 #define GL_FLOAT_R32_NV 0x8885
12821 #define GL_FLOAT_RG16_NV 0x8886
12822 #define GL_FLOAT_RG32_NV 0x8887
12823 #define GL_FLOAT_RGB16_NV 0x8888
12824 #define GL_FLOAT_RGB32_NV 0x8889
12825 #define GL_FLOAT_RGBA16_NV 0x888A
12826 #define GL_FLOAT_RGBA32_NV 0x888B
12827 #define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C
12828 #define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D
12829 #define GL_FLOAT_RGBA_MODE_NV 0x888E
12830
12831 #define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer)
12832
12833 #endif /* GL_NV_float_buffer */
12834
12835 /* --------------------------- GL_NV_fog_distance -------------------------- */
12836
12837 #ifndef GL_NV_fog_distance
12838 #define GL_NV_fog_distance 1
12839
12840 #define GL_FOG_DISTANCE_MODE_NV 0x855A
12841 #define GL_EYE_RADIAL_NV 0x855B
12842 #define GL_EYE_PLANE_ABSOLUTE_NV 0x855C
12843
12844 #define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance)
12845
12846 #endif /* GL_NV_fog_distance */
12847
12848 /* -------------------- GL_NV_fragment_coverage_to_color ------------------- */
12849
12850 #ifndef GL_NV_fragment_coverage_to_color
12851 #define GL_NV_fragment_coverage_to_color 1
12852
12853 #define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD
12854 #define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE
12855
12856 typedef void (GLAPIENTRY * PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color);
12857
12858 #define glFragmentCoverageColorNV GLEW_GET_FUN(__glewFragmentCoverageColorNV)
12859
12860 #define GLEW_NV_fragment_coverage_to_color GLEW_GET_VAR(__GLEW_NV_fragment_coverage_to_color)
12861
12862 #endif /* GL_NV_fragment_coverage_to_color */
12863
12864 /* ------------------------- GL_NV_fragment_program ------------------------ */
12865
12866 #ifndef GL_NV_fragment_program
12867 #define GL_NV_fragment_program 1
12868
12869 #define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868
12870 #define GL_FRAGMENT_PROGRAM_NV 0x8870
12871 #define GL_MAX_TEXTURE_COORDS_NV 0x8871
12872 #define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872
12873 #define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873
12874 #define GL_PROGRAM_ERROR_STRING_NV 0x8874
12875
12876 typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params);
12877 typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params);
12878 typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
12879 typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]);
12880 typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
12881 typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]);
12882
12883 #define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV)
12884 #define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV)
12885 #define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV)
12886 #define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV)
12887 #define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV)
12888 #define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV)
12889
12890 #define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program)
12891
12892 #endif /* GL_NV_fragment_program */
12893
12894 /* ------------------------ GL_NV_fragment_program2 ------------------------ */
12895
12896 #ifndef GL_NV_fragment_program2
12897 #define GL_NV_fragment_program2 1
12898
12899 #define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4
12900 #define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5
12901 #define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6
12902 #define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7
12903 #define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8
12904
12905 #define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2)
12906
12907 #endif /* GL_NV_fragment_program2 */
12908
12909 /* ------------------------ GL_NV_fragment_program4 ------------------------ */
12910
12911 #ifndef GL_NV_fragment_program4
12912 #define GL_NV_fragment_program4 1
12913
12914 #define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4)
12915
12916 #endif /* GL_NV_fragment_program4 */
12917
12918 /* --------------------- GL_NV_fragment_program_option --------------------- */
12919
12920 #ifndef GL_NV_fragment_program_option
12921 #define GL_NV_fragment_program_option 1
12922
12923 #define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option)
12924
12925 #endif /* GL_NV_fragment_program_option */
12926
12927 /* -------------------- GL_NV_fragment_shader_interlock -------------------- */
12928
12929 #ifndef GL_NV_fragment_shader_interlock
12930 #define GL_NV_fragment_shader_interlock 1
12931
12932 #define GLEW_NV_fragment_shader_interlock GLEW_GET_VAR(__GLEW_NV_fragment_shader_interlock)
12933
12934 #endif /* GL_NV_fragment_shader_interlock */
12935
12936 /* -------------------- GL_NV_framebuffer_mixed_samples -------------------- */
12937
12938 #ifndef GL_NV_framebuffer_mixed_samples
12939 #define GL_NV_framebuffer_mixed_samples 1
12940
12941 #define GL_COLOR_SAMPLES_NV 0x8E20
12942 #define GL_RASTER_MULTISAMPLE_EXT 0x9327
12943 #define GL_RASTER_SAMPLES_EXT 0x9328
12944 #define GL_MAX_RASTER_SAMPLES_EXT 0x9329
12945 #define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A
12946 #define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B
12947 #define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C
12948 #define GL_DEPTH_SAMPLES_NV 0x932D
12949 #define GL_STENCIL_SAMPLES_NV 0x932E
12950 #define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F
12951 #define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330
12952 #define GL_COVERAGE_MODULATION_TABLE_NV 0x9331
12953 #define GL_COVERAGE_MODULATION_NV 0x9332
12954 #define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333
12955
12956 #define GLEW_NV_framebuffer_mixed_samples GLEW_GET_VAR(__GLEW_NV_framebuffer_mixed_samples)
12957
12958 #endif /* GL_NV_framebuffer_mixed_samples */
12959
12960 /* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */
12961
12962 #ifndef GL_NV_framebuffer_multisample_coverage
12963 #define GL_NV_framebuffer_multisample_coverage 1
12964
12965 #define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB
12966 #define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10
12967 #define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11
12968 #define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12
12969
12970 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);
12971
12972 #define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV)
12973
12974 #define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage)
12975
12976 #endif /* GL_NV_framebuffer_multisample_coverage */
12977
12978 /* ------------------------ GL_NV_geometry_program4 ------------------------ */
12979
12980 #ifndef GL_NV_geometry_program4
12981 #define GL_NV_geometry_program4 1
12982
12983 #define GL_GEOMETRY_PROGRAM_NV 0x8C26
12984 #define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27
12985 #define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28
12986
12987 typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit);
12988
12989 #define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV)
12990
12991 #define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4)
12992
12993 #endif /* GL_NV_geometry_program4 */
12994
12995 /* ------------------------- GL_NV_geometry_shader4 ------------------------ */
12996
12997 #ifndef GL_NV_geometry_shader4
12998 #define GL_NV_geometry_shader4 1
12999
13000 #define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4)
13001
13002 #endif /* GL_NV_geometry_shader4 */
13003
13004 /* ------------------- GL_NV_geometry_shader_passthrough ------------------- */
13005
13006 #ifndef GL_NV_geometry_shader_passthrough
13007 #define GL_NV_geometry_shader_passthrough 1
13008
13009 #define GLEW_NV_geometry_shader_passthrough GLEW_GET_VAR(__GLEW_NV_geometry_shader_passthrough)
13010
13011 #endif /* GL_NV_geometry_shader_passthrough */
13012
13013 /* --------------------------- GL_NV_gpu_program4 -------------------------- */
13014
13015 #ifndef GL_NV_gpu_program4
13016 #define GL_NV_gpu_program4 1
13017
13018 #define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904
13019 #define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905
13020 #define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906
13021 #define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907
13022 #define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908
13023 #define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909
13024 #define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5
13025 #define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6
13026
13027 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);
13028 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params);
13029 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
13030 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params);
13031 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params);
13032 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params);
13033 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);
13034 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params);
13035 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
13036 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params);
13037 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params);
13038 typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params);
13039
13040 #define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV)
13041 #define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV)
13042 #define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV)
13043 #define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV)
13044 #define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV)
13045 #define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV)
13046 #define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV)
13047 #define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV)
13048 #define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV)
13049 #define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV)
13050 #define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV)
13051 #define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV)
13052
13053 #define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4)
13054
13055 #endif /* GL_NV_gpu_program4 */
13056
13057 /* --------------------------- GL_NV_gpu_program5 -------------------------- */
13058
13059 #ifndef GL_NV_gpu_program5
13060 #define GL_NV_gpu_program5 1
13061
13062 #define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A
13063 #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B
13064 #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C
13065 #define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D
13066 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E
13067 #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F
13068
13069 #define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5)
13070
13071 #endif /* GL_NV_gpu_program5 */
13072
13073 /* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */
13074
13075 #ifndef GL_NV_gpu_program5_mem_extended
13076 #define GL_NV_gpu_program5_mem_extended 1
13077
13078 #define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended)
13079
13080 #endif /* GL_NV_gpu_program5_mem_extended */
13081
13082 /* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */
13083
13084 #ifndef GL_NV_gpu_program_fp64
13085 #define GL_NV_gpu_program_fp64 1
13086
13087 #define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64)
13088
13089 #endif /* GL_NV_gpu_program_fp64 */
13090
13091 /* --------------------------- GL_NV_gpu_shader5 --------------------------- */
13092
13093 #ifndef GL_NV_gpu_shader5
13094 #define GL_NV_gpu_shader5 1
13095
13096 #define GL_INT64_NV 0x140E
13097 #define GL_UNSIGNED_INT64_NV 0x140F
13098 #define GL_INT8_NV 0x8FE0
13099 #define GL_INT8_VEC2_NV 0x8FE1
13100 #define GL_INT8_VEC3_NV 0x8FE2
13101 #define GL_INT8_VEC4_NV 0x8FE3
13102 #define GL_INT16_NV 0x8FE4
13103 #define GL_INT16_VEC2_NV 0x8FE5
13104 #define GL_INT16_VEC3_NV 0x8FE6
13105 #define GL_INT16_VEC4_NV 0x8FE7
13106 #define GL_INT64_VEC2_NV 0x8FE9
13107 #define GL_INT64_VEC3_NV 0x8FEA
13108 #define GL_INT64_VEC4_NV 0x8FEB
13109 #define GL_UNSIGNED_INT8_NV 0x8FEC
13110 #define GL_UNSIGNED_INT8_VEC2_NV 0x8FED
13111 #define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE
13112 #define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF
13113 #define GL_UNSIGNED_INT16_NV 0x8FF0
13114 #define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1
13115 #define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2
13116 #define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3
13117 #define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5
13118 #define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6
13119 #define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7
13120 #define GL_FLOAT16_NV 0x8FF8
13121 #define GL_FLOAT16_VEC2_NV 0x8FF9
13122 #define GL_FLOAT16_VEC3_NV 0x8FFA
13123 #define GL_FLOAT16_VEC4_NV 0x8FFB
13124
13125 typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params);
13126 typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params);
13127 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x);
13128 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
13129 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x);
13130 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
13131 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y);
13132 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
13133 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y);
13134 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
13135 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);
13136 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
13137 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
13138 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
13139 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
13140 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
13141 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
13142 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
13143 typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x);
13144 typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
13145 typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x);
13146 typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
13147 typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y);
13148 typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
13149 typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y);
13150 typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
13151 typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);
13152 typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
13153 typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
13154 typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
13155 typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
13156 typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
13157 typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
13158 typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
13159
13160 #define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV)
13161 #define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV)
13162 #define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV)
13163 #define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV)
13164 #define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV)
13165 #define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV)
13166 #define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV)
13167 #define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV)
13168 #define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV)
13169 #define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV)
13170 #define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV)
13171 #define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV)
13172 #define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV)
13173 #define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV)
13174 #define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV)
13175 #define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV)
13176 #define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV)
13177 #define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV)
13178 #define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV)
13179 #define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV)
13180 #define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV)
13181 #define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV)
13182 #define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV)
13183 #define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV)
13184 #define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV)
13185 #define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV)
13186 #define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV)
13187 #define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV)
13188 #define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV)
13189 #define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV)
13190 #define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV)
13191 #define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV)
13192 #define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV)
13193 #define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV)
13194
13195 #define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5)
13196
13197 #endif /* GL_NV_gpu_shader5 */
13198
13199 /* ---------------------------- GL_NV_half_float --------------------------- */
13200
13201 #ifndef GL_NV_half_float
13202 #define GL_NV_half_float 1
13203
13204 #define GL_HALF_FLOAT_NV 0x140B
13205
13206 typedef unsigned short GLhalf;
13207
13208 typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue);
13209 typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v);
13210 typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha);
13211 typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v);
13212 typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog);
13213 typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog);
13214 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s);
13215 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v);
13216 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t);
13217 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v);
13218 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r);
13219 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v);
13220 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q);
13221 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v);
13222 typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz);
13223 typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v);
13224 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue);
13225 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v);
13226 typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s);
13227 typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v);
13228 typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t);
13229 typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v);
13230 typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r);
13231 typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v);
13232 typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q);
13233 typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v);
13234 typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y);
13235 typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v);
13236 typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z);
13237 typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v);
13238 typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w);
13239 typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v);
13240 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x);
13241 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v);
13242 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y);
13243 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v);
13244 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z);
13245 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v);
13246 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w);
13247 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v);
13248 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);
13249 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);
13250 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);
13251 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);
13252 typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight);
13253 typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight);
13254
13255 #define glColor3hNV GLEW_GET_FUN(__glewColor3hNV)
13256 #define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV)
13257 #define glColor4hNV GLEW_GET_FUN(__glewColor4hNV)
13258 #define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV)
13259 #define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV)
13260 #define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV)
13261 #define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV)
13262 #define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV)
13263 #define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV)
13264 #define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV)
13265 #define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV)
13266 #define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV)
13267 #define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV)
13268 #define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV)
13269 #define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV)
13270 #define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV)
13271 #define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV)
13272 #define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV)
13273 #define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV)
13274 #define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV)
13275 #define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV)
13276 #define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV)
13277 #define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV)
13278 #define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV)
13279 #define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV)
13280 #define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV)
13281 #define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV)
13282 #define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV)
13283 #define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV)
13284 #define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV)
13285 #define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV)
13286 #define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV)
13287 #define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV)
13288 #define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV)
13289 #define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV)
13290 #define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV)
13291 #define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV)
13292 #define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV)
13293 #define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV)
13294 #define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV)
13295 #define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV)
13296 #define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV)
13297 #define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV)
13298 #define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV)
13299 #define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV)
13300 #define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV)
13301
13302 #define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float)
13303
13304 #endif /* GL_NV_half_float */
13305
13306 /* ------------------- GL_NV_internalformat_sample_query ------------------- */
13307
13308 #ifndef GL_NV_internalformat_sample_query
13309 #define GL_NV_internalformat_sample_query 1
13310
13311 #define GL_MULTISAMPLES_NV 0x9371
13312 #define GL_SUPERSAMPLE_SCALE_X_NV 0x9372
13313 #define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373
13314 #define GL_CONFORMANT_NV 0x9374
13315
13316 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params);
13317
13318 #define glGetInternalformatSampleivNV GLEW_GET_FUN(__glewGetInternalformatSampleivNV)
13319
13320 #define GLEW_NV_internalformat_sample_query GLEW_GET_VAR(__GLEW_NV_internalformat_sample_query)
13321
13322 #endif /* GL_NV_internalformat_sample_query */
13323
13324 /* ------------------------ GL_NV_light_max_exponent ----------------------- */
13325
13326 #ifndef GL_NV_light_max_exponent
13327 #define GL_NV_light_max_exponent 1
13328
13329 #define GL_MAX_SHININESS_NV 0x8504
13330 #define GL_MAX_SPOT_EXPONENT_NV 0x8505
13331
13332 #define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent)
13333
13334 #endif /* GL_NV_light_max_exponent */
13335
13336 /* ----------------------- GL_NV_multisample_coverage ---------------------- */
13337
13338 #ifndef GL_NV_multisample_coverage
13339 #define GL_NV_multisample_coverage 1
13340
13341 #define GL_COLOR_SAMPLES_NV 0x8E20
13342
13343 #define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage)
13344
13345 #endif /* GL_NV_multisample_coverage */
13346
13347 /* --------------------- GL_NV_multisample_filter_hint --------------------- */
13348
13349 #ifndef GL_NV_multisample_filter_hint
13350 #define GL_NV_multisample_filter_hint 1
13351
13352 #define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534
13353
13354 #define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint)
13355
13356 #endif /* GL_NV_multisample_filter_hint */
13357
13358 /* ------------------------- GL_NV_occlusion_query ------------------------- */
13359
13360 #ifndef GL_NV_occlusion_query
13361 #define GL_NV_occlusion_query 1
13362
13363 #define GL_PIXEL_COUNTER_BITS_NV 0x8864
13364 #define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865
13365 #define GL_PIXEL_COUNT_NV 0x8866
13366 #define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867
13367
13368 typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id);
13369 typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids);
13370 typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void);
13371 typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids);
13372 typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params);
13373 typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params);
13374 typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id);
13375
13376 #define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV)
13377 #define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV)
13378 #define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV)
13379 #define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV)
13380 #define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV)
13381 #define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV)
13382 #define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV)
13383
13384 #define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query)
13385
13386 #endif /* GL_NV_occlusion_query */
13387
13388 /* ----------------------- GL_NV_packed_depth_stencil ---------------------- */
13389
13390 #ifndef GL_NV_packed_depth_stencil
13391 #define GL_NV_packed_depth_stencil 1
13392
13393 #define GL_DEPTH_STENCIL_NV 0x84F9
13394 #define GL_UNSIGNED_INT_24_8_NV 0x84FA
13395
13396 #define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil)
13397
13398 #endif /* GL_NV_packed_depth_stencil */
13399
13400 /* --------------------- GL_NV_parameter_buffer_object --------------------- */
13401
13402 #ifndef GL_NV_parameter_buffer_object
13403 #define GL_NV_parameter_buffer_object 1
13404
13405 #define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0
13406 #define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1
13407 #define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2
13408 #define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3
13409 #define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4
13410
13411 typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params);
13412 typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params);
13413 typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params);
13414
13415 #define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV)
13416 #define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV)
13417 #define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV)
13418
13419 #define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object)
13420
13421 #endif /* GL_NV_parameter_buffer_object */
13422
13423 /* --------------------- GL_NV_parameter_buffer_object2 -------------------- */
13424
13425 #ifndef GL_NV_parameter_buffer_object2
13426 #define GL_NV_parameter_buffer_object2 1
13427
13428 #define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2)
13429
13430 #endif /* GL_NV_parameter_buffer_object2 */
13431
13432 /* -------------------------- GL_NV_path_rendering ------------------------- */
13433
13434 #ifndef GL_NV_path_rendering
13435 #define GL_NV_path_rendering 1
13436
13437 #define GL_CLOSE_PATH_NV 0x00
13438 #define GL_BOLD_BIT_NV 0x01
13439 #define GL_GLYPH_WIDTH_BIT_NV 0x01
13440 #define GL_GLYPH_HEIGHT_BIT_NV 0x02
13441 #define GL_ITALIC_BIT_NV 0x02
13442 #define GL_MOVE_TO_NV 0x02
13443 #define GL_RELATIVE_MOVE_TO_NV 0x03
13444 #define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04
13445 #define GL_LINE_TO_NV 0x04
13446 #define GL_RELATIVE_LINE_TO_NV 0x05
13447 #define GL_HORIZONTAL_LINE_TO_NV 0x06
13448 #define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07
13449 #define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08
13450 #define GL_VERTICAL_LINE_TO_NV 0x08
13451 #define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09
13452 #define GL_QUADRATIC_CURVE_TO_NV 0x0A
13453 #define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B
13454 #define GL_CUBIC_CURVE_TO_NV 0x0C
13455 #define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D
13456 #define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E
13457 #define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F
13458 #define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10
13459 #define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10
13460 #define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11
13461 #define GL_SMALL_CCW_ARC_TO_NV 0x12
13462 #define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13
13463 #define GL_SMALL_CW_ARC_TO_NV 0x14
13464 #define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15
13465 #define GL_LARGE_CCW_ARC_TO_NV 0x16
13466 #define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17
13467 #define GL_LARGE_CW_ARC_TO_NV 0x18
13468 #define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19
13469 #define GL_CONIC_CURVE_TO_NV 0x1A
13470 #define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B
13471 #define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20
13472 #define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40
13473 #define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80
13474 #define GL_ROUNDED_RECT_NV 0xE8
13475 #define GL_RELATIVE_ROUNDED_RECT_NV 0xE9
13476 #define GL_ROUNDED_RECT2_NV 0xEA
13477 #define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB
13478 #define GL_ROUNDED_RECT4_NV 0xEC
13479 #define GL_RELATIVE_ROUNDED_RECT4_NV 0xED
13480 #define GL_ROUNDED_RECT8_NV 0xEE
13481 #define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF
13482 #define GL_RESTART_PATH_NV 0xF0
13483 #define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2
13484 #define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4
13485 #define GL_RECT_NV 0xF6
13486 #define GL_RELATIVE_RECT_NV 0xF7
13487 #define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8
13488 #define GL_CIRCULAR_CW_ARC_TO_NV 0xFA
13489 #define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC
13490 #define GL_ARC_TO_NV 0xFE
13491 #define GL_RELATIVE_ARC_TO_NV 0xFF
13492 #define GL_GLYPH_HAS_KERNING_BIT_NV 0x100
13493 #define GL_PRIMARY_COLOR_NV 0x852C
13494 #define GL_SECONDARY_COLOR_NV 0x852D
13495 #define GL_PRIMARY_COLOR 0x8577
13496 #define GL_PATH_FORMAT_SVG_NV 0x9070
13497 #define GL_PATH_FORMAT_PS_NV 0x9071
13498 #define GL_STANDARD_FONT_NAME_NV 0x9072
13499 #define GL_SYSTEM_FONT_NAME_NV 0x9073
13500 #define GL_FILE_NAME_NV 0x9074
13501 #define GL_PATH_STROKE_WIDTH_NV 0x9075
13502 #define GL_PATH_END_CAPS_NV 0x9076
13503 #define GL_PATH_INITIAL_END_CAP_NV 0x9077
13504 #define GL_PATH_TERMINAL_END_CAP_NV 0x9078
13505 #define GL_PATH_JOIN_STYLE_NV 0x9079
13506 #define GL_PATH_MITER_LIMIT_NV 0x907A
13507 #define GL_PATH_DASH_CAPS_NV 0x907B
13508 #define GL_PATH_INITIAL_DASH_CAP_NV 0x907C
13509 #define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D
13510 #define GL_PATH_DASH_OFFSET_NV 0x907E
13511 #define GL_PATH_CLIENT_LENGTH_NV 0x907F
13512 #define GL_PATH_FILL_MODE_NV 0x9080
13513 #define GL_PATH_FILL_MASK_NV 0x9081
13514 #define GL_PATH_FILL_COVER_MODE_NV 0x9082
13515 #define GL_PATH_STROKE_COVER_MODE_NV 0x9083
13516 #define GL_PATH_STROKE_MASK_NV 0x9084
13517 #define GL_PATH_STROKE_BOUND_NV 0x9086
13518 #define GL_COUNT_UP_NV 0x9088
13519 #define GL_COUNT_DOWN_NV 0x9089
13520 #define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A
13521 #define GL_CONVEX_HULL_NV 0x908B
13522 #define GL_BOUNDING_BOX_NV 0x908D
13523 #define GL_TRANSLATE_X_NV 0x908E
13524 #define GL_TRANSLATE_Y_NV 0x908F
13525 #define GL_TRANSLATE_2D_NV 0x9090
13526 #define GL_TRANSLATE_3D_NV 0x9091
13527 #define GL_AFFINE_2D_NV 0x9092
13528 #define GL_AFFINE_3D_NV 0x9094
13529 #define GL_TRANSPOSE_AFFINE_2D_NV 0x9096
13530 #define GL_TRANSPOSE_AFFINE_3D_NV 0x9098
13531 #define GL_UTF8_NV 0x909A
13532 #define GL_UTF16_NV 0x909B
13533 #define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C
13534 #define GL_PATH_COMMAND_COUNT_NV 0x909D
13535 #define GL_PATH_COORD_COUNT_NV 0x909E
13536 #define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F
13537 #define GL_PATH_COMPUTED_LENGTH_NV 0x90A0
13538 #define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1
13539 #define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2
13540 #define GL_SQUARE_NV 0x90A3
13541 #define GL_ROUND_NV 0x90A4
13542 #define GL_TRIANGULAR_NV 0x90A5
13543 #define GL_BEVEL_NV 0x90A6
13544 #define GL_MITER_REVERT_NV 0x90A7
13545 #define GL_MITER_TRUNCATE_NV 0x90A8
13546 #define GL_SKIP_MISSING_GLYPH_NV 0x90A9
13547 #define GL_USE_MISSING_GLYPH_NV 0x90AA
13548 #define GL_PATH_ERROR_POSITION_NV 0x90AB
13549 #define GL_PATH_FOG_GEN_MODE_NV 0x90AC
13550 #define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD
13551 #define GL_ADJACENT_PAIRS_NV 0x90AE
13552 #define GL_FIRST_TO_REST_NV 0x90AF
13553 #define GL_PATH_GEN_MODE_NV 0x90B0
13554 #define GL_PATH_GEN_COEFF_NV 0x90B1
13555 #define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2
13556 #define GL_PATH_GEN_COMPONENTS_NV 0x90B3
13557 #define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4
13558 #define GL_MOVE_TO_RESETS_NV 0x90B5
13559 #define GL_MOVE_TO_CONTINUES_NV 0x90B6
13560 #define GL_PATH_STENCIL_FUNC_NV 0x90B7
13561 #define GL_PATH_STENCIL_REF_NV 0x90B8
13562 #define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9
13563 #define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD
13564 #define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE
13565 #define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF
13566 #define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368
13567 #define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369
13568 #define GL_FONT_UNAVAILABLE_NV 0x936A
13569 #define GL_FONT_UNINTELLIGIBLE_NV 0x936B
13570 #define GL_STANDARD_FONT_FORMAT_NV 0x936C
13571 #define GL_FRAGMENT_INPUT_NV 0x936D
13572 #define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000
13573 #define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000
13574 #define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000
13575 #define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000
13576 #define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000
13577 #define GL_FONT_ASCENDER_BIT_NV 0x00200000
13578 #define GL_FONT_DESCENDER_BIT_NV 0x00400000
13579 #define GL_FONT_HEIGHT_BIT_NV 0x00800000
13580 #define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000
13581 #define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000
13582 #define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000
13583 #define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000
13584 #define GL_FONT_HAS_KERNING_BIT_NV 0x10000000
13585 #define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000
13586
13587 typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath);
13588 typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
13589 typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode);
13590 typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
13591 typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode);
13592 typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range);
13593 typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range);
13594 typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value);
13595 typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value);
13596 typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte* commands);
13597 typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat* coords);
13598 typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat* dashArray);
13599 typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments);
13600 typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics);
13601 typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);
13602 typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat* value);
13603 typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint* value);
13604 typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);
13605 typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value);
13606 typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value);
13607 typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLfloat *params);
13608 typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);
13609 typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path);
13610 typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y);
13611 typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y);
13612 typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat* m);
13613 typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat* m);
13614 typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m);
13615 typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat* m);
13616 typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat* m);
13617 typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m);
13618 typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs);
13619 typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords);
13620 typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords);
13621 typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc);
13622 typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray);
13623 typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode);
13624 typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
13625 typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]);
13626 typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
13627 typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
13628 typedef GLenum (GLAPIENTRY * PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
13629 typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value);
13630 typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value);
13631 typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value);
13632 typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value);
13633 typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units);
13634 typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask);
13635 typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString);
13636 typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords);
13637 typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords);
13638 typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs);
13639 typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);
13640 typedef void (GLAPIENTRY * PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs);
13641 typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);
13642 typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask);
13643 typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);
13644 typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask);
13645 typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
13646 typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
13647 typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
13648 typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode);
13649 typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues);
13650 typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]);
13651
13652 #define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV)
13653 #define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV)
13654 #define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV)
13655 #define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV)
13656 #define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV)
13657 #define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV)
13658 #define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV)
13659 #define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV)
13660 #define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV)
13661 #define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV)
13662 #define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV)
13663 #define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV)
13664 #define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV)
13665 #define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV)
13666 #define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV)
13667 #define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV)
13668 #define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV)
13669 #define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV)
13670 #define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV)
13671 #define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV)
13672 #define glGetProgramResourcefvNV GLEW_GET_FUN(__glewGetProgramResourcefvNV)
13673 #define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV)
13674 #define glIsPathNV GLEW_GET_FUN(__glewIsPathNV)
13675 #define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV)
13676 #define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV)
13677 #define glMatrixLoad3x2fNV GLEW_GET_FUN(__glewMatrixLoad3x2fNV)
13678 #define glMatrixLoad3x3fNV GLEW_GET_FUN(__glewMatrixLoad3x3fNV)
13679 #define glMatrixLoadTranspose3x3fNV GLEW_GET_FUN(__glewMatrixLoadTranspose3x3fNV)
13680 #define glMatrixMult3x2fNV GLEW_GET_FUN(__glewMatrixMult3x2fNV)
13681 #define glMatrixMult3x3fNV GLEW_GET_FUN(__glewMatrixMult3x3fNV)
13682 #define glMatrixMultTranspose3x3fNV GLEW_GET_FUN(__glewMatrixMultTranspose3x3fNV)
13683 #define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV)
13684 #define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV)
13685 #define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV)
13686 #define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV)
13687 #define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV)
13688 #define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV)
13689 #define glPathGlyphIndexArrayNV GLEW_GET_FUN(__glewPathGlyphIndexArrayNV)
13690 #define glPathGlyphIndexRangeNV GLEW_GET_FUN(__glewPathGlyphIndexRangeNV)
13691 #define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV)
13692 #define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV)
13693 #define glPathMemoryGlyphIndexArrayNV GLEW_GET_FUN(__glewPathMemoryGlyphIndexArrayNV)
13694 #define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV)
13695 #define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV)
13696 #define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV)
13697 #define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV)
13698 #define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV)
13699 #define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV)
13700 #define glPathStringNV GLEW_GET_FUN(__glewPathStringNV)
13701 #define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV)
13702 #define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV)
13703 #define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV)
13704 #define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV)
13705 #define glProgramPathFragmentInputGenNV GLEW_GET_FUN(__glewProgramPathFragmentInputGenNV)
13706 #define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV)
13707 #define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV)
13708 #define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV)
13709 #define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV)
13710 #define glStencilThenCoverFillPathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverFillPathInstancedNV)
13711 #define glStencilThenCoverFillPathNV GLEW_GET_FUN(__glewStencilThenCoverFillPathNV)
13712 #define glStencilThenCoverStrokePathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathInstancedNV)
13713 #define glStencilThenCoverStrokePathNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathNV)
13714 #define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV)
13715 #define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV)
13716
13717 #define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering)
13718
13719 #endif /* GL_NV_path_rendering */
13720
13721 /* -------------------- GL_NV_path_rendering_shared_edge ------------------- */
13722
13723 #ifndef GL_NV_path_rendering_shared_edge
13724 #define GL_NV_path_rendering_shared_edge 1
13725
13726 #define GL_SHARED_EDGE_NV 0xC0
13727
13728 #define GLEW_NV_path_rendering_shared_edge GLEW_GET_VAR(__GLEW_NV_path_rendering_shared_edge)
13729
13730 #endif /* GL_NV_path_rendering_shared_edge */
13731
13732 /* ------------------------- GL_NV_pixel_data_range ------------------------ */
13733
13734 #ifndef GL_NV_pixel_data_range
13735 #define GL_NV_pixel_data_range 1
13736
13737 #define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878
13738 #define GL_READ_PIXEL_DATA_RANGE_NV 0x8879
13739 #define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A
13740 #define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B
13741 #define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C
13742 #define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D
13743
13744 typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target);
13745 typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void *pointer);
13746
13747 #define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV)
13748 #define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV)
13749
13750 #define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range)
13751
13752 #endif /* GL_NV_pixel_data_range */
13753
13754 /* --------------------------- GL_NV_point_sprite -------------------------- */
13755
13756 #ifndef GL_NV_point_sprite
13757 #define GL_NV_point_sprite 1
13758
13759 #define GL_POINT_SPRITE_NV 0x8861
13760 #define GL_COORD_REPLACE_NV 0x8862
13761 #define GL_POINT_SPRITE_R_MODE_NV 0x8863
13762
13763 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param);
13764 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params);
13765
13766 #define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV)
13767 #define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV)
13768
13769 #define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite)
13770
13771 #endif /* GL_NV_point_sprite */
13772
13773 /* -------------------------- GL_NV_present_video -------------------------- */
13774
13775 #ifndef GL_NV_present_video
13776 #define GL_NV_present_video 1
13777
13778 #define GL_FRAME_NV 0x8E26
13779 #define GL_FIELDS_NV 0x8E27
13780 #define GL_CURRENT_TIME_NV 0x8E28
13781 #define GL_NUM_FILL_STREAMS_NV 0x8E29
13782 #define GL_PRESENT_TIME_NV 0x8E2A
13783 #define GL_PRESENT_DURATION_NV 0x8E2B
13784
13785 typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params);
13786 typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params);
13787 typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params);
13788 typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params);
13789 typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3);
13790 typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1);
13791
13792 #define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV)
13793 #define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV)
13794 #define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV)
13795 #define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV)
13796 #define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV)
13797 #define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV)
13798
13799 #define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video)
13800
13801 #endif /* GL_NV_present_video */
13802
13803 /* ------------------------ GL_NV_primitive_restart ------------------------ */
13804
13805 #ifndef GL_NV_primitive_restart
13806 #define GL_NV_primitive_restart 1
13807
13808 #define GL_PRIMITIVE_RESTART_NV 0x8558
13809 #define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559
13810
13811 typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index);
13812 typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void);
13813
13814 #define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV)
13815 #define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV)
13816
13817 #define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart)
13818
13819 #endif /* GL_NV_primitive_restart */
13820
13821 /* ------------------------ GL_NV_register_combiners ----------------------- */
13822
13823 #ifndef GL_NV_register_combiners
13824 #define GL_NV_register_combiners 1
13825
13826 #define GL_REGISTER_COMBINERS_NV 0x8522
13827 #define GL_VARIABLE_A_NV 0x8523
13828 #define GL_VARIABLE_B_NV 0x8524
13829 #define GL_VARIABLE_C_NV 0x8525
13830 #define GL_VARIABLE_D_NV 0x8526
13831 #define GL_VARIABLE_E_NV 0x8527
13832 #define GL_VARIABLE_F_NV 0x8528
13833 #define GL_VARIABLE_G_NV 0x8529
13834 #define GL_CONSTANT_COLOR0_NV 0x852A
13835 #define GL_CONSTANT_COLOR1_NV 0x852B
13836 #define GL_PRIMARY_COLOR_NV 0x852C
13837 #define GL_SECONDARY_COLOR_NV 0x852D
13838 #define GL_SPARE0_NV 0x852E
13839 #define GL_SPARE1_NV 0x852F
13840 #define GL_DISCARD_NV 0x8530
13841 #define GL_E_TIMES_F_NV 0x8531
13842 #define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532
13843 #define GL_UNSIGNED_IDENTITY_NV 0x8536
13844 #define GL_UNSIGNED_INVERT_NV 0x8537
13845 #define GL_EXPAND_NORMAL_NV 0x8538
13846 #define GL_EXPAND_NEGATE_NV 0x8539
13847 #define GL_HALF_BIAS_NORMAL_NV 0x853A
13848 #define GL_HALF_BIAS_NEGATE_NV 0x853B
13849 #define GL_SIGNED_IDENTITY_NV 0x853C
13850 #define GL_SIGNED_NEGATE_NV 0x853D
13851 #define GL_SCALE_BY_TWO_NV 0x853E
13852 #define GL_SCALE_BY_FOUR_NV 0x853F
13853 #define GL_SCALE_BY_ONE_HALF_NV 0x8540
13854 #define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541
13855 #define GL_COMBINER_INPUT_NV 0x8542
13856 #define GL_COMBINER_MAPPING_NV 0x8543
13857 #define GL_COMBINER_COMPONENT_USAGE_NV 0x8544
13858 #define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545
13859 #define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546
13860 #define GL_COMBINER_MUX_SUM_NV 0x8547
13861 #define GL_COMBINER_SCALE_NV 0x8548
13862 #define GL_COMBINER_BIAS_NV 0x8549
13863 #define GL_COMBINER_AB_OUTPUT_NV 0x854A
13864 #define GL_COMBINER_CD_OUTPUT_NV 0x854B
13865 #define GL_COMBINER_SUM_OUTPUT_NV 0x854C
13866 #define GL_MAX_GENERAL_COMBINERS_NV 0x854D
13867 #define GL_NUM_GENERAL_COMBINERS_NV 0x854E
13868 #define GL_COLOR_SUM_CLAMP_NV 0x854F
13869 #define GL_COMBINER0_NV 0x8550
13870 #define GL_COMBINER1_NV 0x8551
13871 #define GL_COMBINER2_NV 0x8552
13872 #define GL_COMBINER3_NV 0x8553
13873 #define GL_COMBINER4_NV 0x8554
13874 #define GL_COMBINER5_NV 0x8555
13875 #define GL_COMBINER6_NV 0x8556
13876 #define GL_COMBINER7_NV 0x8557
13877
13878 typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
13879 typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
13880 typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);
13881 typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params);
13882 typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);
13883 typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params);
13884 typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
13885 typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params);
13886 typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params);
13887 typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params);
13888 typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params);
13889 typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params);
13890 typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params);
13891
13892 #define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV)
13893 #define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV)
13894 #define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV)
13895 #define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV)
13896 #define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV)
13897 #define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV)
13898 #define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV)
13899 #define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV)
13900 #define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV)
13901 #define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV)
13902 #define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV)
13903 #define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV)
13904 #define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV)
13905
13906 #define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners)
13907
13908 #endif /* GL_NV_register_combiners */
13909
13910 /* ----------------------- GL_NV_register_combiners2 ----------------------- */
13911
13912 #ifndef GL_NV_register_combiners2
13913 #define GL_NV_register_combiners2 1
13914
13915 #define GL_PER_STAGE_CONSTANTS_NV 0x8535
13916
13917 typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params);
13918 typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params);
13919
13920 #define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV)
13921 #define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV)
13922
13923 #define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2)
13924
13925 #endif /* GL_NV_register_combiners2 */
13926
13927 /* ------------------------- GL_NV_sample_locations ------------------------ */
13928
13929 #ifndef GL_NV_sample_locations
13930 #define GL_NV_sample_locations 1
13931
13932 #define GL_SAMPLE_LOCATION_NV 0x8E50
13933 #define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D
13934 #define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E
13935 #define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F
13936 #define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340
13937 #define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341
13938 #define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342
13939 #define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343
13940
13941 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v);
13942 typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v);
13943
13944 #define glFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewFramebufferSampleLocationsfvNV)
13945 #define glNamedFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvNV)
13946
13947 #define GLEW_NV_sample_locations GLEW_GET_VAR(__GLEW_NV_sample_locations)
13948
13949 #endif /* GL_NV_sample_locations */
13950
13951 /* ------------------ GL_NV_sample_mask_override_coverage ------------------ */
13952
13953 #ifndef GL_NV_sample_mask_override_coverage
13954 #define GL_NV_sample_mask_override_coverage 1
13955
13956 #define GLEW_NV_sample_mask_override_coverage GLEW_GET_VAR(__GLEW_NV_sample_mask_override_coverage)
13957
13958 #endif /* GL_NV_sample_mask_override_coverage */
13959
13960 /* ---------------------- GL_NV_shader_atomic_counters --------------------- */
13961
13962 #ifndef GL_NV_shader_atomic_counters
13963 #define GL_NV_shader_atomic_counters 1
13964
13965 #define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters)
13966
13967 #endif /* GL_NV_shader_atomic_counters */
13968
13969 /* ----------------------- GL_NV_shader_atomic_float ----------------------- */
13970
13971 #ifndef GL_NV_shader_atomic_float
13972 #define GL_NV_shader_atomic_float 1
13973
13974 #define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float)
13975
13976 #endif /* GL_NV_shader_atomic_float */
13977
13978 /* -------------------- GL_NV_shader_atomic_fp16_vector -------------------- */
13979
13980 #ifndef GL_NV_shader_atomic_fp16_vector
13981 #define GL_NV_shader_atomic_fp16_vector 1
13982
13983 #define GLEW_NV_shader_atomic_fp16_vector GLEW_GET_VAR(__GLEW_NV_shader_atomic_fp16_vector)
13984
13985 #endif /* GL_NV_shader_atomic_fp16_vector */
13986
13987 /* ----------------------- GL_NV_shader_atomic_int64 ----------------------- */
13988
13989 #ifndef GL_NV_shader_atomic_int64
13990 #define GL_NV_shader_atomic_int64 1
13991
13992 #define GLEW_NV_shader_atomic_int64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_int64)
13993
13994 #endif /* GL_NV_shader_atomic_int64 */
13995
13996 /* ------------------------ GL_NV_shader_buffer_load ----------------------- */
13997
13998 #ifndef GL_NV_shader_buffer_load
13999 #define GL_NV_shader_buffer_load 1
14000
14001 #define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D
14002 #define GL_GPU_ADDRESS_NV 0x8F34
14003 #define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35
14004
14005 typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params);
14006 typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result);
14007 typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params);
14008 typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target);
14009 typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer);
14010 typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target);
14011 typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access);
14012 typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer);
14013 typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access);
14014 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value);
14015 typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
14016 typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value);
14017 typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
14018
14019 #define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV)
14020 #define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV)
14021 #define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV)
14022 #define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV)
14023 #define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV)
14024 #define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV)
14025 #define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV)
14026 #define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV)
14027 #define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV)
14028 #define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV)
14029 #define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV)
14030 #define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV)
14031 #define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV)
14032
14033 #define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load)
14034
14035 #endif /* GL_NV_shader_buffer_load */
14036
14037 /* ------------------- GL_NV_shader_storage_buffer_object ------------------ */
14038
14039 #ifndef GL_NV_shader_storage_buffer_object
14040 #define GL_NV_shader_storage_buffer_object 1
14041
14042 #define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object)
14043
14044 #endif /* GL_NV_shader_storage_buffer_object */
14045
14046 /* ----------------------- GL_NV_shader_thread_group ----------------------- */
14047
14048 #ifndef GL_NV_shader_thread_group
14049 #define GL_NV_shader_thread_group 1
14050
14051 #define GL_WARP_SIZE_NV 0x9339
14052 #define GL_WARPS_PER_SM_NV 0x933A
14053 #define GL_SM_COUNT_NV 0x933B
14054
14055 #define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group)
14056
14057 #endif /* GL_NV_shader_thread_group */
14058
14059 /* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */
14060
14061 #ifndef GL_NV_shader_thread_shuffle
14062 #define GL_NV_shader_thread_shuffle 1
14063
14064 #define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle)
14065
14066 #endif /* GL_NV_shader_thread_shuffle */
14067
14068 /* ---------------------- GL_NV_tessellation_program5 ---------------------- */
14069
14070 #ifndef GL_NV_tessellation_program5
14071 #define GL_NV_tessellation_program5 1
14072
14073 #define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8
14074 #define GL_TESS_CONTROL_PROGRAM_NV 0x891E
14075 #define GL_TESS_EVALUATION_PROGRAM_NV 0x891F
14076 #define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74
14077 #define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75
14078
14079 #define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5)
14080
14081 #endif /* GL_NV_tessellation_program5 */
14082
14083 /* -------------------------- GL_NV_texgen_emboss -------------------------- */
14084
14085 #ifndef GL_NV_texgen_emboss
14086 #define GL_NV_texgen_emboss 1
14087
14088 #define GL_EMBOSS_LIGHT_NV 0x855D
14089 #define GL_EMBOSS_CONSTANT_NV 0x855E
14090 #define GL_EMBOSS_MAP_NV 0x855F
14091
14092 #define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss)
14093
14094 #endif /* GL_NV_texgen_emboss */
14095
14096 /* ------------------------ GL_NV_texgen_reflection ------------------------ */
14097
14098 #ifndef GL_NV_texgen_reflection
14099 #define GL_NV_texgen_reflection 1
14100
14101 #define GL_NORMAL_MAP_NV 0x8511
14102 #define GL_REFLECTION_MAP_NV 0x8512
14103
14104 #define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection)
14105
14106 #endif /* GL_NV_texgen_reflection */
14107
14108 /* ------------------------- GL_NV_texture_barrier ------------------------- */
14109
14110 #ifndef GL_NV_texture_barrier
14111 #define GL_NV_texture_barrier 1
14112
14113 typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void);
14114
14115 #define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV)
14116
14117 #define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier)
14118
14119 #endif /* GL_NV_texture_barrier */
14120
14121 /* --------------------- GL_NV_texture_compression_vtc --------------------- */
14122
14123 #ifndef GL_NV_texture_compression_vtc
14124 #define GL_NV_texture_compression_vtc 1
14125
14126 #define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc)
14127
14128 #endif /* GL_NV_texture_compression_vtc */
14129
14130 /* ----------------------- GL_NV_texture_env_combine4 ---------------------- */
14131
14132 #ifndef GL_NV_texture_env_combine4
14133 #define GL_NV_texture_env_combine4 1
14134
14135 #define GL_COMBINE4_NV 0x8503
14136 #define GL_SOURCE3_RGB_NV 0x8583
14137 #define GL_SOURCE3_ALPHA_NV 0x858B
14138 #define GL_OPERAND3_RGB_NV 0x8593
14139 #define GL_OPERAND3_ALPHA_NV 0x859B
14140
14141 #define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4)
14142
14143 #endif /* GL_NV_texture_env_combine4 */
14144
14145 /* ---------------------- GL_NV_texture_expand_normal ---------------------- */
14146
14147 #ifndef GL_NV_texture_expand_normal
14148 #define GL_NV_texture_expand_normal 1
14149
14150 #define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F
14151
14152 #define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal)
14153
14154 #endif /* GL_NV_texture_expand_normal */
14155
14156 /* ----------------------- GL_NV_texture_multisample ----------------------- */
14157
14158 #ifndef GL_NV_texture_multisample
14159 #define GL_NV_texture_multisample 1
14160
14161 #define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045
14162 #define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046
14163
14164 typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
14165 typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
14166 typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
14167 typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
14168 typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
14169 typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
14170
14171 #define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV)
14172 #define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV)
14173 #define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV)
14174 #define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV)
14175 #define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV)
14176 #define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV)
14177
14178 #define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample)
14179
14180 #endif /* GL_NV_texture_multisample */
14181
14182 /* ------------------------ GL_NV_texture_rectangle ------------------------ */
14183
14184 #ifndef GL_NV_texture_rectangle
14185 #define GL_NV_texture_rectangle 1
14186
14187 #define GL_TEXTURE_RECTANGLE_NV 0x84F5
14188 #define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6
14189 #define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7
14190 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8
14191
14192 #define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle)
14193
14194 #endif /* GL_NV_texture_rectangle */
14195
14196 /* -------------------------- GL_NV_texture_shader ------------------------- */
14197
14198 #ifndef GL_NV_texture_shader
14199 #define GL_NV_texture_shader 1
14200
14201 #define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C
14202 #define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D
14203 #define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E
14204 #define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9
14205 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA
14206 #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB
14207 #define GL_DSDT_MAG_INTENSITY_NV 0x86DC
14208 #define GL_SHADER_CONSISTENT_NV 0x86DD
14209 #define GL_TEXTURE_SHADER_NV 0x86DE
14210 #define GL_SHADER_OPERATION_NV 0x86DF
14211 #define GL_CULL_MODES_NV 0x86E0
14212 #define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1
14213 #define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1
14214 #define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2
14215 #define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2
14216 #define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3
14217 #define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3
14218 #define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4
14219 #define GL_CONST_EYE_NV 0x86E5
14220 #define GL_PASS_THROUGH_NV 0x86E6
14221 #define GL_CULL_FRAGMENT_NV 0x86E7
14222 #define GL_OFFSET_TEXTURE_2D_NV 0x86E8
14223 #define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9
14224 #define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA
14225 #define GL_DOT_PRODUCT_NV 0x86EC
14226 #define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED
14227 #define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE
14228 #define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0
14229 #define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1
14230 #define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2
14231 #define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3
14232 #define GL_HILO_NV 0x86F4
14233 #define GL_DSDT_NV 0x86F5
14234 #define GL_DSDT_MAG_NV 0x86F6
14235 #define GL_DSDT_MAG_VIB_NV 0x86F7
14236 #define GL_HILO16_NV 0x86F8
14237 #define GL_SIGNED_HILO_NV 0x86F9
14238 #define GL_SIGNED_HILO16_NV 0x86FA
14239 #define GL_SIGNED_RGBA_NV 0x86FB
14240 #define GL_SIGNED_RGBA8_NV 0x86FC
14241 #define GL_SIGNED_RGB_NV 0x86FE
14242 #define GL_SIGNED_RGB8_NV 0x86FF
14243 #define GL_SIGNED_LUMINANCE_NV 0x8701
14244 #define GL_SIGNED_LUMINANCE8_NV 0x8702
14245 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703
14246 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704
14247 #define GL_SIGNED_ALPHA_NV 0x8705
14248 #define GL_SIGNED_ALPHA8_NV 0x8706
14249 #define GL_SIGNED_INTENSITY_NV 0x8707
14250 #define GL_SIGNED_INTENSITY8_NV 0x8708
14251 #define GL_DSDT8_NV 0x8709
14252 #define GL_DSDT8_MAG8_NV 0x870A
14253 #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B
14254 #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C
14255 #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
14256 #define GL_HI_SCALE_NV 0x870E
14257 #define GL_LO_SCALE_NV 0x870F
14258 #define GL_DS_SCALE_NV 0x8710
14259 #define GL_DT_SCALE_NV 0x8711
14260 #define GL_MAGNITUDE_SCALE_NV 0x8712
14261 #define GL_VIBRANCE_SCALE_NV 0x8713
14262 #define GL_HI_BIAS_NV 0x8714
14263 #define GL_LO_BIAS_NV 0x8715
14264 #define GL_DS_BIAS_NV 0x8716
14265 #define GL_DT_BIAS_NV 0x8717
14266 #define GL_MAGNITUDE_BIAS_NV 0x8718
14267 #define GL_VIBRANCE_BIAS_NV 0x8719
14268 #define GL_TEXTURE_BORDER_VALUES_NV 0x871A
14269 #define GL_TEXTURE_HI_SIZE_NV 0x871B
14270 #define GL_TEXTURE_LO_SIZE_NV 0x871C
14271 #define GL_TEXTURE_DS_SIZE_NV 0x871D
14272 #define GL_TEXTURE_DT_SIZE_NV 0x871E
14273 #define GL_TEXTURE_MAG_SIZE_NV 0x871F
14274
14275 #define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader)
14276
14277 #endif /* GL_NV_texture_shader */
14278
14279 /* ------------------------- GL_NV_texture_shader2 ------------------------- */
14280
14281 #ifndef GL_NV_texture_shader2
14282 #define GL_NV_texture_shader2 1
14283
14284 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA
14285 #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB
14286 #define GL_DSDT_MAG_INTENSITY_NV 0x86DC
14287 #define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF
14288 #define GL_HILO_NV 0x86F4
14289 #define GL_DSDT_NV 0x86F5
14290 #define GL_DSDT_MAG_NV 0x86F6
14291 #define GL_DSDT_MAG_VIB_NV 0x86F7
14292 #define GL_HILO16_NV 0x86F8
14293 #define GL_SIGNED_HILO_NV 0x86F9
14294 #define GL_SIGNED_HILO16_NV 0x86FA
14295 #define GL_SIGNED_RGBA_NV 0x86FB
14296 #define GL_SIGNED_RGBA8_NV 0x86FC
14297 #define GL_SIGNED_RGB_NV 0x86FE
14298 #define GL_SIGNED_RGB8_NV 0x86FF
14299 #define GL_SIGNED_LUMINANCE_NV 0x8701
14300 #define GL_SIGNED_LUMINANCE8_NV 0x8702
14301 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703
14302 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704
14303 #define GL_SIGNED_ALPHA_NV 0x8705
14304 #define GL_SIGNED_ALPHA8_NV 0x8706
14305 #define GL_SIGNED_INTENSITY_NV 0x8707
14306 #define GL_SIGNED_INTENSITY8_NV 0x8708
14307 #define GL_DSDT8_NV 0x8709
14308 #define GL_DSDT8_MAG8_NV 0x870A
14309 #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B
14310 #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C
14311 #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
14312
14313 #define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2)
14314
14315 #endif /* GL_NV_texture_shader2 */
14316
14317 /* ------------------------- GL_NV_texture_shader3 ------------------------- */
14318
14319 #ifndef GL_NV_texture_shader3
14320 #define GL_NV_texture_shader3 1
14321
14322 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850
14323 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851
14324 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852
14325 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853
14326 #define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854
14327 #define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855
14328 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856
14329 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857
14330 #define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858
14331 #define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859
14332 #define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A
14333 #define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B
14334 #define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C
14335 #define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D
14336 #define GL_HILO8_NV 0x885E
14337 #define GL_SIGNED_HILO8_NV 0x885F
14338 #define GL_FORCE_BLUE_TO_ONE_NV 0x8860
14339
14340 #define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3)
14341
14342 #endif /* GL_NV_texture_shader3 */
14343
14344 /* ------------------------ GL_NV_transform_feedback ----------------------- */
14345
14346 #ifndef GL_NV_transform_feedback
14347 #define GL_NV_transform_feedback 1
14348
14349 #define GL_BACK_PRIMARY_COLOR_NV 0x8C77
14350 #define GL_BACK_SECONDARY_COLOR_NV 0x8C78
14351 #define GL_TEXTURE_COORD_NV 0x8C79
14352 #define GL_CLIP_DISTANCE_NV 0x8C7A
14353 #define GL_VERTEX_ID_NV 0x8C7B
14354 #define GL_PRIMITIVE_ID_NV 0x8C7C
14355 #define GL_GENERIC_ATTRIB_NV 0x8C7D
14356 #define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E
14357 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F
14358 #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80
14359 #define GL_ACTIVE_VARYINGS_NV 0x8C81
14360 #define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82
14361 #define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83
14362 #define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84
14363 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85
14364 #define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86
14365 #define GL_PRIMITIVES_GENERATED_NV 0x8C87
14366 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88
14367 #define GL_RASTERIZER_DISCARD_NV 0x8C89
14368 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A
14369 #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B
14370 #define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C
14371 #define GL_SEPARATE_ATTRIBS_NV 0x8C8D
14372 #define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E
14373 #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F
14374
14375 typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name);
14376 typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode);
14377 typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer);
14378 typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);
14379 typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
14380 typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void);
14381 typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
14382 typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location);
14383 typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name);
14384 typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode);
14385 typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode);
14386
14387 #define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV)
14388 #define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV)
14389 #define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV)
14390 #define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV)
14391 #define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV)
14392 #define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV)
14393 #define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV)
14394 #define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV)
14395 #define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV)
14396 #define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV)
14397 #define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV)
14398
14399 #define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback)
14400
14401 #endif /* GL_NV_transform_feedback */
14402
14403 /* ----------------------- GL_NV_transform_feedback2 ----------------------- */
14404
14405 #ifndef GL_NV_transform_feedback2
14406 #define GL_NV_transform_feedback2 1
14407
14408 #define GL_TRANSFORM_FEEDBACK_NV 0x8E22
14409 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23
14410 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24
14411 #define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25
14412
14413 typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id);
14414 typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids);
14415 typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id);
14416 typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids);
14417 typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id);
14418 typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void);
14419 typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void);
14420
14421 #define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV)
14422 #define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV)
14423 #define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV)
14424 #define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV)
14425 #define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV)
14426 #define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV)
14427 #define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV)
14428
14429 #define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2)
14430
14431 #endif /* GL_NV_transform_feedback2 */
14432
14433 /* ------------------ GL_NV_uniform_buffer_unified_memory ------------------ */
14434
14435 #ifndef GL_NV_uniform_buffer_unified_memory
14436 #define GL_NV_uniform_buffer_unified_memory 1
14437
14438 #define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E
14439 #define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F
14440 #define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370
14441
14442 #define GLEW_NV_uniform_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_uniform_buffer_unified_memory)
14443
14444 #endif /* GL_NV_uniform_buffer_unified_memory */
14445
14446 /* -------------------------- GL_NV_vdpau_interop -------------------------- */
14447
14448 #ifndef GL_NV_vdpau_interop
14449 #define GL_NV_vdpau_interop 1
14450
14451 #define GL_SURFACE_STATE_NV 0x86EB
14452 #define GL_SURFACE_REGISTERED_NV 0x86FD
14453 #define GL_SURFACE_MAPPED_NV 0x8700
14454 #define GL_WRITE_DISCARD_NV 0x88BE
14455
14456 typedef GLintptr GLvdpauSurfaceNV;
14457
14458 typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void);
14459 typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values);
14460 typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const void*getProcAddress);
14461 typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface);
14462 typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces);
14463 typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
14464 typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
14465 typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access);
14466 typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces);
14467 typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface);
14468
14469 #define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV)
14470 #define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV)
14471 #define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV)
14472 #define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV)
14473 #define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV)
14474 #define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV)
14475 #define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV)
14476 #define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV)
14477 #define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV)
14478 #define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV)
14479
14480 #define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop)
14481
14482 #endif /* GL_NV_vdpau_interop */
14483
14484 /* ------------------------ GL_NV_vertex_array_range ----------------------- */
14485
14486 #ifndef GL_NV_vertex_array_range
14487 #define GL_NV_vertex_array_range 1
14488
14489 #define GL_VERTEX_ARRAY_RANGE_NV 0x851D
14490 #define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E
14491 #define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F
14492 #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520
14493 #define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521
14494
14495 typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void);
14496 typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void *pointer);
14497
14498 #define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV)
14499 #define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV)
14500
14501 #define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range)
14502
14503 #endif /* GL_NV_vertex_array_range */
14504
14505 /* ----------------------- GL_NV_vertex_array_range2 ----------------------- */
14506
14507 #ifndef GL_NV_vertex_array_range2
14508 #define GL_NV_vertex_array_range2 1
14509
14510 #define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533
14511
14512 #define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2)
14513
14514 #endif /* GL_NV_vertex_array_range2 */
14515
14516 /* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */
14517
14518 #ifndef GL_NV_vertex_attrib_integer_64bit
14519 #define GL_NV_vertex_attrib_integer_64bit 1
14520
14521 #define GL_INT64_NV 0x140E
14522 #define GL_UNSIGNED_INT64_NV 0x140F
14523
14524 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params);
14525 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params);
14526 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x);
14527 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v);
14528 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x);
14529 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
14530 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y);
14531 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v);
14532 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y);
14533 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
14534 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z);
14535 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v);
14536 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
14537 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
14538 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
14539 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v);
14540 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
14541 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
14542 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);
14543
14544 #define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV)
14545 #define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV)
14546 #define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV)
14547 #define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV)
14548 #define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV)
14549 #define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV)
14550 #define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV)
14551 #define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV)
14552 #define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV)
14553 #define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV)
14554 #define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV)
14555 #define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV)
14556 #define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV)
14557 #define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV)
14558 #define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV)
14559 #define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV)
14560 #define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV)
14561 #define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV)
14562 #define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV)
14563
14564 #define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit)
14565
14566 #endif /* GL_NV_vertex_attrib_integer_64bit */
14567
14568 /* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */
14569
14570 #ifndef GL_NV_vertex_buffer_unified_memory
14571 #define GL_NV_vertex_buffer_unified_memory 1
14572
14573 #define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E
14574 #define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F
14575 #define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20
14576 #define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21
14577 #define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22
14578 #define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23
14579 #define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24
14580 #define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25
14581 #define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26
14582 #define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27
14583 #define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28
14584 #define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29
14585 #define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A
14586 #define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B
14587 #define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C
14588 #define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D
14589 #define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E
14590 #define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F
14591 #define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30
14592 #define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31
14593 #define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32
14594 #define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33
14595 #define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40
14596 #define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41
14597 #define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42
14598
14599 typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length);
14600 typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
14601 typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride);
14602 typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride);
14603 typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]);
14604 typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride);
14605 typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride);
14606 typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
14607 typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
14608 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride);
14609 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);
14610 typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
14611
14612 #define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV)
14613 #define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV)
14614 #define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV)
14615 #define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV)
14616 #define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV)
14617 #define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV)
14618 #define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV)
14619 #define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV)
14620 #define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV)
14621 #define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV)
14622 #define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV)
14623 #define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV)
14624
14625 #define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory)
14626
14627 #endif /* GL_NV_vertex_buffer_unified_memory */
14628
14629 /* -------------------------- GL_NV_vertex_program ------------------------- */
14630
14631 #ifndef GL_NV_vertex_program
14632 #define GL_NV_vertex_program 1
14633
14634 #define GL_VERTEX_PROGRAM_NV 0x8620
14635 #define GL_VERTEX_STATE_PROGRAM_NV 0x8621
14636 #define GL_ATTRIB_ARRAY_SIZE_NV 0x8623
14637 #define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624
14638 #define GL_ATTRIB_ARRAY_TYPE_NV 0x8625
14639 #define GL_CURRENT_ATTRIB_NV 0x8626
14640 #define GL_PROGRAM_LENGTH_NV 0x8627
14641 #define GL_PROGRAM_STRING_NV 0x8628
14642 #define GL_MODELVIEW_PROJECTION_NV 0x8629
14643 #define GL_IDENTITY_NV 0x862A
14644 #define GL_INVERSE_NV 0x862B
14645 #define GL_TRANSPOSE_NV 0x862C
14646 #define GL_INVERSE_TRANSPOSE_NV 0x862D
14647 #define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E
14648 #define GL_MAX_TRACK_MATRICES_NV 0x862F
14649 #define GL_MATRIX0_NV 0x8630
14650 #define GL_MATRIX1_NV 0x8631
14651 #define GL_MATRIX2_NV 0x8632
14652 #define GL_MATRIX3_NV 0x8633
14653 #define GL_MATRIX4_NV 0x8634
14654 #define GL_MATRIX5_NV 0x8635
14655 #define GL_MATRIX6_NV 0x8636
14656 #define GL_MATRIX7_NV 0x8637
14657 #define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640
14658 #define GL_CURRENT_MATRIX_NV 0x8641
14659 #define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642
14660 #define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643
14661 #define GL_PROGRAM_PARAMETER_NV 0x8644
14662 #define GL_ATTRIB_ARRAY_POINTER_NV 0x8645
14663 #define GL_PROGRAM_TARGET_NV 0x8646
14664 #define GL_PROGRAM_RESIDENT_NV 0x8647
14665 #define GL_TRACK_MATRIX_NV 0x8648
14666 #define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649
14667 #define GL_VERTEX_PROGRAM_BINDING_NV 0x864A
14668 #define GL_PROGRAM_ERROR_POSITION_NV 0x864B
14669 #define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650
14670 #define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651
14671 #define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652
14672 #define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653
14673 #define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654
14674 #define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655
14675 #define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656
14676 #define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657
14677 #define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658
14678 #define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659
14679 #define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A
14680 #define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B
14681 #define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C
14682 #define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D
14683 #define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E
14684 #define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F
14685 #define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660
14686 #define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661
14687 #define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662
14688 #define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663
14689 #define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664
14690 #define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665
14691 #define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666
14692 #define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667
14693 #define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668
14694 #define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669
14695 #define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A
14696 #define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B
14697 #define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C
14698 #define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D
14699 #define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E
14700 #define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F
14701 #define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670
14702 #define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671
14703 #define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672
14704 #define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673
14705 #define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674
14706 #define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675
14707 #define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676
14708 #define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677
14709 #define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678
14710 #define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679
14711 #define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A
14712 #define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B
14713 #define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C
14714 #define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D
14715 #define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E
14716 #define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F
14717
14718 typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences);
14719 typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id);
14720 typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids);
14721 typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params);
14722 typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids);
14723 typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params);
14724 typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params);
14725 typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program);
14726 typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params);
14727 typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params);
14728 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void** pointer);
14729 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params);
14730 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params);
14731 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params);
14732 typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id);
14733 typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program);
14734 typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
14735 typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params);
14736 typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
14737 typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params);
14738 typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params);
14739 typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params);
14740 typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids);
14741 typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);
14742 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x);
14743 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v);
14744 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x);
14745 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v);
14746 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x);
14747 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v);
14748 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y);
14749 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v);
14750 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y);
14751 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v);
14752 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y);
14753 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v);
14754 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
14755 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v);
14756 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
14757 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v);
14758 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
14759 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v);
14760 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
14761 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v);
14762 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
14763 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v);
14764 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
14765 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v);
14766 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
14767 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v);
14768 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
14769 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
14770 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
14771 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
14772 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
14773 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
14774 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
14775 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
14776 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
14777 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
14778 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
14779 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
14780 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
14781 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v);
14782
14783 #define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV)
14784 #define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV)
14785 #define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV)
14786 #define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV)
14787 #define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV)
14788 #define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV)
14789 #define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV)
14790 #define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV)
14791 #define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV)
14792 #define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV)
14793 #define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV)
14794 #define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV)
14795 #define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV)
14796 #define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV)
14797 #define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV)
14798 #define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV)
14799 #define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV)
14800 #define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV)
14801 #define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV)
14802 #define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV)
14803 #define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV)
14804 #define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV)
14805 #define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV)
14806 #define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV)
14807 #define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV)
14808 #define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV)
14809 #define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV)
14810 #define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV)
14811 #define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV)
14812 #define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV)
14813 #define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV)
14814 #define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV)
14815 #define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV)
14816 #define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV)
14817 #define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV)
14818 #define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV)
14819 #define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV)
14820 #define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV)
14821 #define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV)
14822 #define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV)
14823 #define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV)
14824 #define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV)
14825 #define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV)
14826 #define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV)
14827 #define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV)
14828 #define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV)
14829 #define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV)
14830 #define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV)
14831 #define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV)
14832 #define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV)
14833 #define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV)
14834 #define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV)
14835 #define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV)
14836 #define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV)
14837 #define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV)
14838 #define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV)
14839 #define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV)
14840 #define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV)
14841 #define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV)
14842 #define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV)
14843 #define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV)
14844 #define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV)
14845 #define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV)
14846 #define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV)
14847
14848 #define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program)
14849
14850 #endif /* GL_NV_vertex_program */
14851
14852 /* ------------------------ GL_NV_vertex_program1_1 ------------------------ */
14853
14854 #ifndef GL_NV_vertex_program1_1
14855 #define GL_NV_vertex_program1_1 1
14856
14857 #define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1)
14858
14859 #endif /* GL_NV_vertex_program1_1 */
14860
14861 /* ------------------------- GL_NV_vertex_program2 ------------------------- */
14862
14863 #ifndef GL_NV_vertex_program2
14864 #define GL_NV_vertex_program2 1
14865
14866 #define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2)
14867
14868 #endif /* GL_NV_vertex_program2 */
14869
14870 /* ---------------------- GL_NV_vertex_program2_option --------------------- */
14871
14872 #ifndef GL_NV_vertex_program2_option
14873 #define GL_NV_vertex_program2_option 1
14874
14875 #define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4
14876 #define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5
14877
14878 #define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option)
14879
14880 #endif /* GL_NV_vertex_program2_option */
14881
14882 /* ------------------------- GL_NV_vertex_program3 ------------------------- */
14883
14884 #ifndef GL_NV_vertex_program3
14885 #define GL_NV_vertex_program3 1
14886
14887 #define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
14888
14889 #define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3)
14890
14891 #endif /* GL_NV_vertex_program3 */
14892
14893 /* ------------------------- GL_NV_vertex_program4 ------------------------- */
14894
14895 #ifndef GL_NV_vertex_program4
14896 #define GL_NV_vertex_program4 1
14897
14898 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD
14899
14900 #define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4)
14901
14902 #endif /* GL_NV_vertex_program4 */
14903
14904 /* -------------------------- GL_NV_video_capture -------------------------- */
14905
14906 #ifndef GL_NV_video_capture
14907 #define GL_NV_video_capture 1
14908
14909 #define GL_VIDEO_BUFFER_NV 0x9020
14910 #define GL_VIDEO_BUFFER_BINDING_NV 0x9021
14911 #define GL_FIELD_UPPER_NV 0x9022
14912 #define GL_FIELD_LOWER_NV 0x9023
14913 #define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024
14914 #define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025
14915 #define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026
14916 #define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027
14917 #define GL_VIDEO_BUFFER_PITCH_NV 0x9028
14918 #define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029
14919 #define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A
14920 #define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B
14921 #define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C
14922 #define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D
14923 #define GL_PARTIAL_SUCCESS_NV 0x902E
14924 #define GL_SUCCESS_NV 0x902F
14925 #define GL_FAILURE_NV 0x9030
14926 #define GL_YCBYCR8_422_NV 0x9031
14927 #define GL_YCBAYCR8A_4224_NV 0x9032
14928 #define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033
14929 #define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034
14930 #define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035
14931 #define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036
14932 #define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037
14933 #define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038
14934 #define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039
14935 #define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A
14936 #define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B
14937 #define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C
14938
14939 typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot);
14940 typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset);
14941 typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture);
14942 typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot);
14943 typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params);
14944 typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params);
14945 typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params);
14946 typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params);
14947 typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time);
14948 typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params);
14949 typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params);
14950 typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params);
14951
14952 #define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV)
14953 #define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV)
14954 #define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV)
14955 #define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV)
14956 #define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV)
14957 #define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV)
14958 #define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV)
14959 #define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV)
14960 #define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV)
14961 #define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV)
14962 #define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV)
14963 #define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV)
14964
14965 #define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture)
14966
14967 #endif /* GL_NV_video_capture */
14968
14969 /* ------------------------- GL_NV_viewport_array2 ------------------------- */
14970
14971 #ifndef GL_NV_viewport_array2
14972 #define GL_NV_viewport_array2 1
14973
14974 #define GLEW_NV_viewport_array2 GLEW_GET_VAR(__GLEW_NV_viewport_array2)
14975
14976 #endif /* GL_NV_viewport_array2 */
14977
14978 /* ------------------------ GL_OES_byte_coordinates ------------------------ */
14979
14980 #ifndef GL_OES_byte_coordinates
14981 #define GL_OES_byte_coordinates 1
14982
14983 #define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates)
14984
14985 #endif /* GL_OES_byte_coordinates */
14986
14987 /* ------------------- GL_OES_compressed_paletted_texture ------------------ */
14988
14989 #ifndef GL_OES_compressed_paletted_texture
14990 #define GL_OES_compressed_paletted_texture 1
14991
14992 #define GL_PALETTE4_RGB8_OES 0x8B90
14993 #define GL_PALETTE4_RGBA8_OES 0x8B91
14994 #define GL_PALETTE4_R5_G6_B5_OES 0x8B92
14995 #define GL_PALETTE4_RGBA4_OES 0x8B93
14996 #define GL_PALETTE4_RGB5_A1_OES 0x8B94
14997 #define GL_PALETTE8_RGB8_OES 0x8B95
14998 #define GL_PALETTE8_RGBA8_OES 0x8B96
14999 #define GL_PALETTE8_R5_G6_B5_OES 0x8B97
15000 #define GL_PALETTE8_RGBA4_OES 0x8B98
15001 #define GL_PALETTE8_RGB5_A1_OES 0x8B99
15002
15003 #define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture)
15004
15005 #endif /* GL_OES_compressed_paletted_texture */
15006
15007 /* --------------------------- GL_OES_read_format -------------------------- */
15008
15009 #ifndef GL_OES_read_format
15010 #define GL_OES_read_format 1
15011
15012 #define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A
15013 #define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B
15014
15015 #define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format)
15016
15017 #endif /* GL_OES_read_format */
15018
15019 /* ------------------------ GL_OES_single_precision ------------------------ */
15020
15021 #ifndef GL_OES_single_precision
15022 #define GL_OES_single_precision 1
15023
15024 typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampf depth);
15025 typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation);
15026 typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f);
15027 typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
15028 typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation);
15029 typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
15030
15031 #define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES)
15032 #define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES)
15033 #define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES)
15034 #define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES)
15035 #define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES)
15036 #define glOrthofOES GLEW_GET_FUN(__glewOrthofOES)
15037
15038 #define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision)
15039
15040 #endif /* GL_OES_single_precision */
15041
15042 /* ---------------------------- GL_OML_interlace --------------------------- */
15043
15044 #ifndef GL_OML_interlace
15045 #define GL_OML_interlace 1
15046
15047 #define GL_INTERLACE_OML 0x8980
15048 #define GL_INTERLACE_READ_OML 0x8981
15049
15050 #define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace)
15051
15052 #endif /* GL_OML_interlace */
15053
15054 /* ---------------------------- GL_OML_resample ---------------------------- */
15055
15056 #ifndef GL_OML_resample
15057 #define GL_OML_resample 1
15058
15059 #define GL_PACK_RESAMPLE_OML 0x8984
15060 #define GL_UNPACK_RESAMPLE_OML 0x8985
15061 #define GL_RESAMPLE_REPLICATE_OML 0x8986
15062 #define GL_RESAMPLE_ZERO_FILL_OML 0x8987
15063 #define GL_RESAMPLE_AVERAGE_OML 0x8988
15064 #define GL_RESAMPLE_DECIMATE_OML 0x8989
15065
15066 #define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample)
15067
15068 #endif /* GL_OML_resample */
15069
15070 /* ---------------------------- GL_OML_subsample --------------------------- */
15071
15072 #ifndef GL_OML_subsample
15073 #define GL_OML_subsample 1
15074
15075 #define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982
15076 #define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983
15077
15078 #define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample)
15079
15080 #endif /* GL_OML_subsample */
15081
15082 /* ---------------------------- GL_OVR_multiview --------------------------- */
15083
15084 #ifndef GL_OVR_multiview
15085 #define GL_OVR_multiview 1
15086
15087 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630
15088 #define GL_MAX_VIEWS_OVR 0x9631
15089 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632
15090 #define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633
15091
15092 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
15093
15094 #define glFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultiviewOVR)
15095
15096 #define GLEW_OVR_multiview GLEW_GET_VAR(__GLEW_OVR_multiview)
15097
15098 #endif /* GL_OVR_multiview */
15099
15100 /* --------------------------- GL_OVR_multiview2 --------------------------- */
15101
15102 #ifndef GL_OVR_multiview2
15103 #define GL_OVR_multiview2 1
15104
15105 #define GLEW_OVR_multiview2 GLEW_GET_VAR(__GLEW_OVR_multiview2)
15106
15107 #endif /* GL_OVR_multiview2 */
15108
15109 /* --------------------------- GL_PGI_misc_hints --------------------------- */
15110
15111 #ifndef GL_PGI_misc_hints
15112 #define GL_PGI_misc_hints 1
15113
15114 #define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000
15115 #define GL_CONSERVE_MEMORY_HINT_PGI 107005
15116 #define GL_RECLAIM_MEMORY_HINT_PGI 107006
15117 #define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010
15118 #define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011
15119 #define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012
15120 #define GL_ALWAYS_FAST_HINT_PGI 107020
15121 #define GL_ALWAYS_SOFT_HINT_PGI 107021
15122 #define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022
15123 #define GL_ALLOW_DRAW_WIN_HINT_PGI 107023
15124 #define GL_ALLOW_DRAW_FRG_HINT_PGI 107024
15125 #define GL_ALLOW_DRAW_MEM_HINT_PGI 107025
15126 #define GL_STRICT_DEPTHFUNC_HINT_PGI 107030
15127 #define GL_STRICT_LIGHTING_HINT_PGI 107031
15128 #define GL_STRICT_SCISSOR_HINT_PGI 107032
15129 #define GL_FULL_STIPPLE_HINT_PGI 107033
15130 #define GL_CLIP_NEAR_HINT_PGI 107040
15131 #define GL_CLIP_FAR_HINT_PGI 107041
15132 #define GL_WIDE_LINE_HINT_PGI 107042
15133 #define GL_BACK_NORMALS_HINT_PGI 107043
15134
15135 #define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints)
15136
15137 #endif /* GL_PGI_misc_hints */
15138
15139 /* -------------------------- GL_PGI_vertex_hints -------------------------- */
15140
15141 #ifndef GL_PGI_vertex_hints
15142 #define GL_PGI_vertex_hints 1
15143
15144 #define GL_VERTEX23_BIT_PGI 0x00000004
15145 #define GL_VERTEX4_BIT_PGI 0x00000008
15146 #define GL_COLOR3_BIT_PGI 0x00010000
15147 #define GL_COLOR4_BIT_PGI 0x00020000
15148 #define GL_EDGEFLAG_BIT_PGI 0x00040000
15149 #define GL_INDEX_BIT_PGI 0x00080000
15150 #define GL_MAT_AMBIENT_BIT_PGI 0x00100000
15151 #define GL_VERTEX_DATA_HINT_PGI 107050
15152 #define GL_VERTEX_CONSISTENT_HINT_PGI 107051
15153 #define GL_MATERIAL_SIDE_HINT_PGI 107052
15154 #define GL_MAX_VERTEX_HINT_PGI 107053
15155 #define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000
15156 #define GL_MAT_DIFFUSE_BIT_PGI 0x00400000
15157 #define GL_MAT_EMISSION_BIT_PGI 0x00800000
15158 #define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000
15159 #define GL_MAT_SHININESS_BIT_PGI 0x02000000
15160 #define GL_MAT_SPECULAR_BIT_PGI 0x04000000
15161 #define GL_NORMAL_BIT_PGI 0x08000000
15162 #define GL_TEXCOORD1_BIT_PGI 0x10000000
15163 #define GL_TEXCOORD2_BIT_PGI 0x20000000
15164 #define GL_TEXCOORD3_BIT_PGI 0x40000000
15165 #define GL_TEXCOORD4_BIT_PGI 0x80000000
15166
15167 #define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints)
15168
15169 #endif /* GL_PGI_vertex_hints */
15170
15171 /* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */
15172
15173 #ifndef GL_REGAL_ES1_0_compatibility
15174 #define GL_REGAL_ES1_0_compatibility 1
15175
15176 typedef int GLclampx;
15177
15178 typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref);
15179 typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
15180 typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth);
15181 typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
15182 typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar);
15183 typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param);
15184 typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params);
15185 typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
15186 typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
15187 typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param);
15188 typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params);
15189 typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param);
15190 typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params);
15191 typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width);
15192 typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m);
15193 typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param);
15194 typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params);
15195 typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m);
15196 typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
15197 typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz);
15198 typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
15199 typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
15200 typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size);
15201 typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units);
15202 typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
15203 typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert);
15204 typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z);
15205 typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param);
15206 typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params);
15207 typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param);
15208 typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z);
15209
15210 #define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx)
15211 #define glClearColorx GLEW_GET_FUN(__glewClearColorx)
15212 #define glClearDepthx GLEW_GET_FUN(__glewClearDepthx)
15213 #define glColor4x GLEW_GET_FUN(__glewColor4x)
15214 #define glDepthRangex GLEW_GET_FUN(__glewDepthRangex)
15215 #define glFogx GLEW_GET_FUN(__glewFogx)
15216 #define glFogxv GLEW_GET_FUN(__glewFogxv)
15217 #define glFrustumf GLEW_GET_FUN(__glewFrustumf)
15218 #define glFrustumx GLEW_GET_FUN(__glewFrustumx)
15219 #define glLightModelx GLEW_GET_FUN(__glewLightModelx)
15220 #define glLightModelxv GLEW_GET_FUN(__glewLightModelxv)
15221 #define glLightx GLEW_GET_FUN(__glewLightx)
15222 #define glLightxv GLEW_GET_FUN(__glewLightxv)
15223 #define glLineWidthx GLEW_GET_FUN(__glewLineWidthx)
15224 #define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx)
15225 #define glMaterialx GLEW_GET_FUN(__glewMaterialx)
15226 #define glMaterialxv GLEW_GET_FUN(__glewMaterialxv)
15227 #define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx)
15228 #define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x)
15229 #define glNormal3x GLEW_GET_FUN(__glewNormal3x)
15230 #define glOrthof GLEW_GET_FUN(__glewOrthof)
15231 #define glOrthox GLEW_GET_FUN(__glewOrthox)
15232 #define glPointSizex GLEW_GET_FUN(__glewPointSizex)
15233 #define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx)
15234 #define glRotatex GLEW_GET_FUN(__glewRotatex)
15235 #define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex)
15236 #define glScalex GLEW_GET_FUN(__glewScalex)
15237 #define glTexEnvx GLEW_GET_FUN(__glewTexEnvx)
15238 #define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv)
15239 #define glTexParameterx GLEW_GET_FUN(__glewTexParameterx)
15240 #define glTranslatex GLEW_GET_FUN(__glewTranslatex)
15241
15242 #define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility)
15243
15244 #endif /* GL_REGAL_ES1_0_compatibility */
15245
15246 /* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */
15247
15248 #ifndef GL_REGAL_ES1_1_compatibility
15249 #define GL_REGAL_ES1_1_compatibility 1
15250
15251 typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation);
15252 typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation);
15253 typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]);
15254 typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]);
15255 typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params);
15256 typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params);
15257 typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params);
15258 typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params);
15259 typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params);
15260 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param);
15261 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params);
15262 typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer);
15263 typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params);
15264
15265 #define glClipPlanef GLEW_GET_FUN(__glewClipPlanef)
15266 #define glClipPlanex GLEW_GET_FUN(__glewClipPlanex)
15267 #define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef)
15268 #define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex)
15269 #define glGetFixedv GLEW_GET_FUN(__glewGetFixedv)
15270 #define glGetLightxv GLEW_GET_FUN(__glewGetLightxv)
15271 #define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv)
15272 #define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv)
15273 #define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv)
15274 #define glPointParameterx GLEW_GET_FUN(__glewPointParameterx)
15275 #define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv)
15276 #define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES)
15277 #define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv)
15278
15279 #define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility)
15280
15281 #endif /* GL_REGAL_ES1_1_compatibility */
15282
15283 /* ---------------------------- GL_REGAL_enable ---------------------------- */
15284
15285 #ifndef GL_REGAL_enable
15286 #define GL_REGAL_enable 1
15287
15288 #define GL_ERROR_REGAL 0x9322
15289 #define GL_DEBUG_REGAL 0x9323
15290 #define GL_LOG_REGAL 0x9324
15291 #define GL_EMULATION_REGAL 0x9325
15292 #define GL_DRIVER_REGAL 0x9326
15293 #define GL_MISSING_REGAL 0x9360
15294 #define GL_TRACE_REGAL 0x9361
15295 #define GL_CACHE_REGAL 0x9362
15296 #define GL_CODE_REGAL 0x9363
15297 #define GL_STATISTICS_REGAL 0x9364
15298
15299 #define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable)
15300
15301 #endif /* GL_REGAL_enable */
15302
15303 /* ------------------------- GL_REGAL_error_string ------------------------- */
15304
15305 #ifndef GL_REGAL_error_string
15306 #define GL_REGAL_error_string 1
15307
15308 typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error);
15309
15310 #define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL)
15311
15312 #define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string)
15313
15314 #endif /* GL_REGAL_error_string */
15315
15316 /* ------------------------ GL_REGAL_extension_query ----------------------- */
15317
15318 #ifndef GL_REGAL_extension_query
15319 #define GL_REGAL_extension_query 1
15320
15321 typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext);
15322 typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext);
15323
15324 #define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL)
15325 #define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL)
15326
15327 #define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query)
15328
15329 #endif /* GL_REGAL_extension_query */
15330
15331 /* ------------------------------ GL_REGAL_log ----------------------------- */
15332
15333 #ifndef GL_REGAL_log
15334 #define GL_REGAL_log 1
15335
15336 #define GL_LOG_ERROR_REGAL 0x9319
15337 #define GL_LOG_WARNING_REGAL 0x931A
15338 #define GL_LOG_INFO_REGAL 0x931B
15339 #define GL_LOG_APP_REGAL 0x931C
15340 #define GL_LOG_DRIVER_REGAL 0x931D
15341 #define GL_LOG_INTERNAL_REGAL 0x931E
15342 #define GL_LOG_DEBUG_REGAL 0x931F
15343 #define GL_LOG_STATUS_REGAL 0x9320
15344 #define GL_LOG_HTTP_REGAL 0x9321
15345
15346 typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, void *context);
15347
15348 typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback);
15349
15350 #define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL)
15351
15352 #define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log)
15353
15354 #endif /* GL_REGAL_log */
15355
15356 /* ------------------------- GL_REGAL_proc_address ------------------------- */
15357
15358 #ifndef GL_REGAL_proc_address
15359 #define GL_REGAL_proc_address 1
15360
15361 typedef void * (GLAPIENTRY * PFNGLGETPROCADDRESSREGALPROC) (const GLchar *name);
15362
15363 #define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL)
15364
15365 #define GLEW_REGAL_proc_address GLEW_GET_VAR(__GLEW_REGAL_proc_address)
15366
15367 #endif /* GL_REGAL_proc_address */
15368
15369 /* ----------------------- GL_REND_screen_coordinates ---------------------- */
15370
15371 #ifndef GL_REND_screen_coordinates
15372 #define GL_REND_screen_coordinates 1
15373
15374 #define GL_SCREEN_COORDINATES_REND 0x8490
15375 #define GL_INVERTED_SCREEN_W_REND 0x8491
15376
15377 #define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates)
15378
15379 #endif /* GL_REND_screen_coordinates */
15380
15381 /* ------------------------------- GL_S3_s3tc ------------------------------ */
15382
15383 #ifndef GL_S3_s3tc
15384 #define GL_S3_s3tc 1
15385
15386 #define GL_RGB_S3TC 0x83A0
15387 #define GL_RGB4_S3TC 0x83A1
15388 #define GL_RGBA_S3TC 0x83A2
15389 #define GL_RGBA4_S3TC 0x83A3
15390 #define GL_RGBA_DXT5_S3TC 0x83A4
15391 #define GL_RGBA4_DXT5_S3TC 0x83A5
15392
15393 #define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc)
15394
15395 #endif /* GL_S3_s3tc */
15396
15397 /* -------------------------- GL_SGIS_color_range -------------------------- */
15398
15399 #ifndef GL_SGIS_color_range
15400 #define GL_SGIS_color_range 1
15401
15402 #define GL_EXTENDED_RANGE_SGIS 0x85A5
15403 #define GL_MIN_RED_SGIS 0x85A6
15404 #define GL_MAX_RED_SGIS 0x85A7
15405 #define GL_MIN_GREEN_SGIS 0x85A8
15406 #define GL_MAX_GREEN_SGIS 0x85A9
15407 #define GL_MIN_BLUE_SGIS 0x85AA
15408 #define GL_MAX_BLUE_SGIS 0x85AB
15409 #define GL_MIN_ALPHA_SGIS 0x85AC
15410 #define GL_MAX_ALPHA_SGIS 0x85AD
15411
15412 #define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range)
15413
15414 #endif /* GL_SGIS_color_range */
15415
15416 /* ------------------------- GL_SGIS_detail_texture ------------------------ */
15417
15418 #ifndef GL_SGIS_detail_texture
15419 #define GL_SGIS_detail_texture 1
15420
15421 typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points);
15422 typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points);
15423
15424 #define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS)
15425 #define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS)
15426
15427 #define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture)
15428
15429 #endif /* GL_SGIS_detail_texture */
15430
15431 /* -------------------------- GL_SGIS_fog_function ------------------------- */
15432
15433 #ifndef GL_SGIS_fog_function
15434 #define GL_SGIS_fog_function 1
15435
15436 typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points);
15437 typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points);
15438
15439 #define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS)
15440 #define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS)
15441
15442 #define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function)
15443
15444 #endif /* GL_SGIS_fog_function */
15445
15446 /* ------------------------ GL_SGIS_generate_mipmap ------------------------ */
15447
15448 #ifndef GL_SGIS_generate_mipmap
15449 #define GL_SGIS_generate_mipmap 1
15450
15451 #define GL_GENERATE_MIPMAP_SGIS 0x8191
15452 #define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192
15453
15454 #define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap)
15455
15456 #endif /* GL_SGIS_generate_mipmap */
15457
15458 /* -------------------------- GL_SGIS_multisample -------------------------- */
15459
15460 #ifndef GL_SGIS_multisample
15461 #define GL_SGIS_multisample 1
15462
15463 #define GL_MULTISAMPLE_SGIS 0x809D
15464 #define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E
15465 #define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F
15466 #define GL_SAMPLE_MASK_SGIS 0x80A0
15467 #define GL_1PASS_SGIS 0x80A1
15468 #define GL_2PASS_0_SGIS 0x80A2
15469 #define GL_2PASS_1_SGIS 0x80A3
15470 #define GL_4PASS_0_SGIS 0x80A4
15471 #define GL_4PASS_1_SGIS 0x80A5
15472 #define GL_4PASS_2_SGIS 0x80A6
15473 #define GL_4PASS_3_SGIS 0x80A7
15474 #define GL_SAMPLE_BUFFERS_SGIS 0x80A8
15475 #define GL_SAMPLES_SGIS 0x80A9
15476 #define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA
15477 #define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB
15478 #define GL_SAMPLE_PATTERN_SGIS 0x80AC
15479
15480 typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert);
15481 typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern);
15482
15483 #define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS)
15484 #define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS)
15485
15486 #define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample)
15487
15488 #endif /* GL_SGIS_multisample */
15489
15490 /* ------------------------- GL_SGIS_pixel_texture ------------------------- */
15491
15492 #ifndef GL_SGIS_pixel_texture
15493 #define GL_SGIS_pixel_texture 1
15494
15495 #define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture)
15496
15497 #endif /* GL_SGIS_pixel_texture */
15498
15499 /* ----------------------- GL_SGIS_point_line_texgen ----------------------- */
15500
15501 #ifndef GL_SGIS_point_line_texgen
15502 #define GL_SGIS_point_line_texgen 1
15503
15504 #define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0
15505 #define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1
15506 #define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2
15507 #define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3
15508 #define GL_EYE_POINT_SGIS 0x81F4
15509 #define GL_OBJECT_POINT_SGIS 0x81F5
15510 #define GL_EYE_LINE_SGIS 0x81F6
15511 #define GL_OBJECT_LINE_SGIS 0x81F7
15512
15513 #define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen)
15514
15515 #endif /* GL_SGIS_point_line_texgen */
15516
15517 /* ------------------------ GL_SGIS_sharpen_texture ------------------------ */
15518
15519 #ifndef GL_SGIS_sharpen_texture
15520 #define GL_SGIS_sharpen_texture 1
15521
15522 typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points);
15523 typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points);
15524
15525 #define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS)
15526 #define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS)
15527
15528 #define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture)
15529
15530 #endif /* GL_SGIS_sharpen_texture */
15531
15532 /* --------------------------- GL_SGIS_texture4D --------------------------- */
15533
15534 #ifndef GL_SGIS_texture4D
15535 #define GL_SGIS_texture4D 1
15536
15537 typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void *pixels);
15538 typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void *pixels);
15539
15540 #define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS)
15541 #define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS)
15542
15543 #define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D)
15544
15545 #endif /* GL_SGIS_texture4D */
15546
15547 /* ---------------------- GL_SGIS_texture_border_clamp --------------------- */
15548
15549 #ifndef GL_SGIS_texture_border_clamp
15550 #define GL_SGIS_texture_border_clamp 1
15551
15552 #define GL_CLAMP_TO_BORDER_SGIS 0x812D
15553
15554 #define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp)
15555
15556 #endif /* GL_SGIS_texture_border_clamp */
15557
15558 /* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */
15559
15560 #ifndef GL_SGIS_texture_edge_clamp
15561 #define GL_SGIS_texture_edge_clamp 1
15562
15563 #define GL_CLAMP_TO_EDGE_SGIS 0x812F
15564
15565 #define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp)
15566
15567 #endif /* GL_SGIS_texture_edge_clamp */
15568
15569 /* ------------------------ GL_SGIS_texture_filter4 ------------------------ */
15570
15571 #ifndef GL_SGIS_texture_filter4
15572 #define GL_SGIS_texture_filter4 1
15573
15574 typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights);
15575 typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights);
15576
15577 #define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS)
15578 #define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS)
15579
15580 #define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4)
15581
15582 #endif /* GL_SGIS_texture_filter4 */
15583
15584 /* -------------------------- GL_SGIS_texture_lod -------------------------- */
15585
15586 #ifndef GL_SGIS_texture_lod
15587 #define GL_SGIS_texture_lod 1
15588
15589 #define GL_TEXTURE_MIN_LOD_SGIS 0x813A
15590 #define GL_TEXTURE_MAX_LOD_SGIS 0x813B
15591 #define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C
15592 #define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D
15593
15594 #define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod)
15595
15596 #endif /* GL_SGIS_texture_lod */
15597
15598 /* ------------------------- GL_SGIS_texture_select ------------------------ */
15599
15600 #ifndef GL_SGIS_texture_select
15601 #define GL_SGIS_texture_select 1
15602
15603 #define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select)
15604
15605 #endif /* GL_SGIS_texture_select */
15606
15607 /* ----------------------------- GL_SGIX_async ----------------------------- */
15608
15609 #ifndef GL_SGIX_async
15610 #define GL_SGIX_async 1
15611
15612 #define GL_ASYNC_MARKER_SGIX 0x8329
15613
15614 typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker);
15615 typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range);
15616 typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp);
15617 typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range);
15618 typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker);
15619 typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp);
15620
15621 #define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX)
15622 #define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX)
15623 #define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX)
15624 #define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX)
15625 #define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX)
15626 #define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX)
15627
15628 #define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async)
15629
15630 #endif /* GL_SGIX_async */
15631
15632 /* ------------------------ GL_SGIX_async_histogram ------------------------ */
15633
15634 #ifndef GL_SGIX_async_histogram
15635 #define GL_SGIX_async_histogram 1
15636
15637 #define GL_ASYNC_HISTOGRAM_SGIX 0x832C
15638 #define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D
15639
15640 #define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram)
15641
15642 #endif /* GL_SGIX_async_histogram */
15643
15644 /* -------------------------- GL_SGIX_async_pixel -------------------------- */
15645
15646 #ifndef GL_SGIX_async_pixel
15647 #define GL_SGIX_async_pixel 1
15648
15649 #define GL_ASYNC_TEX_IMAGE_SGIX 0x835C
15650 #define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D
15651 #define GL_ASYNC_READ_PIXELS_SGIX 0x835E
15652 #define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F
15653 #define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360
15654 #define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361
15655
15656 #define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel)
15657
15658 #endif /* GL_SGIX_async_pixel */
15659
15660 /* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */
15661
15662 #ifndef GL_SGIX_blend_alpha_minmax
15663 #define GL_SGIX_blend_alpha_minmax 1
15664
15665 #define GL_ALPHA_MIN_SGIX 0x8320
15666 #define GL_ALPHA_MAX_SGIX 0x8321
15667
15668 #define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax)
15669
15670 #endif /* GL_SGIX_blend_alpha_minmax */
15671
15672 /* ---------------------------- GL_SGIX_clipmap ---------------------------- */
15673
15674 #ifndef GL_SGIX_clipmap
15675 #define GL_SGIX_clipmap 1
15676
15677 #define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap)
15678
15679 #endif /* GL_SGIX_clipmap */
15680
15681 /* ---------------------- GL_SGIX_convolution_accuracy --------------------- */
15682
15683 #ifndef GL_SGIX_convolution_accuracy
15684 #define GL_SGIX_convolution_accuracy 1
15685
15686 #define GL_CONVOLUTION_HINT_SGIX 0x8316
15687
15688 #define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy)
15689
15690 #endif /* GL_SGIX_convolution_accuracy */
15691
15692 /* ------------------------- GL_SGIX_depth_texture ------------------------- */
15693
15694 #ifndef GL_SGIX_depth_texture
15695 #define GL_SGIX_depth_texture 1
15696
15697 #define GL_DEPTH_COMPONENT16_SGIX 0x81A5
15698 #define GL_DEPTH_COMPONENT24_SGIX 0x81A6
15699 #define GL_DEPTH_COMPONENT32_SGIX 0x81A7
15700
15701 #define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture)
15702
15703 #endif /* GL_SGIX_depth_texture */
15704
15705 /* -------------------------- GL_SGIX_flush_raster ------------------------- */
15706
15707 #ifndef GL_SGIX_flush_raster
15708 #define GL_SGIX_flush_raster 1
15709
15710 typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void);
15711
15712 #define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX)
15713
15714 #define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster)
15715
15716 #endif /* GL_SGIX_flush_raster */
15717
15718 /* --------------------------- GL_SGIX_fog_offset -------------------------- */
15719
15720 #ifndef GL_SGIX_fog_offset
15721 #define GL_SGIX_fog_offset 1
15722
15723 #define GL_FOG_OFFSET_SGIX 0x8198
15724 #define GL_FOG_OFFSET_VALUE_SGIX 0x8199
15725
15726 #define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset)
15727
15728 #endif /* GL_SGIX_fog_offset */
15729
15730 /* -------------------------- GL_SGIX_fog_texture -------------------------- */
15731
15732 #ifndef GL_SGIX_fog_texture
15733 #define GL_SGIX_fog_texture 1
15734
15735 #define GL_FOG_PATCHY_FACTOR_SGIX 0
15736 #define GL_FRAGMENT_FOG_SGIX 0
15737 #define GL_TEXTURE_FOG_SGIX 0
15738
15739 typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname);
15740
15741 #define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX)
15742
15743 #define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture)
15744
15745 #endif /* GL_SGIX_fog_texture */
15746
15747 /* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */
15748
15749 #ifndef GL_SGIX_fragment_specular_lighting
15750 #define GL_SGIX_fragment_specular_lighting 1
15751
15752 typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode);
15753 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param);
15754 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params);
15755 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param);
15756 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params);
15757 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param);
15758 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params);
15759 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param);
15760 typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params);
15761 typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param);
15762 typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params);
15763 typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param);
15764 typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params);
15765 typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data);
15766 typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data);
15767 typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data);
15768 typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data);
15769
15770 #define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX)
15771 #define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX)
15772 #define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX)
15773 #define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX)
15774 #define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX)
15775 #define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX)
15776 #define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX)
15777 #define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX)
15778 #define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX)
15779 #define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX)
15780 #define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX)
15781 #define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX)
15782 #define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX)
15783 #define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX)
15784 #define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX)
15785 #define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX)
15786 #define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX)
15787
15788 #define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting)
15789
15790 #endif /* GL_SGIX_fragment_specular_lighting */
15791
15792 /* --------------------------- GL_SGIX_framezoom --------------------------- */
15793
15794 #ifndef GL_SGIX_framezoom
15795 #define GL_SGIX_framezoom 1
15796
15797 typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor);
15798
15799 #define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX)
15800
15801 #define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom)
15802
15803 #endif /* GL_SGIX_framezoom */
15804
15805 /* --------------------------- GL_SGIX_interlace --------------------------- */
15806
15807 #ifndef GL_SGIX_interlace
15808 #define GL_SGIX_interlace 1
15809
15810 #define GL_INTERLACE_SGIX 0x8094
15811
15812 #define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace)
15813
15814 #endif /* GL_SGIX_interlace */
15815
15816 /* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */
15817
15818 #ifndef GL_SGIX_ir_instrument1
15819 #define GL_SGIX_ir_instrument1 1
15820
15821 #define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1)
15822
15823 #endif /* GL_SGIX_ir_instrument1 */
15824
15825 /* ------------------------- GL_SGIX_list_priority ------------------------- */
15826
15827 #ifndef GL_SGIX_list_priority
15828 #define GL_SGIX_list_priority 1
15829
15830 #define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority)
15831
15832 #endif /* GL_SGIX_list_priority */
15833
15834 /* ------------------------- GL_SGIX_pixel_texture ------------------------- */
15835
15836 #ifndef GL_SGIX_pixel_texture
15837 #define GL_SGIX_pixel_texture 1
15838
15839 typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode);
15840
15841 #define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX)
15842
15843 #define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture)
15844
15845 #endif /* GL_SGIX_pixel_texture */
15846
15847 /* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */
15848
15849 #ifndef GL_SGIX_pixel_texture_bits
15850 #define GL_SGIX_pixel_texture_bits 1
15851
15852 #define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits)
15853
15854 #endif /* GL_SGIX_pixel_texture_bits */
15855
15856 /* ------------------------ GL_SGIX_reference_plane ------------------------ */
15857
15858 #ifndef GL_SGIX_reference_plane
15859 #define GL_SGIX_reference_plane 1
15860
15861 typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation);
15862
15863 #define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX)
15864
15865 #define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane)
15866
15867 #endif /* GL_SGIX_reference_plane */
15868
15869 /* ---------------------------- GL_SGIX_resample --------------------------- */
15870
15871 #ifndef GL_SGIX_resample
15872 #define GL_SGIX_resample 1
15873
15874 #define GL_PACK_RESAMPLE_SGIX 0x842E
15875 #define GL_UNPACK_RESAMPLE_SGIX 0x842F
15876 #define GL_RESAMPLE_DECIMATE_SGIX 0x8430
15877 #define GL_RESAMPLE_REPLICATE_SGIX 0x8433
15878 #define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434
15879
15880 #define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample)
15881
15882 #endif /* GL_SGIX_resample */
15883
15884 /* ----------------------------- GL_SGIX_shadow ---------------------------- */
15885
15886 #ifndef GL_SGIX_shadow
15887 #define GL_SGIX_shadow 1
15888
15889 #define GL_TEXTURE_COMPARE_SGIX 0x819A
15890 #define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B
15891 #define GL_TEXTURE_LEQUAL_R_SGIX 0x819C
15892 #define GL_TEXTURE_GEQUAL_R_SGIX 0x819D
15893
15894 #define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow)
15895
15896 #endif /* GL_SGIX_shadow */
15897
15898 /* ------------------------- GL_SGIX_shadow_ambient ------------------------ */
15899
15900 #ifndef GL_SGIX_shadow_ambient
15901 #define GL_SGIX_shadow_ambient 1
15902
15903 #define GL_SHADOW_AMBIENT_SGIX 0x80BF
15904
15905 #define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient)
15906
15907 #endif /* GL_SGIX_shadow_ambient */
15908
15909 /* ----------------------------- GL_SGIX_sprite ---------------------------- */
15910
15911 #ifndef GL_SGIX_sprite
15912 #define GL_SGIX_sprite 1
15913
15914 typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param);
15915 typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params);
15916 typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param);
15917 typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params);
15918
15919 #define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX)
15920 #define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX)
15921 #define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX)
15922 #define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX)
15923
15924 #define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite)
15925
15926 #endif /* GL_SGIX_sprite */
15927
15928 /* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */
15929
15930 #ifndef GL_SGIX_tag_sample_buffer
15931 #define GL_SGIX_tag_sample_buffer 1
15932
15933 typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void);
15934
15935 #define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX)
15936
15937 #define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer)
15938
15939 #endif /* GL_SGIX_tag_sample_buffer */
15940
15941 /* ------------------------ GL_SGIX_texture_add_env ------------------------ */
15942
15943 #ifndef GL_SGIX_texture_add_env
15944 #define GL_SGIX_texture_add_env 1
15945
15946 #define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env)
15947
15948 #endif /* GL_SGIX_texture_add_env */
15949
15950 /* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */
15951
15952 #ifndef GL_SGIX_texture_coordinate_clamp
15953 #define GL_SGIX_texture_coordinate_clamp 1
15954
15955 #define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369
15956 #define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A
15957 #define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B
15958
15959 #define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp)
15960
15961 #endif /* GL_SGIX_texture_coordinate_clamp */
15962
15963 /* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */
15964
15965 #ifndef GL_SGIX_texture_lod_bias
15966 #define GL_SGIX_texture_lod_bias 1
15967
15968 #define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias)
15969
15970 #endif /* GL_SGIX_texture_lod_bias */
15971
15972 /* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */
15973
15974 #ifndef GL_SGIX_texture_multi_buffer
15975 #define GL_SGIX_texture_multi_buffer 1
15976
15977 #define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E
15978
15979 #define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer)
15980
15981 #endif /* GL_SGIX_texture_multi_buffer */
15982
15983 /* ------------------------- GL_SGIX_texture_range ------------------------- */
15984
15985 #ifndef GL_SGIX_texture_range
15986 #define GL_SGIX_texture_range 1
15987
15988 #define GL_RGB_SIGNED_SGIX 0x85E0
15989 #define GL_RGBA_SIGNED_SGIX 0x85E1
15990 #define GL_ALPHA_SIGNED_SGIX 0x85E2
15991 #define GL_LUMINANCE_SIGNED_SGIX 0x85E3
15992 #define GL_INTENSITY_SIGNED_SGIX 0x85E4
15993 #define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5
15994 #define GL_RGB16_SIGNED_SGIX 0x85E6
15995 #define GL_RGBA16_SIGNED_SGIX 0x85E7
15996 #define GL_ALPHA16_SIGNED_SGIX 0x85E8
15997 #define GL_LUMINANCE16_SIGNED_SGIX 0x85E9
15998 #define GL_INTENSITY16_SIGNED_SGIX 0x85EA
15999 #define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB
16000 #define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC
16001 #define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED
16002 #define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE
16003 #define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF
16004 #define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0
16005 #define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1
16006 #define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2
16007 #define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3
16008 #define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4
16009 #define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5
16010 #define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6
16011 #define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7
16012 #define GL_MIN_LUMINANCE_SGIS 0x85F8
16013 #define GL_MAX_LUMINANCE_SGIS 0x85F9
16014 #define GL_MIN_INTENSITY_SGIS 0x85FA
16015 #define GL_MAX_INTENSITY_SGIS 0x85FB
16016
16017 #define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range)
16018
16019 #endif /* GL_SGIX_texture_range */
16020
16021 /* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */
16022
16023 #ifndef GL_SGIX_texture_scale_bias
16024 #define GL_SGIX_texture_scale_bias 1
16025
16026 #define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179
16027 #define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A
16028 #define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B
16029 #define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C
16030
16031 #define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias)
16032
16033 #endif /* GL_SGIX_texture_scale_bias */
16034
16035 /* ------------------------- GL_SGIX_vertex_preclip ------------------------ */
16036
16037 #ifndef GL_SGIX_vertex_preclip
16038 #define GL_SGIX_vertex_preclip 1
16039
16040 #define GL_VERTEX_PRECLIP_SGIX 0x83EE
16041 #define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF
16042
16043 #define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip)
16044
16045 #endif /* GL_SGIX_vertex_preclip */
16046
16047 /* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */
16048
16049 #ifndef GL_SGIX_vertex_preclip_hint
16050 #define GL_SGIX_vertex_preclip_hint 1
16051
16052 #define GL_VERTEX_PRECLIP_SGIX 0x83EE
16053 #define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF
16054
16055 #define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint)
16056
16057 #endif /* GL_SGIX_vertex_preclip_hint */
16058
16059 /* ----------------------------- GL_SGIX_ycrcb ----------------------------- */
16060
16061 #ifndef GL_SGIX_ycrcb
16062 #define GL_SGIX_ycrcb 1
16063
16064 #define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb)
16065
16066 #endif /* GL_SGIX_ycrcb */
16067
16068 /* -------------------------- GL_SGI_color_matrix -------------------------- */
16069
16070 #ifndef GL_SGI_color_matrix
16071 #define GL_SGI_color_matrix 1
16072
16073 #define GL_COLOR_MATRIX_SGI 0x80B1
16074 #define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2
16075 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3
16076 #define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4
16077 #define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5
16078 #define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6
16079 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7
16080 #define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8
16081 #define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9
16082 #define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA
16083 #define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB
16084
16085 #define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix)
16086
16087 #endif /* GL_SGI_color_matrix */
16088
16089 /* --------------------------- GL_SGI_color_table -------------------------- */
16090
16091 #ifndef GL_SGI_color_table
16092 #define GL_SGI_color_table 1
16093
16094 #define GL_COLOR_TABLE_SGI 0x80D0
16095 #define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1
16096 #define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2
16097 #define GL_PROXY_COLOR_TABLE_SGI 0x80D3
16098 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4
16099 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5
16100 #define GL_COLOR_TABLE_SCALE_SGI 0x80D6
16101 #define GL_COLOR_TABLE_BIAS_SGI 0x80D7
16102 #define GL_COLOR_TABLE_FORMAT_SGI 0x80D8
16103 #define GL_COLOR_TABLE_WIDTH_SGI 0x80D9
16104 #define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA
16105 #define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB
16106 #define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC
16107 #define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD
16108 #define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE
16109 #define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF
16110
16111 typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params);
16112 typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params);
16113 typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);
16114 typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
16115 typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params);
16116 typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params);
16117 typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table);
16118
16119 #define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI)
16120 #define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI)
16121 #define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI)
16122 #define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI)
16123 #define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI)
16124 #define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI)
16125 #define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI)
16126
16127 #define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table)
16128
16129 #endif /* GL_SGI_color_table */
16130
16131 /* ----------------------- GL_SGI_texture_color_table ---------------------- */
16132
16133 #ifndef GL_SGI_texture_color_table
16134 #define GL_SGI_texture_color_table 1
16135
16136 #define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC
16137 #define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD
16138
16139 #define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table)
16140
16141 #endif /* GL_SGI_texture_color_table */
16142
16143 /* ------------------------- GL_SUNX_constant_data ------------------------- */
16144
16145 #ifndef GL_SUNX_constant_data
16146 #define GL_SUNX_constant_data 1
16147
16148 #define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5
16149 #define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6
16150
16151 typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void);
16152
16153 #define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX)
16154
16155 #define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data)
16156
16157 #endif /* GL_SUNX_constant_data */
16158
16159 /* -------------------- GL_SUN_convolution_border_modes -------------------- */
16160
16161 #ifndef GL_SUN_convolution_border_modes
16162 #define GL_SUN_convolution_border_modes 1
16163
16164 #define GL_WRAP_BORDER_SUN 0x81D4
16165
16166 #define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes)
16167
16168 #endif /* GL_SUN_convolution_border_modes */
16169
16170 /* -------------------------- GL_SUN_global_alpha -------------------------- */
16171
16172 #ifndef GL_SUN_global_alpha
16173 #define GL_SUN_global_alpha 1
16174
16175 #define GL_GLOBAL_ALPHA_SUN 0x81D9
16176 #define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA
16177
16178 typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor);
16179 typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor);
16180 typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor);
16181 typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor);
16182 typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor);
16183 typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor);
16184 typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor);
16185 typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor);
16186
16187 #define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN)
16188 #define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN)
16189 #define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN)
16190 #define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN)
16191 #define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN)
16192 #define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN)
16193 #define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN)
16194 #define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN)
16195
16196 #define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha)
16197
16198 #endif /* GL_SUN_global_alpha */
16199
16200 /* --------------------------- GL_SUN_mesh_array --------------------------- */
16201
16202 #ifndef GL_SUN_mesh_array
16203 #define GL_SUN_mesh_array 1
16204
16205 #define GL_QUAD_MESH_SUN 0x8614
16206 #define GL_TRIANGLE_MESH_SUN 0x8615
16207
16208 #define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array)
16209
16210 #endif /* GL_SUN_mesh_array */
16211
16212 /* ------------------------ GL_SUN_read_video_pixels ----------------------- */
16213
16214 #ifndef GL_SUN_read_video_pixels
16215 #define GL_SUN_read_video_pixels 1
16216
16217 typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
16218
16219 #define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN)
16220
16221 #define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels)
16222
16223 #endif /* GL_SUN_read_video_pixels */
16224
16225 /* --------------------------- GL_SUN_slice_accum -------------------------- */
16226
16227 #ifndef GL_SUN_slice_accum
16228 #define GL_SUN_slice_accum 1
16229
16230 #define GL_SLICE_ACCUM_SUN 0x85CC
16231
16232 #define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum)
16233
16234 #endif /* GL_SUN_slice_accum */
16235
16236 /* -------------------------- GL_SUN_triangle_list ------------------------- */
16237
16238 #ifndef GL_SUN_triangle_list
16239 #define GL_SUN_triangle_list 1
16240
16241 #define GL_RESTART_SUN 0x01
16242 #define GL_REPLACE_MIDDLE_SUN 0x02
16243 #define GL_REPLACE_OLDEST_SUN 0x03
16244 #define GL_TRIANGLE_LIST_SUN 0x81D7
16245 #define GL_REPLACEMENT_CODE_SUN 0x81D8
16246 #define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0
16247 #define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1
16248 #define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2
16249 #define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3
16250 #define GL_R1UI_V3F_SUN 0x85C4
16251 #define GL_R1UI_C4UB_V3F_SUN 0x85C5
16252 #define GL_R1UI_C3F_V3F_SUN 0x85C6
16253 #define GL_R1UI_N3F_V3F_SUN 0x85C7
16254 #define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8
16255 #define GL_R1UI_T2F_V3F_SUN 0x85C9
16256 #define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA
16257 #define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB
16258
16259 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void *pointer);
16260 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code);
16261 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code);
16262 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code);
16263 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code);
16264 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code);
16265 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code);
16266
16267 #define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN)
16268 #define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN)
16269 #define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN)
16270 #define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN)
16271 #define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN)
16272 #define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN)
16273 #define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN)
16274
16275 #define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list)
16276
16277 #endif /* GL_SUN_triangle_list */
16278
16279 /* ----------------------------- GL_SUN_vertex ----------------------------- */
16280
16281 #ifndef GL_SUN_vertex
16282 #define GL_SUN_vertex 1
16283
16284 typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
16285 typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v);
16286 typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
16287 typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v);
16288 typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y);
16289 typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v);
16290 typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
16291 typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v);
16292 typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
16293 typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v);
16294 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
16295 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v);
16296 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
16297 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
16298 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
16299 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v);
16300 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
16301 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v);
16302 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
16303 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
16304 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
16305 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v);
16306 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
16307 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v);
16308 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z);
16309 typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v);
16310 typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
16311 typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v);
16312 typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
16313 typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
16314 typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
16315 typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v);
16316 typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
16317 typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v);
16318 typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
16319 typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v);
16320 typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
16321 typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
16322 typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
16323 typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v);
16324
16325 #define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN)
16326 #define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN)
16327 #define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN)
16328 #define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN)
16329 #define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN)
16330 #define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN)
16331 #define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN)
16332 #define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN)
16333 #define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN)
16334 #define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN)
16335 #define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN)
16336 #define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN)
16337 #define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN)
16338 #define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN)
16339 #define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN)
16340 #define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN)
16341 #define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN)
16342 #define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN)
16343 #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN)
16344 #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN)
16345 #define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN)
16346 #define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN)
16347 #define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN)
16348 #define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN)
16349 #define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN)
16350 #define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN)
16351 #define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN)
16352 #define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN)
16353 #define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN)
16354 #define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN)
16355 #define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN)
16356 #define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN)
16357 #define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN)
16358 #define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN)
16359 #define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN)
16360 #define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN)
16361 #define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN)
16362 #define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN)
16363 #define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN)
16364 #define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN)
16365
16366 #define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex)
16367
16368 #endif /* GL_SUN_vertex */
16369
16370 /* -------------------------- GL_WIN_phong_shading ------------------------- */
16371
16372 #ifndef GL_WIN_phong_shading
16373 #define GL_WIN_phong_shading 1
16374
16375 #define GL_PHONG_WIN 0x80EA
16376 #define GL_PHONG_HINT_WIN 0x80EB
16377
16378 #define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading)
16379
16380 #endif /* GL_WIN_phong_shading */
16381
16382 /* -------------------------- GL_WIN_specular_fog -------------------------- */
16383
16384 #ifndef GL_WIN_specular_fog
16385 #define GL_WIN_specular_fog 1
16386
16387 #define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC
16388
16389 #define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog)
16390
16391 #endif /* GL_WIN_specular_fog */
16392
16393 /* ---------------------------- GL_WIN_swap_hint --------------------------- */
16394
16395 #ifndef GL_WIN_swap_hint
16396 #define GL_WIN_swap_hint 1
16397
16398 typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
16399
16400 #define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN)
16401
16402 #define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint)
16403
16404 #endif /* GL_WIN_swap_hint */
16405
16406 /* ------------------------------------------------------------------------- */
16407
16408 #if defined(GLEW_MX) && defined(_WIN32)
16409 #define GLEW_FUN_EXPORT
16410 #else
16411 #define GLEW_FUN_EXPORT GLEWAPI
16412 #endif /* GLEW_MX */
16413
16414 #if defined(GLEW_MX)
16415 #define GLEW_VAR_EXPORT
16416 #else
16417 #define GLEW_VAR_EXPORT GLEWAPI
16418 #endif /* GLEW_MX */
16419
16420 #if defined(GLEW_MX) && defined(_WIN32)
16421 struct GLEWContextStruct
16422 {
16423 #endif /* GLEW_MX */
16424
16425 GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D;
16426 GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements;
16427 GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D;
16428 GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D;
16429
16430 GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture;
16431 GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture;
16432 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D;
16433 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D;
16434 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D;
16435 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D;
16436 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D;
16437 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D;
16438 GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage;
16439 GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd;
16440 GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf;
16441 GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd;
16442 GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf;
16443 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d;
16444 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv;
16445 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f;
16446 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv;
16447 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i;
16448 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv;
16449 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s;
16450 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv;
16451 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d;
16452 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv;
16453 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f;
16454 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv;
16455 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i;
16456 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv;
16457 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s;
16458 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv;
16459 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d;
16460 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv;
16461 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f;
16462 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv;
16463 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i;
16464 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv;
16465 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s;
16466 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv;
16467 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d;
16468 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv;
16469 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f;
16470 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv;
16471 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i;
16472 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv;
16473 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s;
16474 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv;
16475 GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage;
16476
16477 GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor;
16478 GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation;
16479 GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate;
16480 GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer;
16481 GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd;
16482 GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv;
16483 GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf;
16484 GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv;
16485 GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays;
16486 GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements;
16487 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf;
16488 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv;
16489 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri;
16490 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv;
16491 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b;
16492 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv;
16493 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d;
16494 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv;
16495 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f;
16496 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv;
16497 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i;
16498 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv;
16499 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s;
16500 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv;
16501 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub;
16502 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv;
16503 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui;
16504 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv;
16505 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us;
16506 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv;
16507 GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer;
16508 GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d;
16509 GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv;
16510 GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f;
16511 GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv;
16512 GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i;
16513 GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv;
16514 GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s;
16515 GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv;
16516 GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d;
16517 GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv;
16518 GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f;
16519 GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv;
16520 GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i;
16521 GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv;
16522 GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s;
16523 GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv;
16524
16525 GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery;
16526 GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer;
16527 GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData;
16528 GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData;
16529 GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers;
16530 GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries;
16531 GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery;
16532 GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers;
16533 GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries;
16534 GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv;
16535 GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv;
16536 GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData;
16537 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv;
16538 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv;
16539 GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv;
16540 GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer;
16541 GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery;
16542 GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer;
16543 GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer;
16544
16545 GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader;
16546 GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation;
16547 GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate;
16548 GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader;
16549 GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram;
16550 GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader;
16551 GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram;
16552 GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader;
16553 GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader;
16554 GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray;
16555 GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers;
16556 GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray;
16557 GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib;
16558 GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform;
16559 GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders;
16560 GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation;
16561 GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog;
16562 GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv;
16563 GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog;
16564 GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource;
16565 GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv;
16566 GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation;
16567 GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv;
16568 GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv;
16569 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv;
16570 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv;
16571 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv;
16572 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv;
16573 GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram;
16574 GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader;
16575 GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram;
16576 GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource;
16577 GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate;
16578 GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate;
16579 GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate;
16580 GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f;
16581 GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv;
16582 GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i;
16583 GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv;
16584 GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f;
16585 GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv;
16586 GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i;
16587 GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv;
16588 GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f;
16589 GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv;
16590 GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i;
16591 GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv;
16592 GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f;
16593 GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv;
16594 GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i;
16595 GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv;
16596 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv;
16597 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv;
16598 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv;
16599 GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram;
16600 GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram;
16601 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d;
16602 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv;
16603 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f;
16604 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv;
16605 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s;
16606 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv;
16607 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d;
16608 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv;
16609 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f;
16610 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv;
16611 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s;
16612 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv;
16613 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d;
16614 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv;
16615 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f;
16616 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv;
16617 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s;
16618 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv;
16619 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv;
16620 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv;
16621 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv;
16622 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub;
16623 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv;
16624 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv;
16625 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv;
16626 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv;
16627 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d;
16628 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv;
16629 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f;
16630 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv;
16631 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv;
16632 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s;
16633 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv;
16634 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv;
16635 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv;
16636 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv;
16637 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer;
16638
16639 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv;
16640 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv;
16641 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv;
16642 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv;
16643 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv;
16644 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv;
16645
16646 GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender;
16647 GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback;
16648 GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation;
16649 GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor;
16650 GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi;
16651 GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv;
16652 GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv;
16653 GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv;
16654 GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski;
16655 GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei;
16656 GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei;
16657 GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender;
16658 GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback;
16659 GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v;
16660 GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation;
16661 GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi;
16662 GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv;
16663 GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv;
16664 GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying;
16665 GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv;
16666 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv;
16667 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv;
16668 GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi;
16669 GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv;
16670 GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv;
16671 GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings;
16672 GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui;
16673 GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv;
16674 GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui;
16675 GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv;
16676 GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui;
16677 GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv;
16678 GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui;
16679 GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv;
16680 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i;
16681 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv;
16682 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui;
16683 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv;
16684 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i;
16685 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv;
16686 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui;
16687 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv;
16688 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i;
16689 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv;
16690 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui;
16691 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv;
16692 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv;
16693 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i;
16694 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv;
16695 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv;
16696 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv;
16697 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui;
16698 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv;
16699 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv;
16700 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer;
16701
16702 GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced;
16703 GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced;
16704 GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex;
16705 GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer;
16706
16707 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture;
16708 GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v;
16709 GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v;
16710
16711 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor;
16712
16713 GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei;
16714 GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi;
16715 GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei;
16716 GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci;
16717 GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading;
16718
16719 GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus;
16720 GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage;
16721 GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEPROC __glewGetnTexImage;
16722 GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv;
16723
16724 GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX;
16725
16726 GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD;
16727 GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD;
16728 GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD;
16729 GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD;
16730
16731 GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD;
16732 GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD;
16733 GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD;
16734 GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD;
16735
16736 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD;
16737
16738 GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD;
16739 GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD;
16740
16741 GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD;
16742 GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD;
16743 GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD;
16744
16745 GLEW_FUN_EXPORT PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD;
16746
16747 GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD;
16748 GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD;
16749 GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD;
16750 GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD;
16751 GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD;
16752 GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD;
16753 GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD;
16754 GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD;
16755 GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD;
16756 GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD;
16757 GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD;
16758
16759 GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD;
16760
16761 GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD;
16762 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD;
16763
16764 GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD;
16765
16766 GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD;
16767 GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD;
16768
16769 GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE;
16770
16771 GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE;
16772
16773 GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE;
16774 GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE;
16775 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE;
16776
16777 GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE;
16778 GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE;
16779 GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE;
16780 GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE;
16781 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE;
16782 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE;
16783 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE;
16784 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE;
16785 GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE;
16786 GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE;
16787 GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE;
16788
16789 GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE;
16790
16791 GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE;
16792 GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE;
16793 GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE;
16794 GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE;
16795 GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE;
16796
16797 GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE;
16798 GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE;
16799 GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE;
16800 GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE;
16801 GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE;
16802 GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE;
16803 GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE;
16804 GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE;
16805
16806 GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE;
16807 GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE;
16808
16809 GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE;
16810 GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE;
16811 GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE;
16812
16813 GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE;
16814 GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE;
16815
16816 GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE;
16817 GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE;
16818 GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE;
16819 GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE;
16820
16821 GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE;
16822 GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE;
16823 GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE;
16824
16825 GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE;
16826 GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE;
16827 GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE;
16828 GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE;
16829 GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE;
16830 GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE;
16831 GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE;
16832
16833 GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf;
16834 GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef;
16835 GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat;
16836 GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler;
16837 GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary;
16838
16839 GLEW_FUN_EXPORT PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion;
16840
16841 GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB;
16842
16843 GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance;
16844 GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance;
16845 GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance;
16846
16847 GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB;
16848 GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB;
16849 GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB;
16850 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB;
16851 GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB;
16852 GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB;
16853 GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB;
16854 GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB;
16855 GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB;
16856 GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB;
16857 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB;
16858 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB;
16859 GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB;
16860 GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB;
16861 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB;
16862 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB;
16863
16864 GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed;
16865 GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex;
16866
16867 GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage;
16868 GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT;
16869
16870 GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB;
16871
16872 GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData;
16873 GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData;
16874 GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT;
16875 GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT;
16876
16877 GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage;
16878 GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage;
16879
16880 GLEW_FUN_EXPORT PFNGLCLIPCONTROLPROC __glewClipControl;
16881
16882 GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB;
16883
16884 GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute;
16885 GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect;
16886
16887 GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB;
16888
16889 GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData;
16890
16891 GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData;
16892
16893 GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB;
16894 GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB;
16895 GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB;
16896 GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB;
16897
16898 GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit;
16899 GLEW_FUN_EXPORT PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer;
16900 GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus;
16901 GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData;
16902 GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData;
16903 GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi;
16904 GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv;
16905 GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv;
16906 GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv;
16907 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D;
16908 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D;
16909 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D;
16910 GLEW_FUN_EXPORT PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData;
16911 GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D;
16912 GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D;
16913 GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D;
16914 GLEW_FUN_EXPORT PFNGLCREATEBUFFERSPROC __glewCreateBuffers;
16915 GLEW_FUN_EXPORT PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers;
16916 GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines;
16917 GLEW_FUN_EXPORT PFNGLCREATEQUERIESPROC __glewCreateQueries;
16918 GLEW_FUN_EXPORT PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers;
16919 GLEW_FUN_EXPORT PFNGLCREATESAMPLERSPROC __glewCreateSamplers;
16920 GLEW_FUN_EXPORT PFNGLCREATETEXTURESPROC __glewCreateTextures;
16921 GLEW_FUN_EXPORT PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks;
16922 GLEW_FUN_EXPORT PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays;
16923 GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib;
16924 GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib;
16925 GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange;
16926 GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap;
16927 GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage;
16928 GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v;
16929 GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv;
16930 GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv;
16931 GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData;
16932 GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv;
16933 GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv;
16934 GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv;
16935 GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v;
16936 GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv;
16937 GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v;
16938 GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv;
16939 GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage;
16940 GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv;
16941 GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv;
16942 GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv;
16943 GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv;
16944 GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv;
16945 GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv;
16946 GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v;
16947 GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v;
16948 GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv;
16949 GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv;
16950 GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv;
16951 GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv;
16952 GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData;
16953 GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData;
16954 GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer;
16955 GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange;
16956 GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData;
16957 GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage;
16958 GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData;
16959 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer;
16960 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers;
16961 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri;
16962 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer;
16963 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer;
16964 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture;
16965 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer;
16966 GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage;
16967 GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample;
16968 GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERPROC __glewTextureBuffer;
16969 GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange;
16970 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv;
16971 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv;
16972 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf;
16973 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv;
16974 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri;
16975 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv;
16976 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D;
16977 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D;
16978 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample;
16979 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D;
16980 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample;
16981 GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D;
16982 GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D;
16983 GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D;
16984 GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase;
16985 GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange;
16986 GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer;
16987 GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding;
16988 GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat;
16989 GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat;
16990 GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat;
16991 GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor;
16992 GLEW_FUN_EXPORT PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer;
16993 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer;
16994 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers;
16995
16996 GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB;
16997
16998 GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB;
16999 GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB;
17000 GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB;
17001 GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB;
17002
17003 GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex;
17004 GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex;
17005 GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex;
17006 GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex;
17007
17008 GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect;
17009 GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect;
17010
17011 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri;
17012 GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv;
17013 GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT;
17014 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT;
17015
17016 GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer;
17017 GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer;
17018 GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer;
17019 GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus;
17020 GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers;
17021 GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers;
17022 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer;
17023 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D;
17024 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D;
17025 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D;
17026 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer;
17027 GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers;
17028 GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers;
17029 GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap;
17030 GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv;
17031 GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv;
17032 GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer;
17033 GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer;
17034 GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage;
17035 GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample;
17036
17037 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB;
17038 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB;
17039 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB;
17040 GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB;
17041
17042 GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary;
17043 GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary;
17044 GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri;
17045
17046 GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage;
17047 GLEW_FUN_EXPORT PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage;
17048
17049 GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv;
17050 GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d;
17051 GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv;
17052 GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d;
17053 GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv;
17054 GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d;
17055 GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv;
17056 GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d;
17057 GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv;
17058 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv;
17059 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv;
17060 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv;
17061 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv;
17062 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv;
17063 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv;
17064 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv;
17065 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv;
17066 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv;
17067
17068 GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB;
17069 GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB;
17070 GLEW_FUN_EXPORT PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB;
17071 GLEW_FUN_EXPORT PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB;
17072 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB;
17073 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB;
17074 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB;
17075 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB;
17076 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB;
17077 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB;
17078 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB;
17079 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB;
17080 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB;
17081 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB;
17082 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB;
17083 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB;
17084 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB;
17085 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB;
17086 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB;
17087 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB;
17088 GLEW_FUN_EXPORT PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB;
17089 GLEW_FUN_EXPORT PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB;
17090 GLEW_FUN_EXPORT PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB;
17091 GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB;
17092 GLEW_FUN_EXPORT PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB;
17093 GLEW_FUN_EXPORT PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB;
17094 GLEW_FUN_EXPORT PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB;
17095 GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB;
17096 GLEW_FUN_EXPORT PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB;
17097 GLEW_FUN_EXPORT PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB;
17098 GLEW_FUN_EXPORT PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB;
17099 GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB;
17100 GLEW_FUN_EXPORT PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB;
17101 GLEW_FUN_EXPORT PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB;
17102 GLEW_FUN_EXPORT PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB;
17103 GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB;
17104
17105 GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable;
17106 GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable;
17107 GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv;
17108 GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv;
17109 GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D;
17110 GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D;
17111 GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf;
17112 GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv;
17113 GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri;
17114 GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv;
17115 GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable;
17116 GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable;
17117 GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D;
17118 GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D;
17119 GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable;
17120 GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv;
17121 GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv;
17122 GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter;
17123 GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv;
17124 GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv;
17125 GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram;
17126 GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv;
17127 GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv;
17128 GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax;
17129 GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv;
17130 GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv;
17131 GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter;
17132 GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram;
17133 GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax;
17134 GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram;
17135 GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax;
17136 GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D;
17137
17138 GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB;
17139 GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB;
17140
17141 GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB;
17142 GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB;
17143 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB;
17144
17145 GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ;
17146
17147 GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v;
17148
17149 GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData;
17150 GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData;
17151 GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer;
17152 GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer;
17153 GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage;
17154 GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage;
17155
17156 GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange;
17157 GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange;
17158
17159 GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB;
17160 GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB;
17161 GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB;
17162 GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB;
17163 GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB;
17164
17165 GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase;
17166 GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange;
17167 GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures;
17168 GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers;
17169 GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures;
17170 GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers;
17171
17172 GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect;
17173 GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect;
17174
17175 GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB;
17176
17177 GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB;
17178 GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB;
17179 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB;
17180 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB;
17181 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB;
17182 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB;
17183 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB;
17184 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB;
17185 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB;
17186 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB;
17187 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB;
17188 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB;
17189 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB;
17190 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB;
17191 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB;
17192 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB;
17193 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB;
17194 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB;
17195 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB;
17196 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB;
17197 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB;
17198 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB;
17199 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB;
17200 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB;
17201 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB;
17202 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB;
17203 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB;
17204 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB;
17205 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB;
17206 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB;
17207 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB;
17208 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB;
17209 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB;
17210 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB;
17211
17212 GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB;
17213 GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB;
17214 GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB;
17215 GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB;
17216 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB;
17217 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB;
17218 GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB;
17219 GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB;
17220
17221 GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB;
17222
17223 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB;
17224 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB;
17225
17226 GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv;
17227 GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex;
17228 GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation;
17229 GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex;
17230 GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName;
17231 GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv;
17232
17233 GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex;
17234
17235 GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB;
17236 GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB;
17237 GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB;
17238 GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB;
17239 GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB;
17240 GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB;
17241 GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB;
17242 GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB;
17243 GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB;
17244 GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB;
17245 GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB;
17246 GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB;
17247 GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB;
17248 GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB;
17249 GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB;
17250 GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB;
17251 GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB;
17252 GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB;
17253 GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB;
17254 GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB;
17255
17256 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB;
17257 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB;
17258
17259 GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB;
17260
17261 GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler;
17262 GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers;
17263 GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers;
17264 GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv;
17265 GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv;
17266 GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv;
17267 GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv;
17268 GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler;
17269 GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv;
17270 GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv;
17271 GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf;
17272 GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv;
17273 GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri;
17274 GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv;
17275
17276 GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram;
17277 GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline;
17278 GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv;
17279 GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines;
17280 GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines;
17281 GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog;
17282 GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv;
17283 GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline;
17284 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d;
17285 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv;
17286 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f;
17287 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv;
17288 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i;
17289 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv;
17290 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui;
17291 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv;
17292 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d;
17293 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv;
17294 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f;
17295 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv;
17296 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i;
17297 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv;
17298 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui;
17299 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv;
17300 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d;
17301 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv;
17302 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f;
17303 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv;
17304 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i;
17305 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv;
17306 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui;
17307 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv;
17308 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d;
17309 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv;
17310 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f;
17311 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv;
17312 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i;
17313 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv;
17314 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui;
17315 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv;
17316 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv;
17317 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv;
17318 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv;
17319 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv;
17320 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv;
17321 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv;
17322 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv;
17323 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv;
17324 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv;
17325 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv;
17326 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv;
17327 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv;
17328 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv;
17329 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv;
17330 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv;
17331 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv;
17332 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv;
17333 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv;
17334 GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages;
17335 GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline;
17336
17337 GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv;
17338
17339 GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture;
17340 GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier;
17341
17342 GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB;
17343 GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB;
17344 GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB;
17345 GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB;
17346 GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB;
17347 GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB;
17348 GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB;
17349 GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB;
17350 GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB;
17351 GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB;
17352 GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB;
17353 GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB;
17354 GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB;
17355 GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB;
17356 GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB;
17357 GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB;
17358 GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB;
17359 GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB;
17360 GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB;
17361 GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB;
17362 GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB;
17363 GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB;
17364 GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB;
17365 GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB;
17366 GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB;
17367 GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB;
17368 GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB;
17369 GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB;
17370 GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB;
17371 GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB;
17372 GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB;
17373 GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB;
17374 GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB;
17375 GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB;
17376 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB;
17377 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB;
17378 GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB;
17379 GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB;
17380 GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB;
17381
17382 GLEW_FUN_EXPORT PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding;
17383
17384 GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName;
17385 GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName;
17386 GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv;
17387 GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv;
17388 GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex;
17389 GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation;
17390 GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv;
17391 GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv;
17392
17393 GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB;
17394 GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB;
17395 GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB;
17396 GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB;
17397 GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB;
17398 GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB;
17399
17400 GLEW_FUN_EXPORT PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB;
17401
17402 GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB;
17403 GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT;
17404
17405 GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync;
17406 GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync;
17407 GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync;
17408 GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v;
17409 GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv;
17410 GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync;
17411 GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync;
17412
17413 GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv;
17414 GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri;
17415
17416 GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERPROC __glewTextureBarrier;
17417
17418 GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB;
17419
17420 GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange;
17421 GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT;
17422
17423 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB;
17424 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB;
17425 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB;
17426 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB;
17427 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB;
17428 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB;
17429 GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB;
17430
17431 GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv;
17432 GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski;
17433 GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample;
17434 GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample;
17435
17436 GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D;
17437 GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D;
17438 GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D;
17439 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT;
17440 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT;
17441 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT;
17442
17443 GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample;
17444 GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample;
17445 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT;
17446 GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT;
17447
17448 GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView;
17449
17450 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v;
17451 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v;
17452 GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter;
17453
17454 GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback;
17455 GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks;
17456 GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback;
17457 GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks;
17458 GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback;
17459 GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback;
17460 GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback;
17461
17462 GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed;
17463 GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream;
17464 GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed;
17465 GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv;
17466
17467 GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced;
17468 GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced;
17469
17470 GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB;
17471 GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB;
17472 GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB;
17473 GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB;
17474
17475 GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase;
17476 GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange;
17477 GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName;
17478 GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv;
17479 GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName;
17480 GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv;
17481 GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v;
17482 GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex;
17483 GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices;
17484 GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding;
17485
17486 GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray;
17487 GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays;
17488 GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays;
17489 GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray;
17490
17491 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv;
17492 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d;
17493 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv;
17494 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d;
17495 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv;
17496 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d;
17497 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv;
17498 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d;
17499 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv;
17500 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer;
17501
17502 GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer;
17503 GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT;
17504 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT;
17505 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT;
17506 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT;
17507 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT;
17508 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT;
17509 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding;
17510 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat;
17511 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat;
17512 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat;
17513 GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor;
17514
17515 GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB;
17516 GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB;
17517 GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB;
17518 GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB;
17519 GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB;
17520 GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB;
17521 GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB;
17522 GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB;
17523 GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB;
17524 GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB;
17525
17526 GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB;
17527 GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB;
17528 GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB;
17529 GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB;
17530 GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB;
17531 GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB;
17532 GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB;
17533 GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB;
17534 GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB;
17535 GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB;
17536 GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB;
17537
17538 GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB;
17539 GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB;
17540 GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB;
17541 GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB;
17542 GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB;
17543 GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB;
17544 GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB;
17545 GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB;
17546 GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB;
17547 GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB;
17548 GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB;
17549 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB;
17550 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB;
17551 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB;
17552 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB;
17553 GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB;
17554 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB;
17555 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB;
17556 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB;
17557 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB;
17558 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB;
17559 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB;
17560 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB;
17561 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB;
17562 GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB;
17563 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB;
17564 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB;
17565 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB;
17566 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB;
17567 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB;
17568 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB;
17569 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB;
17570 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB;
17571 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB;
17572 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB;
17573 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB;
17574 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB;
17575 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB;
17576 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB;
17577 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB;
17578 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB;
17579 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB;
17580 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB;
17581 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB;
17582 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB;
17583 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB;
17584 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB;
17585 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB;
17586 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB;
17587 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB;
17588 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB;
17589 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB;
17590 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB;
17591 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB;
17592 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB;
17593 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB;
17594 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB;
17595 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB;
17596 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB;
17597 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB;
17598 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB;
17599 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB;
17600
17601 GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB;
17602 GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB;
17603 GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB;
17604
17605 GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui;
17606 GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv;
17607 GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui;
17608 GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv;
17609 GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui;
17610 GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv;
17611 GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui;
17612 GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv;
17613 GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui;
17614 GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv;
17615 GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui;
17616 GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv;
17617 GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui;
17618 GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv;
17619 GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui;
17620 GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv;
17621 GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui;
17622 GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv;
17623 GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui;
17624 GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv;
17625 GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui;
17626 GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv;
17627 GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui;
17628 GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv;
17629 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui;
17630 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv;
17631 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui;
17632 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv;
17633 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui;
17634 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv;
17635 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui;
17636 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv;
17637 GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui;
17638 GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv;
17639 GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui;
17640 GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv;
17641 GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui;
17642 GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv;
17643
17644 GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv;
17645 GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed;
17646 GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v;
17647 GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v;
17648 GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv;
17649 GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed;
17650 GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv;
17651 GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv;
17652 GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf;
17653 GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv;
17654
17655 GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB;
17656 GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB;
17657 GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB;
17658 GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB;
17659 GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB;
17660 GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB;
17661 GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB;
17662 GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB;
17663 GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB;
17664 GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB;
17665 GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB;
17666 GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB;
17667 GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB;
17668 GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB;
17669 GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB;
17670 GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB;
17671
17672 GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI;
17673
17674 GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI;
17675 GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI;
17676 GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI;
17677
17678 GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI;
17679 GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI;
17680 GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI;
17681 GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI;
17682
17683 GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI;
17684 GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI;
17685 GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI;
17686 GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI;
17687 GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI;
17688 GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI;
17689 GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI;
17690 GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI;
17691 GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI;
17692 GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI;
17693 GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI;
17694 GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI;
17695 GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI;
17696 GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI;
17697
17698 GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI;
17699 GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI;
17700
17701 GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI;
17702 GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI;
17703
17704 GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI;
17705 GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI;
17706
17707 GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI;
17708 GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI;
17709 GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI;
17710 GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI;
17711 GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI;
17712 GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI;
17713 GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI;
17714 GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI;
17715 GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI;
17716 GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI;
17717 GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI;
17718 GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI;
17719
17720 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI;
17721 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI;
17722 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI;
17723
17724 GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI;
17725 GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI;
17726 GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI;
17727 GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI;
17728 GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI;
17729 GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI;
17730 GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI;
17731 GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI;
17732 GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI;
17733 GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI;
17734 GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI;
17735 GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI;
17736 GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI;
17737 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI;
17738 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI;
17739 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI;
17740 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI;
17741 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI;
17742 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI;
17743 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI;
17744 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI;
17745 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI;
17746 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI;
17747 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI;
17748 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI;
17749 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI;
17750 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI;
17751 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI;
17752 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI;
17753 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI;
17754 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI;
17755 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI;
17756 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI;
17757 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI;
17758 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI;
17759 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI;
17760 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI;
17761 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI;
17762 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI;
17763 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI;
17764 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI;
17765 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI;
17766 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI;
17767 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI;
17768 GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI;
17769
17770 GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT;
17771 GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT;
17772 GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT;
17773
17774 GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT;
17775
17776 GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT;
17777
17778 GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT;
17779
17780 GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT;
17781
17782 GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT;
17783 GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT;
17784
17785 GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT;
17786 GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT;
17787
17788 GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT;
17789 GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT;
17790 GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT;
17791 GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT;
17792 GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT;
17793 GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT;
17794 GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT;
17795 GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT;
17796 GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT;
17797 GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT;
17798 GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT;
17799 GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT;
17800 GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT;
17801
17802 GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT;
17803 GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT;
17804
17805 GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT;
17806 GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT;
17807 GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT;
17808 GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT;
17809 GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT;
17810
17811 GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT;
17812 GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT;
17813
17814 GLEW_FUN_EXPORT PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT;
17815 GLEW_FUN_EXPORT PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT;
17816
17817 GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT;
17818 GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT;
17819 GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT;
17820
17821 GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT;
17822
17823 GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT;
17824 GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT;
17825 GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT;
17826 GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT;
17827 GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT;
17828 GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT;
17829 GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT;
17830 GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT;
17831 GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT;
17832 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT;
17833 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT;
17834 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT;
17835 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT;
17836 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT;
17837 GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT;
17838 GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT;
17839 GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT;
17840 GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT;
17841 GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT;
17842 GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT;
17843 GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT;
17844 GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT;
17845 GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT;
17846 GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT;
17847 GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT;
17848 GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT;
17849 GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT;
17850 GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT;
17851 GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT;
17852 GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT;
17853 GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT;
17854 GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT;
17855 GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT;
17856 GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT;
17857 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT;
17858 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT;
17859 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT;
17860 GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT;
17861 GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT;
17862 GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT;
17863 GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT;
17864 GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT;
17865 GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT;
17866 GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT;
17867 GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT;
17868 GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT;
17869 GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT;
17870 GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT;
17871 GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT;
17872 GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT;
17873 GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT;
17874 GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT;
17875 GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT;
17876 GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT;
17877 GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT;
17878 GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT;
17879 GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT;
17880 GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT;
17881 GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT;
17882 GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT;
17883 GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT;
17884 GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT;
17885 GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT;
17886 GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT;
17887 GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT;
17888 GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT;
17889 GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT;
17890 GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT;
17891 GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT;
17892 GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT;
17893 GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT;
17894 GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT;
17895 GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT;
17896 GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT;
17897 GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT;
17898 GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT;
17899 GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT;
17900 GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT;
17901 GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT;
17902 GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT;
17903 GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT;
17904 GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT;
17905 GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT;
17906 GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT;
17907 GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT;
17908 GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT;
17909 GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT;
17910 GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT;
17911 GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT;
17912 GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT;
17913 GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT;
17914 GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT;
17915 GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT;
17916 GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT;
17917 GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT;
17918 GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT;
17919 GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT;
17920 GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT;
17921 GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT;
17922 GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT;
17923 GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT;
17924 GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT;
17925 GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT;
17926 GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT;
17927 GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT;
17928 GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT;
17929 GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT;
17930 GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT;
17931 GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT;
17932 GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT;
17933 GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT;
17934 GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT;
17935 GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT;
17936 GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT;
17937 GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT;
17938 GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT;
17939 GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT;
17940 GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT;
17941 GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT;
17942 GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT;
17943 GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT;
17944 GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT;
17945 GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT;
17946 GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT;
17947 GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT;
17948 GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT;
17949 GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT;
17950 GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT;
17951 GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT;
17952 GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT;
17953 GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT;
17954 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT;
17955 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT;
17956 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT;
17957 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT;
17958 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT;
17959 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT;
17960 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT;
17961 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT;
17962 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT;
17963 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT;
17964 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT;
17965 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT;
17966 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT;
17967 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT;
17968 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT;
17969 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT;
17970 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT;
17971 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT;
17972 GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT;
17973 GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT;
17974 GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT;
17975 GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT;
17976 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT;
17977 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT;
17978 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT;
17979 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT;
17980 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT;
17981 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT;
17982 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT;
17983 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT;
17984 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT;
17985 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT;
17986 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT;
17987 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT;
17988 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT;
17989 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT;
17990 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT;
17991 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT;
17992 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT;
17993 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT;
17994 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT;
17995 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT;
17996 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT;
17997 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT;
17998 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT;
17999 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT;
18000 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT;
18001 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT;
18002 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT;
18003 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT;
18004 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT;
18005 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT;
18006 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT;
18007 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT;
18008 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT;
18009 GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT;
18010 GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT;
18011 GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT;
18012 GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT;
18013 GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT;
18014 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT;
18015 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT;
18016 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT;
18017 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT;
18018 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT;
18019 GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT;
18020 GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT;
18021 GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT;
18022 GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT;
18023 GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT;
18024 GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT;
18025 GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT;
18026 GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT;
18027 GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT;
18028 GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT;
18029 GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT;
18030 GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT;
18031 GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT;
18032 GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT;
18033 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT;
18034 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT;
18035 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT;
18036 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT;
18037
18038 GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT;
18039 GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT;
18040 GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT;
18041 GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT;
18042 GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT;
18043 GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT;
18044
18045 GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT;
18046 GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT;
18047
18048 GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT;
18049
18050 GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT;
18051 GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT;
18052 GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT;
18053 GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT;
18054 GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT;
18055
18056 GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT;
18057 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT;
18058 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT;
18059 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT;
18060 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT;
18061 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT;
18062 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT;
18063 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT;
18064 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT;
18065 GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT;
18066 GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT;
18067 GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT;
18068 GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT;
18069 GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT;
18070 GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT;
18071 GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT;
18072 GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT;
18073 GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT;
18074
18075 GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT;
18076
18077 GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT;
18078
18079 GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT;
18080 GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT;
18081 GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT;
18082 GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT;
18083 GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT;
18084 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT;
18085 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT;
18086 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT;
18087 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT;
18088 GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT;
18089 GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT;
18090 GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT;
18091 GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT;
18092 GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT;
18093 GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT;
18094 GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT;
18095 GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT;
18096
18097 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT;
18098 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT;
18099 GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT;
18100
18101 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT;
18102 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT;
18103
18104 GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT;
18105 GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT;
18106 GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT;
18107 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT;
18108 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT;
18109 GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT;
18110 GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT;
18111 GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT;
18112 GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT;
18113 GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT;
18114 GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT;
18115 GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT;
18116 GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT;
18117 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT;
18118 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT;
18119 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT;
18120 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT;
18121 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT;
18122 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT;
18123 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT;
18124 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT;
18125 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT;
18126 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT;
18127 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT;
18128 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT;
18129 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT;
18130 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT;
18131 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT;
18132 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT;
18133 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT;
18134 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT;
18135 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT;
18136 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT;
18137 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT;
18138
18139 GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT;
18140 GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT;
18141 GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT;
18142 GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT;
18143 GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT;
18144 GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT;
18145 GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT;
18146 GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT;
18147 GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT;
18148 GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT;
18149
18150 GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT;
18151
18152 GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT;
18153
18154 GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT;
18155 GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT;
18156 GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT;
18157
18158 GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT;
18159 GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT;
18160
18161 GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT;
18162 GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT;
18163
18164 GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT;
18165 GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT;
18166 GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT;
18167 GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT;
18168
18169 GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT;
18170 GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT;
18171 GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT;
18172 GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT;
18173 GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT;
18174 GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT;
18175
18176 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT;
18177 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT;
18178
18179 GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT;
18180
18181 GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT;
18182
18183 GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT;
18184
18185 GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV;
18186 GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV;
18187 GLEW_FUN_EXPORT PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV;
18188 GLEW_FUN_EXPORT PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT;
18189
18190 GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT;
18191 GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT;
18192
18193 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT;
18194 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT;
18195 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT;
18196 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT;
18197 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT;
18198 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT;
18199 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT;
18200 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT;
18201 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT;
18202 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT;
18203 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT;
18204 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT;
18205 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT;
18206 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT;
18207 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT;
18208 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT;
18209 GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT;
18210
18211 GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT;
18212 GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT;
18213 GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT;
18214
18215 GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT;
18216 GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT;
18217
18218 GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT;
18219
18220 GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT;
18221 GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT;
18222 GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT;
18223
18224 GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT;
18225
18226 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT;
18227
18228 GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT;
18229
18230 GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT;
18231 GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT;
18232 GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT;
18233 GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT;
18234 GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT;
18235 GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT;
18236
18237 GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT;
18238 GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT;
18239 GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT;
18240 GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT;
18241 GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT;
18242 GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT;
18243
18244 GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT;
18245
18246 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT;
18247 GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT;
18248
18249 GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT;
18250 GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT;
18251 GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT;
18252 GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT;
18253 GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT;
18254 GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT;
18255 GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT;
18256
18257 GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT;
18258 GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT;
18259 GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT;
18260 GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT;
18261 GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT;
18262 GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT;
18263 GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT;
18264 GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT;
18265
18266 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT;
18267 GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT;
18268 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT;
18269 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT;
18270 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT;
18271 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT;
18272 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT;
18273 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT;
18274 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT;
18275 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT;
18276 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT;
18277
18278 GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT;
18279 GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT;
18280 GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT;
18281 GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT;
18282 GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT;
18283 GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT;
18284 GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT;
18285 GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT;
18286 GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT;
18287 GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT;
18288 GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT;
18289 GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT;
18290 GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT;
18291 GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT;
18292 GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT;
18293 GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT;
18294 GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT;
18295 GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT;
18296 GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT;
18297 GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT;
18298 GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT;
18299 GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT;
18300 GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT;
18301 GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT;
18302 GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT;
18303 GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT;
18304 GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT;
18305 GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT;
18306 GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT;
18307 GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT;
18308 GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT;
18309 GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT;
18310 GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT;
18311 GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT;
18312 GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT;
18313 GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT;
18314 GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT;
18315 GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT;
18316 GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT;
18317 GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT;
18318 GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT;
18319 GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT;
18320
18321 GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT;
18322 GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT;
18323 GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT;
18324
18325 GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT;
18326
18327 GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY;
18328
18329 GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY;
18330
18331 GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP;
18332 GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP;
18333 GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP;
18334 GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP;
18335 GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP;
18336 GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP;
18337
18338 GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM;
18339 GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM;
18340
18341 GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM;
18342 GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM;
18343 GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM;
18344 GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM;
18345 GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM;
18346 GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM;
18347 GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM;
18348 GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM;
18349
18350 GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL;
18351 GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL;
18352 GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL;
18353
18354 GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL;
18355 GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL;
18356 GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL;
18357 GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL;
18358
18359 GLEW_FUN_EXPORT PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL;
18360 GLEW_FUN_EXPORT PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL;
18361 GLEW_FUN_EXPORT PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL;
18362 GLEW_FUN_EXPORT PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL;
18363 GLEW_FUN_EXPORT PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL;
18364 GLEW_FUN_EXPORT PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL;
18365 GLEW_FUN_EXPORT PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL;
18366 GLEW_FUN_EXPORT PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL;
18367 GLEW_FUN_EXPORT PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL;
18368 GLEW_FUN_EXPORT PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL;
18369
18370 GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL;
18371 GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL;
18372
18373 GLEW_FUN_EXPORT PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR;
18374
18375 GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback;
18376 GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl;
18377 GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert;
18378 GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog;
18379 GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel;
18380 GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel;
18381 GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel;
18382 GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel;
18383 GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup;
18384 GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup;
18385
18386 GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv;
18387 GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv;
18388 GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv;
18389 GLEW_FUN_EXPORT PFNGLREADNPIXELSPROC __glewReadnPixels;
18390
18391 GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled;
18392 GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion;
18393 GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion;
18394 GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion;
18395 GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion;
18396
18397 GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA;
18398
18399 GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA;
18400 GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA;
18401 GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA;
18402 GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA;
18403 GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA;
18404 GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA;
18405 GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA;
18406 GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA;
18407 GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA;
18408 GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA;
18409 GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA;
18410 GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA;
18411 GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA;
18412 GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA;
18413 GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA;
18414 GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA;
18415 GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA;
18416 GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA;
18417 GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA;
18418 GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA;
18419 GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA;
18420 GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA;
18421 GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA;
18422 GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA;
18423
18424 GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX;
18425 GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX;
18426
18427 GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV;
18428 GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV;
18429
18430 GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV;
18431 GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV;
18432
18433 GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV;
18434 GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV;
18435 GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV;
18436 GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV;
18437 GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV;
18438 GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV;
18439 GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV;
18440 GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV;
18441 GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV;
18442 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV;
18443 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV;
18444 GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV;
18445 GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV;
18446
18447 GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV;
18448 GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV;
18449
18450 GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV;
18451 GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV;
18452
18453 GLEW_FUN_EXPORT PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV;
18454
18455 GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV;
18456
18457 GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV;
18458
18459 GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV;
18460 GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV;
18461 GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV;
18462
18463 GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV;
18464
18465 GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV;
18466 GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV;
18467 GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV;
18468 GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV;
18469 GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV;
18470 GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV;
18471 GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV;
18472 GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV;
18473 GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV;
18474
18475 GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV;
18476 GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV;
18477 GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV;
18478
18479 GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV;
18480 GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV;
18481 GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV;
18482 GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV;
18483 GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV;
18484 GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV;
18485 GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV;
18486
18487 GLEW_FUN_EXPORT PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV;
18488
18489 GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV;
18490 GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV;
18491 GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV;
18492 GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV;
18493 GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV;
18494 GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV;
18495
18496 GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV;
18497
18498 GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV;
18499
18500 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV;
18501 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV;
18502 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV;
18503 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV;
18504 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV;
18505 GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV;
18506 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV;
18507 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV;
18508 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV;
18509 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV;
18510 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV;
18511 GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV;
18512
18513 GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV;
18514 GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV;
18515 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV;
18516 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV;
18517 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV;
18518 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV;
18519 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV;
18520 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV;
18521 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV;
18522 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV;
18523 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV;
18524 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV;
18525 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV;
18526 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV;
18527 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV;
18528 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV;
18529 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV;
18530 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV;
18531 GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV;
18532 GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV;
18533 GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV;
18534 GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV;
18535 GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV;
18536 GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV;
18537 GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV;
18538 GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV;
18539 GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV;
18540 GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV;
18541 GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV;
18542 GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV;
18543 GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV;
18544 GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV;
18545 GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV;
18546 GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV;
18547
18548 GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV;
18549 GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV;
18550 GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV;
18551 GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV;
18552 GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV;
18553 GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV;
18554 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV;
18555 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV;
18556 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV;
18557 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV;
18558 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV;
18559 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV;
18560 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV;
18561 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV;
18562 GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV;
18563 GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV;
18564 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV;
18565 GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV;
18566 GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV;
18567 GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV;
18568 GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV;
18569 GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV;
18570 GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV;
18571 GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV;
18572 GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV;
18573 GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV;
18574 GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV;
18575 GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV;
18576 GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV;
18577 GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV;
18578 GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV;
18579 GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV;
18580 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV;
18581 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV;
18582 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV;
18583 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV;
18584 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV;
18585 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV;
18586 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV;
18587 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV;
18588 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV;
18589 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV;
18590 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV;
18591 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV;
18592 GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV;
18593 GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV;
18594
18595 GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV;
18596
18597 GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV;
18598 GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV;
18599 GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV;
18600 GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV;
18601 GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV;
18602 GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV;
18603 GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV;
18604
18605 GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV;
18606 GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV;
18607 GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV;
18608
18609 GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV;
18610 GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV;
18611 GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV;
18612 GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV;
18613 GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV;
18614 GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV;
18615 GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV;
18616 GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV;
18617 GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV;
18618 GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV;
18619 GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV;
18620 GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV;
18621 GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV;
18622 GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV;
18623 GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV;
18624 GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV;
18625 GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV;
18626 GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV;
18627 GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV;
18628 GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV;
18629 GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV;
18630 GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV;
18631 GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV;
18632 GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV;
18633 GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV;
18634 GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV;
18635 GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV;
18636 GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV;
18637 GLEW_FUN_EXPORT PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV;
18638 GLEW_FUN_EXPORT PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV;
18639 GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV;
18640 GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV;
18641 GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV;
18642 GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV;
18643 GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV;
18644 GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV;
18645 GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV;
18646 GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV;
18647 GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV;
18648 GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV;
18649 GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV;
18650 GLEW_FUN_EXPORT PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV;
18651 GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV;
18652 GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV;
18653 GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV;
18654 GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV;
18655 GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV;
18656 GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV;
18657 GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV;
18658 GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV;
18659 GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV;
18660 GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV;
18661 GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV;
18662 GLEW_FUN_EXPORT PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV;
18663 GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV;
18664 GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV;
18665 GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV;
18666 GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV;
18667 GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV;
18668 GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV;
18669 GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV;
18670 GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV;
18671 GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV;
18672 GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV;
18673
18674 GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV;
18675 GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV;
18676
18677 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV;
18678 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV;
18679
18680 GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV;
18681 GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV;
18682 GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV;
18683 GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV;
18684 GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV;
18685 GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV;
18686
18687 GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV;
18688 GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV;
18689
18690 GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV;
18691 GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV;
18692 GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV;
18693 GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV;
18694 GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV;
18695 GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV;
18696 GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV;
18697 GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV;
18698 GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV;
18699 GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV;
18700 GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV;
18701 GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV;
18702 GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV;
18703
18704 GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV;
18705 GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV;
18706
18707 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV;
18708 GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV;
18709
18710 GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV;
18711 GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV;
18712 GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV;
18713 GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV;
18714 GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV;
18715 GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV;
18716 GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV;
18717 GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV;
18718 GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV;
18719 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV;
18720 GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV;
18721 GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV;
18722 GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV;
18723
18724 GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV;
18725
18726 GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV;
18727 GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV;
18728 GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV;
18729 GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV;
18730 GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV;
18731 GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV;
18732
18733 GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV;
18734 GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV;
18735 GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV;
18736 GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV;
18737 GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV;
18738 GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV;
18739 GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV;
18740 GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV;
18741 GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV;
18742 GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV;
18743 GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV;
18744
18745 GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV;
18746 GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV;
18747 GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV;
18748 GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV;
18749 GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV;
18750 GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV;
18751 GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV;
18752
18753 GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV;
18754 GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV;
18755 GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV;
18756 GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV;
18757 GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV;
18758 GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV;
18759 GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV;
18760 GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV;
18761 GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV;
18762 GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV;
18763
18764 GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV;
18765 GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV;
18766
18767 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV;
18768 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV;
18769 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV;
18770 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV;
18771 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV;
18772 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV;
18773 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV;
18774 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV;
18775 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV;
18776 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV;
18777 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV;
18778 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV;
18779 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV;
18780 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV;
18781 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV;
18782 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV;
18783 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV;
18784 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV;
18785 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV;
18786
18787 GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV;
18788 GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV;
18789 GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV;
18790 GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV;
18791 GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV;
18792 GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV;
18793 GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV;
18794 GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV;
18795 GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV;
18796 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV;
18797 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV;
18798 GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV;
18799
18800 GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV;
18801 GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV;
18802 GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV;
18803 GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV;
18804 GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV;
18805 GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV;
18806 GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV;
18807 GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV;
18808 GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV;
18809 GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV;
18810 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV;
18811 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV;
18812 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV;
18813 GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV;
18814 GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV;
18815 GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV;
18816 GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV;
18817 GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV;
18818 GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV;
18819 GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV;
18820 GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV;
18821 GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV;
18822 GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV;
18823 GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV;
18824 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV;
18825 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV;
18826 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV;
18827 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV;
18828 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV;
18829 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV;
18830 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV;
18831 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV;
18832 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV;
18833 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV;
18834 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV;
18835 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV;
18836 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV;
18837 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV;
18838 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV;
18839 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV;
18840 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV;
18841 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV;
18842 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV;
18843 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV;
18844 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV;
18845 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV;
18846 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV;
18847 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV;
18848 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV;
18849 GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV;
18850 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV;
18851 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV;
18852 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV;
18853 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV;
18854 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV;
18855 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV;
18856 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV;
18857 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV;
18858 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV;
18859 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV;
18860 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV;
18861 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV;
18862 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV;
18863 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV;
18864
18865 GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV;
18866 GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV;
18867 GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV;
18868 GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV;
18869 GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV;
18870 GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV;
18871 GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV;
18872 GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV;
18873 GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV;
18874 GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV;
18875 GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV;
18876 GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV;
18877
18878 GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES;
18879 GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES;
18880 GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES;
18881 GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES;
18882 GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES;
18883 GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES;
18884
18885 GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR;
18886
18887 GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx;
18888 GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx;
18889 GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx;
18890 GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x;
18891 GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex;
18892 GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx;
18893 GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv;
18894 GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf;
18895 GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx;
18896 GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx;
18897 GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv;
18898 GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx;
18899 GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv;
18900 GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx;
18901 GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx;
18902 GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx;
18903 GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv;
18904 GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx;
18905 GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x;
18906 GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x;
18907 GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof;
18908 GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox;
18909 GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex;
18910 GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx;
18911 GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex;
18912 GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex;
18913 GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex;
18914 GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx;
18915 GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv;
18916 GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx;
18917 GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex;
18918
18919 GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef;
18920 GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex;
18921 GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef;
18922 GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex;
18923 GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv;
18924 GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv;
18925 GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv;
18926 GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv;
18927 GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv;
18928 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx;
18929 GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv;
18930 GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES;
18931 GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv;
18932
18933 GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL;
18934
18935 GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL;
18936 GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL;
18937
18938 GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL;
18939
18940 GLEW_FUN_EXPORT PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL;
18941
18942 GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS;
18943 GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS;
18944
18945 GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS;
18946 GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS;
18947
18948 GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS;
18949 GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS;
18950
18951 GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS;
18952 GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS;
18953
18954 GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS;
18955 GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS;
18956
18957 GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS;
18958 GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS;
18959
18960 GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX;
18961 GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX;
18962 GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX;
18963 GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX;
18964 GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX;
18965 GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX;
18966
18967 GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX;
18968
18969 GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX;
18970
18971 GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX;
18972 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX;
18973 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX;
18974 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX;
18975 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX;
18976 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX;
18977 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX;
18978 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX;
18979 GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX;
18980 GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX;
18981 GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX;
18982 GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX;
18983 GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX;
18984 GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX;
18985 GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX;
18986 GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX;
18987 GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX;
18988
18989 GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX;
18990
18991 GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX;
18992
18993 GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX;
18994
18995 GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX;
18996 GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX;
18997 GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX;
18998 GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX;
18999
19000 GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX;
19001
19002 GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI;
19003 GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI;
19004 GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI;
19005 GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI;
19006 GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI;
19007 GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI;
19008 GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI;
19009
19010 GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX;
19011
19012 GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN;
19013 GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN;
19014 GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN;
19015 GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN;
19016 GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN;
19017 GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN;
19018 GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN;
19019 GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN;
19020
19021 GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN;
19022
19023 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN;
19024 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN;
19025 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN;
19026 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN;
19027 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN;
19028 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN;
19029 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN;
19030
19031 GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN;
19032 GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN;
19033 GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN;
19034 GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN;
19035 GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN;
19036 GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN;
19037 GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN;
19038 GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN;
19039 GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN;
19040 GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN;
19041 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN;
19042 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN;
19043 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN;
19044 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN;
19045 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN;
19046 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN;
19047 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN;
19048 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN;
19049 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN;
19050 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN;
19051 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN;
19052 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN;
19053 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN;
19054 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN;
19055 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN;
19056 GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN;
19057 GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN;
19058 GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN;
19059 GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN;
19060 GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN;
19061 GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN;
19062 GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN;
19063 GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN;
19064 GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN;
19065 GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN;
19066 GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN;
19067 GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN;
19068 GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN;
19069 GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN;
19070 GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN;
19071
19072 GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN;
19073
19074 #if defined(GLEW_MX) && !defined(_WIN32)
19075 struct GLEWContextStruct
19076 {
19077 #endif /* GLEW_MX */
19078
19079 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1;
19080 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2;
19081 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1;
19082 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3;
19083 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4;
19084 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5;
19085 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0;
19086 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1;
19087 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0;
19088 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1;
19089 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2;
19090 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3;
19091 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0;
19092 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1;
19093 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2;
19094 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3;
19095 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4;
19096 GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_5;
19097 GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample;
19098 GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer;
19099 GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1;
19100 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor;
19101 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth;
19102 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output;
19103 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate;
19104 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend;
19105 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader;
19106 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64;
19107 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements;
19108 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect;
19109 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete;
19110 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_occlusion_query_event;
19111 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor;
19112 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory;
19113 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object;
19114 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions;
19115 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture;
19116 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_atomic_counter_ops;
19117 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export;
19118 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_value_export;
19119 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax;
19120 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture;
19121 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended;
19122 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4;
19123 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles;
19124 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4;
19125 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer;
19126 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator;
19127 GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index;
19128 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture;
19129 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit;
19130 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample;
19131 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays;
19132 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order;
19133 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary;
19134 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1;
19135 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3;
19136 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5;
19137 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage;
19138 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query;
19139 GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source;
19140 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil;
19141 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage;
19142 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array;
19143 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence;
19144 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels;
19145 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range;
19146 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable;
19147 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer;
19148 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422;
19149 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes;
19150 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector;
19151 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range;
19152 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint;
19153 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object;
19154 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range;
19155 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators;
19156 GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422;
19157 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility;
19158 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_1_compatibility;
19159 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_2_compatibility;
19160 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility;
19161 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays;
19162 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance;
19163 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture;
19164 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended;
19165 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage;
19166 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event;
19167 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object;
19168 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture;
19169 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clip_control;
19170 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float;
19171 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility;
19172 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage;
19173 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader;
19174 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size;
19175 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conditional_render_inverted;
19176 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth;
19177 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer;
19178 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image;
19179 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cull_distance;
19180 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output;
19181 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float;
19182 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp;
19183 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture;
19184 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_derivative_control;
19185 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_direct_state_access;
19186 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers;
19187 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend;
19188 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex;
19189 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect;
19190 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced;
19191 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts;
19192 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location;
19193 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location;
19194 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions;
19195 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport;
19196 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program;
19197 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow;
19198 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader;
19199 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader_interlock;
19200 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments;
19201 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object;
19202 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB;
19203 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4;
19204 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary;
19205 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_texture_sub_image;
19206 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5;
19207 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64;
19208 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_int64;
19209 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel;
19210 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex;
19211 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging;
19212 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters;
19213 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays;
19214 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query;
19215 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2;
19216 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata;
19217 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment;
19218 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range;
19219 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette;
19220 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind;
19221 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect;
19222 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample;
19223 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture;
19224 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query;
19225 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2;
19226 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_parallel_shader_compile;
19227 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pipeline_statistics_query;
19228 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object;
19229 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters;
19230 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite;
19231 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_post_depth_coverage;
19232 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query;
19233 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex;
19234 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object;
19235 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior;
19236 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness;
19237 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation;
19238 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation;
19239 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_locations;
19240 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading;
19241 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects;
19242 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map;
19243 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture;
19244 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects;
19245 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counter_ops;
19246 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters;
19247 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_ballot;
19248 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding;
19249 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_clock;
19250 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters;
19251 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote;
19252 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store;
19253 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size;
19254 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects;
19255 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision;
19256 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export;
19257 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_storage_buffer_object;
19258 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine;
19259 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_image_samples;
19260 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod;
19261 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_viewport_layer_array;
19262 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100;
19263 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack;
19264 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include;
19265 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing;
19266 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow;
19267 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient;
19268 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_buffer;
19269 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture;
19270 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture2;
19271 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture_clamp;
19272 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing;
19273 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync;
19274 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader;
19275 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_barrier;
19276 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp;
19277 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object;
19278 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32;
19279 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_range;
19280 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression;
19281 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc;
19282 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc;
19283 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map;
19284 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array;
19285 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add;
19286 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine;
19287 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar;
19288 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3;
19289 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_minmax;
19290 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float;
19291 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather;
19292 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge;
19293 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat;
19294 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample;
19295 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two;
19296 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_levels;
19297 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod;
19298 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle;
19299 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg;
19300 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui;
19301 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8;
19302 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage;
19303 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample;
19304 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle;
19305 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view;
19306 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query;
19307 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2;
19308 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3;
19309 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced;
19310 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_overflow_query;
19311 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix;
19312 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object;
19313 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra;
19314 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object;
19315 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit;
19316 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_binding;
19317 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend;
19318 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object;
19319 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program;
19320 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader;
19321 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev;
19322 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev;
19323 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array;
19324 GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos;
19325 GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites;
19326 GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3;
19327 GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route;
19328 GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size;
19329 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers;
19330 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array;
19331 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap;
19332 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader;
19333 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer;
19334 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo;
19335 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles;
19336 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil;
19337 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod;
19338 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader;
19339 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc;
19340 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3;
19341 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float;
19342 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once;
19343 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object;
19344 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object;
19345 GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams;
19346 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels;
19347 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader;
19348 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr;
19349 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra;
19350 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform;
19351 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color;
19352 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate;
19353 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate;
19354 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op;
19355 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax;
19356 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract;
19357 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint;
19358 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka;
19359 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable;
19360 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array;
19361 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution;
19362 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame;
19363 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture;
19364 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex;
19365 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_label;
19366 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker;
19367 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test;
19368 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access;
19369 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2;
19370 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced;
19371 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements;
19372 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord;
19373 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting;
19374 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit;
19375 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample;
19376 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled;
19377 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object;
19378 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB;
19379 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4;
19380 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters;
19381 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4;
19382 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram;
19383 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats;
19384 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func;
19385 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material;
19386 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture;
19387 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture;
19388 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute;
19389 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays;
19390 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample;
19391 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil;
19392 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float;
19393 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels;
19394 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture;
19395 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object;
19396 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform;
19397 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table;
19398 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters;
19399 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset;
19400 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset_clamp;
19401 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_post_depth_coverage;
19402 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex;
19403 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_raster_multisample;
19404 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal;
19405 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker;
19406 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color;
19407 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects;
19408 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color;
19409 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted;
19410 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store;
19411 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix;
19412 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs;
19413 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette;
19414 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture2;
19415 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag;
19416 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side;
19417 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap;
19418 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture;
19419 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture;
19420 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D;
19421 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array;
19422 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object;
19423 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1;
19424 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc;
19425 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc;
19426 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc;
19427 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map;
19428 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp;
19429 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env;
19430 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add;
19431 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine;
19432 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3;
19433 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic;
19434 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_minmax;
19435 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer;
19436 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias;
19437 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp;
19438 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object;
19439 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal;
19440 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle;
19441 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB;
19442 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode;
19443 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent;
19444 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm;
19445 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle;
19446 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query;
19447 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback;
19448 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array;
19449 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra;
19450 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit;
19451 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader;
19452 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting;
19453 GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object;
19454 GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator;
19455 GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker;
19456 GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes;
19457 GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform;
19458 GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test;
19459 GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting;
19460 GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex;
19461 GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays;
19462 GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip;
19463 GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data;
19464 GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat;
19465 GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists;
19466 GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp;
19467 GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read;
19468 GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_fragment_shader_ordering;
19469 GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_framebuffer_CMAA;
19470 GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture;
19471 GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays;
19472 GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_performance_query;
19473 GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor;
19474 GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced;
19475 GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced_coherent;
19476 GLEW_VAR_EXPORT GLboolean __GLEW_KHR_context_flush_control;
19477 GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug;
19478 GLEW_VAR_EXPORT GLboolean __GLEW_KHR_no_error;
19479 GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robust_buffer_access_behavior;
19480 GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robustness;
19481 GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_hdr;
19482 GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr;
19483 GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region;
19484 GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack;
19485 GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert;
19486 GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers;
19487 GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos;
19488 GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture;
19489 GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render;
19490 GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info;
19491 GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect;
19492 GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect_count;
19493 GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture;
19494 GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced;
19495 GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent;
19496 GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square;
19497 GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5;
19498 GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render;
19499 GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster;
19500 GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_dilate;
19501 GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color;
19502 GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image;
19503 GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D;
19504 GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float;
19505 GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp;
19506 GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped;
19507 GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture;
19508 GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators;
19509 GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample;
19510 GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence;
19511 GLEW_VAR_EXPORT GLboolean __GLEW_NV_fill_rectangle;
19512 GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer;
19513 GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance;
19514 GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_coverage_to_color;
19515 GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program;
19516 GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2;
19517 GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4;
19518 GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option;
19519 GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_shader_interlock;
19520 GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_mixed_samples;
19521 GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage;
19522 GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4;
19523 GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4;
19524 GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader_passthrough;
19525 GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4;
19526 GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5;
19527 GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended;
19528 GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64;
19529 GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5;
19530 GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float;
19531 GLEW_VAR_EXPORT GLboolean __GLEW_NV_internalformat_sample_query;
19532 GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent;
19533 GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage;
19534 GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint;
19535 GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query;
19536 GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil;
19537 GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object;
19538 GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2;
19539 GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering;
19540 GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering_shared_edge;
19541 GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range;
19542 GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite;
19543 GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video;
19544 GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart;
19545 GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners;
19546 GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2;
19547 GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_locations;
19548 GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_mask_override_coverage;
19549 GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters;
19550 GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float;
19551 GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_fp16_vector;
19552 GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_int64;
19553 GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load;
19554 GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object;
19555 GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group;
19556 GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle;
19557 GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5;
19558 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss;
19559 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection;
19560 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier;
19561 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc;
19562 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4;
19563 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal;
19564 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample;
19565 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle;
19566 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader;
19567 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2;
19568 GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3;
19569 GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback;
19570 GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2;
19571 GLEW_VAR_EXPORT GLboolean __GLEW_NV_uniform_buffer_unified_memory;
19572 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop;
19573 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range;
19574 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2;
19575 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit;
19576 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory;
19577 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program;
19578 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1;
19579 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2;
19580 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option;
19581 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3;
19582 GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4;
19583 GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture;
19584 GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array2;
19585 GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates;
19586 GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture;
19587 GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format;
19588 GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision;
19589 GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace;
19590 GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample;
19591 GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample;
19592 GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview;
19593 GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview2;
19594 GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints;
19595 GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints;
19596 GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility;
19597 GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility;
19598 GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable;
19599 GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string;
19600 GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query;
19601 GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log;
19602 GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_proc_address;
19603 GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates;
19604 GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc;
19605 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range;
19606 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture;
19607 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function;
19608 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap;
19609 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample;
19610 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture;
19611 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen;
19612 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture;
19613 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D;
19614 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp;
19615 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp;
19616 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4;
19617 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod;
19618 GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select;
19619 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async;
19620 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram;
19621 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel;
19622 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax;
19623 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap;
19624 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy;
19625 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture;
19626 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster;
19627 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset;
19628 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture;
19629 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting;
19630 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom;
19631 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace;
19632 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1;
19633 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority;
19634 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture;
19635 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits;
19636 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane;
19637 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample;
19638 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow;
19639 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient;
19640 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite;
19641 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer;
19642 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env;
19643 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp;
19644 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias;
19645 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer;
19646 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range;
19647 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias;
19648 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip;
19649 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint;
19650 GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb;
19651 GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix;
19652 GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table;
19653 GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table;
19654 GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data;
19655 GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes;
19656 GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha;
19657 GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array;
19658 GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels;
19659 GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum;
19660 GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list;
19661 GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex;
19662 GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading;
19663 GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog;
19664 GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint;
19665
19666 #ifdef GLEW_MX
19667 }; /* GLEWContextStruct */
19668 #endif /* GLEW_MX */
19669
19670 /* ------------------------------------------------------------------------- */
19671
19672 /* error codes */
19673 #define GLEW_OK 0
19674 #define GLEW_NO_ERROR 0
19675 #define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */
19676 #define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */
19677 #define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */
19678
19679 /* string codes */
19680 #define GLEW_VERSION 1
19681 #define GLEW_VERSION_MAJOR 2
19682 #define GLEW_VERSION_MINOR 3
19683 #define GLEW_VERSION_MICRO 4
19684
19685 /* ------------------------------------------------------------------------- */
19686
19687 /* GLEW version info */
19688
19689 /*
19690 VERSION 1.13.0
19691 VERSION_MAJOR 1
19692 VERSION_MINOR 13
19693 VERSION_MICRO 0
19694 */
19695
19696 /* API */
19697 #ifdef GLEW_MX
19698
19699 typedef struct GLEWContextStruct GLEWContext;
19700 GLEWAPI GLenum GLEWAPIENTRY glewContextInit (GLEWContext *ctx);
19701 GLEWAPI GLboolean GLEWAPIENTRY glewContextIsSupported (const GLEWContext *ctx, const char *name);
19702
19703 #define glewInit() glewContextInit(glewGetContext())
19704 #define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x)
19705 #define glewIsExtensionSupported(x) glewIsSupported(x)
19706
19707 #define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x))
19708 #ifdef _WIN32
19709 # define GLEW_GET_FUN(x) glewGetContext()->x
19710 #else
19711 # define GLEW_GET_FUN(x) x
19712 #endif
19713
19714 #else /* GLEW_MX */
19715
19716 GLEWAPI GLenum GLEWAPIENTRY glewInit (void);
19717 GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name);
19718 #define glewIsExtensionSupported(x) glewIsSupported(x)
19719
19720 #define GLEW_GET_VAR(x) (*(const GLboolean*)&x)
19721 #define GLEW_GET_FUN(x) x
19722
19723 #endif /* GLEW_MX */
19724
19725 GLEWAPI GLboolean glewExperimental;
19726 GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name);
19727 GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error);
19728 GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name);
19729
19730 #ifdef __cplusplus
19731 }
19732 #endif
19733
19734 #ifdef GLEW_APIENTRY_DEFINED
19735 #undef GLEW_APIENTRY_DEFINED
19736 #undef APIENTRY
19737 #endif
19738
19739 #ifdef GLEW_CALLBACK_DEFINED
19740 #undef GLEW_CALLBACK_DEFINED
19741 #undef CALLBACK
19742 #endif
19743
19744 #ifdef GLEW_WINGDIAPI_DEFINED
19745 #undef GLEW_WINGDIAPI_DEFINED
19746 #undef WINGDIAPI
19747 #endif
19748
19749 #undef GLAPI
19750 /* #undef GLEWAPI */
19751
19752 #endif /* __glew_h__ */
0 /*
1 ** The OpenGL Extension Wrangler Library
2 ** Copyright (C) 2008-2015, Nigel Stewart <nigels[]users sourceforge net>
3 ** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
4 ** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
5 ** Copyright (C) 2002, Lev Povalahev
6 ** All rights reserved.
7 **
8 ** Redistribution and use in source and binary forms, with or without
9 ** modification, are permitted provided that the following conditions are met:
10 **
11 ** * Redistributions of source code must retain the above copyright notice,
12 ** this list of conditions and the following disclaimer.
13 ** * Redistributions in binary form must reproduce the above copyright notice,
14 ** this list of conditions and the following disclaimer in the documentation
15 ** and/or other materials provided with the distribution.
16 ** * The name of the author may be used to endorse or promote products
17 ** derived from this software without specific prior written permission.
18 **
19 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29 ** THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 /*
33 * Mesa 3-D graphics library
34 * Version: 7.0
35 *
36 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
37 *
38 * Permission is hereby granted, free of charge, to any person obtaining a
39 * copy of this software and associated documentation files (the "Software"),
40 * to deal in the Software without restriction, including without limitation
41 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
42 * and/or sell copies of the Software, and to permit persons to whom the
43 * Software is furnished to do so, subject to the following conditions:
44 *
45 * The above copyright notice and this permission notice shall be included
46 * in all copies or substantial portions of the Software.
47 *
48 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
49 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
50 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
51 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
52 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
54 */
55
56 /*
57 ** Copyright (c) 2007 The Khronos Group Inc.
58 **
59 ** Permission is hereby granted, free of charge, to any person obtaining a
60 ** copy of this software and/or associated documentation files (the
61 ** "Materials"), to deal in the Materials without restriction, including
62 ** without limitation the rights to use, copy, modify, merge, publish,
63 ** distribute, sublicense, and/or sell copies of the Materials, and to
64 ** permit persons to whom the Materials are furnished to do so, subject to
65 ** the following conditions:
66 **
67 ** The above copyright notice and this permission notice shall be included
68 ** in all copies or substantial portions of the Materials.
69 **
70 ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
71 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
72 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
73 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
74 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
75 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
76 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
77 */
78
79 #ifndef __glxew_h__
80 #define __glxew_h__
81 #define __GLXEW_H__
82
83 #ifdef __glxext_h_
84 #error glxext.h included before glxew.h
85 #endif
86
87 #if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__)
88 #error glx.h included before glxew.h
89 #endif
90
91 #define __glxext_h_
92
93 #define GLX_H
94 #define __GLX_glx_h__
95 #define __glx_h__
96
97 #include <X11/Xlib.h>
98 #include <X11/Xutil.h>
99 #include <X11/Xmd.h>
100 #include <GL/glew.h>
101
102 #ifdef __cplusplus
103 extern "C" {
104 #endif
105
106 /* ---------------------------- GLX_VERSION_1_0 --------------------------- */
107
108 #ifndef GLX_VERSION_1_0
109 #define GLX_VERSION_1_0 1
110
111 #define GLX_USE_GL 1
112 #define GLX_BUFFER_SIZE 2
113 #define GLX_LEVEL 3
114 #define GLX_RGBA 4
115 #define GLX_DOUBLEBUFFER 5
116 #define GLX_STEREO 6
117 #define GLX_AUX_BUFFERS 7
118 #define GLX_RED_SIZE 8
119 #define GLX_GREEN_SIZE 9
120 #define GLX_BLUE_SIZE 10
121 #define GLX_ALPHA_SIZE 11
122 #define GLX_DEPTH_SIZE 12
123 #define GLX_STENCIL_SIZE 13
124 #define GLX_ACCUM_RED_SIZE 14
125 #define GLX_ACCUM_GREEN_SIZE 15
126 #define GLX_ACCUM_BLUE_SIZE 16
127 #define GLX_ACCUM_ALPHA_SIZE 17
128 #define GLX_BAD_SCREEN 1
129 #define GLX_BAD_ATTRIBUTE 2
130 #define GLX_NO_EXTENSION 3
131 #define GLX_BAD_VISUAL 4
132 #define GLX_BAD_CONTEXT 5
133 #define GLX_BAD_VALUE 6
134 #define GLX_BAD_ENUM 7
135
136 typedef XID GLXDrawable;
137 typedef XID GLXPixmap;
138 #ifdef __sun
139 typedef struct __glXContextRec *GLXContext;
140 #else
141 typedef struct __GLXcontextRec *GLXContext;
142 #endif
143
144 typedef unsigned int GLXVideoDeviceNV;
145
146 extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase);
147 extern Bool glXQueryVersion (Display *dpy, int *major, int *minor);
148 extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value);
149 extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList);
150 extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap);
151 extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix);
152 extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
153 extern void glXDestroyContext (Display *dpy, GLXContext ctx);
154 extern Bool glXIsDirect (Display *dpy, GLXContext ctx);
155 extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask);
156 extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx);
157 extern GLXContext glXGetCurrentContext (void);
158 extern GLXDrawable glXGetCurrentDrawable (void);
159 extern void glXWaitGL (void);
160 extern void glXWaitX (void);
161 extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable);
162 extern void glXUseXFont (Font font, int first, int count, int listBase);
163
164 #define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0)
165
166 #endif /* GLX_VERSION_1_0 */
167
168 /* ---------------------------- GLX_VERSION_1_1 --------------------------- */
169
170 #ifndef GLX_VERSION_1_1
171 #define GLX_VERSION_1_1
172
173 #define GLX_VENDOR 0x1
174 #define GLX_VERSION 0x2
175 #define GLX_EXTENSIONS 0x3
176
177 extern const char* glXQueryExtensionsString (Display *dpy, int screen);
178 extern const char* glXGetClientString (Display *dpy, int name);
179 extern const char* glXQueryServerString (Display *dpy, int screen, int name);
180
181 #define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1)
182
183 #endif /* GLX_VERSION_1_1 */
184
185 /* ---------------------------- GLX_VERSION_1_2 ---------------------------- */
186
187 #ifndef GLX_VERSION_1_2
188 #define GLX_VERSION_1_2 1
189
190 typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void);
191
192 #define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay)
193
194 #define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2)
195
196 #endif /* GLX_VERSION_1_2 */
197
198 /* ---------------------------- GLX_VERSION_1_3 ---------------------------- */
199
200 #ifndef GLX_VERSION_1_3
201 #define GLX_VERSION_1_3 1
202
203 #define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001
204 #define GLX_RGBA_BIT 0x00000001
205 #define GLX_WINDOW_BIT 0x00000001
206 #define GLX_COLOR_INDEX_BIT 0x00000002
207 #define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002
208 #define GLX_PIXMAP_BIT 0x00000002
209 #define GLX_BACK_LEFT_BUFFER_BIT 0x00000004
210 #define GLX_PBUFFER_BIT 0x00000004
211 #define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008
212 #define GLX_AUX_BUFFERS_BIT 0x00000010
213 #define GLX_CONFIG_CAVEAT 0x20
214 #define GLX_DEPTH_BUFFER_BIT 0x00000020
215 #define GLX_X_VISUAL_TYPE 0x22
216 #define GLX_TRANSPARENT_TYPE 0x23
217 #define GLX_TRANSPARENT_INDEX_VALUE 0x24
218 #define GLX_TRANSPARENT_RED_VALUE 0x25
219 #define GLX_TRANSPARENT_GREEN_VALUE 0x26
220 #define GLX_TRANSPARENT_BLUE_VALUE 0x27
221 #define GLX_TRANSPARENT_ALPHA_VALUE 0x28
222 #define GLX_STENCIL_BUFFER_BIT 0x00000040
223 #define GLX_ACCUM_BUFFER_BIT 0x00000080
224 #define GLX_NONE 0x8000
225 #define GLX_SLOW_CONFIG 0x8001
226 #define GLX_TRUE_COLOR 0x8002
227 #define GLX_DIRECT_COLOR 0x8003
228 #define GLX_PSEUDO_COLOR 0x8004
229 #define GLX_STATIC_COLOR 0x8005
230 #define GLX_GRAY_SCALE 0x8006
231 #define GLX_STATIC_GRAY 0x8007
232 #define GLX_TRANSPARENT_RGB 0x8008
233 #define GLX_TRANSPARENT_INDEX 0x8009
234 #define GLX_VISUAL_ID 0x800B
235 #define GLX_SCREEN 0x800C
236 #define GLX_NON_CONFORMANT_CONFIG 0x800D
237 #define GLX_DRAWABLE_TYPE 0x8010
238 #define GLX_RENDER_TYPE 0x8011
239 #define GLX_X_RENDERABLE 0x8012
240 #define GLX_FBCONFIG_ID 0x8013
241 #define GLX_RGBA_TYPE 0x8014
242 #define GLX_COLOR_INDEX_TYPE 0x8015
243 #define GLX_MAX_PBUFFER_WIDTH 0x8016
244 #define GLX_MAX_PBUFFER_HEIGHT 0x8017
245 #define GLX_MAX_PBUFFER_PIXELS 0x8018
246 #define GLX_PRESERVED_CONTENTS 0x801B
247 #define GLX_LARGEST_PBUFFER 0x801C
248 #define GLX_WIDTH 0x801D
249 #define GLX_HEIGHT 0x801E
250 #define GLX_EVENT_MASK 0x801F
251 #define GLX_DAMAGED 0x8020
252 #define GLX_SAVED 0x8021
253 #define GLX_WINDOW 0x8022
254 #define GLX_PBUFFER 0x8023
255 #define GLX_PBUFFER_HEIGHT 0x8040
256 #define GLX_PBUFFER_WIDTH 0x8041
257 #define GLX_PBUFFER_CLOBBER_MASK 0x08000000
258 #define GLX_DONT_CARE 0xFFFFFFFF
259
260 typedef XID GLXFBConfigID;
261 typedef XID GLXPbuffer;
262 typedef XID GLXWindow;
263 typedef struct __GLXFBConfigRec *GLXFBConfig;
264
265 typedef struct {
266 int event_type;
267 int draw_type;
268 unsigned long serial;
269 Bool send_event;
270 Display *display;
271 GLXDrawable drawable;
272 unsigned int buffer_mask;
273 unsigned int aux_buffer;
274 int x, y;
275 int width, height;
276 int count;
277 } GLXPbufferClobberEvent;
278 typedef union __GLXEvent {
279 GLXPbufferClobberEvent glxpbufferclobber;
280 long pad[24];
281 } GLXEvent;
282
283 typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements);
284 typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
285 typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list);
286 typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);
287 typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list);
288 typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf);
289 typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap);
290 typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win);
291 typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void);
292 typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value);
293 typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements);
294 typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask);
295 typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config);
296 typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
297 typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value);
298 typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
299 typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask);
300
301 #define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig)
302 #define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext)
303 #define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer)
304 #define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap)
305 #define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow)
306 #define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer)
307 #define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap)
308 #define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow)
309 #define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable)
310 #define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib)
311 #define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs)
312 #define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent)
313 #define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig)
314 #define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent)
315 #define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext)
316 #define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable)
317 #define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent)
318
319 #define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3)
320
321 #endif /* GLX_VERSION_1_3 */
322
323 /* ---------------------------- GLX_VERSION_1_4 ---------------------------- */
324
325 #ifndef GLX_VERSION_1_4
326 #define GLX_VERSION_1_4 1
327
328 #define GLX_SAMPLE_BUFFERS 100000
329 #define GLX_SAMPLES 100001
330
331 extern void ( * glXGetProcAddress (const GLubyte *procName)) (void);
332
333 #define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4)
334
335 #endif /* GLX_VERSION_1_4 */
336
337 /* -------------------------- GLX_3DFX_multisample ------------------------- */
338
339 #ifndef GLX_3DFX_multisample
340 #define GLX_3DFX_multisample 1
341
342 #define GLX_SAMPLE_BUFFERS_3DFX 0x8050
343 #define GLX_SAMPLES_3DFX 0x8051
344
345 #define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample)
346
347 #endif /* GLX_3DFX_multisample */
348
349 /* ------------------------ GLX_AMD_gpu_association ------------------------ */
350
351 #ifndef GLX_AMD_gpu_association
352 #define GLX_AMD_gpu_association 1
353
354 #define GLX_GPU_VENDOR_AMD 0x1F00
355 #define GLX_GPU_RENDERER_STRING_AMD 0x1F01
356 #define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02
357 #define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2
358 #define GLX_GPU_RAM_AMD 0x21A3
359 #define GLX_GPU_CLOCK_AMD 0x21A4
360 #define GLX_GPU_NUM_PIPES_AMD 0x21A5
361 #define GLX_GPU_NUM_SIMD_AMD 0x21A6
362 #define GLX_GPU_NUM_RB_AMD 0x21A7
363 #define GLX_GPU_NUM_SPI_AMD 0x21A8
364
365 typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
366 typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list);
367 typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList);
368 typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx);
369 typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx);
370 typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void);
371 typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids);
372 typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data);
373 typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx);
374
375 #define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD)
376 #define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD)
377 #define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD)
378 #define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD)
379 #define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD)
380 #define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD)
381 #define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD)
382 #define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD)
383 #define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD)
384
385 #define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association)
386
387 #endif /* GLX_AMD_gpu_association */
388
389 /* --------------------- GLX_ARB_context_flush_control --------------------- */
390
391 #ifndef GLX_ARB_context_flush_control
392 #define GLX_ARB_context_flush_control 1
393
394 #define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0x0000
395 #define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097
396 #define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098
397
398 #define GLXEW_ARB_context_flush_control GLXEW_GET_VAR(__GLXEW_ARB_context_flush_control)
399
400 #endif /* GLX_ARB_context_flush_control */
401
402 /* ------------------------- GLX_ARB_create_context ------------------------ */
403
404 #ifndef GLX_ARB_create_context
405 #define GLX_ARB_create_context 1
406
407 #define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001
408 #define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
409 #define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
410 #define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
411 #define GLX_CONTEXT_FLAGS_ARB 0x2094
412
413 typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
414
415 #define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB)
416
417 #define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context)
418
419 #endif /* GLX_ARB_create_context */
420
421 /* --------------------- GLX_ARB_create_context_profile -------------------- */
422
423 #ifndef GLX_ARB_create_context_profile
424 #define GLX_ARB_create_context_profile 1
425
426 #define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
427 #define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
428 #define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
429
430 #define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile)
431
432 #endif /* GLX_ARB_create_context_profile */
433
434 /* ------------------- GLX_ARB_create_context_robustness ------------------- */
435
436 #ifndef GLX_ARB_create_context_robustness
437 #define GLX_ARB_create_context_robustness 1
438
439 #define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
440 #define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252
441 #define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
442 #define GLX_NO_RESET_NOTIFICATION_ARB 0x8261
443
444 #define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness)
445
446 #endif /* GLX_ARB_create_context_robustness */
447
448 /* ------------------------- GLX_ARB_fbconfig_float ------------------------ */
449
450 #ifndef GLX_ARB_fbconfig_float
451 #define GLX_ARB_fbconfig_float 1
452
453 #define GLX_RGBA_FLOAT_BIT_ARB 0x00000004
454 #define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9
455
456 #define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float)
457
458 #endif /* GLX_ARB_fbconfig_float */
459
460 /* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */
461
462 #ifndef GLX_ARB_framebuffer_sRGB
463 #define GLX_ARB_framebuffer_sRGB 1
464
465 #define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2
466
467 #define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB)
468
469 #endif /* GLX_ARB_framebuffer_sRGB */
470
471 /* ------------------------ GLX_ARB_get_proc_address ----------------------- */
472
473 #ifndef GLX_ARB_get_proc_address
474 #define GLX_ARB_get_proc_address 1
475
476 extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void);
477
478 #define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address)
479
480 #endif /* GLX_ARB_get_proc_address */
481
482 /* -------------------------- GLX_ARB_multisample -------------------------- */
483
484 #ifndef GLX_ARB_multisample
485 #define GLX_ARB_multisample 1
486
487 #define GLX_SAMPLE_BUFFERS_ARB 100000
488 #define GLX_SAMPLES_ARB 100001
489
490 #define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample)
491
492 #endif /* GLX_ARB_multisample */
493
494 /* ---------------- GLX_ARB_robustness_application_isolation --------------- */
495
496 #ifndef GLX_ARB_robustness_application_isolation
497 #define GLX_ARB_robustness_application_isolation 1
498
499 #define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008
500
501 #define GLXEW_ARB_robustness_application_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_application_isolation)
502
503 #endif /* GLX_ARB_robustness_application_isolation */
504
505 /* ---------------- GLX_ARB_robustness_share_group_isolation --------------- */
506
507 #ifndef GLX_ARB_robustness_share_group_isolation
508 #define GLX_ARB_robustness_share_group_isolation 1
509
510 #define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008
511
512 #define GLXEW_ARB_robustness_share_group_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_share_group_isolation)
513
514 #endif /* GLX_ARB_robustness_share_group_isolation */
515
516 /* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */
517
518 #ifndef GLX_ARB_vertex_buffer_object
519 #define GLX_ARB_vertex_buffer_object 1
520
521 #define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095
522
523 #define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object)
524
525 #endif /* GLX_ARB_vertex_buffer_object */
526
527 /* ----------------------- GLX_ATI_pixel_format_float ---------------------- */
528
529 #ifndef GLX_ATI_pixel_format_float
530 #define GLX_ATI_pixel_format_float 1
531
532 #define GLX_RGBA_FLOAT_ATI_BIT 0x00000100
533
534 #define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float)
535
536 #endif /* GLX_ATI_pixel_format_float */
537
538 /* ------------------------- GLX_ATI_render_texture ------------------------ */
539
540 #ifndef GLX_ATI_render_texture
541 #define GLX_ATI_render_texture 1
542
543 #define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800
544 #define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801
545 #define GLX_TEXTURE_FORMAT_ATI 0x9802
546 #define GLX_TEXTURE_TARGET_ATI 0x9803
547 #define GLX_MIPMAP_TEXTURE_ATI 0x9804
548 #define GLX_TEXTURE_RGB_ATI 0x9805
549 #define GLX_TEXTURE_RGBA_ATI 0x9806
550 #define GLX_NO_TEXTURE_ATI 0x9807
551 #define GLX_TEXTURE_CUBE_MAP_ATI 0x9808
552 #define GLX_TEXTURE_1D_ATI 0x9809
553 #define GLX_TEXTURE_2D_ATI 0x980A
554 #define GLX_MIPMAP_LEVEL_ATI 0x980B
555 #define GLX_CUBE_MAP_FACE_ATI 0x980C
556 #define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D
557 #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E
558 #define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F
559 #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810
560 #define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811
561 #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812
562 #define GLX_FRONT_LEFT_ATI 0x9813
563 #define GLX_FRONT_RIGHT_ATI 0x9814
564 #define GLX_BACK_LEFT_ATI 0x9815
565 #define GLX_BACK_RIGHT_ATI 0x9816
566 #define GLX_AUX0_ATI 0x9817
567 #define GLX_AUX1_ATI 0x9818
568 #define GLX_AUX2_ATI 0x9819
569 #define GLX_AUX3_ATI 0x981A
570 #define GLX_AUX4_ATI 0x981B
571 #define GLX_AUX5_ATI 0x981C
572 #define GLX_AUX6_ATI 0x981D
573 #define GLX_AUX7_ATI 0x981E
574 #define GLX_AUX8_ATI 0x981F
575 #define GLX_AUX9_ATI 0x9820
576 #define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821
577 #define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822
578
579 typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer);
580 typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list);
581 typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer);
582
583 #define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI)
584 #define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI)
585 #define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI)
586
587 #define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture)
588
589 #endif /* GLX_ATI_render_texture */
590
591 /* --------------------------- GLX_EXT_buffer_age -------------------------- */
592
593 #ifndef GLX_EXT_buffer_age
594 #define GLX_EXT_buffer_age 1
595
596 #define GLX_BACK_BUFFER_AGE_EXT 0x20F4
597
598 #define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age)
599
600 #endif /* GLX_EXT_buffer_age */
601
602 /* ------------------- GLX_EXT_create_context_es2_profile ------------------ */
603
604 #ifndef GLX_EXT_create_context_es2_profile
605 #define GLX_EXT_create_context_es2_profile 1
606
607 #define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
608
609 #define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile)
610
611 #endif /* GLX_EXT_create_context_es2_profile */
612
613 /* ------------------- GLX_EXT_create_context_es_profile ------------------- */
614
615 #ifndef GLX_EXT_create_context_es_profile
616 #define GLX_EXT_create_context_es_profile 1
617
618 #define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004
619
620 #define GLXEW_EXT_create_context_es_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es_profile)
621
622 #endif /* GLX_EXT_create_context_es_profile */
623
624 /* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */
625
626 #ifndef GLX_EXT_fbconfig_packed_float
627 #define GLX_EXT_fbconfig_packed_float 1
628
629 #define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008
630 #define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1
631
632 #define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float)
633
634 #endif /* GLX_EXT_fbconfig_packed_float */
635
636 /* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */
637
638 #ifndef GLX_EXT_framebuffer_sRGB
639 #define GLX_EXT_framebuffer_sRGB 1
640
641 #define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2
642
643 #define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB)
644
645 #endif /* GLX_EXT_framebuffer_sRGB */
646
647 /* ------------------------- GLX_EXT_import_context ------------------------ */
648
649 #ifndef GLX_EXT_import_context
650 #define GLX_EXT_import_context 1
651
652 #define GLX_SHARE_CONTEXT_EXT 0x800A
653 #define GLX_VISUAL_ID_EXT 0x800B
654 #define GLX_SCREEN_EXT 0x800C
655
656 typedef XID GLXContextID;
657
658 typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context);
659 typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context);
660 typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID);
661 typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value);
662
663 #define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT)
664 #define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT)
665 #define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT)
666 #define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT)
667
668 #define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context)
669
670 #endif /* GLX_EXT_import_context */
671
672 /* -------------------------- GLX_EXT_scene_marker ------------------------- */
673
674 #ifndef GLX_EXT_scene_marker
675 #define GLX_EXT_scene_marker 1
676
677 #define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker)
678
679 #endif /* GLX_EXT_scene_marker */
680
681 /* -------------------------- GLX_EXT_stereo_tree -------------------------- */
682
683 #ifndef GLX_EXT_stereo_tree
684 #define GLX_EXT_stereo_tree 1
685
686 #define GLX_STEREO_NOTIFY_EXT 0x00000000
687 #define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001
688 #define GLX_STEREO_TREE_EXT 0x20F5
689
690 #define GLXEW_EXT_stereo_tree GLXEW_GET_VAR(__GLXEW_EXT_stereo_tree)
691
692 #endif /* GLX_EXT_stereo_tree */
693
694 /* -------------------------- GLX_EXT_swap_control ------------------------- */
695
696 #ifndef GLX_EXT_swap_control
697 #define GLX_EXT_swap_control 1
698
699 #define GLX_SWAP_INTERVAL_EXT 0x20F1
700 #define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2
701
702 typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval);
703
704 #define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT)
705
706 #define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control)
707
708 #endif /* GLX_EXT_swap_control */
709
710 /* ----------------------- GLX_EXT_swap_control_tear ----------------------- */
711
712 #ifndef GLX_EXT_swap_control_tear
713 #define GLX_EXT_swap_control_tear 1
714
715 #define GLX_LATE_SWAPS_TEAR_EXT 0x20F3
716
717 #define GLXEW_EXT_swap_control_tear GLXEW_GET_VAR(__GLXEW_EXT_swap_control_tear)
718
719 #endif /* GLX_EXT_swap_control_tear */
720
721 /* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */
722
723 #ifndef GLX_EXT_texture_from_pixmap
724 #define GLX_EXT_texture_from_pixmap 1
725
726 #define GLX_TEXTURE_1D_BIT_EXT 0x00000001
727 #define GLX_TEXTURE_2D_BIT_EXT 0x00000002
728 #define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004
729 #define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0
730 #define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1
731 #define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2
732 #define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3
733 #define GLX_Y_INVERTED_EXT 0x20D4
734 #define GLX_TEXTURE_FORMAT_EXT 0x20D5
735 #define GLX_TEXTURE_TARGET_EXT 0x20D6
736 #define GLX_MIPMAP_TEXTURE_EXT 0x20D7
737 #define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8
738 #define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9
739 #define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA
740 #define GLX_TEXTURE_1D_EXT 0x20DB
741 #define GLX_TEXTURE_2D_EXT 0x20DC
742 #define GLX_TEXTURE_RECTANGLE_EXT 0x20DD
743 #define GLX_FRONT_LEFT_EXT 0x20DE
744 #define GLX_FRONT_RIGHT_EXT 0x20DF
745 #define GLX_BACK_LEFT_EXT 0x20E0
746 #define GLX_BACK_RIGHT_EXT 0x20E1
747 #define GLX_AUX0_EXT 0x20E2
748 #define GLX_AUX1_EXT 0x20E3
749 #define GLX_AUX2_EXT 0x20E4
750 #define GLX_AUX3_EXT 0x20E5
751 #define GLX_AUX4_EXT 0x20E6
752 #define GLX_AUX5_EXT 0x20E7
753 #define GLX_AUX6_EXT 0x20E8
754 #define GLX_AUX7_EXT 0x20E9
755 #define GLX_AUX8_EXT 0x20EA
756 #define GLX_AUX9_EXT 0x20EB
757
758 typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list);
759 typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer);
760
761 #define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT)
762 #define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT)
763
764 #define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap)
765
766 #endif /* GLX_EXT_texture_from_pixmap */
767
768 /* -------------------------- GLX_EXT_visual_info -------------------------- */
769
770 #ifndef GLX_EXT_visual_info
771 #define GLX_EXT_visual_info 1
772
773 #define GLX_X_VISUAL_TYPE_EXT 0x22
774 #define GLX_TRANSPARENT_TYPE_EXT 0x23
775 #define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24
776 #define GLX_TRANSPARENT_RED_VALUE_EXT 0x25
777 #define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26
778 #define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27
779 #define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28
780 #define GLX_NONE_EXT 0x8000
781 #define GLX_TRUE_COLOR_EXT 0x8002
782 #define GLX_DIRECT_COLOR_EXT 0x8003
783 #define GLX_PSEUDO_COLOR_EXT 0x8004
784 #define GLX_STATIC_COLOR_EXT 0x8005
785 #define GLX_GRAY_SCALE_EXT 0x8006
786 #define GLX_STATIC_GRAY_EXT 0x8007
787 #define GLX_TRANSPARENT_RGB_EXT 0x8008
788 #define GLX_TRANSPARENT_INDEX_EXT 0x8009
789
790 #define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info)
791
792 #endif /* GLX_EXT_visual_info */
793
794 /* ------------------------- GLX_EXT_visual_rating ------------------------- */
795
796 #ifndef GLX_EXT_visual_rating
797 #define GLX_EXT_visual_rating 1
798
799 #define GLX_VISUAL_CAVEAT_EXT 0x20
800 #define GLX_SLOW_VISUAL_EXT 0x8001
801 #define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D
802
803 #define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating)
804
805 #endif /* GLX_EXT_visual_rating */
806
807 /* -------------------------- GLX_INTEL_swap_event ------------------------- */
808
809 #ifndef GLX_INTEL_swap_event
810 #define GLX_INTEL_swap_event 1
811
812 #define GLX_EXCHANGE_COMPLETE_INTEL 0x8180
813 #define GLX_COPY_COMPLETE_INTEL 0x8181
814 #define GLX_FLIP_COMPLETE_INTEL 0x8182
815 #define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000
816
817 #define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event)
818
819 #endif /* GLX_INTEL_swap_event */
820
821 /* -------------------------- GLX_MESA_agp_offset -------------------------- */
822
823 #ifndef GLX_MESA_agp_offset
824 #define GLX_MESA_agp_offset 1
825
826 typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer);
827
828 #define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA)
829
830 #define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset)
831
832 #endif /* GLX_MESA_agp_offset */
833
834 /* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */
835
836 #ifndef GLX_MESA_copy_sub_buffer
837 #define GLX_MESA_copy_sub_buffer 1
838
839 typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height);
840
841 #define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA)
842
843 #define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer)
844
845 #endif /* GLX_MESA_copy_sub_buffer */
846
847 /* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */
848
849 #ifndef GLX_MESA_pixmap_colormap
850 #define GLX_MESA_pixmap_colormap 1
851
852 typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap);
853
854 #define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA)
855
856 #define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap)
857
858 #endif /* GLX_MESA_pixmap_colormap */
859
860 /* ------------------------ GLX_MESA_query_renderer ------------------------ */
861
862 #ifndef GLX_MESA_query_renderer
863 #define GLX_MESA_query_renderer 1
864
865 #define GLX_RENDERER_VENDOR_ID_MESA 0x8183
866 #define GLX_RENDERER_DEVICE_ID_MESA 0x8184
867 #define GLX_RENDERER_VERSION_MESA 0x8185
868 #define GLX_RENDERER_ACCELERATED_MESA 0x8186
869 #define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187
870 #define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188
871 #define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189
872 #define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A
873 #define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B
874 #define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C
875 #define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D
876 #define GLX_RENDERER_ID_MESA 0x818E
877
878 typedef Bool ( * PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) (int attribute, unsigned int* value);
879 typedef const char* ( * PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) (int attribute);
880 typedef Bool ( * PFNGLXQUERYRENDERERINTEGERMESAPROC) (Display* dpy, int screen, int renderer, int attribute, unsigned int *value);
881 typedef const char* ( * PFNGLXQUERYRENDERERSTRINGMESAPROC) (Display *dpy, int screen, int renderer, int attribute);
882
883 #define glXQueryCurrentRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererIntegerMESA)
884 #define glXQueryCurrentRendererStringMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererStringMESA)
885 #define glXQueryRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryRendererIntegerMESA)
886 #define glXQueryRendererStringMESA GLXEW_GET_FUN(__glewXQueryRendererStringMESA)
887
888 #define GLXEW_MESA_query_renderer GLXEW_GET_VAR(__GLXEW_MESA_query_renderer)
889
890 #endif /* GLX_MESA_query_renderer */
891
892 /* ------------------------ GLX_MESA_release_buffers ----------------------- */
893
894 #ifndef GLX_MESA_release_buffers
895 #define GLX_MESA_release_buffers 1
896
897 typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d);
898
899 #define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA)
900
901 #define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers)
902
903 #endif /* GLX_MESA_release_buffers */
904
905 /* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */
906
907 #ifndef GLX_MESA_set_3dfx_mode
908 #define GLX_MESA_set_3dfx_mode 1
909
910 #define GLX_3DFX_WINDOW_MODE_MESA 0x1
911 #define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2
912
913 typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode);
914
915 #define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA)
916
917 #define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode)
918
919 #endif /* GLX_MESA_set_3dfx_mode */
920
921 /* ------------------------- GLX_MESA_swap_control ------------------------- */
922
923 #ifndef GLX_MESA_swap_control
924 #define GLX_MESA_swap_control 1
925
926 typedef int ( * PFNGLXGETSWAPINTERVALMESAPROC) (void);
927 typedef int ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval);
928
929 #define glXGetSwapIntervalMESA GLXEW_GET_FUN(__glewXGetSwapIntervalMESA)
930 #define glXSwapIntervalMESA GLXEW_GET_FUN(__glewXSwapIntervalMESA)
931
932 #define GLXEW_MESA_swap_control GLXEW_GET_VAR(__GLXEW_MESA_swap_control)
933
934 #endif /* GLX_MESA_swap_control */
935
936 /* --------------------------- GLX_NV_copy_buffer -------------------------- */
937
938 #ifndef GLX_NV_copy_buffer
939 #define GLX_NV_copy_buffer 1
940
941 typedef void ( * PFNGLXCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
942 typedef void ( * PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
943
944 #define glXCopyBufferSubDataNV GLXEW_GET_FUN(__glewXCopyBufferSubDataNV)
945 #define glXNamedCopyBufferSubDataNV GLXEW_GET_FUN(__glewXNamedCopyBufferSubDataNV)
946
947 #define GLXEW_NV_copy_buffer GLXEW_GET_VAR(__GLXEW_NV_copy_buffer)
948
949 #endif /* GLX_NV_copy_buffer */
950
951 /* --------------------------- GLX_NV_copy_image --------------------------- */
952
953 #ifndef GLX_NV_copy_image
954 #define GLX_NV_copy_image 1
955
956 typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
957
958 #define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV)
959
960 #define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image)
961
962 #endif /* GLX_NV_copy_image */
963
964 /* ------------------------ GLX_NV_delay_before_swap ----------------------- */
965
966 #ifndef GLX_NV_delay_before_swap
967 #define GLX_NV_delay_before_swap 1
968
969 typedef Bool ( * PFNGLXDELAYBEFORESWAPNVPROC) (Display* dpy, GLXDrawable drawable, GLfloat seconds);
970
971 #define glXDelayBeforeSwapNV GLXEW_GET_FUN(__glewXDelayBeforeSwapNV)
972
973 #define GLXEW_NV_delay_before_swap GLXEW_GET_VAR(__GLXEW_NV_delay_before_swap)
974
975 #endif /* GLX_NV_delay_before_swap */
976
977 /* -------------------------- GLX_NV_float_buffer -------------------------- */
978
979 #ifndef GLX_NV_float_buffer
980 #define GLX_NV_float_buffer 1
981
982 #define GLX_FLOAT_COMPONENTS_NV 0x20B0
983
984 #define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer)
985
986 #endif /* GLX_NV_float_buffer */
987
988 /* ---------------------- GLX_NV_multisample_coverage ---------------------- */
989
990 #ifndef GLX_NV_multisample_coverage
991 #define GLX_NV_multisample_coverage 1
992
993 #define GLX_COLOR_SAMPLES_NV 0x20B3
994 #define GLX_COVERAGE_SAMPLES_NV 100001
995
996 #define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage)
997
998 #endif /* GLX_NV_multisample_coverage */
999
1000 /* -------------------------- GLX_NV_present_video ------------------------- */
1001
1002 #ifndef GLX_NV_present_video
1003 #define GLX_NV_present_video 1
1004
1005 #define GLX_NUM_VIDEO_SLOTS_NV 0x20F0
1006
1007 typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list);
1008 typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements);
1009
1010 #define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV)
1011 #define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV)
1012
1013 #define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video)
1014
1015 #endif /* GLX_NV_present_video */
1016
1017 /* --------------------------- GLX_NV_swap_group --------------------------- */
1018
1019 #ifndef GLX_NV_swap_group
1020 #define GLX_NV_swap_group 1
1021
1022 typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier);
1023 typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group);
1024 typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count);
1025 typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers);
1026 typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier);
1027 typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen);
1028
1029 #define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV)
1030 #define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV)
1031 #define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV)
1032 #define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV)
1033 #define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV)
1034 #define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV)
1035
1036 #define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group)
1037
1038 #endif /* GLX_NV_swap_group */
1039
1040 /* ----------------------- GLX_NV_vertex_array_range ----------------------- */
1041
1042 #ifndef GLX_NV_vertex_array_range
1043 #define GLX_NV_vertex_array_range 1
1044
1045 typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);
1046 typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer);
1047
1048 #define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV)
1049 #define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV)
1050
1051 #define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range)
1052
1053 #endif /* GLX_NV_vertex_array_range */
1054
1055 /* -------------------------- GLX_NV_video_capture ------------------------- */
1056
1057 #ifndef GLX_NV_video_capture
1058 #define GLX_NV_video_capture 1
1059
1060 #define GLX_DEVICE_ID_NV 0x20CD
1061 #define GLX_UNIQUE_ID_NV 0x20CE
1062 #define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF
1063
1064 typedef XID GLXVideoCaptureDeviceNV;
1065
1066 typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) (Display* dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device);
1067 typedef GLXVideoCaptureDeviceNV * ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) (Display* dpy, int screen, int *nelements);
1068 typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device);
1069 typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value);
1070 typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device);
1071
1072 #define glXBindVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXBindVideoCaptureDeviceNV)
1073 #define glXEnumerateVideoCaptureDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoCaptureDevicesNV)
1074 #define glXLockVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXLockVideoCaptureDeviceNV)
1075 #define glXQueryVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXQueryVideoCaptureDeviceNV)
1076 #define glXReleaseVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoCaptureDeviceNV)
1077
1078 #define GLXEW_NV_video_capture GLXEW_GET_VAR(__GLXEW_NV_video_capture)
1079
1080 #endif /* GLX_NV_video_capture */
1081
1082 /* ---------------------------- GLX_NV_video_out --------------------------- */
1083
1084 #ifndef GLX_NV_video_out
1085 #define GLX_NV_video_out 1
1086
1087 #define GLX_VIDEO_OUT_COLOR_NV 0x20C3
1088 #define GLX_VIDEO_OUT_ALPHA_NV 0x20C4
1089 #define GLX_VIDEO_OUT_DEPTH_NV 0x20C5
1090 #define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
1091 #define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
1092 #define GLX_VIDEO_OUT_FRAME_NV 0x20C8
1093 #define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9
1094 #define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA
1095 #define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB
1096 #define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC
1097
1098 typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer);
1099 typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice);
1100 typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);
1101 typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice);
1102 typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf);
1103 typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock);
1104
1105 #define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV)
1106 #define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV)
1107 #define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV)
1108 #define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV)
1109 #define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV)
1110 #define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV)
1111
1112 #define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out)
1113
1114 #endif /* GLX_NV_video_out */
1115
1116 /* -------------------------- GLX_OML_swap_method -------------------------- */
1117
1118 #ifndef GLX_OML_swap_method
1119 #define GLX_OML_swap_method 1
1120
1121 #define GLX_SWAP_METHOD_OML 0x8060
1122 #define GLX_SWAP_EXCHANGE_OML 0x8061
1123 #define GLX_SWAP_COPY_OML 0x8062
1124 #define GLX_SWAP_UNDEFINED_OML 0x8063
1125
1126 #define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method)
1127
1128 #endif /* GLX_OML_swap_method */
1129
1130 /* -------------------------- GLX_OML_sync_control ------------------------- */
1131
1132 #ifndef GLX_OML_sync_control
1133 #define GLX_OML_sync_control 1
1134
1135 typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator);
1136 typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc);
1137 typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder);
1138 typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc);
1139 typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc);
1140
1141 #define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML)
1142 #define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML)
1143 #define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML)
1144 #define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML)
1145 #define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML)
1146
1147 #define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control)
1148
1149 #endif /* GLX_OML_sync_control */
1150
1151 /* ------------------------ GLX_SGIS_blended_overlay ----------------------- */
1152
1153 #ifndef GLX_SGIS_blended_overlay
1154 #define GLX_SGIS_blended_overlay 1
1155
1156 #define GLX_BLENDED_RGBA_SGIS 0x8025
1157
1158 #define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay)
1159
1160 #endif /* GLX_SGIS_blended_overlay */
1161
1162 /* -------------------------- GLX_SGIS_color_range ------------------------- */
1163
1164 #ifndef GLX_SGIS_color_range
1165 #define GLX_SGIS_color_range 1
1166
1167 #define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range)
1168
1169 #endif /* GLX_SGIS_color_range */
1170
1171 /* -------------------------- GLX_SGIS_multisample ------------------------- */
1172
1173 #ifndef GLX_SGIS_multisample
1174 #define GLX_SGIS_multisample 1
1175
1176 #define GLX_SAMPLE_BUFFERS_SGIS 100000
1177 #define GLX_SAMPLES_SGIS 100001
1178
1179 #define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample)
1180
1181 #endif /* GLX_SGIS_multisample */
1182
1183 /* ---------------------- GLX_SGIS_shared_multisample ---------------------- */
1184
1185 #ifndef GLX_SGIS_shared_multisample
1186 #define GLX_SGIS_shared_multisample 1
1187
1188 #define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026
1189 #define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027
1190
1191 #define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample)
1192
1193 #endif /* GLX_SGIS_shared_multisample */
1194
1195 /* --------------------------- GLX_SGIX_fbconfig --------------------------- */
1196
1197 #ifndef GLX_SGIX_fbconfig
1198 #define GLX_SGIX_fbconfig 1
1199
1200 #define GLX_RGBA_BIT_SGIX 0x00000001
1201 #define GLX_WINDOW_BIT_SGIX 0x00000001
1202 #define GLX_COLOR_INDEX_BIT_SGIX 0x00000002
1203 #define GLX_PIXMAP_BIT_SGIX 0x00000002
1204 #define GLX_SCREEN_EXT 0x800C
1205 #define GLX_DRAWABLE_TYPE_SGIX 0x8010
1206 #define GLX_RENDER_TYPE_SGIX 0x8011
1207 #define GLX_X_RENDERABLE_SGIX 0x8012
1208 #define GLX_FBCONFIG_ID_SGIX 0x8013
1209 #define GLX_RGBA_TYPE_SGIX 0x8014
1210 #define GLX_COLOR_INDEX_TYPE_SGIX 0x8015
1211
1212 typedef XID GLXFBConfigIDSGIX;
1213 typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;
1214
1215 typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements);
1216 typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
1217 typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap);
1218 typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value);
1219 typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis);
1220 typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config);
1221
1222 #define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX)
1223 #define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX)
1224 #define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX)
1225 #define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX)
1226 #define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX)
1227 #define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX)
1228
1229 #define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig)
1230
1231 #endif /* GLX_SGIX_fbconfig */
1232
1233 /* --------------------------- GLX_SGIX_hyperpipe -------------------------- */
1234
1235 #ifndef GLX_SGIX_hyperpipe
1236 #define GLX_SGIX_hyperpipe 1
1237
1238 #define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001
1239 #define GLX_PIPE_RECT_SGIX 0x00000001
1240 #define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002
1241 #define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002
1242 #define GLX_HYPERPIPE_STEREO_SGIX 0x00000003
1243 #define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004
1244 #define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80
1245 #define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91
1246 #define GLX_BAD_HYPERPIPE_SGIX 92
1247 #define GLX_HYPERPIPE_ID_SGIX 0x8030
1248
1249 typedef struct {
1250 char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
1251 int networkId;
1252 } GLXHyperpipeNetworkSGIX;
1253 typedef struct {
1254 char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
1255 int XOrigin;
1256 int YOrigin;
1257 int maxHeight;
1258 int maxWidth;
1259 } GLXPipeRectLimits;
1260 typedef struct {
1261 char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
1262 int channel;
1263 unsigned int participationType;
1264 int timeSlice;
1265 } GLXHyperpipeConfigSGIX;
1266 typedef struct {
1267 char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
1268 int srcXOrigin;
1269 int srcYOrigin;
1270 int srcWidth;
1271 int srcHeight;
1272 int destXOrigin;
1273 int destYOrigin;
1274 int destWidth;
1275 int destHeight;
1276 } GLXPipeRect;
1277
1278 typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId);
1279 typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId);
1280 typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList);
1281 typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId);
1282 typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList);
1283 typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList);
1284 typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes);
1285 typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes);
1286
1287 #define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX)
1288 #define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX)
1289 #define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX)
1290 #define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX)
1291 #define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX)
1292 #define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX)
1293 #define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX)
1294 #define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX)
1295
1296 #define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe)
1297
1298 #endif /* GLX_SGIX_hyperpipe */
1299
1300 /* ---------------------------- GLX_SGIX_pbuffer --------------------------- */
1301
1302 #ifndef GLX_SGIX_pbuffer
1303 #define GLX_SGIX_pbuffer 1
1304
1305 #define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001
1306 #define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002
1307 #define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004
1308 #define GLX_PBUFFER_BIT_SGIX 0x00000004
1309 #define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008
1310 #define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010
1311 #define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020
1312 #define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040
1313 #define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080
1314 #define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100
1315 #define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016
1316 #define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017
1317 #define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018
1318 #define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019
1319 #define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A
1320 #define GLX_PRESERVED_CONTENTS_SGIX 0x801B
1321 #define GLX_LARGEST_PBUFFER_SGIX 0x801C
1322 #define GLX_WIDTH_SGIX 0x801D
1323 #define GLX_HEIGHT_SGIX 0x801E
1324 #define GLX_EVENT_MASK_SGIX 0x801F
1325 #define GLX_DAMAGED_SGIX 0x8020
1326 #define GLX_SAVED_SGIX 0x8021
1327 #define GLX_WINDOW_SGIX 0x8022
1328 #define GLX_PBUFFER_SGIX 0x8023
1329 #define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000
1330
1331 typedef XID GLXPbufferSGIX;
1332 typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX;
1333
1334 typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list);
1335 typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf);
1336 typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask);
1337 typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value);
1338 typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask);
1339
1340 #define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX)
1341 #define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX)
1342 #define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX)
1343 #define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX)
1344 #define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX)
1345
1346 #define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer)
1347
1348 #endif /* GLX_SGIX_pbuffer */
1349
1350 /* ------------------------- GLX_SGIX_swap_barrier ------------------------- */
1351
1352 #ifndef GLX_SGIX_swap_barrier
1353 #define GLX_SGIX_swap_barrier 1
1354
1355 typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier);
1356 typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max);
1357
1358 #define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX)
1359 #define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX)
1360
1361 #define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier)
1362
1363 #endif /* GLX_SGIX_swap_barrier */
1364
1365 /* -------------------------- GLX_SGIX_swap_group -------------------------- */
1366
1367 #ifndef GLX_SGIX_swap_group
1368 #define GLX_SGIX_swap_group 1
1369
1370 typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member);
1371
1372 #define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX)
1373
1374 #define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group)
1375
1376 #endif /* GLX_SGIX_swap_group */
1377
1378 /* ------------------------- GLX_SGIX_video_resize ------------------------- */
1379
1380 #ifndef GLX_SGIX_video_resize
1381 #define GLX_SGIX_video_resize 1
1382
1383 #define GLX_SYNC_FRAME_SGIX 0x00000000
1384 #define GLX_SYNC_SWAP_SGIX 0x00000001
1385
1386 typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window);
1387 typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h);
1388 typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype);
1389 typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h);
1390 typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh);
1391
1392 #define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX)
1393 #define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX)
1394 #define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX)
1395 #define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX)
1396 #define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX)
1397
1398 #define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize)
1399
1400 #endif /* GLX_SGIX_video_resize */
1401
1402 /* ---------------------- GLX_SGIX_visual_select_group --------------------- */
1403
1404 #ifndef GLX_SGIX_visual_select_group
1405 #define GLX_SGIX_visual_select_group 1
1406
1407 #define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028
1408
1409 #define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group)
1410
1411 #endif /* GLX_SGIX_visual_select_group */
1412
1413 /* ---------------------------- GLX_SGI_cushion ---------------------------- */
1414
1415 #ifndef GLX_SGI_cushion
1416 #define GLX_SGI_cushion 1
1417
1418 typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion);
1419
1420 #define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI)
1421
1422 #define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion)
1423
1424 #endif /* GLX_SGI_cushion */
1425
1426 /* ----------------------- GLX_SGI_make_current_read ----------------------- */
1427
1428 #ifndef GLX_SGI_make_current_read
1429 #define GLX_SGI_make_current_read 1
1430
1431 typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void);
1432 typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
1433
1434 #define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI)
1435 #define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI)
1436
1437 #define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read)
1438
1439 #endif /* GLX_SGI_make_current_read */
1440
1441 /* -------------------------- GLX_SGI_swap_control ------------------------- */
1442
1443 #ifndef GLX_SGI_swap_control
1444 #define GLX_SGI_swap_control 1
1445
1446 typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval);
1447
1448 #define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI)
1449
1450 #define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control)
1451
1452 #endif /* GLX_SGI_swap_control */
1453
1454 /* --------------------------- GLX_SGI_video_sync -------------------------- */
1455
1456 #ifndef GLX_SGI_video_sync
1457 #define GLX_SGI_video_sync 1
1458
1459 typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count);
1460 typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count);
1461
1462 #define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI)
1463 #define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI)
1464
1465 #define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync)
1466
1467 #endif /* GLX_SGI_video_sync */
1468
1469 /* --------------------- GLX_SUN_get_transparent_index --------------------- */
1470
1471 #ifndef GLX_SUN_get_transparent_index
1472 #define GLX_SUN_get_transparent_index 1
1473
1474 typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex);
1475
1476 #define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN)
1477
1478 #define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index)
1479
1480 #endif /* GLX_SUN_get_transparent_index */
1481
1482 /* -------------------------- GLX_SUN_video_resize ------------------------- */
1483
1484 #ifndef GLX_SUN_video_resize
1485 #define GLX_SUN_video_resize 1
1486
1487 #define GLX_VIDEO_RESIZE_SUN 0x8171
1488 #define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD
1489
1490 typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor);
1491 typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor);
1492
1493 #define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN)
1494 #define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN)
1495
1496 #define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize)
1497
1498 #endif /* GLX_SUN_video_resize */
1499
1500 /* ------------------------------------------------------------------------- */
1501
1502 #ifdef GLEW_MX
1503 #define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT
1504 #define GLXEW_VAR_EXPORT
1505 #else
1506 #define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT
1507 #define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT
1508 #endif /* GLEW_MX */
1509
1510 GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay;
1511
1512 GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig;
1513 GLXEW_FUN_EXPORT PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext;
1514 GLXEW_FUN_EXPORT PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer;
1515 GLXEW_FUN_EXPORT PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap;
1516 GLXEW_FUN_EXPORT PFNGLXCREATEWINDOWPROC __glewXCreateWindow;
1517 GLXEW_FUN_EXPORT PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer;
1518 GLXEW_FUN_EXPORT PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap;
1519 GLXEW_FUN_EXPORT PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow;
1520 GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable;
1521 GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib;
1522 GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs;
1523 GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent;
1524 GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig;
1525 GLXEW_FUN_EXPORT PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent;
1526 GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext;
1527 GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable;
1528 GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent;
1529
1530 GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD;
1531 GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD;
1532 GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD;
1533 GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD;
1534 GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD;
1535 GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD;
1536 GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD;
1537 GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD;
1538 GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD;
1539
1540 GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB;
1541
1542 GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI;
1543 GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI;
1544 GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI;
1545
1546 GLXEW_FUN_EXPORT PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT;
1547 GLXEW_FUN_EXPORT PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT;
1548 GLXEW_FUN_EXPORT PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT;
1549 GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT;
1550
1551 GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT;
1552
1553 GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT;
1554 GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT;
1555
1556 GLXEW_FUN_EXPORT PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA;
1557
1558 GLXEW_FUN_EXPORT PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA;
1559
1560 GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA;
1561
1562 GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA;
1563 GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA;
1564 GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA;
1565 GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA;
1566
1567 GLXEW_FUN_EXPORT PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA;
1568
1569 GLXEW_FUN_EXPORT PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA;
1570
1571 GLXEW_FUN_EXPORT PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA;
1572 GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA;
1573
1574 GLXEW_FUN_EXPORT PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV;
1575 GLXEW_FUN_EXPORT PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV;
1576
1577 GLXEW_FUN_EXPORT PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV;
1578
1579 GLXEW_FUN_EXPORT PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV;
1580
1581 GLXEW_FUN_EXPORT PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV;
1582 GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV;
1583
1584 GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV;
1585 GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV;
1586 GLXEW_FUN_EXPORT PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV;
1587 GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV;
1588 GLXEW_FUN_EXPORT PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV;
1589 GLXEW_FUN_EXPORT PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV;
1590
1591 GLXEW_FUN_EXPORT PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV;
1592 GLXEW_FUN_EXPORT PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV;
1593
1594 GLXEW_FUN_EXPORT PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV;
1595 GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV;
1596 GLXEW_FUN_EXPORT PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV;
1597 GLXEW_FUN_EXPORT PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV;
1598 GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV;
1599
1600 GLXEW_FUN_EXPORT PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV;
1601 GLXEW_FUN_EXPORT PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV;
1602 GLXEW_FUN_EXPORT PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV;
1603 GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV;
1604 GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV;
1605 GLXEW_FUN_EXPORT PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV;
1606
1607 GLXEW_FUN_EXPORT PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML;
1608 GLXEW_FUN_EXPORT PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML;
1609 GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML;
1610 GLXEW_FUN_EXPORT PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML;
1611 GLXEW_FUN_EXPORT PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML;
1612
1613 GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX;
1614 GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX;
1615 GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX;
1616 GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX;
1617 GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX;
1618 GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX;
1619
1620 GLXEW_FUN_EXPORT PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX;
1621 GLXEW_FUN_EXPORT PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX;
1622 GLXEW_FUN_EXPORT PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX;
1623 GLXEW_FUN_EXPORT PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX;
1624 GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX;
1625 GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX;
1626 GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX;
1627 GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX;
1628
1629 GLXEW_FUN_EXPORT PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX;
1630 GLXEW_FUN_EXPORT PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX;
1631 GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX;
1632 GLXEW_FUN_EXPORT PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX;
1633 GLXEW_FUN_EXPORT PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX;
1634
1635 GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX;
1636 GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX;
1637
1638 GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX;
1639
1640 GLXEW_FUN_EXPORT PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX;
1641 GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX;
1642 GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX;
1643 GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX;
1644 GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX;
1645
1646 GLXEW_FUN_EXPORT PFNGLXCUSHIONSGIPROC __glewXCushionSGI;
1647
1648 GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI;
1649 GLXEW_FUN_EXPORT PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI;
1650
1651 GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI;
1652
1653 GLXEW_FUN_EXPORT PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI;
1654 GLXEW_FUN_EXPORT PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI;
1655
1656 GLXEW_FUN_EXPORT PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN;
1657
1658 GLXEW_FUN_EXPORT PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN;
1659 GLXEW_FUN_EXPORT PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN;
1660
1661 #if defined(GLEW_MX)
1662 struct GLXEWContextStruct
1663 {
1664 #endif /* GLEW_MX */
1665
1666 GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0;
1667 GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1;
1668 GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2;
1669 GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_3;
1670 GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_4;
1671 GLXEW_VAR_EXPORT GLboolean __GLXEW_3DFX_multisample;
1672 GLXEW_VAR_EXPORT GLboolean __GLXEW_AMD_gpu_association;
1673 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_context_flush_control;
1674 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context;
1675 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_profile;
1676 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_robustness;
1677 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_fbconfig_float;
1678 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB;
1679 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_get_proc_address;
1680 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_multisample;
1681 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_application_isolation;
1682 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation;
1683 GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object;
1684 GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float;
1685 GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture;
1686 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age;
1687 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile;
1688 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile;
1689 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float;
1690 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB;
1691 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context;
1692 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker;
1693 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_stereo_tree;
1694 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control;
1695 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear;
1696 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap;
1697 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_info;
1698 GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_rating;
1699 GLXEW_VAR_EXPORT GLboolean __GLXEW_INTEL_swap_event;
1700 GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_agp_offset;
1701 GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer;
1702 GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap;
1703 GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_query_renderer;
1704 GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_release_buffers;
1705 GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode;
1706 GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_swap_control;
1707 GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_buffer;
1708 GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_image;
1709 GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_delay_before_swap;
1710 GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_float_buffer;
1711 GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multisample_coverage;
1712 GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video;
1713 GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group;
1714 GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range;
1715 GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture;
1716 GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out;
1717 GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method;
1718 GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control;
1719 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay;
1720 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_color_range;
1721 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_multisample;
1722 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_shared_multisample;
1723 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_fbconfig;
1724 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_hyperpipe;
1725 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_pbuffer;
1726 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_barrier;
1727 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_group;
1728 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_video_resize;
1729 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_visual_select_group;
1730 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_cushion;
1731 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_make_current_read;
1732 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_swap_control;
1733 GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_video_sync;
1734 GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_get_transparent_index;
1735 GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_video_resize;
1736
1737 #ifdef GLEW_MX
1738 }; /* GLXEWContextStruct */
1739 #endif /* GLEW_MX */
1740
1741 /* ------------------------------------------------------------------------ */
1742
1743 #ifdef GLEW_MX
1744
1745 typedef struct GLXEWContextStruct GLXEWContext;
1746 GLEWAPI GLenum GLEWAPIENTRY glxewContextInit (GLXEWContext *ctx);
1747 GLEWAPI GLboolean GLEWAPIENTRY glxewContextIsSupported (const GLXEWContext *ctx, const char *name);
1748
1749 #define glxewInit() glxewContextInit(glxewGetContext())
1750 #define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x)
1751
1752 #define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x))
1753 #define GLXEW_GET_FUN(x) x
1754
1755 #else /* GLEW_MX */
1756
1757 GLEWAPI GLenum GLEWAPIENTRY glxewInit ();
1758 GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name);
1759
1760 #define GLXEW_GET_VAR(x) (*(const GLboolean*)&x)
1761 #define GLXEW_GET_FUN(x) x
1762
1763 #endif /* GLEW_MX */
1764
1765 GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name);
1766
1767 #ifdef __cplusplus
1768 }
1769 #endif
1770
1771 #endif /* __glxew_h__ */
0 /*
1 ** The OpenGL Extension Wrangler Library
2 ** Copyright (C) 2008-2015, Nigel Stewart <nigels[]users sourceforge net>
3 ** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
4 ** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
5 ** Copyright (C) 2002, Lev Povalahev
6 ** All rights reserved.
7 **
8 ** Redistribution and use in source and binary forms, with or without
9 ** modification, are permitted provided that the following conditions are met:
10 **
11 ** * Redistributions of source code must retain the above copyright notice,
12 ** this list of conditions and the following disclaimer.
13 ** * Redistributions in binary form must reproduce the above copyright notice,
14 ** this list of conditions and the following disclaimer in the documentation
15 ** and/or other materials provided with the distribution.
16 ** * The name of the author may be used to endorse or promote products
17 ** derived from this software without specific prior written permission.
18 **
19 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29 ** THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 /*
33 ** Copyright (c) 2007 The Khronos Group Inc.
34 **
35 ** Permission is hereby granted, free of charge, to any person obtaining a
36 ** copy of this software and/or associated documentation files (the
37 ** "Materials"), to deal in the Materials without restriction, including
38 ** without limitation the rights to use, copy, modify, merge, publish,
39 ** distribute, sublicense, and/or sell copies of the Materials, and to
40 ** permit persons to whom the Materials are furnished to do so, subject to
41 ** the following conditions:
42 **
43 ** The above copyright notice and this permission notice shall be included
44 ** in all copies or substantial portions of the Materials.
45 **
46 ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
47 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
48 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
49 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
50 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
51 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
52 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
53 */
54
55 #ifndef __wglew_h__
56 #define __wglew_h__
57 #define __WGLEW_H__
58
59 #ifdef __wglext_h_
60 #error wglext.h included before wglew.h
61 #endif
62
63 #define __wglext_h_
64
65 #if !defined(WINAPI)
66 # ifndef WIN32_LEAN_AND_MEAN
67 # define WIN32_LEAN_AND_MEAN 1
68 # endif
69 # ifdef NOGDI
70 # undef NOGDI
71 # endif
72 #include <windows.h>
73 # undef WIN32_LEAN_AND_MEAN
74 #endif
75
76 /*
77 * GLEW_STATIC needs to be set when using the static version.
78 * GLEW_BUILD is set when building the DLL version.
79 */
80 #ifdef GLEW_STATIC
81 # define GLEWAPI extern
82 #else
83 # ifdef GLEW_BUILD
84 # define GLEWAPI extern __declspec(dllexport)
85 # else
86 # define GLEWAPI extern __declspec(dllimport)
87 # endif
88 #endif
89
90 #ifdef __cplusplus
91 extern "C" {
92 #endif
93
94 /* -------------------------- WGL_3DFX_multisample ------------------------- */
95
96 #ifndef WGL_3DFX_multisample
97 #define WGL_3DFX_multisample 1
98
99 #define WGL_SAMPLE_BUFFERS_3DFX 0x2060
100 #define WGL_SAMPLES_3DFX 0x2061
101
102 #define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample)
103
104 #endif /* WGL_3DFX_multisample */
105
106 /* ------------------------- WGL_3DL_stereo_control ------------------------ */
107
108 #ifndef WGL_3DL_stereo_control
109 #define WGL_3DL_stereo_control 1
110
111 #define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055
112 #define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056
113 #define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057
114 #define WGL_STEREO_POLARITY_INVERT_3DL 0x2058
115
116 typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState);
117
118 #define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL)
119
120 #define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control)
121
122 #endif /* WGL_3DL_stereo_control */
123
124 /* ------------------------ WGL_AMD_gpu_association ------------------------ */
125
126 #ifndef WGL_AMD_gpu_association
127 #define WGL_AMD_gpu_association 1
128
129 #define WGL_GPU_VENDOR_AMD 0x1F00
130 #define WGL_GPU_RENDERER_STRING_AMD 0x1F01
131 #define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02
132 #define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2
133 #define WGL_GPU_RAM_AMD 0x21A3
134 #define WGL_GPU_CLOCK_AMD 0x21A4
135 #define WGL_GPU_NUM_PIPES_AMD 0x21A5
136 #define WGL_GPU_NUM_SIMD_AMD 0x21A6
137 #define WGL_GPU_NUM_RB_AMD 0x21A7
138 #define WGL_GPU_NUM_SPI_AMD 0x21A8
139
140 typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
141 typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id);
142 typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList);
143 typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc);
144 typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc);
145 typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void);
146 typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids);
147 typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data);
148 typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc);
149
150 #define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD)
151 #define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD)
152 #define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD)
153 #define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD)
154 #define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD)
155 #define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD)
156 #define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD)
157 #define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD)
158 #define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD)
159
160 #define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association)
161
162 #endif /* WGL_AMD_gpu_association */
163
164 /* ------------------------- WGL_ARB_buffer_region ------------------------- */
165
166 #ifndef WGL_ARB_buffer_region
167 #define WGL_ARB_buffer_region 1
168
169 #define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001
170 #define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002
171 #define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004
172 #define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008
173
174 typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType);
175 typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);
176 typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);
177 typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);
178
179 #define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB)
180 #define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB)
181 #define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB)
182 #define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB)
183
184 #define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region)
185
186 #endif /* WGL_ARB_buffer_region */
187
188 /* --------------------- WGL_ARB_context_flush_control --------------------- */
189
190 #ifndef WGL_ARB_context_flush_control
191 #define WGL_ARB_context_flush_control 1
192
193 #define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0x0000
194 #define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097
195 #define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098
196
197 #define WGLEW_ARB_context_flush_control WGLEW_GET_VAR(__WGLEW_ARB_context_flush_control)
198
199 #endif /* WGL_ARB_context_flush_control */
200
201 /* ------------------------- WGL_ARB_create_context ------------------------ */
202
203 #ifndef WGL_ARB_create_context
204 #define WGL_ARB_create_context 1
205
206 #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001
207 #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
208 #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
209 #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
210 #define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
211 #define WGL_CONTEXT_FLAGS_ARB 0x2094
212 #define ERROR_INVALID_VERSION_ARB 0x2095
213 #define ERROR_INVALID_PROFILE_ARB 0x2096
214
215 typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList);
216
217 #define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB)
218
219 #define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context)
220
221 #endif /* WGL_ARB_create_context */
222
223 /* --------------------- WGL_ARB_create_context_profile -------------------- */
224
225 #ifndef WGL_ARB_create_context_profile
226 #define WGL_ARB_create_context_profile 1
227
228 #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
229 #define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
230 #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
231
232 #define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile)
233
234 #endif /* WGL_ARB_create_context_profile */
235
236 /* ------------------- WGL_ARB_create_context_robustness ------------------- */
237
238 #ifndef WGL_ARB_create_context_robustness
239 #define WGL_ARB_create_context_robustness 1
240
241 #define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
242 #define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
243 #define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
244 #define WGL_NO_RESET_NOTIFICATION_ARB 0x8261
245
246 #define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness)
247
248 #endif /* WGL_ARB_create_context_robustness */
249
250 /* ----------------------- WGL_ARB_extensions_string ----------------------- */
251
252 #ifndef WGL_ARB_extensions_string
253 #define WGL_ARB_extensions_string 1
254
255 typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
256
257 #define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB)
258
259 #define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string)
260
261 #endif /* WGL_ARB_extensions_string */
262
263 /* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */
264
265 #ifndef WGL_ARB_framebuffer_sRGB
266 #define WGL_ARB_framebuffer_sRGB 1
267
268 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9
269
270 #define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB)
271
272 #endif /* WGL_ARB_framebuffer_sRGB */
273
274 /* ----------------------- WGL_ARB_make_current_read ----------------------- */
275
276 #ifndef WGL_ARB_make_current_read
277 #define WGL_ARB_make_current_read 1
278
279 #define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043
280 #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054
281
282 typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID);
283 typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
284
285 #define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB)
286 #define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB)
287
288 #define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read)
289
290 #endif /* WGL_ARB_make_current_read */
291
292 /* -------------------------- WGL_ARB_multisample -------------------------- */
293
294 #ifndef WGL_ARB_multisample
295 #define WGL_ARB_multisample 1
296
297 #define WGL_SAMPLE_BUFFERS_ARB 0x2041
298 #define WGL_SAMPLES_ARB 0x2042
299
300 #define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample)
301
302 #endif /* WGL_ARB_multisample */
303
304 /* ---------------------------- WGL_ARB_pbuffer ---------------------------- */
305
306 #ifndef WGL_ARB_pbuffer
307 #define WGL_ARB_pbuffer 1
308
309 #define WGL_DRAW_TO_PBUFFER_ARB 0x202D
310 #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
311 #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
312 #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
313 #define WGL_PBUFFER_LARGEST_ARB 0x2033
314 #define WGL_PBUFFER_WIDTH_ARB 0x2034
315 #define WGL_PBUFFER_HEIGHT_ARB 0x2035
316 #define WGL_PBUFFER_LOST_ARB 0x2036
317
318 DECLARE_HANDLE(HPBUFFERARB);
319
320 typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);
321 typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);
322 typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);
323 typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue);
324 typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);
325
326 #define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB)
327 #define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB)
328 #define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB)
329 #define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB)
330 #define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB)
331
332 #define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer)
333
334 #endif /* WGL_ARB_pbuffer */
335
336 /* -------------------------- WGL_ARB_pixel_format ------------------------- */
337
338 #ifndef WGL_ARB_pixel_format
339 #define WGL_ARB_pixel_format 1
340
341 #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
342 #define WGL_DRAW_TO_WINDOW_ARB 0x2001
343 #define WGL_DRAW_TO_BITMAP_ARB 0x2002
344 #define WGL_ACCELERATION_ARB 0x2003
345 #define WGL_NEED_PALETTE_ARB 0x2004
346 #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
347 #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
348 #define WGL_SWAP_METHOD_ARB 0x2007
349 #define WGL_NUMBER_OVERLAYS_ARB 0x2008
350 #define WGL_NUMBER_UNDERLAYS_ARB 0x2009
351 #define WGL_TRANSPARENT_ARB 0x200A
352 #define WGL_SHARE_DEPTH_ARB 0x200C
353 #define WGL_SHARE_STENCIL_ARB 0x200D
354 #define WGL_SHARE_ACCUM_ARB 0x200E
355 #define WGL_SUPPORT_GDI_ARB 0x200F
356 #define WGL_SUPPORT_OPENGL_ARB 0x2010
357 #define WGL_DOUBLE_BUFFER_ARB 0x2011
358 #define WGL_STEREO_ARB 0x2012
359 #define WGL_PIXEL_TYPE_ARB 0x2013
360 #define WGL_COLOR_BITS_ARB 0x2014
361 #define WGL_RED_BITS_ARB 0x2015
362 #define WGL_RED_SHIFT_ARB 0x2016
363 #define WGL_GREEN_BITS_ARB 0x2017
364 #define WGL_GREEN_SHIFT_ARB 0x2018
365 #define WGL_BLUE_BITS_ARB 0x2019
366 #define WGL_BLUE_SHIFT_ARB 0x201A
367 #define WGL_ALPHA_BITS_ARB 0x201B
368 #define WGL_ALPHA_SHIFT_ARB 0x201C
369 #define WGL_ACCUM_BITS_ARB 0x201D
370 #define WGL_ACCUM_RED_BITS_ARB 0x201E
371 #define WGL_ACCUM_GREEN_BITS_ARB 0x201F
372 #define WGL_ACCUM_BLUE_BITS_ARB 0x2020
373 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
374 #define WGL_DEPTH_BITS_ARB 0x2022
375 #define WGL_STENCIL_BITS_ARB 0x2023
376 #define WGL_AUX_BUFFERS_ARB 0x2024
377 #define WGL_NO_ACCELERATION_ARB 0x2025
378 #define WGL_GENERIC_ACCELERATION_ARB 0x2026
379 #define WGL_FULL_ACCELERATION_ARB 0x2027
380 #define WGL_SWAP_EXCHANGE_ARB 0x2028
381 #define WGL_SWAP_COPY_ARB 0x2029
382 #define WGL_SWAP_UNDEFINED_ARB 0x202A
383 #define WGL_TYPE_RGBA_ARB 0x202B
384 #define WGL_TYPE_COLORINDEX_ARB 0x202C
385 #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
386 #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
387 #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
388 #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
389 #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
390
391 typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
392 typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues);
393 typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues);
394
395 #define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB)
396 #define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB)
397 #define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB)
398
399 #define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format)
400
401 #endif /* WGL_ARB_pixel_format */
402
403 /* ----------------------- WGL_ARB_pixel_format_float ---------------------- */
404
405 #ifndef WGL_ARB_pixel_format_float
406 #define WGL_ARB_pixel_format_float 1
407
408 #define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0
409
410 #define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float)
411
412 #endif /* WGL_ARB_pixel_format_float */
413
414 /* ------------------------- WGL_ARB_render_texture ------------------------ */
415
416 #ifndef WGL_ARB_render_texture
417 #define WGL_ARB_render_texture 1
418
419 #define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070
420 #define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071
421 #define WGL_TEXTURE_FORMAT_ARB 0x2072
422 #define WGL_TEXTURE_TARGET_ARB 0x2073
423 #define WGL_MIPMAP_TEXTURE_ARB 0x2074
424 #define WGL_TEXTURE_RGB_ARB 0x2075
425 #define WGL_TEXTURE_RGBA_ARB 0x2076
426 #define WGL_NO_TEXTURE_ARB 0x2077
427 #define WGL_TEXTURE_CUBE_MAP_ARB 0x2078
428 #define WGL_TEXTURE_1D_ARB 0x2079
429 #define WGL_TEXTURE_2D_ARB 0x207A
430 #define WGL_MIPMAP_LEVEL_ARB 0x207B
431 #define WGL_CUBE_MAP_FACE_ARB 0x207C
432 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D
433 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E
434 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F
435 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080
436 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081
437 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082
438 #define WGL_FRONT_LEFT_ARB 0x2083
439 #define WGL_FRONT_RIGHT_ARB 0x2084
440 #define WGL_BACK_LEFT_ARB 0x2085
441 #define WGL_BACK_RIGHT_ARB 0x2086
442 #define WGL_AUX0_ARB 0x2087
443 #define WGL_AUX1_ARB 0x2088
444 #define WGL_AUX2_ARB 0x2089
445 #define WGL_AUX3_ARB 0x208A
446 #define WGL_AUX4_ARB 0x208B
447 #define WGL_AUX5_ARB 0x208C
448 #define WGL_AUX6_ARB 0x208D
449 #define WGL_AUX7_ARB 0x208E
450 #define WGL_AUX8_ARB 0x208F
451 #define WGL_AUX9_ARB 0x2090
452
453 typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
454 typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
455 typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList);
456
457 #define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB)
458 #define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB)
459 #define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB)
460
461 #define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture)
462
463 #endif /* WGL_ARB_render_texture */
464
465 /* ---------------- WGL_ARB_robustness_application_isolation --------------- */
466
467 #ifndef WGL_ARB_robustness_application_isolation
468 #define WGL_ARB_robustness_application_isolation 1
469
470 #define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008
471
472 #define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation)
473
474 #endif /* WGL_ARB_robustness_application_isolation */
475
476 /* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */
477
478 #ifndef WGL_ARB_robustness_share_group_isolation
479 #define WGL_ARB_robustness_share_group_isolation 1
480
481 #define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008
482
483 #define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation)
484
485 #endif /* WGL_ARB_robustness_share_group_isolation */
486
487 /* ----------------------- WGL_ATI_pixel_format_float ---------------------- */
488
489 #ifndef WGL_ATI_pixel_format_float
490 #define WGL_ATI_pixel_format_float 1
491
492 #define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0
493 #define GL_RGBA_FLOAT_MODE_ATI 0x8820
494 #define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835
495
496 #define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float)
497
498 #endif /* WGL_ATI_pixel_format_float */
499
500 /* -------------------- WGL_ATI_render_texture_rectangle ------------------- */
501
502 #ifndef WGL_ATI_render_texture_rectangle
503 #define WGL_ATI_render_texture_rectangle 1
504
505 #define WGL_TEXTURE_RECTANGLE_ATI 0x21A5
506
507 #define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle)
508
509 #endif /* WGL_ATI_render_texture_rectangle */
510
511 /* ------------------- WGL_EXT_create_context_es2_profile ------------------ */
512
513 #ifndef WGL_EXT_create_context_es2_profile
514 #define WGL_EXT_create_context_es2_profile 1
515
516 #define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
517
518 #define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile)
519
520 #endif /* WGL_EXT_create_context_es2_profile */
521
522 /* ------------------- WGL_EXT_create_context_es_profile ------------------- */
523
524 #ifndef WGL_EXT_create_context_es_profile
525 #define WGL_EXT_create_context_es_profile 1
526
527 #define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004
528
529 #define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile)
530
531 #endif /* WGL_EXT_create_context_es_profile */
532
533 /* -------------------------- WGL_EXT_depth_float -------------------------- */
534
535 #ifndef WGL_EXT_depth_float
536 #define WGL_EXT_depth_float 1
537
538 #define WGL_DEPTH_FLOAT_EXT 0x2040
539
540 #define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float)
541
542 #endif /* WGL_EXT_depth_float */
543
544 /* ---------------------- WGL_EXT_display_color_table ---------------------- */
545
546 #ifndef WGL_EXT_display_color_table
547 #define WGL_EXT_display_color_table 1
548
549 typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id);
550 typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id);
551 typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id);
552 typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length);
553
554 #define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT)
555 #define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT)
556 #define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT)
557 #define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT)
558
559 #define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table)
560
561 #endif /* WGL_EXT_display_color_table */
562
563 /* ----------------------- WGL_EXT_extensions_string ----------------------- */
564
565 #ifndef WGL_EXT_extensions_string
566 #define WGL_EXT_extensions_string 1
567
568 typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void);
569
570 #define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT)
571
572 #define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string)
573
574 #endif /* WGL_EXT_extensions_string */
575
576 /* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */
577
578 #ifndef WGL_EXT_framebuffer_sRGB
579 #define WGL_EXT_framebuffer_sRGB 1
580
581 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9
582
583 #define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB)
584
585 #endif /* WGL_EXT_framebuffer_sRGB */
586
587 /* ----------------------- WGL_EXT_make_current_read ----------------------- */
588
589 #ifndef WGL_EXT_make_current_read
590 #define WGL_EXT_make_current_read 1
591
592 #define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043
593
594 typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID);
595 typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
596
597 #define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT)
598 #define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT)
599
600 #define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read)
601
602 #endif /* WGL_EXT_make_current_read */
603
604 /* -------------------------- WGL_EXT_multisample -------------------------- */
605
606 #ifndef WGL_EXT_multisample
607 #define WGL_EXT_multisample 1
608
609 #define WGL_SAMPLE_BUFFERS_EXT 0x2041
610 #define WGL_SAMPLES_EXT 0x2042
611
612 #define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample)
613
614 #endif /* WGL_EXT_multisample */
615
616 /* ---------------------------- WGL_EXT_pbuffer ---------------------------- */
617
618 #ifndef WGL_EXT_pbuffer
619 #define WGL_EXT_pbuffer 1
620
621 #define WGL_DRAW_TO_PBUFFER_EXT 0x202D
622 #define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E
623 #define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F
624 #define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030
625 #define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031
626 #define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032
627 #define WGL_PBUFFER_LARGEST_EXT 0x2033
628 #define WGL_PBUFFER_WIDTH_EXT 0x2034
629 #define WGL_PBUFFER_HEIGHT_EXT 0x2035
630
631 DECLARE_HANDLE(HPBUFFEREXT);
632
633 typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);
634 typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer);
635 typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer);
636 typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue);
637 typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC);
638
639 #define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT)
640 #define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT)
641 #define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT)
642 #define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT)
643 #define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT)
644
645 #define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer)
646
647 #endif /* WGL_EXT_pbuffer */
648
649 /* -------------------------- WGL_EXT_pixel_format ------------------------- */
650
651 #ifndef WGL_EXT_pixel_format
652 #define WGL_EXT_pixel_format 1
653
654 #define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000
655 #define WGL_DRAW_TO_WINDOW_EXT 0x2001
656 #define WGL_DRAW_TO_BITMAP_EXT 0x2002
657 #define WGL_ACCELERATION_EXT 0x2003
658 #define WGL_NEED_PALETTE_EXT 0x2004
659 #define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005
660 #define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006
661 #define WGL_SWAP_METHOD_EXT 0x2007
662 #define WGL_NUMBER_OVERLAYS_EXT 0x2008
663 #define WGL_NUMBER_UNDERLAYS_EXT 0x2009
664 #define WGL_TRANSPARENT_EXT 0x200A
665 #define WGL_TRANSPARENT_VALUE_EXT 0x200B
666 #define WGL_SHARE_DEPTH_EXT 0x200C
667 #define WGL_SHARE_STENCIL_EXT 0x200D
668 #define WGL_SHARE_ACCUM_EXT 0x200E
669 #define WGL_SUPPORT_GDI_EXT 0x200F
670 #define WGL_SUPPORT_OPENGL_EXT 0x2010
671 #define WGL_DOUBLE_BUFFER_EXT 0x2011
672 #define WGL_STEREO_EXT 0x2012
673 #define WGL_PIXEL_TYPE_EXT 0x2013
674 #define WGL_COLOR_BITS_EXT 0x2014
675 #define WGL_RED_BITS_EXT 0x2015
676 #define WGL_RED_SHIFT_EXT 0x2016
677 #define WGL_GREEN_BITS_EXT 0x2017
678 #define WGL_GREEN_SHIFT_EXT 0x2018
679 #define WGL_BLUE_BITS_EXT 0x2019
680 #define WGL_BLUE_SHIFT_EXT 0x201A
681 #define WGL_ALPHA_BITS_EXT 0x201B
682 #define WGL_ALPHA_SHIFT_EXT 0x201C
683 #define WGL_ACCUM_BITS_EXT 0x201D
684 #define WGL_ACCUM_RED_BITS_EXT 0x201E
685 #define WGL_ACCUM_GREEN_BITS_EXT 0x201F
686 #define WGL_ACCUM_BLUE_BITS_EXT 0x2020
687 #define WGL_ACCUM_ALPHA_BITS_EXT 0x2021
688 #define WGL_DEPTH_BITS_EXT 0x2022
689 #define WGL_STENCIL_BITS_EXT 0x2023
690 #define WGL_AUX_BUFFERS_EXT 0x2024
691 #define WGL_NO_ACCELERATION_EXT 0x2025
692 #define WGL_GENERIC_ACCELERATION_EXT 0x2026
693 #define WGL_FULL_ACCELERATION_EXT 0x2027
694 #define WGL_SWAP_EXCHANGE_EXT 0x2028
695 #define WGL_SWAP_COPY_EXT 0x2029
696 #define WGL_SWAP_UNDEFINED_EXT 0x202A
697 #define WGL_TYPE_RGBA_EXT 0x202B
698 #define WGL_TYPE_COLORINDEX_EXT 0x202C
699
700 typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
701 typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues);
702 typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues);
703
704 #define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT)
705 #define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT)
706 #define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT)
707
708 #define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format)
709
710 #endif /* WGL_EXT_pixel_format */
711
712 /* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */
713
714 #ifndef WGL_EXT_pixel_format_packed_float
715 #define WGL_EXT_pixel_format_packed_float 1
716
717 #define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8
718
719 #define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float)
720
721 #endif /* WGL_EXT_pixel_format_packed_float */
722
723 /* -------------------------- WGL_EXT_swap_control ------------------------- */
724
725 #ifndef WGL_EXT_swap_control
726 #define WGL_EXT_swap_control 1
727
728 typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);
729 typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
730
731 #define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT)
732 #define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT)
733
734 #define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control)
735
736 #endif /* WGL_EXT_swap_control */
737
738 /* ----------------------- WGL_EXT_swap_control_tear ----------------------- */
739
740 #ifndef WGL_EXT_swap_control_tear
741 #define WGL_EXT_swap_control_tear 1
742
743 #define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear)
744
745 #endif /* WGL_EXT_swap_control_tear */
746
747 /* --------------------- WGL_I3D_digital_video_control --------------------- */
748
749 #ifndef WGL_I3D_digital_video_control
750 #define WGL_I3D_digital_video_control 1
751
752 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050
753 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051
754 #define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052
755 #define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053
756
757 typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);
758 typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);
759
760 #define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D)
761 #define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D)
762
763 #define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control)
764
765 #endif /* WGL_I3D_digital_video_control */
766
767 /* ----------------------------- WGL_I3D_gamma ----------------------------- */
768
769 #ifndef WGL_I3D_gamma
770 #define WGL_I3D_gamma 1
771
772 #define WGL_GAMMA_TABLE_SIZE_I3D 0x204E
773 #define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F
774
775 typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue);
776 typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);
777 typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue);
778 typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);
779
780 #define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D)
781 #define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D)
782 #define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D)
783 #define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D)
784
785 #define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma)
786
787 #endif /* WGL_I3D_gamma */
788
789 /* ---------------------------- WGL_I3D_genlock ---------------------------- */
790
791 #ifndef WGL_I3D_genlock
792 #define WGL_I3D_genlock 1
793
794 #define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044
795 #define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045
796 #define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046
797 #define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047
798 #define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048
799 #define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049
800 #define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A
801 #define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B
802 #define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C
803
804 typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC);
805 typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC);
806 typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate);
807 typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay);
808 typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge);
809 typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource);
810 typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate);
811 typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay);
812 typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge);
813 typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource);
814 typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag);
815 typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay);
816
817 #define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D)
818 #define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D)
819 #define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D)
820 #define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D)
821 #define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D)
822 #define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D)
823 #define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D)
824 #define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D)
825 #define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D)
826 #define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D)
827 #define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D)
828 #define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D)
829
830 #define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock)
831
832 #endif /* WGL_I3D_genlock */
833
834 /* -------------------------- WGL_I3D_image_buffer ------------------------- */
835
836 #ifndef WGL_I3D_image_buffer
837 #define WGL_I3D_image_buffer 1
838
839 #define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001
840 #define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002
841
842 typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count);
843 typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags);
844 typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress);
845 typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count);
846
847 #define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D)
848 #define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D)
849 #define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D)
850 #define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D)
851
852 #define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer)
853
854 #endif /* WGL_I3D_image_buffer */
855
856 /* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */
857
858 #ifndef WGL_I3D_swap_frame_lock
859 #define WGL_I3D_swap_frame_lock 1
860
861 typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID);
862 typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID);
863 typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag);
864 typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag);
865
866 #define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D)
867 #define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D)
868 #define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D)
869 #define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D)
870
871 #define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock)
872
873 #endif /* WGL_I3D_swap_frame_lock */
874
875 /* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */
876
877 #ifndef WGL_I3D_swap_frame_usage
878 #define WGL_I3D_swap_frame_usage 1
879
880 typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void);
881 typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void);
882 typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage);
883 typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);
884
885 #define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D)
886 #define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D)
887 #define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D)
888 #define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D)
889
890 #define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage)
891
892 #endif /* WGL_I3D_swap_frame_usage */
893
894 /* --------------------------- WGL_NV_DX_interop --------------------------- */
895
896 #ifndef WGL_NV_DX_interop
897 #define WGL_NV_DX_interop 1
898
899 #define WGL_ACCESS_READ_ONLY_NV 0x0000
900 #define WGL_ACCESS_READ_WRITE_NV 0x0001
901 #define WGL_ACCESS_WRITE_DISCARD_NV 0x0002
902
903 typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice);
904 typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects);
905 typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access);
906 typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice);
907 typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access);
908 typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle);
909 typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects);
910 typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject);
911
912 #define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV)
913 #define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV)
914 #define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV)
915 #define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV)
916 #define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV)
917 #define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV)
918 #define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV)
919 #define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV)
920
921 #define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop)
922
923 #endif /* WGL_NV_DX_interop */
924
925 /* --------------------------- WGL_NV_DX_interop2 -------------------------- */
926
927 #ifndef WGL_NV_DX_interop2
928 #define WGL_NV_DX_interop2 1
929
930 #define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2)
931
932 #endif /* WGL_NV_DX_interop2 */
933
934 /* --------------------------- WGL_NV_copy_image --------------------------- */
935
936 #ifndef WGL_NV_copy_image
937 #define WGL_NV_copy_image 1
938
939 typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
940
941 #define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV)
942
943 #define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image)
944
945 #endif /* WGL_NV_copy_image */
946
947 /* ------------------------ WGL_NV_delay_before_swap ----------------------- */
948
949 #ifndef WGL_NV_delay_before_swap
950 #define WGL_NV_delay_before_swap 1
951
952 typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds);
953
954 #define wglDelayBeforeSwapNV WGLEW_GET_FUN(__wglewDelayBeforeSwapNV)
955
956 #define WGLEW_NV_delay_before_swap WGLEW_GET_VAR(__WGLEW_NV_delay_before_swap)
957
958 #endif /* WGL_NV_delay_before_swap */
959
960 /* -------------------------- WGL_NV_float_buffer -------------------------- */
961
962 #ifndef WGL_NV_float_buffer
963 #define WGL_NV_float_buffer 1
964
965 #define WGL_FLOAT_COMPONENTS_NV 0x20B0
966 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1
967 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2
968 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3
969 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4
970 #define WGL_TEXTURE_FLOAT_R_NV 0x20B5
971 #define WGL_TEXTURE_FLOAT_RG_NV 0x20B6
972 #define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7
973 #define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8
974
975 #define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer)
976
977 #endif /* WGL_NV_float_buffer */
978
979 /* -------------------------- WGL_NV_gpu_affinity -------------------------- */
980
981 #ifndef WGL_NV_gpu_affinity
982 #define WGL_NV_gpu_affinity 1
983
984 #define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0
985 #define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1
986
987 DECLARE_HANDLE(HGPUNV);
988 typedef struct _GPU_DEVICE {
989 DWORD cb;
990 CHAR DeviceName[32];
991 CHAR DeviceString[128];
992 DWORD Flags;
993 RECT rcVirtualScreen;
994 } GPU_DEVICE, *PGPU_DEVICE;
995
996 typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList);
997 typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc);
998 typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);
999 typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu);
1000 typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu);
1001
1002 #define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV)
1003 #define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV)
1004 #define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV)
1005 #define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV)
1006 #define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV)
1007
1008 #define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity)
1009
1010 #endif /* WGL_NV_gpu_affinity */
1011
1012 /* ---------------------- WGL_NV_multisample_coverage ---------------------- */
1013
1014 #ifndef WGL_NV_multisample_coverage
1015 #define WGL_NV_multisample_coverage 1
1016
1017 #define WGL_COVERAGE_SAMPLES_NV 0x2042
1018 #define WGL_COLOR_SAMPLES_NV 0x20B9
1019
1020 #define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage)
1021
1022 #endif /* WGL_NV_multisample_coverage */
1023
1024 /* -------------------------- WGL_NV_present_video ------------------------- */
1025
1026 #ifndef WGL_NV_present_video
1027 #define WGL_NV_present_video 1
1028
1029 #define WGL_NUM_VIDEO_SLOTS_NV 0x20F0
1030
1031 DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);
1032
1033 typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList);
1034 typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList);
1035 typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue);
1036
1037 #define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV)
1038 #define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV)
1039 #define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV)
1040
1041 #define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video)
1042
1043 #endif /* WGL_NV_present_video */
1044
1045 /* ---------------------- WGL_NV_render_depth_texture ---------------------- */
1046
1047 #ifndef WGL_NV_render_depth_texture
1048 #define WGL_NV_render_depth_texture 1
1049
1050 #define WGL_NO_TEXTURE_ARB 0x2077
1051 #define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3
1052 #define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4
1053 #define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5
1054 #define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6
1055 #define WGL_DEPTH_COMPONENT_NV 0x20A7
1056
1057 #define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture)
1058
1059 #endif /* WGL_NV_render_depth_texture */
1060
1061 /* -------------------- WGL_NV_render_texture_rectangle -------------------- */
1062
1063 #ifndef WGL_NV_render_texture_rectangle
1064 #define WGL_NV_render_texture_rectangle 1
1065
1066 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0
1067 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1
1068 #define WGL_TEXTURE_RECTANGLE_NV 0x20A2
1069
1070 #define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle)
1071
1072 #endif /* WGL_NV_render_texture_rectangle */
1073
1074 /* --------------------------- WGL_NV_swap_group --------------------------- */
1075
1076 #ifndef WGL_NV_swap_group
1077 #define WGL_NV_swap_group 1
1078
1079 typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier);
1080 typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);
1081 typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count);
1082 typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers);
1083 typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier);
1084 typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);
1085
1086 #define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV)
1087 #define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV)
1088 #define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV)
1089 #define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV)
1090 #define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV)
1091 #define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV)
1092
1093 #define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group)
1094
1095 #endif /* WGL_NV_swap_group */
1096
1097 /* ----------------------- WGL_NV_vertex_array_range ----------------------- */
1098
1099 #ifndef WGL_NV_vertex_array_range
1100 #define WGL_NV_vertex_array_range 1
1101
1102 typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);
1103 typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer);
1104
1105 #define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV)
1106 #define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV)
1107
1108 #define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range)
1109
1110 #endif /* WGL_NV_vertex_array_range */
1111
1112 /* -------------------------- WGL_NV_video_capture ------------------------- */
1113
1114 #ifndef WGL_NV_video_capture
1115 #define WGL_NV_video_capture 1
1116
1117 #define WGL_UNIQUE_ID_NV 0x20CE
1118 #define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF
1119
1120 DECLARE_HANDLE(HVIDEOINPUTDEVICENV);
1121
1122 typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);
1123 typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList);
1124 typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
1125 typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue);
1126 typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
1127
1128 #define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV)
1129 #define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV)
1130 #define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV)
1131 #define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV)
1132 #define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV)
1133
1134 #define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture)
1135
1136 #endif /* WGL_NV_video_capture */
1137
1138 /* -------------------------- WGL_NV_video_output -------------------------- */
1139
1140 #ifndef WGL_NV_video_output
1141 #define WGL_NV_video_output 1
1142
1143 #define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0
1144 #define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1
1145 #define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2
1146 #define WGL_VIDEO_OUT_COLOR_NV 0x20C3
1147 #define WGL_VIDEO_OUT_ALPHA_NV 0x20C4
1148 #define WGL_VIDEO_OUT_DEPTH_NV 0x20C5
1149 #define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
1150 #define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
1151 #define WGL_VIDEO_OUT_FRAME 0x20C8
1152 #define WGL_VIDEO_OUT_FIELD_1 0x20C9
1153 #define WGL_VIDEO_OUT_FIELD_2 0x20CA
1154 #define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB
1155 #define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC
1156
1157 DECLARE_HANDLE(HPVIDEODEV);
1158
1159 typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);
1160 typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice);
1161 typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);
1162 typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice);
1163 typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer);
1164 typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock);
1165
1166 #define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV)
1167 #define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV)
1168 #define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV)
1169 #define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV)
1170 #define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV)
1171 #define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV)
1172
1173 #define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output)
1174
1175 #endif /* WGL_NV_video_output */
1176
1177 /* -------------------------- WGL_OML_sync_control ------------------------- */
1178
1179 #ifndef WGL_OML_sync_control
1180 #define WGL_OML_sync_control 1
1181
1182 typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator);
1183 typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc);
1184 typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);
1185 typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);
1186 typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc);
1187 typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc);
1188
1189 #define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML)
1190 #define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML)
1191 #define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML)
1192 #define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML)
1193 #define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML)
1194 #define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML)
1195
1196 #define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control)
1197
1198 #endif /* WGL_OML_sync_control */
1199
1200 /* ------------------------------------------------------------------------- */
1201
1202 #ifdef GLEW_MX
1203 #define WGLEW_FUN_EXPORT
1204 #define WGLEW_VAR_EXPORT
1205 #else
1206 #define WGLEW_FUN_EXPORT GLEW_FUN_EXPORT
1207 #define WGLEW_VAR_EXPORT GLEW_VAR_EXPORT
1208 #endif /* GLEW_MX */
1209
1210 #ifdef GLEW_MX
1211 struct WGLEWContextStruct
1212 {
1213 #endif /* GLEW_MX */
1214
1215 WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL;
1216
1217 WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD;
1218 WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD;
1219 WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD;
1220 WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD;
1221 WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD;
1222 WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD;
1223 WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD;
1224 WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD;
1225 WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD;
1226
1227 WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB;
1228 WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB;
1229 WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB;
1230 WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB;
1231
1232 WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB;
1233
1234 WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB;
1235
1236 WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB;
1237 WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB;
1238
1239 WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB;
1240 WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB;
1241 WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB;
1242 WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB;
1243 WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB;
1244
1245 WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB;
1246 WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB;
1247 WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB;
1248
1249 WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB;
1250 WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB;
1251 WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB;
1252
1253 WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT;
1254 WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT;
1255 WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT;
1256 WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT;
1257
1258 WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT;
1259
1260 WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT;
1261 WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT;
1262
1263 WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT;
1264 WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT;
1265 WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT;
1266 WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT;
1267 WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT;
1268
1269 WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT;
1270 WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT;
1271 WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT;
1272
1273 WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT;
1274 WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT;
1275
1276 WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D;
1277 WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D;
1278
1279 WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D;
1280 WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D;
1281 WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D;
1282 WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D;
1283
1284 WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D;
1285 WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D;
1286 WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D;
1287 WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D;
1288 WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D;
1289 WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D;
1290 WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D;
1291 WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D;
1292 WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D;
1293 WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D;
1294 WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D;
1295 WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D;
1296
1297 WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D;
1298 WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D;
1299 WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D;
1300 WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D;
1301
1302 WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D;
1303 WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D;
1304 WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D;
1305 WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D;
1306
1307 WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D;
1308 WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D;
1309 WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D;
1310 WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D;
1311
1312 WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV;
1313 WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV;
1314 WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV;
1315 WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV;
1316 WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV;
1317 WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV;
1318 WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV;
1319 WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV;
1320
1321 WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV;
1322
1323 WGLEW_FUN_EXPORT PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV;
1324
1325 WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV;
1326 WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV;
1327 WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV;
1328 WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV;
1329 WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV;
1330
1331 WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV;
1332 WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV;
1333 WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV;
1334
1335 WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV;
1336 WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV;
1337 WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV;
1338 WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV;
1339 WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV;
1340 WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV;
1341
1342 WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV;
1343 WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV;
1344
1345 WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV;
1346 WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV;
1347 WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV;
1348 WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV;
1349 WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV;
1350
1351 WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV;
1352 WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV;
1353 WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV;
1354 WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV;
1355 WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV;
1356 WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV;
1357
1358 WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML;
1359 WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML;
1360 WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML;
1361 WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML;
1362 WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML;
1363 WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML;
1364 WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample;
1365 WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control;
1366 WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association;
1367 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region;
1368 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_context_flush_control;
1369 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context;
1370 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile;
1371 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness;
1372 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string;
1373 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB;
1374 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read;
1375 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample;
1376 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer;
1377 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format;
1378 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float;
1379 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture;
1380 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation;
1381 WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation;
1382 WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float;
1383 WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle;
1384 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile;
1385 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile;
1386 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float;
1387 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table;
1388 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string;
1389 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB;
1390 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read;
1391 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample;
1392 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer;
1393 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format;
1394 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float;
1395 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control;
1396 WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear;
1397 WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control;
1398 WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma;
1399 WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock;
1400 WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer;
1401 WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock;
1402 WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage;
1403 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop;
1404 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2;
1405 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image;
1406 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_delay_before_swap;
1407 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer;
1408 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity;
1409 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage;
1410 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video;
1411 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture;
1412 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle;
1413 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group;
1414 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range;
1415 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture;
1416 WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output;
1417 WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control;
1418
1419 #ifdef GLEW_MX
1420 }; /* WGLEWContextStruct */
1421 #endif /* GLEW_MX */
1422
1423 /* ------------------------------------------------------------------------- */
1424
1425 #ifdef GLEW_MX
1426
1427 typedef struct WGLEWContextStruct WGLEWContext;
1428 GLEWAPI GLenum GLEWAPIENTRY wglewContextInit (WGLEWContext *ctx);
1429 GLEWAPI GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext *ctx, const char *name);
1430
1431 #define wglewInit() wglewContextInit(wglewGetContext())
1432 #define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x)
1433
1434 #define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x))
1435 #define WGLEW_GET_FUN(x) wglewGetContext()->x
1436
1437 #else /* GLEW_MX */
1438
1439 GLEWAPI GLenum GLEWAPIENTRY wglewInit ();
1440 GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name);
1441
1442 #define WGLEW_GET_VAR(x) (*(const GLboolean*)&x)
1443 #define WGLEW_GET_FUN(x) x
1444
1445 #endif /* GLEW_MX */
1446
1447 GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name);
1448
1449 #ifdef __cplusplus
1450 }
1451 #endif
1452
1453 #undef GLEWAPI
1454
1455 #endif /* __wglew_h__ */
0 /*
1 ** The OpenGL Extension Wrangler Library
2 ** Copyright (C) 2008-2015, Nigel Stewart <nigels[]users sourceforge net>
3 ** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
4 ** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
5 ** Copyright (C) 2002, Lev Povalahev
6 ** All rights reserved.
7 **
8 ** Redistribution and use in source and binary forms, with or without
9 ** modification, are permitted provided that the following conditions are met:
10 **
11 ** * Redistributions of source code must retain the above copyright notice,
12 ** this list of conditions and the following disclaimer.
13 ** * Redistributions in binary form must reproduce the above copyright notice,
14 ** this list of conditions and the following disclaimer in the documentation
15 ** and/or other materials provided with the distribution.
16 ** * The name of the author may be used to endorse or promote products
17 ** derived from this software without specific prior written permission.
18 **
19 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29 ** THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #ifdef SLIC3R_GUI
33
34 #include <GL/glew.h>
35
36 #if defined(_WIN32)
37 # include <GL/wglew.h>
38 #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))
39 # include <GL/glxew.h>
40 #endif
41
42 #include <stddef.h> /* For size_t */
43
44 /*
45 * Define glewGetContext and related helper macros.
46 */
47 #ifdef GLEW_MX
48 # define glewGetContext() ctx
49 # ifdef _WIN32
50 # define GLEW_CONTEXT_ARG_DEF_INIT GLEWContext* ctx
51 # define GLEW_CONTEXT_ARG_VAR_INIT ctx
52 # define wglewGetContext() ctx
53 # define WGLEW_CONTEXT_ARG_DEF_INIT WGLEWContext* ctx
54 # define WGLEW_CONTEXT_ARG_DEF_LIST WGLEWContext* ctx
55 # else /* _WIN32 */
56 # define GLEW_CONTEXT_ARG_DEF_INIT void
57 # define GLEW_CONTEXT_ARG_VAR_INIT
58 # define glxewGetContext() ctx
59 # define GLXEW_CONTEXT_ARG_DEF_INIT void
60 # define GLXEW_CONTEXT_ARG_DEF_LIST GLXEWContext* ctx
61 # endif /* _WIN32 */
62 # define GLEW_CONTEXT_ARG_DEF_LIST GLEWContext* ctx
63 #else /* GLEW_MX */
64 # define GLEW_CONTEXT_ARG_DEF_INIT void
65 # define GLEW_CONTEXT_ARG_VAR_INIT
66 # define GLEW_CONTEXT_ARG_DEF_LIST void
67 # define WGLEW_CONTEXT_ARG_DEF_INIT void
68 # define WGLEW_CONTEXT_ARG_DEF_LIST void
69 # define GLXEW_CONTEXT_ARG_DEF_INIT void
70 # define GLXEW_CONTEXT_ARG_DEF_LIST void
71 #endif /* GLEW_MX */
72
73 #if defined(GLEW_REGAL)
74
75 /* In GLEW_REGAL mode we call direcly into the linked
76 libRegal.so glGetProcAddressREGAL for looking up
77 the GL function pointers. */
78
79 # undef glGetProcAddressREGAL
80 # ifdef WIN32
81 extern void * __stdcall glGetProcAddressREGAL(const GLchar *name);
82 static void * (__stdcall * regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL;
83 # else
84 extern void * glGetProcAddressREGAL(const GLchar *name);
85 static void * (*regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL;
86 # endif
87 # define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL)
88
89 #elif defined(__sgi) || defined (__sun) || defined(__HAIKU__) || defined(GLEW_APPLE_GLX)
90 #include <dlfcn.h>
91 #include <stdio.h>
92 #include <stdlib.h>
93
94 void* dlGetProcAddress (const GLubyte* name)
95 {
96 static void* h = NULL;
97 static void* gpa;
98
99 if (h == NULL)
100 {
101 if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL;
102 gpa = dlsym(h, "glXGetProcAddress");
103 }
104
105 if (gpa != NULL)
106 return ((void*(*)(const GLubyte*))gpa)(name);
107 else
108 return dlsym(h, (const char*)name);
109 }
110 #endif /* __sgi || __sun || GLEW_APPLE_GLX */
111
112 #if defined(__APPLE__)
113 #include <stdlib.h>
114 #include <string.h>
115 #include <AvailabilityMacros.h>
116
117 #ifdef MAC_OS_X_VERSION_10_3
118
119 #include <dlfcn.h>
120
121 void* NSGLGetProcAddress (const GLubyte *name)
122 {
123 static void* image = NULL;
124 void* addr;
125 if (NULL == image)
126 {
127 image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY);
128 }
129 if( !image ) return NULL;
130 addr = dlsym(image, (const char*)name);
131 if( addr ) return addr;
132 #ifdef GLEW_APPLE_GLX
133 return dlGetProcAddress( name ); // try next for glx symbols
134 #else
135 return NULL;
136 #endif
137 }
138 #else
139
140 #include <mach-o/dyld.h>
141
142 void* NSGLGetProcAddress (const GLubyte *name)
143 {
144 static const struct mach_header* image = NULL;
145 NSSymbol symbol;
146 char* symbolName;
147 if (NULL == image)
148 {
149 image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR);
150 }
151 /* prepend a '_' for the Unix C symbol mangling convention */
152 symbolName = malloc(strlen((const char*)name) + 2);
153 strcpy(symbolName+1, (const char*)name);
154 symbolName[0] = '_';
155 symbol = NULL;
156 /* if (NSIsSymbolNameDefined(symbolName))
157 symbol = NSLookupAndBindSymbol(symbolName); */
158 symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL;
159 free(symbolName);
160 if( symbol ) return NSAddressOfSymbol(symbol);
161 #ifdef GLEW_APPLE_GLX
162 return dlGetProcAddress( name ); // try next for glx symbols
163 #else
164 return NULL;
165 #endif
166 }
167 #endif /* MAC_OS_X_VERSION_10_3 */
168 #endif /* __APPLE__ */
169
170 /*
171 * Define glewGetProcAddress.
172 */
173 #if defined(GLEW_REGAL)
174 # define glewGetProcAddress(name) regalGetProcAddress((const GLchar *) name)
175 #elif defined(_WIN32)
176 # define glewGetProcAddress(name) ((LPCSTR)name)
177 #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)
178 # define glewGetProcAddress(name) NSGLGetProcAddress(name)
179 #elif defined(__sgi) || defined(__sun) || defined(__HAIKU__)
180 # define glewGetProcAddress(name) dlGetProcAddress(name)
181 #elif defined(__ANDROID__)
182 # define glewGetProcAddress(name) NULL /* TODO */
183 #elif defined(__native_client__)
184 # define glewGetProcAddress(name) NULL /* TODO */
185 #else /* __linux */
186 # define glewGetProcAddress(name) (*glXGetProcAddressARB)(name)
187 #endif
188
189 /*
190 * Redefine GLEW_GET_VAR etc without const cast
191 */
192
193 #undef GLEW_GET_VAR
194 #ifdef GLEW_MX
195 # define GLEW_GET_VAR(x) (glewGetContext()->x)
196 #else /* GLEW_MX */
197 # define GLEW_GET_VAR(x) (x)
198 #endif /* GLEW_MX */
199
200 #ifdef WGLEW_GET_VAR
201 # undef WGLEW_GET_VAR
202 # ifdef GLEW_MX
203 # define WGLEW_GET_VAR(x) (wglewGetContext()->x)
204 # else /* GLEW_MX */
205 # define WGLEW_GET_VAR(x) (x)
206 # endif /* GLEW_MX */
207 #endif /* WGLEW_GET_VAR */
208
209 #ifdef GLXEW_GET_VAR
210 # undef GLXEW_GET_VAR
211 # ifdef GLEW_MX
212 # define GLXEW_GET_VAR(x) (glxewGetContext()->x)
213 # else /* GLEW_MX */
214 # define GLXEW_GET_VAR(x) (x)
215 # endif /* GLEW_MX */
216 #endif /* GLXEW_GET_VAR */
217
218 /*
219 * GLEW, just like OpenGL or GLU, does not rely on the standard C library.
220 * These functions implement the functionality required in this file.
221 */
222 static GLuint _glewStrLen (const GLubyte* s)
223 {
224 GLuint i=0;
225 if (s == NULL) return 0;
226 while (s[i] != '\0') i++;
227 return i;
228 }
229
230 static GLuint _glewStrCLen (const GLubyte* s, GLubyte c)
231 {
232 GLuint i=0;
233 if (s == NULL) return 0;
234 while (s[i] != '\0' && s[i] != c) i++;
235 return (s[i] == '\0' || s[i] == c) ? i : 0;
236 }
237
238 static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n)
239 {
240 GLuint i=0;
241 if(a == NULL || b == NULL)
242 return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE;
243 while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++;
244 return i == n ? GL_TRUE : GL_FALSE;
245 }
246
247 static GLboolean _glewStrSame1 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)
248 {
249 while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t'))
250 {
251 (*a)++;
252 (*na)--;
253 }
254 if(*na >= nb)
255 {
256 GLuint i=0;
257 while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;
258 if(i == nb)
259 {
260 *a = *a + nb;
261 *na = *na - nb;
262 return GL_TRUE;
263 }
264 }
265 return GL_FALSE;
266 }
267
268 static GLboolean _glewStrSame2 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)
269 {
270 if(*na >= nb)
271 {
272 GLuint i=0;
273 while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;
274 if(i == nb)
275 {
276 *a = *a + nb;
277 *na = *na - nb;
278 return GL_TRUE;
279 }
280 }
281 return GL_FALSE;
282 }
283
284 static GLboolean _glewStrSame3 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)
285 {
286 if(*na >= nb)
287 {
288 GLuint i=0;
289 while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;
290 if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t'))
291 {
292 *a = *a + nb;
293 *na = *na - nb;
294 return GL_TRUE;
295 }
296 }
297 return GL_FALSE;
298 }
299
300 /*
301 * Search for name in the extensions string. Use of strstr()
302 * is not sufficient because extension names can be prefixes of
303 * other extension names. Could use strtok() but the constant
304 * string returned by glGetString might be in read-only memory.
305 */
306 static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end)
307 {
308 const GLubyte* p;
309 GLuint len = _glewStrLen((const GLubyte*)name);
310 p = start;
311 while (p < end)
312 {
313 GLuint n = _glewStrCLen(p, ' ');
314 if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;
315 p += n+1;
316 }
317 return GL_FALSE;
318 }
319
320 #if !defined(_WIN32) || !defined(GLEW_MX)
321
322 PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL;
323 PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL;
324 PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL;
325 PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL;
326
327 PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL;
328 PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL;
329 PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL;
330 PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL;
331 PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL;
332 PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL;
333 PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL;
334 PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL;
335 PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL;
336 PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL;
337 PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL;
338 PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL;
339 PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL;
340 PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL;
341 PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL;
342 PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL;
343 PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL;
344 PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL;
345 PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL;
346 PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL;
347 PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL;
348 PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL;
349 PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL;
350 PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL;
351 PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL;
352 PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL;
353 PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL;
354 PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL;
355 PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL;
356 PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL;
357 PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL;
358 PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL;
359 PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL;
360 PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL;
361 PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL;
362 PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL;
363 PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL;
364 PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL;
365 PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL;
366 PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL;
367 PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL;
368 PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL;
369 PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL;
370 PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL;
371 PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL;
372 PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL;
373
374 PFNGLBLENDCOLORPROC __glewBlendColor = NULL;
375 PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL;
376 PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL;
377 PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL;
378 PFNGLFOGCOORDDPROC __glewFogCoordd = NULL;
379 PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL;
380 PFNGLFOGCOORDFPROC __glewFogCoordf = NULL;
381 PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL;
382 PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL;
383 PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL;
384 PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL;
385 PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL;
386 PFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL;
387 PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL;
388 PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL;
389 PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL;
390 PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL;
391 PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL;
392 PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL;
393 PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL;
394 PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL;
395 PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL;
396 PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL;
397 PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL;
398 PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL;
399 PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL;
400 PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL;
401 PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL;
402 PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL;
403 PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL;
404 PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL;
405 PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL;
406 PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL;
407 PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL;
408 PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL;
409 PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL;
410 PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL;
411 PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL;
412 PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL;
413 PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL;
414 PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL;
415 PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL;
416 PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL;
417 PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL;
418 PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL;
419 PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL;
420 PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL;
421
422 PFNGLBEGINQUERYPROC __glewBeginQuery = NULL;
423 PFNGLBINDBUFFERPROC __glewBindBuffer = NULL;
424 PFNGLBUFFERDATAPROC __glewBufferData = NULL;
425 PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL;
426 PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL;
427 PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL;
428 PFNGLENDQUERYPROC __glewEndQuery = NULL;
429 PFNGLGENBUFFERSPROC __glewGenBuffers = NULL;
430 PFNGLGENQUERIESPROC __glewGenQueries = NULL;
431 PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL;
432 PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL;
433 PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL;
434 PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL;
435 PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL;
436 PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL;
437 PFNGLISBUFFERPROC __glewIsBuffer = NULL;
438 PFNGLISQUERYPROC __glewIsQuery = NULL;
439 PFNGLMAPBUFFERPROC __glewMapBuffer = NULL;
440 PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL;
441
442 PFNGLATTACHSHADERPROC __glewAttachShader = NULL;
443 PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL;
444 PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL;
445 PFNGLCOMPILESHADERPROC __glewCompileShader = NULL;
446 PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL;
447 PFNGLCREATESHADERPROC __glewCreateShader = NULL;
448 PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL;
449 PFNGLDELETESHADERPROC __glewDeleteShader = NULL;
450 PFNGLDETACHSHADERPROC __glewDetachShader = NULL;
451 PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL;
452 PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL;
453 PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL;
454 PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL;
455 PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL;
456 PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL;
457 PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL;
458 PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL;
459 PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL;
460 PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL;
461 PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL;
462 PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL;
463 PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL;
464 PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL;
465 PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL;
466 PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL;
467 PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL;
468 PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL;
469 PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL;
470 PFNGLISPROGRAMPROC __glewIsProgram = NULL;
471 PFNGLISSHADERPROC __glewIsShader = NULL;
472 PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL;
473 PFNGLSHADERSOURCEPROC __glewShaderSource = NULL;
474 PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL;
475 PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL;
476 PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL;
477 PFNGLUNIFORM1FPROC __glewUniform1f = NULL;
478 PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL;
479 PFNGLUNIFORM1IPROC __glewUniform1i = NULL;
480 PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL;
481 PFNGLUNIFORM2FPROC __glewUniform2f = NULL;
482 PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL;
483 PFNGLUNIFORM2IPROC __glewUniform2i = NULL;
484 PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL;
485 PFNGLUNIFORM3FPROC __glewUniform3f = NULL;
486 PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL;
487 PFNGLUNIFORM3IPROC __glewUniform3i = NULL;
488 PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL;
489 PFNGLUNIFORM4FPROC __glewUniform4f = NULL;
490 PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL;
491 PFNGLUNIFORM4IPROC __glewUniform4i = NULL;
492 PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL;
493 PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL;
494 PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL;
495 PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL;
496 PFNGLUSEPROGRAMPROC __glewUseProgram = NULL;
497 PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL;
498 PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL;
499 PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL;
500 PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL;
501 PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL;
502 PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL;
503 PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL;
504 PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL;
505 PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL;
506 PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL;
507 PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL;
508 PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL;
509 PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL;
510 PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL;
511 PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL;
512 PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL;
513 PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL;
514 PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL;
515 PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL;
516 PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL;
517 PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL;
518 PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL;
519 PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL;
520 PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL;
521 PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL;
522 PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL;
523 PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL;
524 PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL;
525 PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL;
526 PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL;
527 PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL;
528 PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL;
529 PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL;
530 PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL;
531 PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL;
532 PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL;
533 PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL;
534 PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL;
535
536 PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL;
537 PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL;
538 PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL;
539 PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL;
540 PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL;
541 PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL;
542
543 PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL;
544 PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL;
545 PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL;
546 PFNGLCLAMPCOLORPROC __glewClampColor = NULL;
547 PFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL;
548 PFNGLCLEARBUFFERFVPROC __glewClearBufferfv = NULL;
549 PFNGLCLEARBUFFERIVPROC __glewClearBufferiv = NULL;
550 PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv = NULL;
551 PFNGLCOLORMASKIPROC __glewColorMaski = NULL;
552 PFNGLDISABLEIPROC __glewDisablei = NULL;
553 PFNGLENABLEIPROC __glewEnablei = NULL;
554 PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL;
555 PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL;
556 PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL;
557 PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL;
558 PFNGLGETSTRINGIPROC __glewGetStringi = NULL;
559 PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL;
560 PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL;
561 PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying = NULL;
562 PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv = NULL;
563 PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv = NULL;
564 PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv = NULL;
565 PFNGLISENABLEDIPROC __glewIsEnabledi = NULL;
566 PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv = NULL;
567 PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv = NULL;
568 PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings = NULL;
569 PFNGLUNIFORM1UIPROC __glewUniform1ui = NULL;
570 PFNGLUNIFORM1UIVPROC __glewUniform1uiv = NULL;
571 PFNGLUNIFORM2UIPROC __glewUniform2ui = NULL;
572 PFNGLUNIFORM2UIVPROC __glewUniform2uiv = NULL;
573 PFNGLUNIFORM3UIPROC __glewUniform3ui = NULL;
574 PFNGLUNIFORM3UIVPROC __glewUniform3uiv = NULL;
575 PFNGLUNIFORM4UIPROC __glewUniform4ui = NULL;
576 PFNGLUNIFORM4UIVPROC __glewUniform4uiv = NULL;
577 PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i = NULL;
578 PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv = NULL;
579 PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui = NULL;
580 PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv = NULL;
581 PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i = NULL;
582 PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv = NULL;
583 PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui = NULL;
584 PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv = NULL;
585 PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i = NULL;
586 PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv = NULL;
587 PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui = NULL;
588 PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv = NULL;
589 PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv = NULL;
590 PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i = NULL;
591 PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv = NULL;
592 PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv = NULL;
593 PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv = NULL;
594 PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui = NULL;
595 PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL;
596 PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL;
597 PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL;
598
599 PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL;
600 PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL;
601 PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL;
602 PFNGLTEXBUFFERPROC __glewTexBuffer = NULL;
603
604 PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL;
605 PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL;
606 PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL;
607
608 PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor = NULL;
609
610 PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei = NULL;
611 PFNGLBLENDEQUATIONIPROC __glewBlendEquationi = NULL;
612 PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei = NULL;
613 PFNGLBLENDFUNCIPROC __glewBlendFunci = NULL;
614 PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading = NULL;
615
616 PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus = NULL;
617 PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage = NULL;
618 PFNGLGETNTEXIMAGEPROC __glewGetnTexImage = NULL;
619 PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv = NULL;
620
621 PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL;
622
623 PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD = NULL;
624 PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD = NULL;
625 PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD = NULL;
626 PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD = NULL;
627
628 PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL;
629 PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL;
630 PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL;
631 PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL;
632
633 PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD = NULL;
634
635 PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL;
636 PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL;
637
638 PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD = NULL;
639 PFNGLGENNAMESAMDPROC __glewGenNamesAMD = NULL;
640 PFNGLISNAMEAMDPROC __glewIsNameAMD = NULL;
641
642 PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD = NULL;
643
644 PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL;
645 PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL;
646 PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL;
647 PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL;
648 PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL;
649 PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL;
650 PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL;
651 PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL;
652 PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL;
653 PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL;
654 PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL;
655
656 PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL;
657
658 PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD = NULL;
659 PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD = NULL;
660
661 PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL;
662
663 PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL;
664 PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL;
665
666 PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE = NULL;
667
668 PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE = NULL;
669
670 PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE = NULL;
671 PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE = NULL;
672 PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE = NULL;
673
674 PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE = NULL;
675 PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE = NULL;
676 PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE = NULL;
677 PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE = NULL;
678 PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE = NULL;
679 PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE = NULL;
680 PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE = NULL;
681 PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE = NULL;
682 PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE = NULL;
683 PFNGLISQUERYANGLEPROC __glewIsQueryANGLE = NULL;
684 PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE = NULL;
685
686 PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE = NULL;
687
688 PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL;
689 PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL;
690 PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL;
691 PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL;
692 PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL;
693
694 PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL;
695 PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL;
696 PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL;
697 PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL;
698 PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL;
699 PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL;
700 PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL;
701 PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL;
702
703 PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL;
704 PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL;
705
706 PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL;
707 PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL;
708 PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL;
709
710 PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL;
711 PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL;
712
713 PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL;
714 PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL;
715 PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL;
716 PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL;
717
718 PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL;
719 PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL;
720 PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL;
721
722 PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL;
723 PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL;
724 PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL;
725 PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL;
726 PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL;
727 PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL;
728 PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL;
729
730 PFNGLCLEARDEPTHFPROC __glewClearDepthf = NULL;
731 PFNGLDEPTHRANGEFPROC __glewDepthRangef = NULL;
732 PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat = NULL;
733 PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler = NULL;
734 PFNGLSHADERBINARYPROC __glewShaderBinary = NULL;
735
736 PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion = NULL;
737
738 PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB = NULL;
739
740 PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = NULL;
741 PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL;
742 PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL;
743
744 PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB = NULL;
745 PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB = NULL;
746 PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB = NULL;
747 PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB = NULL;
748 PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB = NULL;
749 PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB = NULL;
750 PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB = NULL;
751 PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB = NULL;
752 PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB = NULL;
753 PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB = NULL;
754 PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB = NULL;
755 PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB = NULL;
756 PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB = NULL;
757 PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB = NULL;
758 PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB = NULL;
759 PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB = NULL;
760
761 PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL;
762 PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL;
763
764 PFNGLBUFFERSTORAGEPROC __glewBufferStorage = NULL;
765 PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT = NULL;
766
767 PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL;
768
769 PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL;
770 PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL;
771 PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL;
772 PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL;
773
774 PFNGLCLEARTEXIMAGEPROC __glewClearTexImage = NULL;
775 PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage = NULL;
776
777 PFNGLCLIPCONTROLPROC __glewClipControl = NULL;
778
779 PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL;
780
781 PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL;
782 PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL;
783
784 PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB = NULL;
785
786 PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL;
787
788 PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL;
789
790 PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB = NULL;
791 PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB = NULL;
792 PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB = NULL;
793 PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB = NULL;
794
795 PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit = NULL;
796 PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer = NULL;
797 PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus = NULL;
798 PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData = NULL;
799 PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData = NULL;
800 PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi = NULL;
801 PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv = NULL;
802 PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv = NULL;
803 PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv = NULL;
804 PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D = NULL;
805 PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D = NULL;
806 PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D = NULL;
807 PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData = NULL;
808 PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D = NULL;
809 PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D = NULL;
810 PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D = NULL;
811 PFNGLCREATEBUFFERSPROC __glewCreateBuffers = NULL;
812 PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers = NULL;
813 PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines = NULL;
814 PFNGLCREATEQUERIESPROC __glewCreateQueries = NULL;
815 PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers = NULL;
816 PFNGLCREATESAMPLERSPROC __glewCreateSamplers = NULL;
817 PFNGLCREATETEXTURESPROC __glewCreateTextures = NULL;
818 PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks = NULL;
819 PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays = NULL;
820 PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib = NULL;
821 PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib = NULL;
822 PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange = NULL;
823 PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap = NULL;
824 PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage = NULL;
825 PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v = NULL;
826 PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv = NULL;
827 PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv = NULL;
828 PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData = NULL;
829 PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv = NULL;
830 PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv = NULL;
831 PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv = NULL;
832 PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v = NULL;
833 PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv = NULL;
834 PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v = NULL;
835 PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv = NULL;
836 PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage = NULL;
837 PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv = NULL;
838 PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv = NULL;
839 PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv = NULL;
840 PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv = NULL;
841 PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv = NULL;
842 PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv = NULL;
843 PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v = NULL;
844 PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v = NULL;
845 PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv = NULL;
846 PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv = NULL;
847 PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv = NULL;
848 PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv = NULL;
849 PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData = NULL;
850 PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData = NULL;
851 PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer = NULL;
852 PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange = NULL;
853 PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData = NULL;
854 PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage = NULL;
855 PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData = NULL;
856 PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer = NULL;
857 PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers = NULL;
858 PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri = NULL;
859 PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer = NULL;
860 PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer = NULL;
861 PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture = NULL;
862 PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer = NULL;
863 PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage = NULL;
864 PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample = NULL;
865 PFNGLTEXTUREBUFFERPROC __glewTextureBuffer = NULL;
866 PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange = NULL;
867 PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv = NULL;
868 PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv = NULL;
869 PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf = NULL;
870 PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv = NULL;
871 PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri = NULL;
872 PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv = NULL;
873 PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D = NULL;
874 PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D = NULL;
875 PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample = NULL;
876 PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D = NULL;
877 PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample = NULL;
878 PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D = NULL;
879 PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D = NULL;
880 PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D = NULL;
881 PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase = NULL;
882 PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange = NULL;
883 PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer = NULL;
884 PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding = NULL;
885 PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat = NULL;
886 PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat = NULL;
887 PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat = NULL;
888 PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor = NULL;
889 PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer = NULL;
890 PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer = NULL;
891 PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers = NULL;
892
893 PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL;
894
895 PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL;
896 PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL;
897 PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL;
898 PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL;
899
900 PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL;
901 PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL;
902 PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL;
903 PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL;
904
905 PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect = NULL;
906 PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect = NULL;
907
908 PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri = NULL;
909 PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv = NULL;
910 PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT = NULL;
911 PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT = NULL;
912
913 PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer = NULL;
914 PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer = NULL;
915 PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer = NULL;
916 PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL;
917 PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL;
918 PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL;
919 PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL;
920 PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL;
921 PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL;
922 PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL;
923 PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL;
924 PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL;
925 PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL;
926 PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL;
927 PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv = NULL;
928 PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv = NULL;
929 PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer = NULL;
930 PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer = NULL;
931 PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage = NULL;
932 PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample = NULL;
933
934 PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB = NULL;
935 PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL;
936 PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL;
937 PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL;
938
939 PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary = NULL;
940 PFNGLPROGRAMBINARYPROC __glewProgramBinary = NULL;
941 PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri = NULL;
942
943 PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage = NULL;
944 PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage = NULL;
945
946 PFNGLGETUNIFORMDVPROC __glewGetUniformdv = NULL;
947 PFNGLUNIFORM1DPROC __glewUniform1d = NULL;
948 PFNGLUNIFORM1DVPROC __glewUniform1dv = NULL;
949 PFNGLUNIFORM2DPROC __glewUniform2d = NULL;
950 PFNGLUNIFORM2DVPROC __glewUniform2dv = NULL;
951 PFNGLUNIFORM3DPROC __glewUniform3d = NULL;
952 PFNGLUNIFORM3DVPROC __glewUniform3dv = NULL;
953 PFNGLUNIFORM4DPROC __glewUniform4d = NULL;
954 PFNGLUNIFORM4DVPROC __glewUniform4dv = NULL;
955 PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv = NULL;
956 PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv = NULL;
957 PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv = NULL;
958 PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv = NULL;
959 PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv = NULL;
960 PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv = NULL;
961 PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv = NULL;
962 PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv = NULL;
963 PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv = NULL;
964
965 PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB = NULL;
966 PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB = NULL;
967 PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB = NULL;
968 PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB = NULL;
969 PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB = NULL;
970 PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB = NULL;
971 PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB = NULL;
972 PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB = NULL;
973 PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB = NULL;
974 PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB = NULL;
975 PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB = NULL;
976 PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB = NULL;
977 PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB = NULL;
978 PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB = NULL;
979 PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB = NULL;
980 PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB = NULL;
981 PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB = NULL;
982 PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB = NULL;
983 PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB = NULL;
984 PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB = NULL;
985 PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB = NULL;
986 PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB = NULL;
987 PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB = NULL;
988 PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB = NULL;
989 PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB = NULL;
990 PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB = NULL;
991 PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB = NULL;
992 PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB = NULL;
993 PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB = NULL;
994 PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB = NULL;
995 PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB = NULL;
996 PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB = NULL;
997 PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB = NULL;
998 PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB = NULL;
999 PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB = NULL;
1000 PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB = NULL;
1001
1002 PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL;
1003 PFNGLCOLORTABLEPROC __glewColorTable = NULL;
1004 PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL;
1005 PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL;
1006 PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL;
1007 PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL;
1008 PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL;
1009 PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL;
1010 PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL;
1011 PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL;
1012 PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL;
1013 PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL;
1014 PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL;
1015 PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL;
1016 PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL;
1017 PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL;
1018 PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL;
1019 PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL;
1020 PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL;
1021 PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL;
1022 PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL;
1023 PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL;
1024 PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL;
1025 PFNGLGETMINMAXPROC __glewGetMinmax = NULL;
1026 PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL;
1027 PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL;
1028 PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL;
1029 PFNGLHISTOGRAMPROC __glewHistogram = NULL;
1030 PFNGLMINMAXPROC __glewMinmax = NULL;
1031 PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL;
1032 PFNGLRESETMINMAXPROC __glewResetMinmax = NULL;
1033 PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL;
1034
1035 PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB = NULL;
1036 PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB = NULL;
1037
1038 PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL;
1039 PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL;
1040 PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL;
1041
1042 PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ = NULL;
1043
1044 PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v = NULL;
1045
1046 PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData = NULL;
1047 PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData = NULL;
1048 PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer = NULL;
1049 PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer = NULL;
1050 PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage = NULL;
1051 PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage = NULL;
1052
1053 PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange = NULL;
1054 PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange = NULL;
1055
1056 PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL;
1057 PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL;
1058 PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL;
1059 PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL;
1060 PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL;
1061
1062 PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase = NULL;
1063 PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange = NULL;
1064 PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures = NULL;
1065 PFNGLBINDSAMPLERSPROC __glewBindSamplers = NULL;
1066 PFNGLBINDTEXTURESPROC __glewBindTextures = NULL;
1067 PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers = NULL;
1068
1069 PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL;
1070 PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL;
1071
1072 PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL;
1073
1074 PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL;
1075 PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL;
1076 PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL;
1077 PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL;
1078 PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL;
1079 PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL;
1080 PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL;
1081 PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL;
1082 PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL;
1083 PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL;
1084 PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL;
1085 PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL;
1086 PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL;
1087 PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL;
1088 PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL;
1089 PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL;
1090 PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL;
1091 PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL;
1092 PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL;
1093 PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL;
1094 PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL;
1095 PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL;
1096 PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL;
1097 PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL;
1098 PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL;
1099 PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL;
1100 PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL;
1101 PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL;
1102 PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL;
1103 PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL;
1104 PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL;
1105 PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL;
1106 PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL;
1107 PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL;
1108
1109 PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL;
1110 PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL;
1111 PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL;
1112 PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL;
1113 PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL;
1114 PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL;
1115 PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL;
1116 PFNGLISQUERYARBPROC __glewIsQueryARB = NULL;
1117
1118 PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB = NULL;
1119
1120 PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL;
1121 PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL;
1122
1123 PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv = NULL;
1124 PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex = NULL;
1125 PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation = NULL;
1126 PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex = NULL;
1127 PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName = NULL;
1128 PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv = NULL;
1129
1130 PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL;
1131
1132 PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB = NULL;
1133 PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB = NULL;
1134 PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB = NULL;
1135 PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB = NULL;
1136 PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB = NULL;
1137 PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB = NULL;
1138 PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB = NULL;
1139 PFNGLGETNMAPIVARBPROC __glewGetnMapivARB = NULL;
1140 PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB = NULL;
1141 PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB = NULL;
1142 PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB = NULL;
1143 PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB = NULL;
1144 PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB = NULL;
1145 PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB = NULL;
1146 PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB = NULL;
1147 PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB = NULL;
1148 PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB = NULL;
1149 PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB = NULL;
1150 PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB = NULL;
1151 PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB = NULL;
1152
1153 PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB = NULL;
1154 PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB = NULL;
1155
1156 PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL;
1157
1158 PFNGLBINDSAMPLERPROC __glewBindSampler = NULL;
1159 PFNGLDELETESAMPLERSPROC __glewDeleteSamplers = NULL;
1160 PFNGLGENSAMPLERSPROC __glewGenSamplers = NULL;
1161 PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv = NULL;
1162 PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv = NULL;
1163 PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv = NULL;
1164 PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv = NULL;
1165 PFNGLISSAMPLERPROC __glewIsSampler = NULL;
1166 PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv = NULL;
1167 PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv = NULL;
1168 PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf = NULL;
1169 PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv = NULL;
1170 PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri = NULL;
1171 PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv = NULL;
1172
1173 PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram = NULL;
1174 PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline = NULL;
1175 PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv = NULL;
1176 PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines = NULL;
1177 PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines = NULL;
1178 PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog = NULL;
1179 PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv = NULL;
1180 PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline = NULL;
1181 PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d = NULL;
1182 PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv = NULL;
1183 PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f = NULL;
1184 PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv = NULL;
1185 PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i = NULL;
1186 PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv = NULL;
1187 PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui = NULL;
1188 PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv = NULL;
1189 PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d = NULL;
1190 PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv = NULL;
1191 PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f = NULL;
1192 PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv = NULL;
1193 PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i = NULL;
1194 PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv = NULL;
1195 PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui = NULL;
1196 PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv = NULL;
1197 PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d = NULL;
1198 PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv = NULL;
1199 PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f = NULL;
1200 PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv = NULL;
1201 PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i = NULL;
1202 PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv = NULL;
1203 PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui = NULL;
1204 PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv = NULL;
1205 PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d = NULL;
1206 PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv = NULL;
1207 PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f = NULL;
1208 PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv = NULL;
1209 PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i = NULL;
1210 PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv = NULL;
1211 PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui = NULL;
1212 PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv = NULL;
1213 PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv = NULL;
1214 PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv = NULL;
1215 PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv = NULL;
1216 PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv = NULL;
1217 PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv = NULL;
1218 PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv = NULL;
1219 PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv = NULL;
1220 PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv = NULL;
1221 PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv = NULL;
1222 PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv = NULL;
1223 PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv = NULL;
1224 PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv = NULL;
1225 PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv = NULL;
1226 PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv = NULL;
1227 PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv = NULL;
1228 PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv = NULL;
1229 PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv = NULL;
1230 PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv = NULL;
1231 PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages = NULL;
1232 PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline = NULL;
1233
1234 PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv = NULL;
1235
1236 PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture = NULL;
1237 PFNGLMEMORYBARRIERPROC __glewMemoryBarrier = NULL;
1238
1239 PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL;
1240 PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL;
1241 PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL;
1242 PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL;
1243 PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL;
1244 PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL;
1245 PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL;
1246 PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL;
1247 PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL;
1248 PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL;
1249 PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL;
1250 PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL;
1251 PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL;
1252 PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL;
1253 PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL;
1254 PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL;
1255 PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL;
1256 PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL;
1257 PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL;
1258 PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL;
1259 PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL;
1260 PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL;
1261 PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL;
1262 PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL;
1263 PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL;
1264 PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL;
1265 PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL;
1266 PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL;
1267 PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL;
1268 PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL;
1269 PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL;
1270 PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL;
1271 PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL;
1272 PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL;
1273 PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL;
1274 PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL;
1275 PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL;
1276 PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL;
1277 PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL;
1278
1279 PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding = NULL;
1280
1281 PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName = NULL;
1282 PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName = NULL;
1283 PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv = NULL;
1284 PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv = NULL;
1285 PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex = NULL;
1286 PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation = NULL;
1287 PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv = NULL;
1288 PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv = NULL;
1289
1290 PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB = NULL;
1291 PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB = NULL;
1292 PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB = NULL;
1293 PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL;
1294 PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL;
1295 PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL;
1296
1297 PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB = NULL;
1298
1299 PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB = NULL;
1300 PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT = NULL;
1301
1302 PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL;
1303 PFNGLDELETESYNCPROC __glewDeleteSync = NULL;
1304 PFNGLFENCESYNCPROC __glewFenceSync = NULL;
1305 PFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL;
1306 PFNGLGETSYNCIVPROC __glewGetSynciv = NULL;
1307 PFNGLISSYNCPROC __glewIsSync = NULL;
1308 PFNGLWAITSYNCPROC __glewWaitSync = NULL;
1309
1310 PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv = NULL;
1311 PFNGLPATCHPARAMETERIPROC __glewPatchParameteri = NULL;
1312
1313 PFNGLTEXTUREBARRIERPROC __glewTextureBarrier = NULL;
1314
1315 PFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL;
1316
1317 PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange = NULL;
1318 PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT = NULL;
1319
1320 PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL;
1321 PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL;
1322 PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL;
1323 PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL;
1324 PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL;
1325 PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL;
1326 PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL;
1327
1328 PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL;
1329 PFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL;
1330 PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL;
1331 PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL;
1332
1333 PFNGLTEXSTORAGE1DPROC __glewTexStorage1D = NULL;
1334 PFNGLTEXSTORAGE2DPROC __glewTexStorage2D = NULL;
1335 PFNGLTEXSTORAGE3DPROC __glewTexStorage3D = NULL;
1336 PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT = NULL;
1337 PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT = NULL;
1338 PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT = NULL;
1339
1340 PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample = NULL;
1341 PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample = NULL;
1342 PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT = NULL;
1343 PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT = NULL;
1344
1345 PFNGLTEXTUREVIEWPROC __glewTextureView = NULL;
1346
1347 PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v = NULL;
1348 PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v = NULL;
1349 PFNGLQUERYCOUNTERPROC __glewQueryCounter = NULL;
1350
1351 PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback = NULL;
1352 PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks = NULL;
1353 PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback = NULL;
1354 PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks = NULL;
1355 PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback = NULL;
1356 PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback = NULL;
1357 PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback = NULL;
1358
1359 PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed = NULL;
1360 PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream = NULL;
1361 PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed = NULL;
1362 PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv = NULL;
1363
1364 PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced = NULL;
1365 PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced = NULL;
1366
1367 PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL;
1368 PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL;
1369 PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL;
1370 PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL;
1371
1372 PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL;
1373 PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL;
1374 PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL;
1375 PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL;
1376 PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL;
1377 PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL;
1378 PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL;
1379 PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL;
1380 PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL;
1381 PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL;
1382
1383 PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL;
1384 PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL;
1385 PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL;
1386 PFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL;
1387
1388 PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv = NULL;
1389 PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d = NULL;
1390 PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv = NULL;
1391 PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d = NULL;
1392 PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv = NULL;
1393 PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d = NULL;
1394 PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv = NULL;
1395 PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d = NULL;
1396 PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv = NULL;
1397 PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer = NULL;
1398
1399 PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer = NULL;
1400 PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT = NULL;
1401 PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT = NULL;
1402 PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT = NULL;
1403 PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT = NULL;
1404 PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT = NULL;
1405 PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT = NULL;
1406 PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding = NULL;
1407 PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat = NULL;
1408 PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat = NULL;
1409 PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat = NULL;
1410 PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor = NULL;
1411
1412 PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL;
1413 PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL;
1414 PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL;
1415 PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL;
1416 PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL;
1417 PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL;
1418 PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL;
1419 PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL;
1420 PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL;
1421 PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL;
1422
1423 PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL;
1424 PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL;
1425 PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL;
1426 PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL;
1427 PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL;
1428 PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL;
1429 PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL;
1430 PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL;
1431 PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL;
1432 PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL;
1433 PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL;
1434
1435 PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL;
1436 PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL;
1437 PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL;
1438 PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL;
1439 PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL;
1440 PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL;
1441 PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL;
1442 PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL;
1443 PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL;
1444 PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL;
1445 PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL;
1446 PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL;
1447 PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL;
1448 PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL;
1449 PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL;
1450 PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL;
1451 PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL;
1452 PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL;
1453 PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL;
1454 PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL;
1455 PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL;
1456 PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL;
1457 PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL;
1458 PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL;
1459 PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL;
1460 PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL;
1461 PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL;
1462 PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL;
1463 PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL;
1464 PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL;
1465 PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL;
1466 PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL;
1467 PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL;
1468 PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL;
1469 PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL;
1470 PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL;
1471 PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL;
1472 PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL;
1473 PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL;
1474 PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL;
1475 PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL;
1476 PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL;
1477 PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL;
1478 PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL;
1479 PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL;
1480 PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL;
1481 PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL;
1482 PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL;
1483 PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL;
1484 PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL;
1485 PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL;
1486 PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL;
1487 PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL;
1488 PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL;
1489 PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL;
1490 PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL;
1491 PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL;
1492 PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL;
1493 PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL;
1494 PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL;
1495 PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL;
1496 PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL;
1497
1498 PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL;
1499 PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL;
1500 PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL;
1501
1502 PFNGLCOLORP3UIPROC __glewColorP3ui = NULL;
1503 PFNGLCOLORP3UIVPROC __glewColorP3uiv = NULL;
1504 PFNGLCOLORP4UIPROC __glewColorP4ui = NULL;
1505 PFNGLCOLORP4UIVPROC __glewColorP4uiv = NULL;
1506 PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui = NULL;
1507 PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv = NULL;
1508 PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui = NULL;
1509 PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv = NULL;
1510 PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui = NULL;
1511 PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv = NULL;
1512 PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui = NULL;
1513 PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv = NULL;
1514 PFNGLNORMALP3UIPROC __glewNormalP3ui = NULL;
1515 PFNGLNORMALP3UIVPROC __glewNormalP3uiv = NULL;
1516 PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui = NULL;
1517 PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv = NULL;
1518 PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui = NULL;
1519 PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv = NULL;
1520 PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui = NULL;
1521 PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv = NULL;
1522 PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui = NULL;
1523 PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv = NULL;
1524 PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui = NULL;
1525 PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv = NULL;
1526 PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui = NULL;
1527 PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv = NULL;
1528 PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui = NULL;
1529 PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv = NULL;
1530 PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui = NULL;
1531 PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv = NULL;
1532 PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui = NULL;
1533 PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv = NULL;
1534 PFNGLVERTEXP2UIPROC __glewVertexP2ui = NULL;
1535 PFNGLVERTEXP2UIVPROC __glewVertexP2uiv = NULL;
1536 PFNGLVERTEXP3UIPROC __glewVertexP3ui = NULL;
1537 PFNGLVERTEXP3UIVPROC __glewVertexP3uiv = NULL;
1538 PFNGLVERTEXP4UIPROC __glewVertexP4ui = NULL;
1539 PFNGLVERTEXP4UIVPROC __glewVertexP4uiv = NULL;
1540
1541 PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv = NULL;
1542 PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed = NULL;
1543 PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v = NULL;
1544 PFNGLGETFLOATI_VPROC __glewGetFloati_v = NULL;
1545 PFNGLSCISSORARRAYVPROC __glewScissorArrayv = NULL;
1546 PFNGLSCISSORINDEXEDPROC __glewScissorIndexed = NULL;
1547 PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv = NULL;
1548 PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv = NULL;
1549 PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf = NULL;
1550 PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv = NULL;
1551
1552 PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL;
1553 PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL;
1554 PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL;
1555 PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL;
1556 PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL;
1557 PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL;
1558 PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL;
1559 PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL;
1560 PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL;
1561 PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL;
1562 PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL;
1563 PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL;
1564 PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL;
1565 PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL;
1566 PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL;
1567 PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL;
1568
1569 PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL;
1570
1571 PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL;
1572 PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL;
1573 PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL;
1574
1575 PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL;
1576 PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL;
1577 PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL;
1578 PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL;
1579
1580 PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL;
1581 PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL;
1582 PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL;
1583 PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL;
1584 PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL;
1585 PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL;
1586 PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL;
1587 PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL;
1588 PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL;
1589 PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL;
1590 PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL;
1591 PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL;
1592 PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL;
1593 PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL;
1594
1595 PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL;
1596 PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL;
1597
1598 PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI = NULL;
1599 PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI = NULL;
1600
1601 PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL;
1602 PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL;
1603
1604 PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL;
1605 PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL;
1606 PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL;
1607 PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL;
1608 PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL;
1609 PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL;
1610 PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL;
1611 PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL;
1612 PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL;
1613 PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL;
1614 PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL;
1615 PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL;
1616
1617 PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL;
1618 PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL;
1619 PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL;
1620
1621 PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL;
1622 PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL;
1623 PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL;
1624 PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL;
1625 PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL;
1626 PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL;
1627 PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL;
1628 PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL;
1629 PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL;
1630 PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL;
1631 PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL;
1632 PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL;
1633 PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL;
1634 PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI = NULL;
1635 PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI = NULL;
1636 PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI = NULL;
1637 PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI = NULL;
1638 PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI = NULL;
1639 PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI = NULL;
1640 PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI = NULL;
1641 PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI = NULL;
1642 PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL;
1643 PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL;
1644 PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL;
1645 PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL;
1646 PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL;
1647 PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL;
1648 PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL;
1649 PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL;
1650 PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL;
1651 PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL;
1652 PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL;
1653 PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL;
1654 PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL;
1655 PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL;
1656 PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL;
1657 PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL;
1658 PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL;
1659 PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL;
1660 PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL;
1661 PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL;
1662 PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL;
1663 PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL;
1664 PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL;
1665 PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL;
1666
1667 PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL;
1668 PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL;
1669 PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL;
1670
1671 PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL;
1672
1673 PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL;
1674
1675 PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL;
1676
1677 PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL;
1678
1679 PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL;
1680 PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL;
1681
1682 PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL;
1683 PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL;
1684
1685 PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL;
1686 PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL;
1687 PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL;
1688 PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL;
1689 PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL;
1690 PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL;
1691 PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL;
1692 PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL;
1693 PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL;
1694 PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL;
1695 PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL;
1696 PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL;
1697 PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL;
1698
1699 PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL;
1700 PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL;
1701
1702 PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL;
1703 PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL;
1704 PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL;
1705 PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL;
1706 PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL;
1707
1708 PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL;
1709 PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL;
1710
1711 PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT = NULL;
1712 PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT = NULL;
1713
1714 PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT = NULL;
1715 PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT = NULL;
1716 PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT = NULL;
1717
1718 PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL;
1719
1720 PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT = NULL;
1721 PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT = NULL;
1722 PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT = NULL;
1723 PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT = NULL;
1724 PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT = NULL;
1725 PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT = NULL;
1726 PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT = NULL;
1727 PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT = NULL;
1728 PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT = NULL;
1729 PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT = NULL;
1730 PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT = NULL;
1731 PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT = NULL;
1732 PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT = NULL;
1733 PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT = NULL;
1734 PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT = NULL;
1735 PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT = NULL;
1736 PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT = NULL;
1737 PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT = NULL;
1738 PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT = NULL;
1739 PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT = NULL;
1740 PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT = NULL;
1741 PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT = NULL;
1742 PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL;
1743 PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL;
1744 PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL;
1745 PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL;
1746 PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL;
1747 PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL;
1748 PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL;
1749 PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL;
1750 PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL;
1751 PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL;
1752 PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL;
1753 PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL;
1754 PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL;
1755 PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL;
1756 PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL;
1757 PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT = NULL;
1758 PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL;
1759 PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL;
1760 PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL;
1761 PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL;
1762 PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL;
1763 PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL;
1764 PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL;
1765 PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL;
1766 PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL;
1767 PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL;
1768 PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT = NULL;
1769 PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT = NULL;
1770 PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT = NULL;
1771 PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT = NULL;
1772 PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT = NULL;
1773 PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT = NULL;
1774 PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT = NULL;
1775 PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT = NULL;
1776 PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT = NULL;
1777 PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT = NULL;
1778 PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT = NULL;
1779 PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT = NULL;
1780 PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT = NULL;
1781 PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT = NULL;
1782 PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT = NULL;
1783 PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT = NULL;
1784 PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT = NULL;
1785 PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT = NULL;
1786 PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL;
1787 PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL;
1788 PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL;
1789 PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL;
1790 PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL;
1791 PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL;
1792 PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL;
1793 PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL;
1794 PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL;
1795 PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL;
1796 PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL;
1797 PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL;
1798 PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL;
1799 PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL;
1800 PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL;
1801 PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL;
1802 PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL;
1803 PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL;
1804 PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL;
1805 PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL;
1806 PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL;
1807 PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT = NULL;
1808 PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT = NULL;
1809 PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT = NULL;
1810 PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT = NULL;
1811 PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT = NULL;
1812 PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT = NULL;
1813 PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT = NULL;
1814 PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT = NULL;
1815 PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT = NULL;
1816 PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT = NULL;
1817 PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT = NULL;
1818 PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT = NULL;
1819 PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT = NULL;
1820 PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT = NULL;
1821 PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT = NULL;
1822 PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT = NULL;
1823 PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT = NULL;
1824 PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT = NULL;
1825 PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT = NULL;
1826 PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT = NULL;
1827 PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT = NULL;
1828 PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT = NULL;
1829 PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT = NULL;
1830 PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT = NULL;
1831 PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT = NULL;
1832 PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT = NULL;
1833 PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT = NULL;
1834 PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT = NULL;
1835 PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT = NULL;
1836 PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT = NULL;
1837 PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT = NULL;
1838 PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT = NULL;
1839 PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT = NULL;
1840 PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT = NULL;
1841 PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT = NULL;
1842 PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT = NULL;
1843 PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT = NULL;
1844 PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT = NULL;
1845 PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT = NULL;
1846 PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL;
1847 PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL;
1848 PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL;
1849 PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL;
1850 PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL;
1851 PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL;
1852 PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL;
1853 PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL;
1854 PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT = NULL;
1855 PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT = NULL;
1856 PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT = NULL;
1857 PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT = NULL;
1858 PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT = NULL;
1859 PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT = NULL;
1860 PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT = NULL;
1861 PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT = NULL;
1862 PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT = NULL;
1863 PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT = NULL;
1864 PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT = NULL;
1865 PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT = NULL;
1866 PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT = NULL;
1867 PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT = NULL;
1868 PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT = NULL;
1869 PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL;
1870 PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL;
1871 PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL;
1872 PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL;
1873 PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL;
1874 PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL;
1875 PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL;
1876 PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL;
1877 PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL;
1878 PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL;
1879 PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL;
1880 PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL;
1881 PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL;
1882 PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL;
1883 PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL;
1884 PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL;
1885 PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL;
1886 PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL;
1887 PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL;
1888 PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL;
1889 PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL;
1890 PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL;
1891 PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL;
1892 PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL;
1893 PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL;
1894 PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL;
1895 PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL;
1896 PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL;
1897 PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL;
1898 PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL;
1899 PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL;
1900 PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL;
1901 PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL;
1902 PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL;
1903 PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL;
1904 PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL;
1905 PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL;
1906 PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL;
1907 PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL;
1908 PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT = NULL;
1909 PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT = NULL;
1910 PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT = NULL;
1911 PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT = NULL;
1912 PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT = NULL;
1913 PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT = NULL;
1914 PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT = NULL;
1915 PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT = NULL;
1916 PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT = NULL;
1917 PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT = NULL;
1918 PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL;
1919 PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL;
1920 PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL;
1921 PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL;
1922 PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL;
1923 PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL;
1924 PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL;
1925 PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL;
1926 PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL;
1927 PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL;
1928 PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL;
1929 PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL;
1930 PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT = NULL;
1931 PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL;
1932 PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL;
1933 PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL;
1934
1935 PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL;
1936 PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL;
1937 PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL;
1938 PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL;
1939 PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL;
1940 PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL;
1941
1942 PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL;
1943 PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL;
1944
1945 PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL;
1946
1947 PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL;
1948 PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL;
1949 PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL;
1950 PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL;
1951 PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL;
1952
1953 PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL;
1954 PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL;
1955 PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL;
1956 PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL;
1957 PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL;
1958 PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL;
1959 PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL;
1960 PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL;
1961 PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL;
1962 PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL;
1963 PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL;
1964 PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL;
1965 PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL;
1966 PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL;
1967 PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL;
1968 PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL;
1969 PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL;
1970 PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL;
1971
1972 PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL;
1973
1974 PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL;
1975
1976 PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL;
1977 PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL;
1978 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL;
1979 PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL;
1980 PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL;
1981 PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL;
1982 PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL;
1983 PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL;
1984 PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL;
1985 PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL;
1986 PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL;
1987 PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL;
1988 PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL;
1989 PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL;
1990 PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL;
1991 PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL;
1992 PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL;
1993
1994 PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL;
1995 PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL;
1996 PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL;
1997
1998 PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL;
1999 PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL;
2000
2001 PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL;
2002 PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL;
2003 PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL;
2004 PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL;
2005 PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL;
2006 PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL;
2007 PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL;
2008 PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL;
2009 PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL;
2010 PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL;
2011 PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL;
2012 PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL;
2013 PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL;
2014 PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL;
2015 PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL;
2016 PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL;
2017 PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL;
2018 PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL;
2019 PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL;
2020 PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL;
2021 PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL;
2022 PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL;
2023 PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL;
2024 PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL;
2025 PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL;
2026 PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL;
2027 PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL;
2028 PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL;
2029 PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL;
2030 PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL;
2031 PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL;
2032 PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL;
2033 PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL;
2034 PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL;
2035
2036 PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL;
2037 PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL;
2038 PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL;
2039 PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL;
2040 PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL;
2041 PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL;
2042 PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL;
2043 PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL;
2044 PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL;
2045 PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL;
2046
2047 PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL;
2048
2049 PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL;
2050
2051 PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL;
2052 PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL;
2053 PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL;
2054
2055 PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL;
2056 PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL;
2057
2058 PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL;
2059 PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL;
2060
2061 PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL;
2062 PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL;
2063 PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL;
2064 PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL;
2065
2066 PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL;
2067 PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL;
2068 PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL;
2069 PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL;
2070 PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL;
2071 PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL;
2072
2073 PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL;
2074 PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL;
2075
2076 PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL;
2077
2078 PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT = NULL;
2079
2080 PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL;
2081
2082 PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV = NULL;
2083 PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV = NULL;
2084 PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV = NULL;
2085 PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT = NULL;
2086
2087 PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL;
2088 PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL;
2089
2090 PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL;
2091 PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL;
2092 PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL;
2093 PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL;
2094 PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL;
2095 PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL;
2096 PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL;
2097 PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL;
2098 PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL;
2099 PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL;
2100 PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL;
2101 PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL;
2102 PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL;
2103 PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL;
2104 PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL;
2105 PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL;
2106 PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL;
2107
2108 PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL;
2109 PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL;
2110 PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL;
2111
2112 PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT = NULL;
2113 PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT = NULL;
2114
2115 PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL;
2116
2117 PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL;
2118 PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL;
2119 PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL;
2120
2121 PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL;
2122
2123 PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL;
2124
2125 PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL;
2126
2127 PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL;
2128 PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL;
2129 PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL;
2130 PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL;
2131 PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL;
2132 PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL;
2133
2134 PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL;
2135 PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL;
2136 PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL;
2137 PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL;
2138 PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL;
2139 PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL;
2140
2141 PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL;
2142
2143 PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL;
2144 PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL;
2145
2146 PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT = NULL;
2147 PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT = NULL;
2148 PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT = NULL;
2149 PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT = NULL;
2150 PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT = NULL;
2151 PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT = NULL;
2152 PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT = NULL;
2153
2154 PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL;
2155 PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL;
2156 PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL;
2157 PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL;
2158 PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL;
2159 PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL;
2160 PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL;
2161 PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL;
2162
2163 PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT = NULL;
2164 PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT = NULL;
2165 PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT = NULL;
2166 PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT = NULL;
2167 PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT = NULL;
2168 PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT = NULL;
2169 PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT = NULL;
2170 PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT = NULL;
2171 PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT = NULL;
2172 PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT = NULL;
2173 PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT = NULL;
2174
2175 PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL;
2176 PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL;
2177 PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL;
2178 PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL;
2179 PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL;
2180 PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL;
2181 PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL;
2182 PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL;
2183 PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL;
2184 PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL;
2185 PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL;
2186 PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL;
2187 PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL;
2188 PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL;
2189 PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL;
2190 PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL;
2191 PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL;
2192 PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL;
2193 PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL;
2194 PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL;
2195 PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL;
2196 PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL;
2197 PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL;
2198 PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL;
2199 PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL;
2200 PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL;
2201 PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL;
2202 PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL;
2203 PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL;
2204 PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL;
2205 PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL;
2206 PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL;
2207 PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL;
2208 PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL;
2209 PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL;
2210 PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL;
2211 PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL;
2212 PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL;
2213 PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL;
2214 PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL;
2215 PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL;
2216 PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL;
2217
2218 PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL;
2219 PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL;
2220 PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL;
2221
2222 PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT = NULL;
2223
2224 PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL;
2225
2226 PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL;
2227
2228 PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL;
2229 PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL;
2230 PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL;
2231 PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL;
2232 PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL;
2233 PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL;
2234
2235 PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL;
2236 PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL;
2237
2238 PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL;
2239 PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL;
2240 PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL;
2241 PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL;
2242 PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL;
2243 PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL;
2244 PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL;
2245 PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL;
2246
2247 PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL = NULL;
2248 PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL = NULL;
2249 PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL = NULL;
2250
2251 PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL;
2252 PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL;
2253 PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL;
2254 PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL;
2255
2256 PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL = NULL;
2257 PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL = NULL;
2258 PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL = NULL;
2259 PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL = NULL;
2260 PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL = NULL;
2261 PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL = NULL;
2262 PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL = NULL;
2263 PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL = NULL;
2264 PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL = NULL;
2265 PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL = NULL;
2266
2267 PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL;
2268 PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL;
2269
2270 PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR = NULL;
2271
2272 PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback = NULL;
2273 PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl = NULL;
2274 PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL;
2275 PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL;
2276 PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL;
2277 PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL;
2278 PFNGLOBJECTLABELPROC __glewObjectLabel = NULL;
2279 PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL;
2280 PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup = NULL;
2281 PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL;
2282
2283 PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv = NULL;
2284 PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv = NULL;
2285 PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv = NULL;
2286 PFNGLREADNPIXELSPROC __glewReadnPixels = NULL;
2287
2288 PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL;
2289 PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion = NULL;
2290 PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion = NULL;
2291 PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion = NULL;
2292 PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion = NULL;
2293
2294 PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL;
2295
2296 PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL;
2297 PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL;
2298 PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL;
2299 PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL;
2300 PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL;
2301 PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL;
2302 PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL;
2303 PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL;
2304 PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL;
2305 PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL;
2306 PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL;
2307 PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL;
2308 PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL;
2309 PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL;
2310 PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL;
2311 PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL;
2312 PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL;
2313 PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL;
2314 PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL;
2315 PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL;
2316 PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL;
2317 PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL;
2318 PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL;
2319 PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL;
2320
2321 PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX = NULL;
2322 PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX = NULL;
2323
2324 PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV = NULL;
2325 PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV = NULL;
2326
2327 PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV = NULL;
2328 PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV = NULL;
2329
2330 PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL;
2331 PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL;
2332 PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL;
2333 PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV = NULL;
2334 PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV = NULL;
2335 PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV = NULL;
2336 PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV = NULL;
2337 PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV = NULL;
2338 PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV = NULL;
2339 PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV = NULL;
2340 PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL;
2341 PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL;
2342 PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL;
2343
2344 PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV = NULL;
2345 PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV = NULL;
2346
2347 PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL;
2348 PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL;
2349
2350 PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV = NULL;
2351
2352 PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV = NULL;
2353
2354 PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL;
2355
2356 PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL;
2357 PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL;
2358 PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL;
2359
2360 PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV = NULL;
2361
2362 PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL;
2363 PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL;
2364 PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL;
2365 PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL;
2366 PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL;
2367 PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL;
2368 PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL;
2369 PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL;
2370 PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL;
2371
2372 PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV = NULL;
2373 PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV = NULL;
2374 PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV = NULL;
2375
2376 PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL;
2377 PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL;
2378 PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL;
2379 PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL;
2380 PFNGLISFENCENVPROC __glewIsFenceNV = NULL;
2381 PFNGLSETFENCENVPROC __glewSetFenceNV = NULL;
2382 PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL;
2383
2384 PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV = NULL;
2385
2386 PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL;
2387 PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL;
2388 PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL;
2389 PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL;
2390 PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL;
2391 PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL;
2392
2393 PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL;
2394
2395 PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL;
2396
2397 PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL;
2398 PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL;
2399 PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL;
2400 PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL;
2401 PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL;
2402 PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL;
2403 PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL;
2404 PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL;
2405 PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL;
2406 PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL;
2407 PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL;
2408 PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL;
2409
2410 PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV = NULL;
2411 PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL;
2412 PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV = NULL;
2413 PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV = NULL;
2414 PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV = NULL;
2415 PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV = NULL;
2416 PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV = NULL;
2417 PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV = NULL;
2418 PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV = NULL;
2419 PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV = NULL;
2420 PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV = NULL;
2421 PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV = NULL;
2422 PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV = NULL;
2423 PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV = NULL;
2424 PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV = NULL;
2425 PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV = NULL;
2426 PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV = NULL;
2427 PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV = NULL;
2428 PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV = NULL;
2429 PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV = NULL;
2430 PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV = NULL;
2431 PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV = NULL;
2432 PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV = NULL;
2433 PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV = NULL;
2434 PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV = NULL;
2435 PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV = NULL;
2436 PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV = NULL;
2437 PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV = NULL;
2438 PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV = NULL;
2439 PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV = NULL;
2440 PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV = NULL;
2441 PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV = NULL;
2442 PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV = NULL;
2443 PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV = NULL;
2444
2445 PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL;
2446 PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL;
2447 PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL;
2448 PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL;
2449 PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL;
2450 PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL;
2451 PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL;
2452 PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL;
2453 PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL;
2454 PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL;
2455 PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL;
2456 PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL;
2457 PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL;
2458 PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL;
2459 PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL;
2460 PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL;
2461 PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL;
2462 PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL;
2463 PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL;
2464 PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL;
2465 PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL;
2466 PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL;
2467 PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL;
2468 PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL;
2469 PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL;
2470 PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL;
2471 PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL;
2472 PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL;
2473 PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL;
2474 PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL;
2475 PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL;
2476 PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL;
2477 PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL;
2478 PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL;
2479 PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL;
2480 PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL;
2481 PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL;
2482 PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL;
2483 PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL;
2484 PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL;
2485 PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL;
2486 PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL;
2487 PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL;
2488 PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL;
2489 PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL;
2490 PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL;
2491
2492 PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV = NULL;
2493
2494 PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL;
2495 PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL;
2496 PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL;
2497 PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL;
2498 PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL;
2499 PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL;
2500 PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL;
2501
2502 PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL;
2503 PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL;
2504 PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL;
2505
2506 PFNGLCOPYPATHNVPROC __glewCopyPathNV = NULL;
2507 PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV = NULL;
2508 PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV = NULL;
2509 PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV = NULL;
2510 PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV = NULL;
2511 PFNGLDELETEPATHSNVPROC __glewDeletePathsNV = NULL;
2512 PFNGLGENPATHSNVPROC __glewGenPathsNV = NULL;
2513 PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV = NULL;
2514 PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV = NULL;
2515 PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV = NULL;
2516 PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV = NULL;
2517 PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV = NULL;
2518 PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV = NULL;
2519 PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV = NULL;
2520 PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV = NULL;
2521 PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV = NULL;
2522 PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV = NULL;
2523 PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV = NULL;
2524 PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV = NULL;
2525 PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV = NULL;
2526 PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV = NULL;
2527 PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV = NULL;
2528 PFNGLISPATHNVPROC __glewIsPathNV = NULL;
2529 PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV = NULL;
2530 PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV = NULL;
2531 PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV = NULL;
2532 PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV = NULL;
2533 PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV = NULL;
2534 PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV = NULL;
2535 PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV = NULL;
2536 PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV = NULL;
2537 PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV = NULL;
2538 PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV = NULL;
2539 PFNGLPATHCOORDSNVPROC __glewPathCoordsNV = NULL;
2540 PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV = NULL;
2541 PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV = NULL;
2542 PFNGLPATHFOGGENNVPROC __glewPathFogGenNV = NULL;
2543 PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV = NULL;
2544 PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV = NULL;
2545 PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV = NULL;
2546 PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV = NULL;
2547 PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV = NULL;
2548 PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV = NULL;
2549 PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV = NULL;
2550 PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV = NULL;
2551 PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV = NULL;
2552 PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV = NULL;
2553 PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV = NULL;
2554 PFNGLPATHSTRINGNVPROC __glewPathStringNV = NULL;
2555 PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV = NULL;
2556 PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV = NULL;
2557 PFNGLPATHTEXGENNVPROC __glewPathTexGenNV = NULL;
2558 PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV = NULL;
2559 PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV = NULL;
2560 PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV = NULL;
2561 PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV = NULL;
2562 PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV = NULL;
2563 PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV = NULL;
2564 PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV = NULL;
2565 PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV = NULL;
2566 PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV = NULL;
2567 PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV = NULL;
2568 PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV = NULL;
2569 PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV = NULL;
2570
2571 PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL;
2572 PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL;
2573
2574 PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL;
2575 PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL;
2576
2577 PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV = NULL;
2578 PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV = NULL;
2579 PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL;
2580 PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL;
2581 PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL;
2582 PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL;
2583
2584 PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL;
2585 PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL;
2586
2587 PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL;
2588 PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL;
2589 PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL;
2590 PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL;
2591 PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL;
2592 PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL;
2593 PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL;
2594 PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL;
2595 PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL;
2596 PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL;
2597 PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL;
2598 PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL;
2599 PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL;
2600
2601 PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL;
2602 PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL;
2603
2604 PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV = NULL;
2605 PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV = NULL;
2606
2607 PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL;
2608 PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL;
2609 PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL;
2610 PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL;
2611 PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL;
2612 PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL;
2613 PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL;
2614 PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL;
2615 PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL;
2616 PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL;
2617 PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL;
2618 PFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL;
2619 PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL;
2620
2621 PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL;
2622
2623 PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV = NULL;
2624 PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV = NULL;
2625 PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV = NULL;
2626 PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV = NULL;
2627 PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV = NULL;
2628 PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV = NULL;
2629
2630 PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL;
2631 PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL;
2632 PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL;
2633 PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL;
2634 PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL;
2635 PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL;
2636 PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL;
2637 PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL;
2638 PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL;
2639 PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL;
2640 PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL;
2641
2642 PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL;
2643 PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL;
2644 PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL;
2645 PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL;
2646 PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL;
2647 PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL;
2648 PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL;
2649
2650 PFNGLVDPAUFININVPROC __glewVDPAUFiniNV = NULL;
2651 PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV = NULL;
2652 PFNGLVDPAUINITNVPROC __glewVDPAUInitNV = NULL;
2653 PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV = NULL;
2654 PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV = NULL;
2655 PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV = NULL;
2656 PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV = NULL;
2657 PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV = NULL;
2658 PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV = NULL;
2659 PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV = NULL;
2660
2661 PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL;
2662 PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL;
2663
2664 PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV = NULL;
2665 PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV = NULL;
2666 PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV = NULL;
2667 PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV = NULL;
2668 PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV = NULL;
2669 PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV = NULL;
2670 PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV = NULL;
2671 PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV = NULL;
2672 PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV = NULL;
2673 PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV = NULL;
2674 PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV = NULL;
2675 PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV = NULL;
2676 PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV = NULL;
2677 PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV = NULL;
2678 PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV = NULL;
2679 PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV = NULL;
2680 PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV = NULL;
2681 PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV = NULL;
2682 PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV = NULL;
2683
2684 PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL;
2685 PFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL;
2686 PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL;
2687 PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL;
2688 PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL;
2689 PFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL;
2690 PFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL;
2691 PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL;
2692 PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL;
2693 PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL;
2694 PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL;
2695 PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL;
2696
2697 PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL;
2698 PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL;
2699 PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL;
2700 PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL;
2701 PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL;
2702 PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL;
2703 PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL;
2704 PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL;
2705 PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL;
2706 PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL;
2707 PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL;
2708 PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL;
2709 PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL;
2710 PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL;
2711 PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL;
2712 PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL;
2713 PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL;
2714 PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL;
2715 PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL;
2716 PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL;
2717 PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL;
2718 PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL;
2719 PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL;
2720 PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL;
2721 PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL;
2722 PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL;
2723 PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL;
2724 PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL;
2725 PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL;
2726 PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL;
2727 PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL;
2728 PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL;
2729 PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL;
2730 PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL;
2731 PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL;
2732 PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL;
2733 PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL;
2734 PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL;
2735 PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL;
2736 PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL;
2737 PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL;
2738 PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL;
2739 PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL;
2740 PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL;
2741 PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL;
2742 PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL;
2743 PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL;
2744 PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL;
2745 PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL;
2746 PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL;
2747 PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL;
2748 PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL;
2749 PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL;
2750 PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL;
2751 PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL;
2752 PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL;
2753 PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL;
2754 PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL;
2755 PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL;
2756 PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL;
2757 PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL;
2758 PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL;
2759 PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL;
2760 PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL;
2761
2762 PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV = NULL;
2763 PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV = NULL;
2764 PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV = NULL;
2765 PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV = NULL;
2766 PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV = NULL;
2767 PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV = NULL;
2768 PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV = NULL;
2769 PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV = NULL;
2770 PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV = NULL;
2771 PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV = NULL;
2772 PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV = NULL;
2773 PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV = NULL;
2774
2775 PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES = NULL;
2776 PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES = NULL;
2777 PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES = NULL;
2778 PFNGLFRUSTUMFOESPROC __glewFrustumfOES = NULL;
2779 PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES = NULL;
2780 PFNGLORTHOFOESPROC __glewOrthofOES = NULL;
2781
2782 PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR = NULL;
2783
2784 PFNGLALPHAFUNCXPROC __glewAlphaFuncx = NULL;
2785 PFNGLCLEARCOLORXPROC __glewClearColorx = NULL;
2786 PFNGLCLEARDEPTHXPROC __glewClearDepthx = NULL;
2787 PFNGLCOLOR4XPROC __glewColor4x = NULL;
2788 PFNGLDEPTHRANGEXPROC __glewDepthRangex = NULL;
2789 PFNGLFOGXPROC __glewFogx = NULL;
2790 PFNGLFOGXVPROC __glewFogxv = NULL;
2791 PFNGLFRUSTUMFPROC __glewFrustumf = NULL;
2792 PFNGLFRUSTUMXPROC __glewFrustumx = NULL;
2793 PFNGLLIGHTMODELXPROC __glewLightModelx = NULL;
2794 PFNGLLIGHTMODELXVPROC __glewLightModelxv = NULL;
2795 PFNGLLIGHTXPROC __glewLightx = NULL;
2796 PFNGLLIGHTXVPROC __glewLightxv = NULL;
2797 PFNGLLINEWIDTHXPROC __glewLineWidthx = NULL;
2798 PFNGLLOADMATRIXXPROC __glewLoadMatrixx = NULL;
2799 PFNGLMATERIALXPROC __glewMaterialx = NULL;
2800 PFNGLMATERIALXVPROC __glewMaterialxv = NULL;
2801 PFNGLMULTMATRIXXPROC __glewMultMatrixx = NULL;
2802 PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x = NULL;
2803 PFNGLNORMAL3XPROC __glewNormal3x = NULL;
2804 PFNGLORTHOFPROC __glewOrthof = NULL;
2805 PFNGLORTHOXPROC __glewOrthox = NULL;
2806 PFNGLPOINTSIZEXPROC __glewPointSizex = NULL;
2807 PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx = NULL;
2808 PFNGLROTATEXPROC __glewRotatex = NULL;
2809 PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex = NULL;
2810 PFNGLSCALEXPROC __glewScalex = NULL;
2811 PFNGLTEXENVXPROC __glewTexEnvx = NULL;
2812 PFNGLTEXENVXVPROC __glewTexEnvxv = NULL;
2813 PFNGLTEXPARAMETERXPROC __glewTexParameterx = NULL;
2814 PFNGLTRANSLATEXPROC __glewTranslatex = NULL;
2815
2816 PFNGLCLIPPLANEFPROC __glewClipPlanef = NULL;
2817 PFNGLCLIPPLANEXPROC __glewClipPlanex = NULL;
2818 PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef = NULL;
2819 PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex = NULL;
2820 PFNGLGETFIXEDVPROC __glewGetFixedv = NULL;
2821 PFNGLGETLIGHTXVPROC __glewGetLightxv = NULL;
2822 PFNGLGETMATERIALXVPROC __glewGetMaterialxv = NULL;
2823 PFNGLGETTEXENVXVPROC __glewGetTexEnvxv = NULL;
2824 PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv = NULL;
2825 PFNGLPOINTPARAMETERXPROC __glewPointParameterx = NULL;
2826 PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv = NULL;
2827 PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES = NULL;
2828 PFNGLTEXPARAMETERXVPROC __glewTexParameterxv = NULL;
2829
2830 PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL;
2831
2832 PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL;
2833 PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL;
2834
2835 PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL = NULL;
2836
2837 PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL = NULL;
2838
2839 PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL;
2840 PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL;
2841
2842 PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL;
2843 PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL;
2844
2845 PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL;
2846 PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL;
2847
2848 PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL;
2849 PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL;
2850
2851 PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL;
2852 PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL;
2853
2854 PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL;
2855 PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL;
2856
2857 PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL;
2858 PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL;
2859 PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL;
2860 PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL;
2861 PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL;
2862 PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL;
2863
2864 PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL;
2865
2866 PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL;
2867
2868 PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL;
2869 PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL;
2870 PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL;
2871 PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL;
2872 PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL;
2873 PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL;
2874 PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL;
2875 PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL;
2876 PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL;
2877 PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL;
2878 PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL;
2879 PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL;
2880 PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL;
2881 PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL;
2882 PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL;
2883 PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL;
2884 PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL;
2885
2886 PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL;
2887
2888 PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL;
2889
2890 PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL;
2891
2892 PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL;
2893 PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL;
2894 PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL;
2895 PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL;
2896
2897 PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL;
2898
2899 PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL;
2900 PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL;
2901 PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL;
2902 PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL;
2903 PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL;
2904 PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL;
2905 PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL;
2906
2907 PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL;
2908
2909 PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL;
2910 PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL;
2911 PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL;
2912 PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL;
2913 PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL;
2914 PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL;
2915 PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL;
2916 PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL;
2917
2918 PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL;
2919
2920 PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL;
2921 PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL;
2922 PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL;
2923 PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL;
2924 PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL;
2925 PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL;
2926 PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL;
2927
2928 PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL;
2929 PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL;
2930 PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL;
2931 PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL;
2932 PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL;
2933 PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL;
2934 PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL;
2935 PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL;
2936 PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL;
2937 PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL;
2938 PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL;
2939 PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL;
2940 PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL;
2941 PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL;
2942 PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL;
2943 PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL;
2944 PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL;
2945 PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL;
2946 PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL;
2947 PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL;
2948 PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL;
2949 PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL;
2950 PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL;
2951 PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL;
2952 PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL;
2953 PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL;
2954 PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL;
2955 PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL;
2956 PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL;
2957 PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL;
2958 PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL;
2959 PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL;
2960 PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL;
2961 PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL;
2962 PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL;
2963 PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL;
2964 PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL;
2965 PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL;
2966 PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL;
2967 PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL;
2968
2969 PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL;
2970
2971 #endif /* !WIN32 || !GLEW_MX */
2972
2973 #if !defined(GLEW_MX)
2974
2975 GLboolean __GLEW_VERSION_1_1 = GL_FALSE;
2976 GLboolean __GLEW_VERSION_1_2 = GL_FALSE;
2977 GLboolean __GLEW_VERSION_1_2_1 = GL_FALSE;
2978 GLboolean __GLEW_VERSION_1_3 = GL_FALSE;
2979 GLboolean __GLEW_VERSION_1_4 = GL_FALSE;
2980 GLboolean __GLEW_VERSION_1_5 = GL_FALSE;
2981 GLboolean __GLEW_VERSION_2_0 = GL_FALSE;
2982 GLboolean __GLEW_VERSION_2_1 = GL_FALSE;
2983 GLboolean __GLEW_VERSION_3_0 = GL_FALSE;
2984 GLboolean __GLEW_VERSION_3_1 = GL_FALSE;
2985 GLboolean __GLEW_VERSION_3_2 = GL_FALSE;
2986 GLboolean __GLEW_VERSION_3_3 = GL_FALSE;
2987 GLboolean __GLEW_VERSION_4_0 = GL_FALSE;
2988 GLboolean __GLEW_VERSION_4_1 = GL_FALSE;
2989 GLboolean __GLEW_VERSION_4_2 = GL_FALSE;
2990 GLboolean __GLEW_VERSION_4_3 = GL_FALSE;
2991 GLboolean __GLEW_VERSION_4_4 = GL_FALSE;
2992 GLboolean __GLEW_VERSION_4_5 = GL_FALSE;
2993 GLboolean __GLEW_3DFX_multisample = GL_FALSE;
2994 GLboolean __GLEW_3DFX_tbuffer = GL_FALSE;
2995 GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE;
2996 GLboolean __GLEW_AMD_blend_minmax_factor = GL_FALSE;
2997 GLboolean __GLEW_AMD_conservative_depth = GL_FALSE;
2998 GLboolean __GLEW_AMD_debug_output = GL_FALSE;
2999 GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE;
3000 GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE;
3001 GLboolean __GLEW_AMD_gcn_shader = GL_FALSE;
3002 GLboolean __GLEW_AMD_gpu_shader_int64 = GL_FALSE;
3003 GLboolean __GLEW_AMD_interleaved_elements = GL_FALSE;
3004 GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE;
3005 GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE;
3006 GLboolean __GLEW_AMD_occlusion_query_event = GL_FALSE;
3007 GLboolean __GLEW_AMD_performance_monitor = GL_FALSE;
3008 GLboolean __GLEW_AMD_pinned_memory = GL_FALSE;
3009 GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE;
3010 GLboolean __GLEW_AMD_sample_positions = GL_FALSE;
3011 GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE;
3012 GLboolean __GLEW_AMD_shader_atomic_counter_ops = GL_FALSE;
3013 GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE;
3014 GLboolean __GLEW_AMD_shader_stencil_value_export = GL_FALSE;
3015 GLboolean __GLEW_AMD_shader_trinary_minmax = GL_FALSE;
3016 GLboolean __GLEW_AMD_sparse_texture = GL_FALSE;
3017 GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE;
3018 GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE;
3019 GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE;
3020 GLboolean __GLEW_AMD_transform_feedback4 = GL_FALSE;
3021 GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE;
3022 GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE;
3023 GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE;
3024 GLboolean __GLEW_ANGLE_depth_texture = GL_FALSE;
3025 GLboolean __GLEW_ANGLE_framebuffer_blit = GL_FALSE;
3026 GLboolean __GLEW_ANGLE_framebuffer_multisample = GL_FALSE;
3027 GLboolean __GLEW_ANGLE_instanced_arrays = GL_FALSE;
3028 GLboolean __GLEW_ANGLE_pack_reverse_row_order = GL_FALSE;
3029 GLboolean __GLEW_ANGLE_program_binary = GL_FALSE;
3030 GLboolean __GLEW_ANGLE_texture_compression_dxt1 = GL_FALSE;
3031 GLboolean __GLEW_ANGLE_texture_compression_dxt3 = GL_FALSE;
3032 GLboolean __GLEW_ANGLE_texture_compression_dxt5 = GL_FALSE;
3033 GLboolean __GLEW_ANGLE_texture_usage = GL_FALSE;
3034 GLboolean __GLEW_ANGLE_timer_query = GL_FALSE;
3035 GLboolean __GLEW_ANGLE_translated_shader_source = GL_FALSE;
3036 GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE;
3037 GLboolean __GLEW_APPLE_client_storage = GL_FALSE;
3038 GLboolean __GLEW_APPLE_element_array = GL_FALSE;
3039 GLboolean __GLEW_APPLE_fence = GL_FALSE;
3040 GLboolean __GLEW_APPLE_float_pixels = GL_FALSE;
3041 GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE;
3042 GLboolean __GLEW_APPLE_object_purgeable = GL_FALSE;
3043 GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE;
3044 GLboolean __GLEW_APPLE_rgb_422 = GL_FALSE;
3045 GLboolean __GLEW_APPLE_row_bytes = GL_FALSE;
3046 GLboolean __GLEW_APPLE_specular_vector = GL_FALSE;
3047 GLboolean __GLEW_APPLE_texture_range = GL_FALSE;
3048 GLboolean __GLEW_APPLE_transform_hint = GL_FALSE;
3049 GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE;
3050 GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE;
3051 GLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE;
3052 GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE;
3053 GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE;
3054 GLboolean __GLEW_ARB_ES3_1_compatibility = GL_FALSE;
3055 GLboolean __GLEW_ARB_ES3_2_compatibility = GL_FALSE;
3056 GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE;
3057 GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE;
3058 GLboolean __GLEW_ARB_base_instance = GL_FALSE;
3059 GLboolean __GLEW_ARB_bindless_texture = GL_FALSE;
3060 GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE;
3061 GLboolean __GLEW_ARB_buffer_storage = GL_FALSE;
3062 GLboolean __GLEW_ARB_cl_event = GL_FALSE;
3063 GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE;
3064 GLboolean __GLEW_ARB_clear_texture = GL_FALSE;
3065 GLboolean __GLEW_ARB_clip_control = GL_FALSE;
3066 GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE;
3067 GLboolean __GLEW_ARB_compatibility = GL_FALSE;
3068 GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE;
3069 GLboolean __GLEW_ARB_compute_shader = GL_FALSE;
3070 GLboolean __GLEW_ARB_compute_variable_group_size = GL_FALSE;
3071 GLboolean __GLEW_ARB_conditional_render_inverted = GL_FALSE;
3072 GLboolean __GLEW_ARB_conservative_depth = GL_FALSE;
3073 GLboolean __GLEW_ARB_copy_buffer = GL_FALSE;
3074 GLboolean __GLEW_ARB_copy_image = GL_FALSE;
3075 GLboolean __GLEW_ARB_cull_distance = GL_FALSE;
3076 GLboolean __GLEW_ARB_debug_output = GL_FALSE;
3077 GLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE;
3078 GLboolean __GLEW_ARB_depth_clamp = GL_FALSE;
3079 GLboolean __GLEW_ARB_depth_texture = GL_FALSE;
3080 GLboolean __GLEW_ARB_derivative_control = GL_FALSE;
3081 GLboolean __GLEW_ARB_direct_state_access = GL_FALSE;
3082 GLboolean __GLEW_ARB_draw_buffers = GL_FALSE;
3083 GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE;
3084 GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE;
3085 GLboolean __GLEW_ARB_draw_indirect = GL_FALSE;
3086 GLboolean __GLEW_ARB_draw_instanced = GL_FALSE;
3087 GLboolean __GLEW_ARB_enhanced_layouts = GL_FALSE;
3088 GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE;
3089 GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE;
3090 GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE;
3091 GLboolean __GLEW_ARB_fragment_layer_viewport = GL_FALSE;
3092 GLboolean __GLEW_ARB_fragment_program = GL_FALSE;
3093 GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE;
3094 GLboolean __GLEW_ARB_fragment_shader = GL_FALSE;
3095 GLboolean __GLEW_ARB_fragment_shader_interlock = GL_FALSE;
3096 GLboolean __GLEW_ARB_framebuffer_no_attachments = GL_FALSE;
3097 GLboolean __GLEW_ARB_framebuffer_object = GL_FALSE;
3098 GLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE;
3099 GLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE;
3100 GLboolean __GLEW_ARB_get_program_binary = GL_FALSE;
3101 GLboolean __GLEW_ARB_get_texture_sub_image = GL_FALSE;
3102 GLboolean __GLEW_ARB_gpu_shader5 = GL_FALSE;
3103 GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE;
3104 GLboolean __GLEW_ARB_gpu_shader_int64 = GL_FALSE;
3105 GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE;
3106 GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE;
3107 GLboolean __GLEW_ARB_imaging = GL_FALSE;
3108 GLboolean __GLEW_ARB_indirect_parameters = GL_FALSE;
3109 GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE;
3110 GLboolean __GLEW_ARB_internalformat_query = GL_FALSE;
3111 GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE;
3112 GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE;
3113 GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE;
3114 GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE;
3115 GLboolean __GLEW_ARB_matrix_palette = GL_FALSE;
3116 GLboolean __GLEW_ARB_multi_bind = GL_FALSE;
3117 GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE;
3118 GLboolean __GLEW_ARB_multisample = GL_FALSE;
3119 GLboolean __GLEW_ARB_multitexture = GL_FALSE;
3120 GLboolean __GLEW_ARB_occlusion_query = GL_FALSE;
3121 GLboolean __GLEW_ARB_occlusion_query2 = GL_FALSE;
3122 GLboolean __GLEW_ARB_parallel_shader_compile = GL_FALSE;
3123 GLboolean __GLEW_ARB_pipeline_statistics_query = GL_FALSE;
3124 GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE;
3125 GLboolean __GLEW_ARB_point_parameters = GL_FALSE;
3126 GLboolean __GLEW_ARB_point_sprite = GL_FALSE;
3127 GLboolean __GLEW_ARB_post_depth_coverage = GL_FALSE;
3128 GLboolean __GLEW_ARB_program_interface_query = GL_FALSE;
3129 GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE;
3130 GLboolean __GLEW_ARB_query_buffer_object = GL_FALSE;
3131 GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE;
3132 GLboolean __GLEW_ARB_robustness = GL_FALSE;
3133 GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE;
3134 GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE;
3135 GLboolean __GLEW_ARB_sample_locations = GL_FALSE;
3136 GLboolean __GLEW_ARB_sample_shading = GL_FALSE;
3137 GLboolean __GLEW_ARB_sampler_objects = GL_FALSE;
3138 GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE;
3139 GLboolean __GLEW_ARB_seamless_cubemap_per_texture = GL_FALSE;
3140 GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE;
3141 GLboolean __GLEW_ARB_shader_atomic_counter_ops = GL_FALSE;
3142 GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE;
3143 GLboolean __GLEW_ARB_shader_ballot = GL_FALSE;
3144 GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE;
3145 GLboolean __GLEW_ARB_shader_clock = GL_FALSE;
3146 GLboolean __GLEW_ARB_shader_draw_parameters = GL_FALSE;
3147 GLboolean __GLEW_ARB_shader_group_vote = GL_FALSE;
3148 GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE;
3149 GLboolean __GLEW_ARB_shader_image_size = GL_FALSE;
3150 GLboolean __GLEW_ARB_shader_objects = GL_FALSE;
3151 GLboolean __GLEW_ARB_shader_precision = GL_FALSE;
3152 GLboolean __GLEW_ARB_shader_stencil_export = GL_FALSE;
3153 GLboolean __GLEW_ARB_shader_storage_buffer_object = GL_FALSE;
3154 GLboolean __GLEW_ARB_shader_subroutine = GL_FALSE;
3155 GLboolean __GLEW_ARB_shader_texture_image_samples = GL_FALSE;
3156 GLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE;
3157 GLboolean __GLEW_ARB_shader_viewport_layer_array = GL_FALSE;
3158 GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE;
3159 GLboolean __GLEW_ARB_shading_language_420pack = GL_FALSE;
3160 GLboolean __GLEW_ARB_shading_language_include = GL_FALSE;
3161 GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE;
3162 GLboolean __GLEW_ARB_shadow = GL_FALSE;
3163 GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE;
3164 GLboolean __GLEW_ARB_sparse_buffer = GL_FALSE;
3165 GLboolean __GLEW_ARB_sparse_texture = GL_FALSE;
3166 GLboolean __GLEW_ARB_sparse_texture2 = GL_FALSE;
3167 GLboolean __GLEW_ARB_sparse_texture_clamp = GL_FALSE;
3168 GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE;
3169 GLboolean __GLEW_ARB_sync = GL_FALSE;
3170 GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE;
3171 GLboolean __GLEW_ARB_texture_barrier = GL_FALSE;
3172 GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE;
3173 GLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE;
3174 GLboolean __GLEW_ARB_texture_buffer_object_rgb32 = GL_FALSE;
3175 GLboolean __GLEW_ARB_texture_buffer_range = GL_FALSE;
3176 GLboolean __GLEW_ARB_texture_compression = GL_FALSE;
3177 GLboolean __GLEW_ARB_texture_compression_bptc = GL_FALSE;
3178 GLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE;
3179 GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE;
3180 GLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE;
3181 GLboolean __GLEW_ARB_texture_env_add = GL_FALSE;
3182 GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE;
3183 GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE;
3184 GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE;
3185 GLboolean __GLEW_ARB_texture_filter_minmax = GL_FALSE;
3186 GLboolean __GLEW_ARB_texture_float = GL_FALSE;
3187 GLboolean __GLEW_ARB_texture_gather = GL_FALSE;
3188 GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge = GL_FALSE;
3189 GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE;
3190 GLboolean __GLEW_ARB_texture_multisample = GL_FALSE;
3191 GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE;
3192 GLboolean __GLEW_ARB_texture_query_levels = GL_FALSE;
3193 GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE;
3194 GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE;
3195 GLboolean __GLEW_ARB_texture_rg = GL_FALSE;
3196 GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE;
3197 GLboolean __GLEW_ARB_texture_stencil8 = GL_FALSE;
3198 GLboolean __GLEW_ARB_texture_storage = GL_FALSE;
3199 GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE;
3200 GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE;
3201 GLboolean __GLEW_ARB_texture_view = GL_FALSE;
3202 GLboolean __GLEW_ARB_timer_query = GL_FALSE;
3203 GLboolean __GLEW_ARB_transform_feedback2 = GL_FALSE;
3204 GLboolean __GLEW_ARB_transform_feedback3 = GL_FALSE;
3205 GLboolean __GLEW_ARB_transform_feedback_instanced = GL_FALSE;
3206 GLboolean __GLEW_ARB_transform_feedback_overflow_query = GL_FALSE;
3207 GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE;
3208 GLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE;
3209 GLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE;
3210 GLboolean __GLEW_ARB_vertex_array_object = GL_FALSE;
3211 GLboolean __GLEW_ARB_vertex_attrib_64bit = GL_FALSE;
3212 GLboolean __GLEW_ARB_vertex_attrib_binding = GL_FALSE;
3213 GLboolean __GLEW_ARB_vertex_blend = GL_FALSE;
3214 GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE;
3215 GLboolean __GLEW_ARB_vertex_program = GL_FALSE;
3216 GLboolean __GLEW_ARB_vertex_shader = GL_FALSE;
3217 GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE;
3218 GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE;
3219 GLboolean __GLEW_ARB_viewport_array = GL_FALSE;
3220 GLboolean __GLEW_ARB_window_pos = GL_FALSE;
3221 GLboolean __GLEW_ATIX_point_sprites = GL_FALSE;
3222 GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE;
3223 GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE;
3224 GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE;
3225 GLboolean __GLEW_ATI_draw_buffers = GL_FALSE;
3226 GLboolean __GLEW_ATI_element_array = GL_FALSE;
3227 GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE;
3228 GLboolean __GLEW_ATI_fragment_shader = GL_FALSE;
3229 GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE;
3230 GLboolean __GLEW_ATI_meminfo = GL_FALSE;
3231 GLboolean __GLEW_ATI_pn_triangles = GL_FALSE;
3232 GLboolean __GLEW_ATI_separate_stencil = GL_FALSE;
3233 GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE;
3234 GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE;
3235 GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE;
3236 GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE;
3237 GLboolean __GLEW_ATI_texture_float = GL_FALSE;
3238 GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE;
3239 GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE;
3240 GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE;
3241 GLboolean __GLEW_ATI_vertex_streams = GL_FALSE;
3242 GLboolean __GLEW_EXT_422_pixels = GL_FALSE;
3243 GLboolean __GLEW_EXT_Cg_shader = GL_FALSE;
3244 GLboolean __GLEW_EXT_abgr = GL_FALSE;
3245 GLboolean __GLEW_EXT_bgra = GL_FALSE;
3246 GLboolean __GLEW_EXT_bindable_uniform = GL_FALSE;
3247 GLboolean __GLEW_EXT_blend_color = GL_FALSE;
3248 GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE;
3249 GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE;
3250 GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE;
3251 GLboolean __GLEW_EXT_blend_minmax = GL_FALSE;
3252 GLboolean __GLEW_EXT_blend_subtract = GL_FALSE;
3253 GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE;
3254 GLboolean __GLEW_EXT_cmyka = GL_FALSE;
3255 GLboolean __GLEW_EXT_color_subtable = GL_FALSE;
3256 GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE;
3257 GLboolean __GLEW_EXT_convolution = GL_FALSE;
3258 GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE;
3259 GLboolean __GLEW_EXT_copy_texture = GL_FALSE;
3260 GLboolean __GLEW_EXT_cull_vertex = GL_FALSE;
3261 GLboolean __GLEW_EXT_debug_label = GL_FALSE;
3262 GLboolean __GLEW_EXT_debug_marker = GL_FALSE;
3263 GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE;
3264 GLboolean __GLEW_EXT_direct_state_access = GL_FALSE;
3265 GLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE;
3266 GLboolean __GLEW_EXT_draw_instanced = GL_FALSE;
3267 GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE;
3268 GLboolean __GLEW_EXT_fog_coord = GL_FALSE;
3269 GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE;
3270 GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE;
3271 GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE;
3272 GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled = GL_FALSE;
3273 GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE;
3274 GLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE;
3275 GLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE;
3276 GLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE;
3277 GLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE;
3278 GLboolean __GLEW_EXT_histogram = GL_FALSE;
3279 GLboolean __GLEW_EXT_index_array_formats = GL_FALSE;
3280 GLboolean __GLEW_EXT_index_func = GL_FALSE;
3281 GLboolean __GLEW_EXT_index_material = GL_FALSE;
3282 GLboolean __GLEW_EXT_index_texture = GL_FALSE;
3283 GLboolean __GLEW_EXT_light_texture = GL_FALSE;
3284 GLboolean __GLEW_EXT_misc_attribute = GL_FALSE;
3285 GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE;
3286 GLboolean __GLEW_EXT_multisample = GL_FALSE;
3287 GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE;
3288 GLboolean __GLEW_EXT_packed_float = GL_FALSE;
3289 GLboolean __GLEW_EXT_packed_pixels = GL_FALSE;
3290 GLboolean __GLEW_EXT_paletted_texture = GL_FALSE;
3291 GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE;
3292 GLboolean __GLEW_EXT_pixel_transform = GL_FALSE;
3293 GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE;
3294 GLboolean __GLEW_EXT_point_parameters = GL_FALSE;
3295 GLboolean __GLEW_EXT_polygon_offset = GL_FALSE;
3296 GLboolean __GLEW_EXT_polygon_offset_clamp = GL_FALSE;
3297 GLboolean __GLEW_EXT_post_depth_coverage = GL_FALSE;
3298 GLboolean __GLEW_EXT_provoking_vertex = GL_FALSE;
3299 GLboolean __GLEW_EXT_raster_multisample = GL_FALSE;
3300 GLboolean __GLEW_EXT_rescale_normal = GL_FALSE;
3301 GLboolean __GLEW_EXT_scene_marker = GL_FALSE;
3302 GLboolean __GLEW_EXT_secondary_color = GL_FALSE;
3303 GLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE;
3304 GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE;
3305 GLboolean __GLEW_EXT_shader_image_load_formatted = GL_FALSE;
3306 GLboolean __GLEW_EXT_shader_image_load_store = GL_FALSE;
3307 GLboolean __GLEW_EXT_shader_integer_mix = GL_FALSE;
3308 GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE;
3309 GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE;
3310 GLboolean __GLEW_EXT_sparse_texture2 = GL_FALSE;
3311 GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE;
3312 GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE;
3313 GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE;
3314 GLboolean __GLEW_EXT_subtexture = GL_FALSE;
3315 GLboolean __GLEW_EXT_texture = GL_FALSE;
3316 GLboolean __GLEW_EXT_texture3D = GL_FALSE;
3317 GLboolean __GLEW_EXT_texture_array = GL_FALSE;
3318 GLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE;
3319 GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE;
3320 GLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE;
3321 GLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE;
3322 GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE;
3323 GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE;
3324 GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE;
3325 GLboolean __GLEW_EXT_texture_env = GL_FALSE;
3326 GLboolean __GLEW_EXT_texture_env_add = GL_FALSE;
3327 GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE;
3328 GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE;
3329 GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE;
3330 GLboolean __GLEW_EXT_texture_filter_minmax = GL_FALSE;
3331 GLboolean __GLEW_EXT_texture_integer = GL_FALSE;
3332 GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE;
3333 GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE;
3334 GLboolean __GLEW_EXT_texture_object = GL_FALSE;
3335 GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE;
3336 GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE;
3337 GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE;
3338 GLboolean __GLEW_EXT_texture_sRGB_decode = GL_FALSE;
3339 GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE;
3340 GLboolean __GLEW_EXT_texture_snorm = GL_FALSE;
3341 GLboolean __GLEW_EXT_texture_swizzle = GL_FALSE;
3342 GLboolean __GLEW_EXT_timer_query = GL_FALSE;
3343 GLboolean __GLEW_EXT_transform_feedback = GL_FALSE;
3344 GLboolean __GLEW_EXT_vertex_array = GL_FALSE;
3345 GLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE;
3346 GLboolean __GLEW_EXT_vertex_attrib_64bit = GL_FALSE;
3347 GLboolean __GLEW_EXT_vertex_shader = GL_FALSE;
3348 GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE;
3349 GLboolean __GLEW_EXT_x11_sync_object = GL_FALSE;
3350 GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE;
3351 GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE;
3352 GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE;
3353 GLboolean __GLEW_HP_image_transform = GL_FALSE;
3354 GLboolean __GLEW_HP_occlusion_test = GL_FALSE;
3355 GLboolean __GLEW_HP_texture_lighting = GL_FALSE;
3356 GLboolean __GLEW_IBM_cull_vertex = GL_FALSE;
3357 GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE;
3358 GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE;
3359 GLboolean __GLEW_IBM_static_data = GL_FALSE;
3360 GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE;
3361 GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE;
3362 GLboolean __GLEW_INGR_color_clamp = GL_FALSE;
3363 GLboolean __GLEW_INGR_interlace_read = GL_FALSE;
3364 GLboolean __GLEW_INTEL_fragment_shader_ordering = GL_FALSE;
3365 GLboolean __GLEW_INTEL_framebuffer_CMAA = GL_FALSE;
3366 GLboolean __GLEW_INTEL_map_texture = GL_FALSE;
3367 GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE;
3368 GLboolean __GLEW_INTEL_performance_query = GL_FALSE;
3369 GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE;
3370 GLboolean __GLEW_KHR_blend_equation_advanced = GL_FALSE;
3371 GLboolean __GLEW_KHR_blend_equation_advanced_coherent = GL_FALSE;
3372 GLboolean __GLEW_KHR_context_flush_control = GL_FALSE;
3373 GLboolean __GLEW_KHR_debug = GL_FALSE;
3374 GLboolean __GLEW_KHR_no_error = GL_FALSE;
3375 GLboolean __GLEW_KHR_robust_buffer_access_behavior = GL_FALSE;
3376 GLboolean __GLEW_KHR_robustness = GL_FALSE;
3377 GLboolean __GLEW_KHR_texture_compression_astc_hdr = GL_FALSE;
3378 GLboolean __GLEW_KHR_texture_compression_astc_ldr = GL_FALSE;
3379 GLboolean __GLEW_KTX_buffer_region = GL_FALSE;
3380 GLboolean __GLEW_MESAX_texture_stack = GL_FALSE;
3381 GLboolean __GLEW_MESA_pack_invert = GL_FALSE;
3382 GLboolean __GLEW_MESA_resize_buffers = GL_FALSE;
3383 GLboolean __GLEW_MESA_window_pos = GL_FALSE;
3384 GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE;
3385 GLboolean __GLEW_NVX_conditional_render = GL_FALSE;
3386 GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE;
3387 GLboolean __GLEW_NV_bindless_multi_draw_indirect = GL_FALSE;
3388 GLboolean __GLEW_NV_bindless_multi_draw_indirect_count = GL_FALSE;
3389 GLboolean __GLEW_NV_bindless_texture = GL_FALSE;
3390 GLboolean __GLEW_NV_blend_equation_advanced = GL_FALSE;
3391 GLboolean __GLEW_NV_blend_equation_advanced_coherent = GL_FALSE;
3392 GLboolean __GLEW_NV_blend_square = GL_FALSE;
3393 GLboolean __GLEW_NV_compute_program5 = GL_FALSE;
3394 GLboolean __GLEW_NV_conditional_render = GL_FALSE;
3395 GLboolean __GLEW_NV_conservative_raster = GL_FALSE;
3396 GLboolean __GLEW_NV_conservative_raster_dilate = GL_FALSE;
3397 GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE;
3398 GLboolean __GLEW_NV_copy_image = GL_FALSE;
3399 GLboolean __GLEW_NV_deep_texture3D = GL_FALSE;
3400 GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE;
3401 GLboolean __GLEW_NV_depth_clamp = GL_FALSE;
3402 GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE;
3403 GLboolean __GLEW_NV_draw_texture = GL_FALSE;
3404 GLboolean __GLEW_NV_evaluators = GL_FALSE;
3405 GLboolean __GLEW_NV_explicit_multisample = GL_FALSE;
3406 GLboolean __GLEW_NV_fence = GL_FALSE;
3407 GLboolean __GLEW_NV_fill_rectangle = GL_FALSE;
3408 GLboolean __GLEW_NV_float_buffer = GL_FALSE;
3409 GLboolean __GLEW_NV_fog_distance = GL_FALSE;
3410 GLboolean __GLEW_NV_fragment_coverage_to_color = GL_FALSE;
3411 GLboolean __GLEW_NV_fragment_program = GL_FALSE;
3412 GLboolean __GLEW_NV_fragment_program2 = GL_FALSE;
3413 GLboolean __GLEW_NV_fragment_program4 = GL_FALSE;
3414 GLboolean __GLEW_NV_fragment_program_option = GL_FALSE;
3415 GLboolean __GLEW_NV_fragment_shader_interlock = GL_FALSE;
3416 GLboolean __GLEW_NV_framebuffer_mixed_samples = GL_FALSE;
3417 GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE;
3418 GLboolean __GLEW_NV_geometry_program4 = GL_FALSE;
3419 GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE;
3420 GLboolean __GLEW_NV_geometry_shader_passthrough = GL_FALSE;
3421 GLboolean __GLEW_NV_gpu_program4 = GL_FALSE;
3422 GLboolean __GLEW_NV_gpu_program5 = GL_FALSE;
3423 GLboolean __GLEW_NV_gpu_program5_mem_extended = GL_FALSE;
3424 GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE;
3425 GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE;
3426 GLboolean __GLEW_NV_half_float = GL_FALSE;
3427 GLboolean __GLEW_NV_internalformat_sample_query = GL_FALSE;
3428 GLboolean __GLEW_NV_light_max_exponent = GL_FALSE;
3429 GLboolean __GLEW_NV_multisample_coverage = GL_FALSE;
3430 GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE;
3431 GLboolean __GLEW_NV_occlusion_query = GL_FALSE;
3432 GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE;
3433 GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE;
3434 GLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE;
3435 GLboolean __GLEW_NV_path_rendering = GL_FALSE;
3436 GLboolean __GLEW_NV_path_rendering_shared_edge = GL_FALSE;
3437 GLboolean __GLEW_NV_pixel_data_range = GL_FALSE;
3438 GLboolean __GLEW_NV_point_sprite = GL_FALSE;
3439 GLboolean __GLEW_NV_present_video = GL_FALSE;
3440 GLboolean __GLEW_NV_primitive_restart = GL_FALSE;
3441 GLboolean __GLEW_NV_register_combiners = GL_FALSE;
3442 GLboolean __GLEW_NV_register_combiners2 = GL_FALSE;
3443 GLboolean __GLEW_NV_sample_locations = GL_FALSE;
3444 GLboolean __GLEW_NV_sample_mask_override_coverage = GL_FALSE;
3445 GLboolean __GLEW_NV_shader_atomic_counters = GL_FALSE;
3446 GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE;
3447 GLboolean __GLEW_NV_shader_atomic_fp16_vector = GL_FALSE;
3448 GLboolean __GLEW_NV_shader_atomic_int64 = GL_FALSE;
3449 GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE;
3450 GLboolean __GLEW_NV_shader_storage_buffer_object = GL_FALSE;
3451 GLboolean __GLEW_NV_shader_thread_group = GL_FALSE;
3452 GLboolean __GLEW_NV_shader_thread_shuffle = GL_FALSE;
3453 GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE;
3454 GLboolean __GLEW_NV_texgen_emboss = GL_FALSE;
3455 GLboolean __GLEW_NV_texgen_reflection = GL_FALSE;
3456 GLboolean __GLEW_NV_texture_barrier = GL_FALSE;
3457 GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE;
3458 GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE;
3459 GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE;
3460 GLboolean __GLEW_NV_texture_multisample = GL_FALSE;
3461 GLboolean __GLEW_NV_texture_rectangle = GL_FALSE;
3462 GLboolean __GLEW_NV_texture_shader = GL_FALSE;
3463 GLboolean __GLEW_NV_texture_shader2 = GL_FALSE;
3464 GLboolean __GLEW_NV_texture_shader3 = GL_FALSE;
3465 GLboolean __GLEW_NV_transform_feedback = GL_FALSE;
3466 GLboolean __GLEW_NV_transform_feedback2 = GL_FALSE;
3467 GLboolean __GLEW_NV_uniform_buffer_unified_memory = GL_FALSE;
3468 GLboolean __GLEW_NV_vdpau_interop = GL_FALSE;
3469 GLboolean __GLEW_NV_vertex_array_range = GL_FALSE;
3470 GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE;
3471 GLboolean __GLEW_NV_vertex_attrib_integer_64bit = GL_FALSE;
3472 GLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE;
3473 GLboolean __GLEW_NV_vertex_program = GL_FALSE;
3474 GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE;
3475 GLboolean __GLEW_NV_vertex_program2 = GL_FALSE;
3476 GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE;
3477 GLboolean __GLEW_NV_vertex_program3 = GL_FALSE;
3478 GLboolean __GLEW_NV_vertex_program4 = GL_FALSE;
3479 GLboolean __GLEW_NV_video_capture = GL_FALSE;
3480 GLboolean __GLEW_NV_viewport_array2 = GL_FALSE;
3481 GLboolean __GLEW_OES_byte_coordinates = GL_FALSE;
3482 GLboolean __GLEW_OES_compressed_paletted_texture = GL_FALSE;
3483 GLboolean __GLEW_OES_read_format = GL_FALSE;
3484 GLboolean __GLEW_OES_single_precision = GL_FALSE;
3485 GLboolean __GLEW_OML_interlace = GL_FALSE;
3486 GLboolean __GLEW_OML_resample = GL_FALSE;
3487 GLboolean __GLEW_OML_subsample = GL_FALSE;
3488 GLboolean __GLEW_OVR_multiview = GL_FALSE;
3489 GLboolean __GLEW_OVR_multiview2 = GL_FALSE;
3490 GLboolean __GLEW_PGI_misc_hints = GL_FALSE;
3491 GLboolean __GLEW_PGI_vertex_hints = GL_FALSE;
3492 GLboolean __GLEW_REGAL_ES1_0_compatibility = GL_FALSE;
3493 GLboolean __GLEW_REGAL_ES1_1_compatibility = GL_FALSE;
3494 GLboolean __GLEW_REGAL_enable = GL_FALSE;
3495 GLboolean __GLEW_REGAL_error_string = GL_FALSE;
3496 GLboolean __GLEW_REGAL_extension_query = GL_FALSE;
3497 GLboolean __GLEW_REGAL_log = GL_FALSE;
3498 GLboolean __GLEW_REGAL_proc_address = GL_FALSE;
3499 GLboolean __GLEW_REND_screen_coordinates = GL_FALSE;
3500 GLboolean __GLEW_S3_s3tc = GL_FALSE;
3501 GLboolean __GLEW_SGIS_color_range = GL_FALSE;
3502 GLboolean __GLEW_SGIS_detail_texture = GL_FALSE;
3503 GLboolean __GLEW_SGIS_fog_function = GL_FALSE;
3504 GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE;
3505 GLboolean __GLEW_SGIS_multisample = GL_FALSE;
3506 GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE;
3507 GLboolean __GLEW_SGIS_point_line_texgen = GL_FALSE;
3508 GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE;
3509 GLboolean __GLEW_SGIS_texture4D = GL_FALSE;
3510 GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE;
3511 GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE;
3512 GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE;
3513 GLboolean __GLEW_SGIS_texture_lod = GL_FALSE;
3514 GLboolean __GLEW_SGIS_texture_select = GL_FALSE;
3515 GLboolean __GLEW_SGIX_async = GL_FALSE;
3516 GLboolean __GLEW_SGIX_async_histogram = GL_FALSE;
3517 GLboolean __GLEW_SGIX_async_pixel = GL_FALSE;
3518 GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE;
3519 GLboolean __GLEW_SGIX_clipmap = GL_FALSE;
3520 GLboolean __GLEW_SGIX_convolution_accuracy = GL_FALSE;
3521 GLboolean __GLEW_SGIX_depth_texture = GL_FALSE;
3522 GLboolean __GLEW_SGIX_flush_raster = GL_FALSE;
3523 GLboolean __GLEW_SGIX_fog_offset = GL_FALSE;
3524 GLboolean __GLEW_SGIX_fog_texture = GL_FALSE;
3525 GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE;
3526 GLboolean __GLEW_SGIX_framezoom = GL_FALSE;
3527 GLboolean __GLEW_SGIX_interlace = GL_FALSE;
3528 GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE;
3529 GLboolean __GLEW_SGIX_list_priority = GL_FALSE;
3530 GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE;
3531 GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE;
3532 GLboolean __GLEW_SGIX_reference_plane = GL_FALSE;
3533 GLboolean __GLEW_SGIX_resample = GL_FALSE;
3534 GLboolean __GLEW_SGIX_shadow = GL_FALSE;
3535 GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE;
3536 GLboolean __GLEW_SGIX_sprite = GL_FALSE;
3537 GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE;
3538 GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE;
3539 GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE;
3540 GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE;
3541 GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE;
3542 GLboolean __GLEW_SGIX_texture_range = GL_FALSE;
3543 GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE;
3544 GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE;
3545 GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE;
3546 GLboolean __GLEW_SGIX_ycrcb = GL_FALSE;
3547 GLboolean __GLEW_SGI_color_matrix = GL_FALSE;
3548 GLboolean __GLEW_SGI_color_table = GL_FALSE;
3549 GLboolean __GLEW_SGI_texture_color_table = GL_FALSE;
3550 GLboolean __GLEW_SUNX_constant_data = GL_FALSE;
3551 GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE;
3552 GLboolean __GLEW_SUN_global_alpha = GL_FALSE;
3553 GLboolean __GLEW_SUN_mesh_array = GL_FALSE;
3554 GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE;
3555 GLboolean __GLEW_SUN_slice_accum = GL_FALSE;
3556 GLboolean __GLEW_SUN_triangle_list = GL_FALSE;
3557 GLboolean __GLEW_SUN_vertex = GL_FALSE;
3558 GLboolean __GLEW_WIN_phong_shading = GL_FALSE;
3559 GLboolean __GLEW_WIN_specular_fog = GL_FALSE;
3560 GLboolean __GLEW_WIN_swap_hint = GL_FALSE;
3561
3562 #endif /* !GLEW_MX */
3563
3564 #ifdef GL_VERSION_1_2
3565
3566 static GLboolean _glewInit_GL_VERSION_1_2 (GLEW_CONTEXT_ARG_DEF_INIT)
3567 {
3568 GLboolean r = GL_FALSE;
3569
3570 r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r;
3571 r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r;
3572 r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r;
3573 r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r;
3574
3575 return r;
3576 }
3577
3578 #endif /* GL_VERSION_1_2 */
3579
3580 #ifdef GL_VERSION_1_3
3581
3582 static GLboolean _glewInit_GL_VERSION_1_3 (GLEW_CONTEXT_ARG_DEF_INIT)
3583 {
3584 GLboolean r = GL_FALSE;
3585
3586 r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r;
3587 r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r;
3588 r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r;
3589 r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r;
3590 r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r;
3591 r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r;
3592 r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r;
3593 r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r;
3594 r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r;
3595 r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r;
3596 r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r;
3597 r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r;
3598 r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r;
3599 r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r;
3600 r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r;
3601 r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r;
3602 r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r;
3603 r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r;
3604 r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r;
3605 r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r;
3606 r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r;
3607 r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r;
3608 r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r;
3609 r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r;
3610 r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r;
3611 r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r;
3612 r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r;
3613 r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r;
3614 r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r;
3615 r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r;
3616 r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r;
3617 r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r;
3618 r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r;
3619 r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r;
3620 r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r;
3621 r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r;
3622 r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r;
3623 r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r;
3624 r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r;
3625 r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r;
3626 r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r;
3627 r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r;
3628 r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r;
3629 r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r;
3630 r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r;
3631 r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r;
3632
3633 return r;
3634 }
3635
3636 #endif /* GL_VERSION_1_3 */
3637
3638 #ifdef GL_VERSION_1_4
3639
3640 static GLboolean _glewInit_GL_VERSION_1_4 (GLEW_CONTEXT_ARG_DEF_INIT)
3641 {
3642 GLboolean r = GL_FALSE;
3643
3644 r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r;
3645 r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r;
3646 r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r;
3647 r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r;
3648 r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r;
3649 r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r;
3650 r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r;
3651 r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r;
3652 r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r;
3653 r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r;
3654 r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r;
3655 r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r;
3656 r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPointParameteri")) == NULL) || r;
3657 r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriv")) == NULL) || r;
3658 r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r;
3659 r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r;
3660 r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r;
3661 r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r;
3662 r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r;
3663 r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r;
3664 r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r;
3665 r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r;
3666 r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r;
3667 r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r;
3668 r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r;
3669 r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r;
3670 r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r;
3671 r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r;
3672 r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r;
3673 r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r;
3674 r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r;
3675 r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r;
3676 r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r;
3677 r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r;
3678 r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r;
3679 r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r;
3680 r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r;
3681 r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r;
3682 r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r;
3683 r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r;
3684 r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r;
3685 r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r;
3686 r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r;
3687 r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r;
3688 r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r;
3689 r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r;
3690 r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r;
3691
3692 return r;
3693 }
3694
3695 #endif /* GL_VERSION_1_4 */
3696
3697 #ifdef GL_VERSION_1_5
3698
3699 static GLboolean _glewInit_GL_VERSION_1_5 (GLEW_CONTEXT_ARG_DEF_INIT)
3700 {
3701 GLboolean r = GL_FALSE;
3702
3703 r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r;
3704 r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r;
3705 r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r;
3706 r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r;
3707 r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r;
3708 r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r;
3709 r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r;
3710 r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r;
3711 r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r;
3712 r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r;
3713 r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r;
3714 r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r;
3715 r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r;
3716 r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r;
3717 r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r;
3718 r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r;
3719 r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r;
3720 r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r;
3721 r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r;
3722
3723 return r;
3724 }
3725
3726 #endif /* GL_VERSION_1_5 */
3727
3728 #ifdef GL_VERSION_2_0
3729
3730 static GLboolean _glewInit_GL_VERSION_2_0 (GLEW_CONTEXT_ARG_DEF_INIT)
3731 {
3732 GLboolean r = GL_FALSE;
3733
3734 r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r;
3735 r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r;
3736 r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r;
3737 r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r;
3738 r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r;
3739 r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r;
3740 r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r;
3741 r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r;
3742 r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r;
3743 r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r;
3744 r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r;
3745 r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r;
3746 r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r;
3747 r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r;
3748 r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r;
3749 r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r;
3750 r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r;
3751 r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r;
3752 r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r;
3753 r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r;
3754 r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r;
3755 r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r;
3756 r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r;
3757 r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r;
3758 r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r;
3759 r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r;
3760 r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r;
3761 r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r;
3762 r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r;
3763 r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r;
3764 r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r;
3765 r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r;
3766 r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r;
3767 r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r;
3768 r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r;
3769 r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r;
3770 r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r;
3771 r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r;
3772 r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r;
3773 r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r;
3774 r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r;
3775 r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r;
3776 r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r;
3777 r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r;
3778 r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r;
3779 r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r;
3780 r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r;
3781 r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r;
3782 r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r;
3783 r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r;
3784 r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r;
3785 r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r;
3786 r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r;
3787 r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r;
3788 r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r;
3789 r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r;
3790 r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r;
3791 r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r;
3792 r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r;
3793 r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r;
3794 r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r;
3795 r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r;
3796 r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r;
3797 r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r;
3798 r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r;
3799 r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r;
3800 r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r;
3801 r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r;
3802 r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r;
3803 r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r;
3804 r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r;
3805 r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r;
3806 r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r;
3807 r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r;
3808 r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r;
3809 r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r;
3810 r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r;
3811 r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r;
3812 r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r;
3813 r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r;
3814 r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r;
3815 r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r;
3816 r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r;
3817 r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r;
3818 r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r;
3819 r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r;
3820 r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r;
3821 r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r;
3822 r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r;
3823 r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r;
3824 r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r;
3825 r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r;
3826 r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r;
3827
3828 return r;
3829 }
3830
3831 #endif /* GL_VERSION_2_0 */
3832
3833 #ifdef GL_VERSION_2_1
3834
3835 static GLboolean _glewInit_GL_VERSION_2_1 (GLEW_CONTEXT_ARG_DEF_INIT)
3836 {
3837 GLboolean r = GL_FALSE;
3838
3839 r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fv")) == NULL) || r;
3840 r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fv")) == NULL) || r;
3841 r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fv")) == NULL) || r;
3842 r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fv")) == NULL) || r;
3843 r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fv")) == NULL) || r;
3844 r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fv")) == NULL) || r;
3845
3846 return r;
3847 }
3848
3849 #endif /* GL_VERSION_2_1 */
3850
3851 #ifdef GL_VERSION_3_0
3852
3853 static GLboolean _glewInit_GL_VERSION_3_0 (GLEW_CONTEXT_ARG_DEF_INIT)
3854 {
3855 GLboolean r = GL_FALSE;
3856
3857 r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRender")) == NULL) || r;
3858 r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedback")) == NULL) || r;
3859 r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocation")) == NULL) || r;
3860 r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)"glClampColor")) == NULL) || r;
3861 r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfi")) == NULL) || r;
3862 r = ((glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfv")) == NULL) || r;
3863 r = ((glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferiv")) == NULL) || r;
3864 r = ((glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferuiv")) == NULL) || r;
3865 r = ((glColorMaski = (PFNGLCOLORMASKIPROC)glewGetProcAddress((const GLubyte*)"glColorMaski")) == NULL) || r;
3866 r = ((glDisablei = (PFNGLDISABLEIPROC)glewGetProcAddress((const GLubyte*)"glDisablei")) == NULL) || r;
3867 r = ((glEnablei = (PFNGLENABLEIPROC)glewGetProcAddress((const GLubyte*)"glEnablei")) == NULL) || r;
3868 r = ((glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRender")) == NULL) || r;
3869 r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedback")) == NULL) || r;
3870 r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)"glGetBooleani_v")) == NULL) || r;
3871 r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocation")) == NULL) || r;
3872 r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi")) == NULL) || r;
3873 r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIiv")) == NULL) || r;
3874 r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuiv")) == NULL) || r;
3875 r = ((glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVarying")) == NULL) || r;
3876 r = ((glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuiv")) == NULL) || r;
3877 r = ((glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIiv")) == NULL) || r;
3878 r = ((glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuiv")) == NULL) || r;
3879 r = ((glIsEnabledi = (PFNGLISENABLEDIPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledi")) == NULL) || r;
3880 r = ((glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIiv")) == NULL) || r;
3881 r = ((glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuiv")) == NULL) || r;
3882 r = ((glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryings")) == NULL) || r;
3883 r = ((glUniform1ui = (PFNGLUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui")) == NULL) || r;
3884 r = ((glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiv")) == NULL) || r;
3885 r = ((glUniform2ui = (PFNGLUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui")) == NULL) || r;
3886 r = ((glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiv")) == NULL) || r;
3887 r = ((glUniform3ui = (PFNGLUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui")) == NULL) || r;
3888 r = ((glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiv")) == NULL) || r;
3889 r = ((glUniform4ui = (PFNGLUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui")) == NULL) || r;
3890 r = ((glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiv")) == NULL) || r;
3891 r = ((glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1i")) == NULL) || r;
3892 r = ((glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iv")) == NULL) || r;
3893 r = ((glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ui")) == NULL) || r;
3894 r = ((glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiv")) == NULL) || r;
3895 r = ((glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2i")) == NULL) || r;
3896 r = ((glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iv")) == NULL) || r;
3897 r = ((glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ui")) == NULL) || r;
3898 r = ((glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiv")) == NULL) || r;
3899 r = ((glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3i")) == NULL) || r;
3900 r = ((glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iv")) == NULL) || r;
3901 r = ((glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ui")) == NULL) || r;
3902 r = ((glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiv")) == NULL) || r;
3903 r = ((glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bv")) == NULL) || r;
3904 r = ((glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4i")) == NULL) || r;
3905 r = ((glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iv")) == NULL) || r;
3906 r = ((glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4sv")) == NULL) || r;
3907 r = ((glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubv")) == NULL) || r;
3908 r = ((glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ui")) == NULL) || r;
3909 r = ((glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiv")) == NULL) || r;
3910 r = ((glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usv")) == NULL) || r;
3911 r = ((glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointer")) == NULL) || r;
3912
3913 return r;
3914 }
3915
3916 #endif /* GL_VERSION_3_0 */
3917
3918 #ifdef GL_VERSION_3_1
3919
3920 static GLboolean _glewInit_GL_VERSION_3_1 (GLEW_CONTEXT_ARG_DEF_INIT)
3921 {
3922 GLboolean r = GL_FALSE;
3923
3924 r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstanced")) == NULL) || r;
3925 r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstanced")) == NULL) || r;
3926 r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndex")) == NULL) || r;
3927 r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTexBuffer")) == NULL) || r;
3928
3929 return r;
3930 }
3931
3932 #endif /* GL_VERSION_3_1 */
3933
3934 #ifdef GL_VERSION_3_2
3935
3936 static GLboolean _glewInit_GL_VERSION_3_2 (GLEW_CONTEXT_ARG_DEF_INIT)
3937 {
3938 GLboolean r = GL_FALSE;
3939
3940 r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture")) == NULL) || r;
3941 r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteri64v")) == NULL) || r;
3942 r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64i_v")) == NULL) || r;
3943
3944 return r;
3945 }
3946
3947 #endif /* GL_VERSION_3_2 */
3948
3949 #ifdef GL_VERSION_3_3
3950
3951 static GLboolean _glewInit_GL_VERSION_3_3 (GLEW_CONTEXT_ARG_DEF_INIT)
3952 {
3953 GLboolean r = GL_FALSE;
3954
3955 r = ((glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisor")) == NULL) || r;
3956
3957 return r;
3958 }
3959
3960 #endif /* GL_VERSION_3_3 */
3961
3962 #ifdef GL_VERSION_4_0
3963
3964 static GLboolean _glewInit_GL_VERSION_4_0 (GLEW_CONTEXT_ARG_DEF_INIT)
3965 {
3966 GLboolean r = GL_FALSE;
3967
3968 r = ((glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparatei")) == NULL) || r;
3969 r = ((glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationi")) == NULL) || r;
3970 r = ((glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparatei")) == NULL) || r;
3971 r = ((glBlendFunci = (PFNGLBLENDFUNCIPROC)glewGetProcAddress((const GLubyte*)"glBlendFunci")) == NULL) || r;
3972 r = ((glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShading")) == NULL) || r;
3973
3974 return r;
3975 }
3976
3977 #endif /* GL_VERSION_4_0 */
3978
3979 #ifdef GL_VERSION_4_5
3980
3981 static GLboolean _glewInit_GL_VERSION_4_5 (GLEW_CONTEXT_ARG_DEF_INIT)
3982 {
3983 GLboolean r = GL_FALSE;
3984
3985 r = ((glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatus")) == NULL) || r;
3986 r = ((glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImage")) == NULL) || r;
3987 r = ((glGetnTexImage = (PFNGLGETNTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImage")) == NULL) || r;
3988 r = ((glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdv")) == NULL) || r;
3989
3990 return r;
3991 }
3992
3993 #endif /* GL_VERSION_4_5 */
3994
3995 #ifdef GL_3DFX_tbuffer
3996
3997 static GLboolean _glewInit_GL_3DFX_tbuffer (GLEW_CONTEXT_ARG_DEF_INIT)
3998 {
3999 GLboolean r = GL_FALSE;
4000
4001 r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r;
4002
4003 return r;
4004 }
4005
4006 #endif /* GL_3DFX_tbuffer */
4007
4008 #ifdef GL_AMD_debug_output
4009
4010 static GLboolean _glewInit_GL_AMD_debug_output (GLEW_CONTEXT_ARG_DEF_INIT)
4011 {
4012 GLboolean r = GL_FALSE;
4013
4014 r = ((glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackAMD")) == NULL) || r;
4015 r = ((glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageEnableAMD")) == NULL) || r;
4016 r = ((glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertAMD")) == NULL) || r;
4017 r = ((glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogAMD")) == NULL) || r;
4018
4019 return r;
4020 }
4021
4022 #endif /* GL_AMD_debug_output */
4023
4024 #ifdef GL_AMD_draw_buffers_blend
4025
4026 static GLboolean _glewInit_GL_AMD_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT)
4027 {
4028 GLboolean r = GL_FALSE;
4029
4030 r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationIndexedAMD")) == NULL) || r;
4031 r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateIndexedAMD")) == NULL) || r;
4032 r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncIndexedAMD")) == NULL) || r;
4033 r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateIndexedAMD")) == NULL) || r;
4034
4035 return r;
4036 }
4037
4038 #endif /* GL_AMD_draw_buffers_blend */
4039
4040 #ifdef GL_AMD_interleaved_elements
4041
4042 static GLboolean _glewInit_GL_AMD_interleaved_elements (GLEW_CONTEXT_ARG_DEF_INIT)
4043 {
4044 GLboolean r = GL_FALSE;
4045
4046 r = ((glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribParameteriAMD")) == NULL) || r;
4047
4048 return r;
4049 }
4050
4051 #endif /* GL_AMD_interleaved_elements */
4052
4053 #ifdef GL_AMD_multi_draw_indirect
4054
4055 static GLboolean _glewInit_GL_AMD_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT)
4056 {
4057 GLboolean r = GL_FALSE;
4058
4059 r = ((glMultiDrawArraysIndirectAMD = (PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectAMD")) == NULL) || r;
4060 r = ((glMultiDrawElementsIndirectAMD = (PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectAMD")) == NULL) || r;
4061
4062 return r;
4063 }
4064
4065 #endif /* GL_AMD_multi_draw_indirect */
4066
4067 #ifdef GL_AMD_name_gen_delete
4068
4069 static GLboolean _glewInit_GL_AMD_name_gen_delete (GLEW_CONTEXT_ARG_DEF_INIT)
4070 {
4071 GLboolean r = GL_FALSE;
4072
4073 r = ((glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamesAMD")) == NULL) || r;
4074 r = ((glGenNamesAMD = (PFNGLGENNAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glGenNamesAMD")) == NULL) || r;
4075 r = ((glIsNameAMD = (PFNGLISNAMEAMDPROC)glewGetProcAddress((const GLubyte*)"glIsNameAMD")) == NULL) || r;
4076
4077 return r;
4078 }
4079
4080 #endif /* GL_AMD_name_gen_delete */
4081
4082 #ifdef GL_AMD_occlusion_query_event
4083
4084 static GLboolean _glewInit_GL_AMD_occlusion_query_event (GLEW_CONTEXT_ARG_DEF_INIT)
4085 {
4086 GLboolean r = GL_FALSE;
4087
4088 r = ((glQueryObjectParameteruiAMD = (PFNGLQUERYOBJECTPARAMETERUIAMDPROC)glewGetProcAddress((const GLubyte*)"glQueryObjectParameteruiAMD")) == NULL) || r;
4089
4090 return r;
4091 }
4092
4093 #endif /* GL_AMD_occlusion_query_event */
4094
4095 #ifdef GL_AMD_performance_monitor
4096
4097 static GLboolean _glewInit_GL_AMD_performance_monitor (GLEW_CONTEXT_ARG_DEF_INIT)
4098 {
4099 GLboolean r = GL_FALSE;
4100
4101 r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfMonitorAMD")) == NULL) || r;
4102 r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfMonitorsAMD")) == NULL) || r;
4103 r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glEndPerfMonitorAMD")) == NULL) || r;
4104 r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glGenPerfMonitorsAMD")) == NULL) || r;
4105 r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterDataAMD")) == NULL) || r;
4106 r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterInfoAMD")) == NULL) || r;
4107 r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterStringAMD")) == NULL) || r;
4108 r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCountersAMD")) == NULL) || r;
4109 r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupStringAMD")) == NULL) || r;
4110 r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupsAMD")) == NULL) || r;
4111 r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glSelectPerfMonitorCountersAMD")) == NULL) || r;
4112
4113 return r;
4114 }
4115
4116 #endif /* GL_AMD_performance_monitor */
4117
4118 #ifdef GL_AMD_sample_positions
4119
4120 static GLboolean _glewInit_GL_AMD_sample_positions (GLEW_CONTEXT_ARG_DEF_INIT)
4121 {
4122 GLboolean r = GL_FALSE;
4123
4124 r = ((glSetMultisamplefvAMD = (PFNGLSETMULTISAMPLEFVAMDPROC)glewGetProcAddress((const GLubyte*)"glSetMultisamplefvAMD")) == NULL) || r;
4125
4126 return r;
4127 }
4128
4129 #endif /* GL_AMD_sample_positions */
4130
4131 #ifdef GL_AMD_sparse_texture
4132
4133 static GLboolean _glewInit_GL_AMD_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT)
4134 {
4135 GLboolean r = GL_FALSE;
4136
4137 r = ((glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTexStorageSparseAMD")) == NULL) || r;
4138 r = ((glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageSparseAMD")) == NULL) || r;
4139
4140 return r;
4141 }
4142
4143 #endif /* GL_AMD_sparse_texture */
4144
4145 #ifdef GL_AMD_stencil_operation_extended
4146
4147 static GLboolean _glewInit_GL_AMD_stencil_operation_extended (GLEW_CONTEXT_ARG_DEF_INIT)
4148 {
4149 GLboolean r = GL_FALSE;
4150
4151 r = ((glStencilOpValueAMD = (PFNGLSTENCILOPVALUEAMDPROC)glewGetProcAddress((const GLubyte*)"glStencilOpValueAMD")) == NULL) || r;
4152
4153 return r;
4154 }
4155
4156 #endif /* GL_AMD_stencil_operation_extended */
4157
4158 #ifdef GL_AMD_vertex_shader_tessellator
4159
4160 static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (GLEW_CONTEXT_ARG_DEF_INIT)
4161 {
4162 GLboolean r = GL_FALSE;
4163
4164 r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationFactorAMD")) == NULL) || r;
4165 r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationModeAMD")) == NULL) || r;
4166
4167 return r;
4168 }
4169
4170 #endif /* GL_AMD_vertex_shader_tessellator */
4171
4172 #ifdef GL_ANGLE_framebuffer_blit
4173
4174 static GLboolean _glewInit_GL_ANGLE_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT)
4175 {
4176 GLboolean r = GL_FALSE;
4177
4178 r = ((glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferANGLE")) == NULL) || r;
4179
4180 return r;
4181 }
4182
4183 #endif /* GL_ANGLE_framebuffer_blit */
4184
4185 #ifdef GL_ANGLE_framebuffer_multisample
4186
4187 static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
4188 {
4189 GLboolean r = GL_FALSE;
4190
4191 r = ((glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleANGLE")) == NULL) || r;
4192
4193 return r;
4194 }
4195
4196 #endif /* GL_ANGLE_framebuffer_multisample */
4197
4198 #ifdef GL_ANGLE_instanced_arrays
4199
4200 static GLboolean _glewInit_GL_ANGLE_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT)
4201 {
4202 GLboolean r = GL_FALSE;
4203
4204 r = ((glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedANGLE")) == NULL) || r;
4205 r = ((glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedANGLE")) == NULL) || r;
4206 r = ((glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorANGLE")) == NULL) || r;
4207
4208 return r;
4209 }
4210
4211 #endif /* GL_ANGLE_instanced_arrays */
4212
4213 #ifdef GL_ANGLE_timer_query
4214
4215 static GLboolean _glewInit_GL_ANGLE_timer_query (GLEW_CONTEXT_ARG_DEF_INIT)
4216 {
4217 GLboolean r = GL_FALSE;
4218
4219 r = ((glBeginQueryANGLE = (PFNGLBEGINQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryANGLE")) == NULL) || r;
4220 r = ((glDeleteQueriesANGLE = (PFNGLDELETEQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesANGLE")) == NULL) || r;
4221 r = ((glEndQueryANGLE = (PFNGLENDQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glEndQueryANGLE")) == NULL) || r;
4222 r = ((glGenQueriesANGLE = (PFNGLGENQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesANGLE")) == NULL) || r;
4223 r = ((glGetQueryObjecti64vANGLE = (PFNGLGETQUERYOBJECTI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vANGLE")) == NULL) || r;
4224 r = ((glGetQueryObjectivANGLE = (PFNGLGETQUERYOBJECTIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivANGLE")) == NULL) || r;
4225 r = ((glGetQueryObjectui64vANGLE = (PFNGLGETQUERYOBJECTUI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vANGLE")) == NULL) || r;
4226 r = ((glGetQueryObjectuivANGLE = (PFNGLGETQUERYOBJECTUIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivANGLE")) == NULL) || r;
4227 r = ((glGetQueryivANGLE = (PFNGLGETQUERYIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivANGLE")) == NULL) || r;
4228 r = ((glIsQueryANGLE = (PFNGLISQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glIsQueryANGLE")) == NULL) || r;
4229 r = ((glQueryCounterANGLE = (PFNGLQUERYCOUNTERANGLEPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterANGLE")) == NULL) || r;
4230
4231 return r;
4232 }
4233
4234 #endif /* GL_ANGLE_timer_query */
4235
4236 #ifdef GL_ANGLE_translated_shader_source
4237
4238 static GLboolean _glewInit_GL_ANGLE_translated_shader_source (GLEW_CONTEXT_ARG_DEF_INIT)
4239 {
4240 GLboolean r = GL_FALSE;
4241
4242 r = ((glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetTranslatedShaderSourceANGLE")) == NULL) || r;
4243
4244 return r;
4245 }
4246
4247 #endif /* GL_ANGLE_translated_shader_source */
4248
4249 #ifdef GL_APPLE_element_array
4250
4251 static GLboolean _glewInit_GL_APPLE_element_array (GLEW_CONTEXT_ARG_DEF_INIT)
4252 {
4253 GLboolean r = GL_FALSE;
4254
4255 r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r;
4256 r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r;
4257 r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r;
4258 r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r;
4259 r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r;
4260
4261 return r;
4262 }
4263
4264 #endif /* GL_APPLE_element_array */
4265
4266 #ifdef GL_APPLE_fence
4267
4268 static GLboolean _glewInit_GL_APPLE_fence (GLEW_CONTEXT_ARG_DEF_INIT)
4269 {
4270 GLboolean r = GL_FALSE;
4271
4272 r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r;
4273 r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r;
4274 r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r;
4275 r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r;
4276 r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r;
4277 r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r;
4278 r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r;
4279 r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r;
4280
4281 return r;
4282 }
4283
4284 #endif /* GL_APPLE_fence */
4285
4286 #ifdef GL_APPLE_flush_buffer_range
4287
4288 static GLboolean _glewInit_GL_APPLE_flush_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT)
4289 {
4290 GLboolean r = GL_FALSE;
4291
4292 r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBufferParameteriAPPLE")) == NULL) || r;
4293 r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeAPPLE")) == NULL) || r;
4294
4295 return r;
4296 }
4297
4298 #endif /* GL_APPLE_flush_buffer_range */
4299
4300 #ifdef GL_APPLE_object_purgeable
4301
4302 static GLboolean _glewInit_GL_APPLE_object_purgeable (GLEW_CONTEXT_ARG_DEF_INIT)
4303 {
4304 GLboolean r = GL_FALSE;
4305
4306 r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivAPPLE")) == NULL) || r;
4307 r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectPurgeableAPPLE")) == NULL) || r;
4308 r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectUnpurgeableAPPLE")) == NULL) || r;
4309
4310 return r;
4311 }
4312
4313 #endif /* GL_APPLE_object_purgeable */
4314
4315 #ifdef GL_APPLE_texture_range
4316
4317 static GLboolean _glewInit_GL_APPLE_texture_range (GLEW_CONTEXT_ARG_DEF_INIT)
4318 {
4319 GLboolean r = GL_FALSE;
4320
4321 r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r;
4322 r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r;
4323
4324 return r;
4325 }
4326
4327 #endif /* GL_APPLE_texture_range */
4328
4329 #ifdef GL_APPLE_vertex_array_object
4330
4331 static GLboolean _glewInit_GL_APPLE_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT)
4332 {
4333 GLboolean r = GL_FALSE;
4334
4335 r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r;
4336 r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r;
4337 r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r;
4338 r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r;
4339
4340 return r;
4341 }
4342
4343 #endif /* GL_APPLE_vertex_array_object */
4344
4345 #ifdef GL_APPLE_vertex_array_range
4346
4347 static GLboolean _glewInit_GL_APPLE_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT)
4348 {
4349 GLboolean r = GL_FALSE;
4350
4351 r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r;
4352 r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r;
4353 r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r;
4354
4355 return r;
4356 }
4357
4358 #endif /* GL_APPLE_vertex_array_range */
4359
4360 #ifdef GL_APPLE_vertex_program_evaluators
4361
4362 static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (GLEW_CONTEXT_ARG_DEF_INIT)
4363 {
4364 GLboolean r = GL_FALSE;
4365
4366 r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribAPPLE")) == NULL) || r;
4367 r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribAPPLE")) == NULL) || r;
4368 r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexAttribEnabledAPPLE")) == NULL) || r;
4369 r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1dAPPLE")) == NULL) || r;
4370 r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1fAPPLE")) == NULL) || r;
4371 r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2dAPPLE")) == NULL) || r;
4372 r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2fAPPLE")) == NULL) || r;
4373
4374 return r;
4375 }
4376
4377 #endif /* GL_APPLE_vertex_program_evaluators */
4378
4379 #ifdef GL_ARB_ES2_compatibility
4380
4381 static GLboolean _glewInit_GL_ARB_ES2_compatibility (GLEW_CONTEXT_ARG_DEF_INIT)
4382 {
4383 GLboolean r = GL_FALSE;
4384
4385 r = ((glClearDepthf = (PFNGLCLEARDEPTHFPROC)glewGetProcAddress((const GLubyte*)"glClearDepthf")) == NULL) || r;
4386 r = ((glDepthRangef = (PFNGLDEPTHRANGEFPROC)glewGetProcAddress((const GLubyte*)"glDepthRangef")) == NULL) || r;
4387 r = ((glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)glewGetProcAddress((const GLubyte*)"glGetShaderPrecisionFormat")) == NULL) || r;
4388 r = ((glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)glewGetProcAddress((const GLubyte*)"glReleaseShaderCompiler")) == NULL) || r;
4389 r = ((glShaderBinary = (PFNGLSHADERBINARYPROC)glewGetProcAddress((const GLubyte*)"glShaderBinary")) == NULL) || r;
4390
4391 return r;
4392 }
4393
4394 #endif /* GL_ARB_ES2_compatibility */
4395
4396 #ifdef GL_ARB_ES3_1_compatibility
4397
4398 static GLboolean _glewInit_GL_ARB_ES3_1_compatibility (GLEW_CONTEXT_ARG_DEF_INIT)
4399 {
4400 GLboolean r = GL_FALSE;
4401
4402 r = ((glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierByRegion")) == NULL) || r;
4403
4404 return r;
4405 }
4406
4407 #endif /* GL_ARB_ES3_1_compatibility */
4408
4409 #ifdef GL_ARB_ES3_2_compatibility
4410
4411 static GLboolean _glewInit_GL_ARB_ES3_2_compatibility (GLEW_CONTEXT_ARG_DEF_INIT)
4412 {
4413 GLboolean r = GL_FALSE;
4414
4415 r = ((glPrimitiveBoundingBoxARB = (PFNGLPRIMITIVEBOUNDINGBOXARBPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveBoundingBoxARB")) == NULL) || r;
4416
4417 return r;
4418 }
4419
4420 #endif /* GL_ARB_ES3_2_compatibility */
4421
4422 #ifdef GL_ARB_base_instance
4423
4424 static GLboolean _glewInit_GL_ARB_base_instance (GLEW_CONTEXT_ARG_DEF_INIT)
4425 {
4426 GLboolean r = GL_FALSE;
4427
4428 r = ((glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstance")) == NULL) || r;
4429 r = ((glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstance")) == NULL) || r;
4430 r = ((glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstance")) == NULL) || r;
4431
4432 return r;
4433 }
4434
4435 #endif /* GL_ARB_base_instance */
4436
4437 #ifdef GL_ARB_bindless_texture
4438
4439 static GLboolean _glewInit_GL_ARB_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT)
4440 {
4441 GLboolean r = GL_FALSE;
4442
4443 r = ((glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleARB")) == NULL) || r;
4444 r = ((glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleARB")) == NULL) || r;
4445 r = ((glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleARB")) == NULL) || r;
4446 r = ((glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vARB")) == NULL) || r;
4447 r = ((glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentARB")) == NULL) || r;
4448 r = ((glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentARB")) == NULL) || r;
4449 r = ((glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentARB")) == NULL) || r;
4450 r = ((glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentARB")) == NULL) || r;
4451 r = ((glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentARB")) == NULL) || r;
4452 r = ((glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentARB")) == NULL) || r;
4453 r = ((glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64ARB")) == NULL) || r;
4454 r = ((glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vARB")) == NULL) || r;
4455 r = ((glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64ARB")) == NULL) || r;
4456 r = ((glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vARB")) == NULL) || r;
4457 r = ((glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64ARB")) == NULL) || r;
4458 r = ((glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vARB")) == NULL) || r;
4459
4460 return r;
4461 }
4462
4463 #endif /* GL_ARB_bindless_texture */
4464
4465 #ifdef GL_ARB_blend_func_extended
4466
4467 static GLboolean _glewInit_GL_ARB_blend_func_extended (GLEW_CONTEXT_ARG_DEF_INIT)
4468 {
4469 GLboolean r = GL_FALSE;
4470
4471 r = ((glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexed")) == NULL) || r;
4472 r = ((glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndex")) == NULL) || r;
4473
4474 return r;
4475 }
4476
4477 #endif /* GL_ARB_blend_func_extended */
4478
4479 #ifdef GL_ARB_buffer_storage
4480
4481 static GLboolean _glewInit_GL_ARB_buffer_storage (GLEW_CONTEXT_ARG_DEF_INIT)
4482 {
4483 GLboolean r = GL_FALSE;
4484
4485 r = ((glBufferStorage = (PFNGLBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glBufferStorage")) == NULL) || r;
4486 r = ((glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageEXT")) == NULL) || r;
4487
4488 return r;
4489 }
4490
4491 #endif /* GL_ARB_buffer_storage */
4492
4493 #ifdef GL_ARB_cl_event
4494
4495 static GLboolean _glewInit_GL_ARB_cl_event (GLEW_CONTEXT_ARG_DEF_INIT)
4496 {
4497 GLboolean r = GL_FALSE;
4498
4499 r = ((glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateSyncFromCLeventARB")) == NULL) || r;
4500
4501 return r;
4502 }
4503
4504 #endif /* GL_ARB_cl_event */
4505
4506 #ifdef GL_ARB_clear_buffer_object
4507
4508 static GLboolean _glewInit_GL_ARB_clear_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
4509 {
4510 GLboolean r = GL_FALSE;
4511
4512 r = ((glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferData")) == NULL) || r;
4513 r = ((glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferSubData")) == NULL) || r;
4514 r = ((glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferDataEXT")) == NULL) || r;
4515 r = ((glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubDataEXT")) == NULL) || r;
4516
4517 return r;
4518 }
4519
4520 #endif /* GL_ARB_clear_buffer_object */
4521
4522 #ifdef GL_ARB_clear_texture
4523
4524 static GLboolean _glewInit_GL_ARB_clear_texture (GLEW_CONTEXT_ARG_DEF_INIT)
4525 {
4526 GLboolean r = GL_FALSE;
4527
4528 r = ((glClearTexImage = (PFNGLCLEARTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexImage")) == NULL) || r;
4529 r = ((glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImage")) == NULL) || r;
4530
4531 return r;
4532 }
4533
4534 #endif /* GL_ARB_clear_texture */
4535
4536 #ifdef GL_ARB_clip_control
4537
4538 static GLboolean _glewInit_GL_ARB_clip_control (GLEW_CONTEXT_ARG_DEF_INIT)
4539 {
4540 GLboolean r = GL_FALSE;
4541
4542 r = ((glClipControl = (PFNGLCLIPCONTROLPROC)glewGetProcAddress((const GLubyte*)"glClipControl")) == NULL) || r;
4543
4544 return r;
4545 }
4546
4547 #endif /* GL_ARB_clip_control */
4548
4549 #ifdef GL_ARB_color_buffer_float
4550
4551 static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT)
4552 {
4553 GLboolean r = GL_FALSE;
4554
4555 r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r;
4556
4557 return r;
4558 }
4559
4560 #endif /* GL_ARB_color_buffer_float */
4561
4562 #ifdef GL_ARB_compute_shader
4563
4564 static GLboolean _glewInit_GL_ARB_compute_shader (GLEW_CONTEXT_ARG_DEF_INIT)
4565 {
4566 GLboolean r = GL_FALSE;
4567
4568 r = ((glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)glewGetProcAddress((const GLubyte*)"glDispatchCompute")) == NULL) || r;
4569 r = ((glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeIndirect")) == NULL) || r;
4570
4571 return r;
4572 }
4573
4574 #endif /* GL_ARB_compute_shader */
4575
4576 #ifdef GL_ARB_compute_variable_group_size
4577
4578 static GLboolean _glewInit_GL_ARB_compute_variable_group_size (GLEW_CONTEXT_ARG_DEF_INIT)
4579 {
4580 GLboolean r = GL_FALSE;
4581
4582 r = ((glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeGroupSizeARB")) == NULL) || r;
4583
4584 return r;
4585 }
4586
4587 #endif /* GL_ARB_compute_variable_group_size */
4588
4589 #ifdef GL_ARB_copy_buffer
4590
4591 static GLboolean _glewInit_GL_ARB_copy_buffer (GLEW_CONTEXT_ARG_DEF_INIT)
4592 {
4593 GLboolean r = GL_FALSE;
4594
4595 r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubData")) == NULL) || r;
4596
4597 return r;
4598 }
4599
4600 #endif /* GL_ARB_copy_buffer */
4601
4602 #ifdef GL_ARB_copy_image
4603
4604 static GLboolean _glewInit_GL_ARB_copy_image (GLEW_CONTEXT_ARG_DEF_INIT)
4605 {
4606 GLboolean r = GL_FALSE;
4607
4608 r = ((glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubData")) == NULL) || r;
4609
4610 return r;
4611 }
4612
4613 #endif /* GL_ARB_copy_image */
4614
4615 #ifdef GL_ARB_debug_output
4616
4617 static GLboolean _glewInit_GL_ARB_debug_output (GLEW_CONTEXT_ARG_DEF_INIT)
4618 {
4619 GLboolean r = GL_FALSE;
4620
4621 r = ((glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackARB")) == NULL) || r;
4622 r = ((glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControlARB")) == NULL) || r;
4623 r = ((glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertARB")) == NULL) || r;
4624 r = ((glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogARB")) == NULL) || r;
4625
4626 return r;
4627 }
4628
4629 #endif /* GL_ARB_debug_output */
4630
4631 #ifdef GL_ARB_direct_state_access
4632
4633 static GLboolean _glewInit_GL_ARB_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT)
4634 {
4635 GLboolean r = GL_FALSE;
4636
4637 r = ((glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnit")) == NULL) || r;
4638 r = ((glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitNamedFramebuffer")) == NULL) || r;
4639 r = ((glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatus")) == NULL) || r;
4640 r = ((glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferData")) == NULL) || r;
4641 r = ((glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubData")) == NULL) || r;
4642 r = ((glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfi")) == NULL) || r;
4643 r = ((glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfv")) == NULL) || r;
4644 r = ((glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferiv")) == NULL) || r;
4645 r = ((glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferuiv")) == NULL) || r;
4646 r = ((glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1D")) == NULL) || r;
4647 r = ((glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2D")) == NULL) || r;
4648 r = ((glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3D")) == NULL) || r;
4649 r = ((glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyNamedBufferSubData")) == NULL) || r;
4650 r = ((glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1D")) == NULL) || r;
4651 r = ((glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2D")) == NULL) || r;
4652 r = ((glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3D")) == NULL) || r;
4653 r = ((glCreateBuffers = (PFNGLCREATEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateBuffers")) == NULL) || r;
4654 r = ((glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateFramebuffers")) == NULL) || r;
4655 r = ((glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramPipelines")) == NULL) || r;
4656 r = ((glCreateQueries = (PFNGLCREATEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glCreateQueries")) == NULL) || r;
4657 r = ((glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateRenderbuffers")) == NULL) || r;
4658 r = ((glCreateSamplers = (PFNGLCREATESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glCreateSamplers")) == NULL) || r;
4659 r = ((glCreateTextures = (PFNGLCREATETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glCreateTextures")) == NULL) || r;
4660 r = ((glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glCreateTransformFeedbacks")) == NULL) || r;
4661 r = ((glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glCreateVertexArrays")) == NULL) || r;
4662 r = ((glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttrib")) == NULL) || r;
4663 r = ((glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttrib")) == NULL) || r;
4664 r = ((glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRange")) == NULL) || r;
4665 r = ((glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmap")) == NULL) || r;
4666 r = ((glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImage")) == NULL) || r;
4667 r = ((glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteri64v")) == NULL) || r;
4668 r = ((glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteriv")) == NULL) || r;
4669 r = ((glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointerv")) == NULL) || r;
4670 r = ((glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubData")) == NULL) || r;
4671 r = ((glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameteriv")) == NULL) || r;
4672 r = ((glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameteriv")) == NULL) || r;
4673 r = ((glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameteriv")) == NULL) || r;
4674 r = ((glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjecti64v")) == NULL) || r;
4675 r = ((glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectiv")) == NULL) || r;
4676 r = ((glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectui64v")) == NULL) || r;
4677 r = ((glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectuiv")) == NULL) || r;
4678 r = ((glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImage")) == NULL) || r;
4679 r = ((glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfv")) == NULL) || r;
4680 r = ((glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameteriv")) == NULL) || r;
4681 r = ((glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIiv")) == NULL) || r;
4682 r = ((glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuiv")) == NULL) || r;
4683 r = ((glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfv")) == NULL) || r;
4684 r = ((glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameteriv")) == NULL) || r;
4685 r = ((glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki64_v")) == NULL) || r;
4686 r = ((glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki_v")) == NULL) || r;
4687 r = ((glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackiv")) == NULL) || r;
4688 r = ((glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexed64iv")) == NULL) || r;
4689 r = ((glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexediv")) == NULL) || r;
4690 r = ((glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayiv")) == NULL) || r;
4691 r = ((glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferData")) == NULL) || r;
4692 r = ((glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferSubData")) == NULL) || r;
4693 r = ((glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBuffer")) == NULL) || r;
4694 r = ((glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRange")) == NULL) || r;
4695 r = ((glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferData")) == NULL) || r;
4696 r = ((glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorage")) == NULL) || r;
4697 r = ((glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubData")) == NULL) || r;
4698 r = ((glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffer")) == NULL) || r;
4699 r = ((glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffers")) == NULL) || r;
4700 r = ((glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteri")) == NULL) || r;
4701 r = ((glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferReadBuffer")) == NULL) || r;
4702 r = ((glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbuffer")) == NULL) || r;
4703 r = ((glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture")) == NULL) || r;
4704 r = ((glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayer")) == NULL) || r;
4705 r = ((glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorage")) == NULL) || r;
4706 r = ((glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisample")) == NULL) || r;
4707 r = ((glTextureBuffer = (PFNGLTEXTUREBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTextureBuffer")) == NULL) || r;
4708 r = ((glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRange")) == NULL) || r;
4709 r = ((glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIiv")) == NULL) || r;
4710 r = ((glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuiv")) == NULL) || r;
4711 r = ((glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterf")) == NULL) || r;
4712 r = ((glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfv")) == NULL) || r;
4713 r = ((glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteri")) == NULL) || r;
4714 r = ((glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriv")) == NULL) || r;
4715 r = ((glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1D")) == NULL) || r;
4716 r = ((glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2D")) == NULL) || r;
4717 r = ((glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisample")) == NULL) || r;
4718 r = ((glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3D")) == NULL) || r;
4719 r = ((glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisample")) == NULL) || r;
4720 r = ((glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1D")) == NULL) || r;
4721 r = ((glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2D")) == NULL) || r;
4722 r = ((glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3D")) == NULL) || r;
4723 r = ((glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferBase")) == NULL) || r;
4724 r = ((glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferRange")) == NULL) || r;
4725 r = ((glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBuffer")) == NULL) || r;
4726 r = ((glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribBinding")) == NULL) || r;
4727 r = ((glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribFormat")) == NULL) || r;
4728 r = ((glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribIFormat")) == NULL) || r;
4729 r = ((glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribLFormat")) == NULL) || r;
4730 r = ((glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindingDivisor")) == NULL) || r;
4731 r = ((glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayElementBuffer")) == NULL) || r;
4732 r = ((glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffer")) == NULL) || r;
4733 r = ((glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffers")) == NULL) || r;
4734
4735 return r;
4736 }
4737
4738 #endif /* GL_ARB_direct_state_access */
4739
4740 #ifdef GL_ARB_draw_buffers
4741
4742 static GLboolean _glewInit_GL_ARB_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT)
4743 {
4744 GLboolean r = GL_FALSE;
4745
4746 r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r;
4747
4748 return r;
4749 }
4750
4751 #endif /* GL_ARB_draw_buffers */
4752
4753 #ifdef GL_ARB_draw_buffers_blend
4754
4755 static GLboolean _glewInit_GL_ARB_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT)
4756 {
4757 GLboolean r = GL_FALSE;
4758
4759 r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiARB")) == NULL) || r;
4760 r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiARB")) == NULL) || r;
4761 r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiARB")) == NULL) || r;
4762 r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciARB")) == NULL) || r;
4763
4764 return r;
4765 }
4766
4767 #endif /* GL_ARB_draw_buffers_blend */
4768
4769 #ifdef GL_ARB_draw_elements_base_vertex
4770
4771 static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (GLEW_CONTEXT_ARG_DEF_INIT)
4772 {
4773 GLboolean r = GL_FALSE;
4774
4775 r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertex")) == NULL) || r;
4776 r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertex")) == NULL) || r;
4777 r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertex")) == NULL) || r;
4778 r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertex")) == NULL) || r;
4779
4780 return r;
4781 }
4782
4783 #endif /* GL_ARB_draw_elements_base_vertex */
4784
4785 #ifdef GL_ARB_draw_indirect
4786
4787 static GLboolean _glewInit_GL_ARB_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT)
4788 {
4789 GLboolean r = GL_FALSE;
4790
4791 r = ((glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysIndirect")) == NULL) || r;
4792 r = ((glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsIndirect")) == NULL) || r;
4793
4794 return r;
4795 }
4796
4797 #endif /* GL_ARB_draw_indirect */
4798
4799 #ifdef GL_ARB_framebuffer_no_attachments
4800
4801 static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments (GLEW_CONTEXT_ARG_DEF_INIT)
4802 {
4803 GLboolean r = GL_FALSE;
4804
4805 r = ((glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glFramebufferParameteri")) == NULL) || r;
4806 r = ((glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameteriv")) == NULL) || r;
4807 r = ((glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterivEXT")) == NULL) || r;
4808 r = ((glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteriEXT")) == NULL) || r;
4809
4810 return r;
4811 }
4812
4813 #endif /* GL_ARB_framebuffer_no_attachments */
4814
4815 #ifdef GL_ARB_framebuffer_object
4816
4817 static GLboolean _glewInit_GL_ARB_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
4818 {
4819 GLboolean r = GL_FALSE;
4820
4821 r = ((glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindFramebuffer")) == NULL) || r;
4822 r = ((glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbuffer")) == NULL) || r;
4823 r = ((glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebuffer")) == NULL) || r;
4824 r = ((glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatus")) == NULL) || r;
4825 r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r;
4826 r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r;
4827 r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r;
4828 r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r;
4829 r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r;
4830 r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r;
4831 r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r;
4832 r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffers")) == NULL) || r;
4833 r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffers")) == NULL) || r;
4834 r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmap")) == NULL) || r;
4835 r = ((glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameteriv")) == NULL) || r;
4836 r = ((glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameteriv")) == NULL) || r;
4837 r = ((glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsFramebuffer")) == NULL) || r;
4838 r = ((glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbuffer")) == NULL) || r;
4839 r = ((glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorage")) == NULL) || r;
4840 r = ((glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisample")) == NULL) || r;
4841
4842 return r;
4843 }
4844
4845 #endif /* GL_ARB_framebuffer_object */
4846
4847 #ifdef GL_ARB_geometry_shader4
4848
4849 static GLboolean _glewInit_GL_ARB_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT)
4850 {
4851 GLboolean r = GL_FALSE;
4852
4853 r = ((glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureARB")) == NULL) || r;
4854 r = ((glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceARB")) == NULL) || r;
4855 r = ((glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerARB")) == NULL) || r;
4856 r = ((glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriARB")) == NULL) || r;
4857
4858 return r;
4859 }
4860
4861 #endif /* GL_ARB_geometry_shader4 */
4862
4863 #ifdef GL_ARB_get_program_binary
4864
4865 static GLboolean _glewInit_GL_ARB_get_program_binary (GLEW_CONTEXT_ARG_DEF_INIT)
4866 {
4867 GLboolean r = GL_FALSE;
4868
4869 r = ((glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinary")) == NULL) || r;
4870 r = ((glProgramBinary = (PFNGLPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glProgramBinary")) == NULL) || r;
4871 r = ((glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteri")) == NULL) || r;
4872
4873 return r;
4874 }
4875
4876 #endif /* GL_ARB_get_program_binary */
4877
4878 #ifdef GL_ARB_get_texture_sub_image
4879
4880 static GLboolean _glewInit_GL_ARB_get_texture_sub_image (GLEW_CONTEXT_ARG_DEF_INIT)
4881 {
4882 GLboolean r = GL_FALSE;
4883
4884 r = ((glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureSubImage")) == NULL) || r;
4885 r = ((glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSubImage")) == NULL) || r;
4886
4887 return r;
4888 }
4889
4890 #endif /* GL_ARB_get_texture_sub_image */
4891
4892 #ifdef GL_ARB_gpu_shader_fp64
4893
4894 static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 (GLEW_CONTEXT_ARG_DEF_INIT)
4895 {
4896 GLboolean r = GL_FALSE;
4897
4898 r = ((glGetUniformdv = (PFNGLGETUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformdv")) == NULL) || r;
4899 r = ((glUniform1d = (PFNGLUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glUniform1d")) == NULL) || r;
4900 r = ((glUniform1dv = (PFNGLUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glUniform1dv")) == NULL) || r;
4901 r = ((glUniform2d = (PFNGLUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glUniform2d")) == NULL) || r;
4902 r = ((glUniform2dv = (PFNGLUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glUniform2dv")) == NULL) || r;
4903 r = ((glUniform3d = (PFNGLUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glUniform3d")) == NULL) || r;
4904 r = ((glUniform3dv = (PFNGLUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glUniform3dv")) == NULL) || r;
4905 r = ((glUniform4d = (PFNGLUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glUniform4d")) == NULL) || r;
4906 r = ((glUniform4dv = (PFNGLUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glUniform4dv")) == NULL) || r;
4907 r = ((glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2dv")) == NULL) || r;
4908 r = ((glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3dv")) == NULL) || r;
4909 r = ((glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4dv")) == NULL) || r;
4910 r = ((glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3dv")) == NULL) || r;
4911 r = ((glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2dv")) == NULL) || r;
4912 r = ((glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4dv")) == NULL) || r;
4913 r = ((glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4dv")) == NULL) || r;
4914 r = ((glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2dv")) == NULL) || r;
4915 r = ((glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3dv")) == NULL) || r;
4916
4917 return r;
4918 }
4919
4920 #endif /* GL_ARB_gpu_shader_fp64 */
4921
4922 #ifdef GL_ARB_gpu_shader_int64
4923
4924 static GLboolean _glewInit_GL_ARB_gpu_shader_int64 (GLEW_CONTEXT_ARG_DEF_INIT)
4925 {
4926 GLboolean r = GL_FALSE;
4927
4928 r = ((glGetUniformi64vARB = (PFNGLGETUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vARB")) == NULL) || r;
4929 r = ((glGetUniformui64vARB = (PFNGLGETUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vARB")) == NULL) || r;
4930 r = ((glGetnUniformi64vARB = (PFNGLGETNUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformi64vARB")) == NULL) || r;
4931 r = ((glGetnUniformui64vARB = (PFNGLGETNUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformui64vARB")) == NULL) || r;
4932 r = ((glProgramUniform1i64ARB = (PFNGLPROGRAMUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64ARB")) == NULL) || r;
4933 r = ((glProgramUniform1i64vARB = (PFNGLPROGRAMUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vARB")) == NULL) || r;
4934 r = ((glProgramUniform1ui64ARB = (PFNGLPROGRAMUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64ARB")) == NULL) || r;
4935 r = ((glProgramUniform1ui64vARB = (PFNGLPROGRAMUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vARB")) == NULL) || r;
4936 r = ((glProgramUniform2i64ARB = (PFNGLPROGRAMUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64ARB")) == NULL) || r;
4937 r = ((glProgramUniform2i64vARB = (PFNGLPROGRAMUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vARB")) == NULL) || r;
4938 r = ((glProgramUniform2ui64ARB = (PFNGLPROGRAMUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64ARB")) == NULL) || r;
4939 r = ((glProgramUniform2ui64vARB = (PFNGLPROGRAMUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vARB")) == NULL) || r;
4940 r = ((glProgramUniform3i64ARB = (PFNGLPROGRAMUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64ARB")) == NULL) || r;
4941 r = ((glProgramUniform3i64vARB = (PFNGLPROGRAMUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vARB")) == NULL) || r;
4942 r = ((glProgramUniform3ui64ARB = (PFNGLPROGRAMUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64ARB")) == NULL) || r;
4943 r = ((glProgramUniform3ui64vARB = (PFNGLPROGRAMUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vARB")) == NULL) || r;
4944 r = ((glProgramUniform4i64ARB = (PFNGLPROGRAMUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64ARB")) == NULL) || r;
4945 r = ((glProgramUniform4i64vARB = (PFNGLPROGRAMUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vARB")) == NULL) || r;
4946 r = ((glProgramUniform4ui64ARB = (PFNGLPROGRAMUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64ARB")) == NULL) || r;
4947 r = ((glProgramUniform4ui64vARB = (PFNGLPROGRAMUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vARB")) == NULL) || r;
4948 r = ((glUniform1i64ARB = (PFNGLUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64ARB")) == NULL) || r;
4949 r = ((glUniform1i64vARB = (PFNGLUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vARB")) == NULL) || r;
4950 r = ((glUniform1ui64ARB = (PFNGLUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64ARB")) == NULL) || r;
4951 r = ((glUniform1ui64vARB = (PFNGLUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vARB")) == NULL) || r;
4952 r = ((glUniform2i64ARB = (PFNGLUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64ARB")) == NULL) || r;
4953 r = ((glUniform2i64vARB = (PFNGLUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vARB")) == NULL) || r;
4954 r = ((glUniform2ui64ARB = (PFNGLUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64ARB")) == NULL) || r;
4955 r = ((glUniform2ui64vARB = (PFNGLUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vARB")) == NULL) || r;
4956 r = ((glUniform3i64ARB = (PFNGLUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64ARB")) == NULL) || r;
4957 r = ((glUniform3i64vARB = (PFNGLUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vARB")) == NULL) || r;
4958 r = ((glUniform3ui64ARB = (PFNGLUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64ARB")) == NULL) || r;
4959 r = ((glUniform3ui64vARB = (PFNGLUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vARB")) == NULL) || r;
4960 r = ((glUniform4i64ARB = (PFNGLUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64ARB")) == NULL) || r;
4961 r = ((glUniform4i64vARB = (PFNGLUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vARB")) == NULL) || r;
4962 r = ((glUniform4ui64ARB = (PFNGLUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64ARB")) == NULL) || r;
4963 r = ((glUniform4ui64vARB = (PFNGLUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vARB")) == NULL) || r;
4964
4965 return r;
4966 }
4967
4968 #endif /* GL_ARB_gpu_shader_int64 */
4969
4970 #ifdef GL_ARB_imaging
4971
4972 static GLboolean _glewInit_GL_ARB_imaging (GLEW_CONTEXT_ARG_DEF_INIT)
4973 {
4974 GLboolean r = GL_FALSE;
4975
4976 r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r;
4977 r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r;
4978 r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r;
4979 r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r;
4980 r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r;
4981 r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r;
4982 r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r;
4983 r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r;
4984 r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r;
4985 r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r;
4986 r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r;
4987 r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r;
4988 r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r;
4989 r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r;
4990 r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r;
4991 r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r;
4992 r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r;
4993 r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r;
4994 r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r;
4995 r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r;
4996 r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r;
4997 r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r;
4998 r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r;
4999 r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r;
5000 r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r;
5001 r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r;
5002 r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r;
5003 r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r;
5004 r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r;
5005 r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r;
5006 r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r;
5007 r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r;
5008 r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r;
5009
5010 return r;
5011 }
5012
5013 #endif /* GL_ARB_imaging */
5014
5015 #ifdef GL_ARB_indirect_parameters
5016
5017 static GLboolean _glewInit_GL_ARB_indirect_parameters (GLEW_CONTEXT_ARG_DEF_INIT)
5018 {
5019 GLboolean r = GL_FALSE;
5020
5021 r = ((glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCountARB")) == NULL) || r;
5022 r = ((glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCountARB")) == NULL) || r;
5023
5024 return r;
5025 }
5026
5027 #endif /* GL_ARB_indirect_parameters */
5028
5029 #ifdef GL_ARB_instanced_arrays
5030
5031 static GLboolean _glewInit_GL_ARB_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT)
5032 {
5033 GLboolean r = GL_FALSE;
5034
5035 r = ((glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedARB")) == NULL) || r;
5036 r = ((glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedARB")) == NULL) || r;
5037 r = ((glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorARB")) == NULL) || r;
5038
5039 return r;
5040 }
5041
5042 #endif /* GL_ARB_instanced_arrays */
5043
5044 #ifdef GL_ARB_internalformat_query
5045
5046 static GLboolean _glewInit_GL_ARB_internalformat_query (GLEW_CONTEXT_ARG_DEF_INIT)
5047 {
5048 GLboolean r = GL_FALSE;
5049
5050 r = ((glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformativ")) == NULL) || r;
5051
5052 return r;
5053 }
5054
5055 #endif /* GL_ARB_internalformat_query */
5056
5057 #ifdef GL_ARB_internalformat_query2
5058
5059 static GLboolean _glewInit_GL_ARB_internalformat_query2 (GLEW_CONTEXT_ARG_DEF_INIT)
5060 {
5061 GLboolean r = GL_FALSE;
5062
5063 r = ((glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformati64v")) == NULL) || r;
5064
5065 return r;
5066 }
5067
5068 #endif /* GL_ARB_internalformat_query2 */
5069
5070 #ifdef GL_ARB_invalidate_subdata
5071
5072 static GLboolean _glewInit_GL_ARB_invalidate_subdata (GLEW_CONTEXT_ARG_DEF_INIT)
5073 {
5074 GLboolean r = GL_FALSE;
5075
5076 r = ((glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferData")) == NULL) || r;
5077 r = ((glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferSubData")) == NULL) || r;
5078 r = ((glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateFramebuffer")) == NULL) || r;
5079 r = ((glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateSubFramebuffer")) == NULL) || r;
5080 r = ((glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexImage")) == NULL) || r;
5081 r = ((glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexSubImage")) == NULL) || r;
5082
5083 return r;
5084 }
5085
5086 #endif /* GL_ARB_invalidate_subdata */
5087
5088 #ifdef GL_ARB_map_buffer_range
5089
5090 static GLboolean _glewInit_GL_ARB_map_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT)
5091 {
5092 GLboolean r = GL_FALSE;
5093
5094 r = ((glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRange")) == NULL) || r;
5095 r = ((glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRange")) == NULL) || r;
5096
5097 return r;
5098 }
5099
5100 #endif /* GL_ARB_map_buffer_range */
5101
5102 #ifdef GL_ARB_matrix_palette
5103
5104 static GLboolean _glewInit_GL_ARB_matrix_palette (GLEW_CONTEXT_ARG_DEF_INIT)
5105 {
5106 GLboolean r = GL_FALSE;
5107
5108 r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r;
5109 r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r;
5110 r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r;
5111 r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r;
5112 r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r;
5113
5114 return r;
5115 }
5116
5117 #endif /* GL_ARB_matrix_palette */
5118
5119 #ifdef GL_ARB_multi_bind
5120
5121 static GLboolean _glewInit_GL_ARB_multi_bind (GLEW_CONTEXT_ARG_DEF_INIT)
5122 {
5123 GLboolean r = GL_FALSE;
5124
5125 r = ((glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersBase")) == NULL) || r;
5126 r = ((glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersRange")) == NULL) || r;
5127 r = ((glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextures")) == NULL) || r;
5128 r = ((glBindSamplers = (PFNGLBINDSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glBindSamplers")) == NULL) || r;
5129 r = ((glBindTextures = (PFNGLBINDTEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindTextures")) == NULL) || r;
5130 r = ((glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffers")) == NULL) || r;
5131
5132 return r;
5133 }
5134
5135 #endif /* GL_ARB_multi_bind */
5136
5137 #ifdef GL_ARB_multi_draw_indirect
5138
5139 static GLboolean _glewInit_GL_ARB_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT)
5140 {
5141 GLboolean r = GL_FALSE;
5142
5143 r = ((glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirect")) == NULL) || r;
5144 r = ((glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirect")) == NULL) || r;
5145
5146 return r;
5147 }
5148
5149 #endif /* GL_ARB_multi_draw_indirect */
5150
5151 #ifdef GL_ARB_multisample
5152
5153 static GLboolean _glewInit_GL_ARB_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
5154 {
5155 GLboolean r = GL_FALSE;
5156
5157 r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r;
5158
5159 return r;
5160 }
5161
5162 #endif /* GL_ARB_multisample */
5163
5164 #ifdef GL_ARB_multitexture
5165
5166 static GLboolean _glewInit_GL_ARB_multitexture (GLEW_CONTEXT_ARG_DEF_INIT)
5167 {
5168 GLboolean r = GL_FALSE;
5169
5170 r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r;
5171 r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r;
5172 r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r;
5173 r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r;
5174 r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r;
5175 r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r;
5176 r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r;
5177 r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r;
5178 r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r;
5179 r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r;
5180 r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r;
5181 r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r;
5182 r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r;
5183 r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r;
5184 r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r;
5185 r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r;
5186 r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r;
5187 r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r;
5188 r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r;
5189 r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r;
5190 r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r;
5191 r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r;
5192 r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r;
5193 r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r;
5194 r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r;
5195 r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r;
5196 r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r;
5197 r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r;
5198 r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r;
5199 r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r;
5200 r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r;
5201 r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r;
5202 r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r;
5203 r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r;
5204
5205 return r;
5206 }
5207
5208 #endif /* GL_ARB_multitexture */
5209
5210 #ifdef GL_ARB_occlusion_query
5211
5212 static GLboolean _glewInit_GL_ARB_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT)
5213 {
5214 GLboolean r = GL_FALSE;
5215
5216 r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r;
5217 r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r;
5218 r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r;
5219 r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r;
5220 r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r;
5221 r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r;
5222 r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r;
5223 r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r;
5224
5225 return r;
5226 }
5227
5228 #endif /* GL_ARB_occlusion_query */
5229
5230 #ifdef GL_ARB_parallel_shader_compile
5231
5232 static GLboolean _glewInit_GL_ARB_parallel_shader_compile (GLEW_CONTEXT_ARG_DEF_INIT)
5233 {
5234 GLboolean r = GL_FALSE;
5235
5236 r = ((glMaxShaderCompilerThreadsARB = (PFNGLMAXSHADERCOMPILERTHREADSARBPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsARB")) == NULL) || r;
5237
5238 return r;
5239 }
5240
5241 #endif /* GL_ARB_parallel_shader_compile */
5242
5243 #ifdef GL_ARB_point_parameters
5244
5245 static GLboolean _glewInit_GL_ARB_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT)
5246 {
5247 GLboolean r = GL_FALSE;
5248
5249 r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r;
5250 r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r;
5251
5252 return r;
5253 }
5254
5255 #endif /* GL_ARB_point_parameters */
5256
5257 #ifdef GL_ARB_program_interface_query
5258
5259 static GLboolean _glewInit_GL_ARB_program_interface_query (GLEW_CONTEXT_ARG_DEF_INIT)
5260 {
5261 GLboolean r = GL_FALSE;
5262
5263 r = ((glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInterfaceiv")) == NULL) || r;
5264 r = ((glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceIndex")) == NULL) || r;
5265 r = ((glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocation")) == NULL) || r;
5266 r = ((glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndex")) == NULL) || r;
5267 r = ((glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceName")) == NULL) || r;
5268 r = ((glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceiv")) == NULL) || r;
5269
5270 return r;
5271 }
5272
5273 #endif /* GL_ARB_program_interface_query */
5274
5275 #ifdef GL_ARB_provoking_vertex
5276
5277 static GLboolean _glewInit_GL_ARB_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT)
5278 {
5279 GLboolean r = GL_FALSE;
5280
5281 r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertex")) == NULL) || r;
5282
5283 return r;
5284 }
5285
5286 #endif /* GL_ARB_provoking_vertex */
5287
5288 #ifdef GL_ARB_robustness
5289
5290 static GLboolean _glewInit_GL_ARB_robustness (GLEW_CONTEXT_ARG_DEF_INIT)
5291 {
5292 GLboolean r = GL_FALSE;
5293
5294 r = ((glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatusARB")) == NULL) || r;
5295 r = ((glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnColorTableARB")) == NULL) || r;
5296 r = ((glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImageARB")) == NULL) || r;
5297 r = ((glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnConvolutionFilterARB")) == NULL) || r;
5298 r = ((glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glGetnHistogramARB")) == NULL) || r;
5299 r = ((glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapdvARB")) == NULL) || r;
5300 r = ((glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapfvARB")) == NULL) || r;
5301 r = ((glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapivARB")) == NULL) || r;
5302 r = ((glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMinmaxARB")) == NULL) || r;
5303 r = ((glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapfvARB")) == NULL) || r;
5304 r = ((glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapuivARB")) == NULL) || r;
5305 r = ((glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapusvARB")) == NULL) || r;
5306 r = ((glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPolygonStippleARB")) == NULL) || r;
5307 r = ((glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnSeparableFilterARB")) == NULL) || r;
5308 r = ((glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImageARB")) == NULL) || r;
5309 r = ((glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdvARB")) == NULL) || r;
5310 r = ((glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvARB")) == NULL) || r;
5311 r = ((glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivARB")) == NULL) || r;
5312 r = ((glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuivARB")) == NULL) || r;
5313 r = ((glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsARB")) == NULL) || r;
5314
5315 return r;
5316 }
5317
5318 #endif /* GL_ARB_robustness */
5319
5320 #ifdef GL_ARB_sample_locations
5321
5322 static GLboolean _glewInit_GL_ARB_sample_locations (GLEW_CONTEXT_ARG_DEF_INIT)
5323 {
5324 GLboolean r = GL_FALSE;
5325
5326 r = ((glFramebufferSampleLocationsfvARB = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvARB")) == NULL) || r;
5327 r = ((glNamedFramebufferSampleLocationsfvARB = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvARB")) == NULL) || r;
5328
5329 return r;
5330 }
5331
5332 #endif /* GL_ARB_sample_locations */
5333
5334 #ifdef GL_ARB_sample_shading
5335
5336 static GLboolean _glewInit_GL_ARB_sample_shading (GLEW_CONTEXT_ARG_DEF_INIT)
5337 {
5338 GLboolean r = GL_FALSE;
5339
5340 r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingARB")) == NULL) || r;
5341
5342 return r;
5343 }
5344
5345 #endif /* GL_ARB_sample_shading */
5346
5347 #ifdef GL_ARB_sampler_objects
5348
5349 static GLboolean _glewInit_GL_ARB_sampler_objects (GLEW_CONTEXT_ARG_DEF_INIT)
5350 {
5351 GLboolean r = GL_FALSE;
5352
5353 r = ((glBindSampler = (PFNGLBINDSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glBindSampler")) == NULL) || r;
5354 r = ((glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteSamplers")) == NULL) || r;
5355 r = ((glGenSamplers = (PFNGLGENSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glGenSamplers")) == NULL) || r;
5356 r = ((glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIiv")) == NULL) || r;
5357 r = ((glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuiv")) == NULL) || r;
5358 r = ((glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterfv")) == NULL) || r;
5359 r = ((glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameteriv")) == NULL) || r;
5360 r = ((glIsSampler = (PFNGLISSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glIsSampler")) == NULL) || r;
5361 r = ((glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIiv")) == NULL) || r;
5362 r = ((glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuiv")) == NULL) || r;
5363 r = ((glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterf")) == NULL) || r;
5364 r = ((glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterfv")) == NULL) || r;
5365 r = ((glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteri")) == NULL) || r;
5366 r = ((glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteriv")) == NULL) || r;
5367
5368 return r;
5369 }
5370
5371 #endif /* GL_ARB_sampler_objects */
5372
5373 #ifdef GL_ARB_separate_shader_objects
5374
5375 static GLboolean _glewInit_GL_ARB_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT)
5376 {
5377 GLboolean r = GL_FALSE;
5378
5379 r = ((glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glActiveShaderProgram")) == NULL) || r;
5380 r = ((glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glBindProgramPipeline")) == NULL) || r;
5381 r = ((glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramv")) == NULL) || r;
5382 r = ((glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramPipelines")) == NULL) || r;
5383 r = ((glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glGenProgramPipelines")) == NULL) || r;
5384 r = ((glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineInfoLog")) == NULL) || r;
5385 r = ((glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineiv")) == NULL) || r;
5386 r = ((glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glIsProgramPipeline")) == NULL) || r;
5387 r = ((glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1d")) == NULL) || r;
5388 r = ((glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dv")) == NULL) || r;
5389 r = ((glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1f")) == NULL) || r;
5390 r = ((glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fv")) == NULL) || r;
5391 r = ((glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i")) == NULL) || r;
5392 r = ((glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iv")) == NULL) || r;
5393 r = ((glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui")) == NULL) || r;
5394 r = ((glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiv")) == NULL) || r;
5395 r = ((glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2d")) == NULL) || r;
5396 r = ((glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dv")) == NULL) || r;
5397 r = ((glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2f")) == NULL) || r;
5398 r = ((glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fv")) == NULL) || r;
5399 r = ((glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i")) == NULL) || r;
5400 r = ((glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iv")) == NULL) || r;
5401 r = ((glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui")) == NULL) || r;
5402 r = ((glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiv")) == NULL) || r;
5403 r = ((glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3d")) == NULL) || r;
5404 r = ((glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dv")) == NULL) || r;
5405 r = ((glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3f")) == NULL) || r;
5406 r = ((glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fv")) == NULL) || r;
5407 r = ((glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i")) == NULL) || r;
5408 r = ((glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iv")) == NULL) || r;
5409 r = ((glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui")) == NULL) || r;
5410 r = ((glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiv")) == NULL) || r;
5411 r = ((glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4d")) == NULL) || r;
5412 r = ((glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dv")) == NULL) || r;
5413 r = ((glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4f")) == NULL) || r;
5414 r = ((glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fv")) == NULL) || r;
5415 r = ((glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i")) == NULL) || r;
5416 r = ((glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iv")) == NULL) || r;
5417 r = ((glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui")) == NULL) || r;
5418 r = ((glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiv")) == NULL) || r;
5419 r = ((glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dv")) == NULL) || r;
5420 r = ((glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fv")) == NULL) || r;
5421 r = ((glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dv")) == NULL) || r;
5422 r = ((glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fv")) == NULL) || r;
5423 r = ((glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dv")) == NULL) || r;
5424 r = ((glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fv")) == NULL) || r;
5425 r = ((glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dv")) == NULL) || r;
5426 r = ((glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fv")) == NULL) || r;
5427 r = ((glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dv")) == NULL) || r;
5428 r = ((glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fv")) == NULL) || r;
5429 r = ((glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dv")) == NULL) || r;
5430 r = ((glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fv")) == NULL) || r;
5431 r = ((glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dv")) == NULL) || r;
5432 r = ((glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fv")) == NULL) || r;
5433 r = ((glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dv")) == NULL) || r;
5434 r = ((glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fv")) == NULL) || r;
5435 r = ((glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dv")) == NULL) || r;
5436 r = ((glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fv")) == NULL) || r;
5437 r = ((glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)glewGetProcAddress((const GLubyte*)"glUseProgramStages")) == NULL) || r;
5438 r = ((glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramPipeline")) == NULL) || r;
5439
5440 return r;
5441 }
5442
5443 #endif /* GL_ARB_separate_shader_objects */
5444
5445 #ifdef GL_ARB_shader_atomic_counters
5446
5447 static GLboolean _glewInit_GL_ARB_shader_atomic_counters (GLEW_CONTEXT_ARG_DEF_INIT)
5448 {
5449 GLboolean r = GL_FALSE;
5450
5451 r = ((glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAtomicCounterBufferiv")) == NULL) || r;
5452
5453 return r;
5454 }
5455
5456 #endif /* GL_ARB_shader_atomic_counters */
5457
5458 #ifdef GL_ARB_shader_image_load_store
5459
5460 static GLboolean _glewInit_GL_ARB_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT)
5461 {
5462 GLboolean r = GL_FALSE;
5463
5464 r = ((glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glBindImageTexture")) == NULL) || r;
5465 r = ((glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrier")) == NULL) || r;
5466
5467 return r;
5468 }
5469
5470 #endif /* GL_ARB_shader_image_load_store */
5471
5472 #ifdef GL_ARB_shader_objects
5473
5474 static GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT)
5475 {
5476 GLboolean r = GL_FALSE;
5477
5478 r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r;
5479 r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r;
5480 r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r;
5481 r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r;
5482 r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r;
5483 r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r;
5484 r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r;
5485 r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r;
5486 r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r;
5487 r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r;
5488 r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r;
5489 r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r;
5490 r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r;
5491 r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r;
5492 r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r;
5493 r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r;
5494 r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r;
5495 r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r;
5496 r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r;
5497 r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r;
5498 r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r;
5499 r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r;
5500 r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r;
5501 r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r;
5502 r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r;
5503 r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r;
5504 r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r;
5505 r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r;
5506 r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r;
5507 r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r;
5508 r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r;
5509 r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r;
5510 r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r;
5511 r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r;
5512 r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r;
5513 r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r;
5514 r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r;
5515 r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r;
5516 r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r;
5517
5518 return r;
5519 }
5520
5521 #endif /* GL_ARB_shader_objects */
5522
5523 #ifdef GL_ARB_shader_storage_buffer_object
5524
5525 static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
5526 {
5527 GLboolean r = GL_FALSE;
5528
5529 r = ((glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glShaderStorageBlockBinding")) == NULL) || r;
5530
5531 return r;
5532 }
5533
5534 #endif /* GL_ARB_shader_storage_buffer_object */
5535
5536 #ifdef GL_ARB_shader_subroutine
5537
5538 static GLboolean _glewInit_GL_ARB_shader_subroutine (GLEW_CONTEXT_ARG_DEF_INIT)
5539 {
5540 GLboolean r = GL_FALSE;
5541
5542 r = ((glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineName")) == NULL) || r;
5543 r = ((glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformName")) == NULL) || r;
5544 r = ((glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformiv")) == NULL) || r;
5545 r = ((glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStageiv")) == NULL) || r;
5546 r = ((glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineIndex")) == NULL) || r;
5547 r = ((glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineUniformLocation")) == NULL) || r;
5548 r = ((glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformSubroutineuiv")) == NULL) || r;
5549 r = ((glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)glewGetProcAddress((const GLubyte*)"glUniformSubroutinesuiv")) == NULL) || r;
5550
5551 return r;
5552 }
5553
5554 #endif /* GL_ARB_shader_subroutine */
5555
5556 #ifdef GL_ARB_shading_language_include
5557
5558 static GLboolean _glewInit_GL_ARB_shading_language_include (GLEW_CONTEXT_ARG_DEF_INIT)
5559 {
5560 GLboolean r = GL_FALSE;
5561
5562 r = ((glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderIncludeARB")) == NULL) || r;
5563 r = ((glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamedStringARB")) == NULL) || r;
5564 r = ((glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringARB")) == NULL) || r;
5565 r = ((glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringivARB")) == NULL) || r;
5566 r = ((glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glIsNamedStringARB")) == NULL) || r;
5567 r = ((glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glNamedStringARB")) == NULL) || r;
5568
5569 return r;
5570 }
5571
5572 #endif /* GL_ARB_shading_language_include */
5573
5574 #ifdef GL_ARB_sparse_buffer
5575
5576 static GLboolean _glewInit_GL_ARB_sparse_buffer (GLEW_CONTEXT_ARG_DEF_INIT)
5577 {
5578 GLboolean r = GL_FALSE;
5579
5580 r = ((glBufferPageCommitmentARB = (PFNGLBUFFERPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glBufferPageCommitmentARB")) == NULL) || r;
5581
5582 return r;
5583 }
5584
5585 #endif /* GL_ARB_sparse_buffer */
5586
5587 #ifdef GL_ARB_sparse_texture
5588
5589 static GLboolean _glewInit_GL_ARB_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT)
5590 {
5591 GLboolean r = GL_FALSE;
5592
5593 r = ((glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentARB")) == NULL) || r;
5594 r = ((glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexturePageCommitmentEXT")) == NULL) || r;
5595
5596 return r;
5597 }
5598
5599 #endif /* GL_ARB_sparse_texture */
5600
5601 #ifdef GL_ARB_sync
5602
5603 static GLboolean _glewInit_GL_ARB_sync (GLEW_CONTEXT_ARG_DEF_INIT)
5604 {
5605 GLboolean r = GL_FALSE;
5606
5607 r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSync")) == NULL) || r;
5608 r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)"glDeleteSync")) == NULL) || r;
5609 r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)"glFenceSync")) == NULL) || r;
5610 r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64v")) == NULL) || r;
5611 r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)"glGetSynciv")) == NULL) || r;
5612 r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)"glIsSync")) == NULL) || r;
5613 r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glWaitSync")) == NULL) || r;
5614
5615 return r;
5616 }
5617
5618 #endif /* GL_ARB_sync */
5619
5620 #ifdef GL_ARB_tessellation_shader
5621
5622 static GLboolean _glewInit_GL_ARB_tessellation_shader (GLEW_CONTEXT_ARG_DEF_INIT)
5623 {
5624 GLboolean r = GL_FALSE;
5625
5626 r = ((glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPatchParameterfv")) == NULL) || r;
5627 r = ((glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteri")) == NULL) || r;
5628
5629 return r;
5630 }
5631
5632 #endif /* GL_ARB_tessellation_shader */
5633
5634 #ifdef GL_ARB_texture_barrier
5635
5636 static GLboolean _glewInit_GL_ARB_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT)
5637 {
5638 GLboolean r = GL_FALSE;
5639
5640 r = ((glTextureBarrier = (PFNGLTEXTUREBARRIERPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrier")) == NULL) || r;
5641
5642 return r;
5643 }
5644
5645 #endif /* GL_ARB_texture_barrier */
5646
5647 #ifdef GL_ARB_texture_buffer_object
5648
5649 static GLboolean _glewInit_GL_ARB_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
5650 {
5651 GLboolean r = GL_FALSE;
5652
5653 r = ((glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glTexBufferARB")) == NULL) || r;
5654
5655 return r;
5656 }
5657
5658 #endif /* GL_ARB_texture_buffer_object */
5659
5660 #ifdef GL_ARB_texture_buffer_range
5661
5662 static GLboolean _glewInit_GL_ARB_texture_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT)
5663 {
5664 GLboolean r = GL_FALSE;
5665
5666 r = ((glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTexBufferRange")) == NULL) || r;
5667 r = ((glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRangeEXT")) == NULL) || r;
5668
5669 return r;
5670 }
5671
5672 #endif /* GL_ARB_texture_buffer_range */
5673
5674 #ifdef GL_ARB_texture_compression
5675
5676 static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT)
5677 {
5678 GLboolean r = GL_FALSE;
5679
5680 r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r;
5681 r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r;
5682 r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r;
5683 r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r;
5684 r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r;
5685 r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r;
5686 r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r;
5687
5688 return r;
5689 }
5690
5691 #endif /* GL_ARB_texture_compression */
5692
5693 #ifdef GL_ARB_texture_multisample
5694
5695 static GLboolean _glewInit_GL_ARB_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
5696 {
5697 GLboolean r = GL_FALSE;
5698
5699 r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefv")) == NULL) || r;
5700 r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)"glSampleMaski")) == NULL) || r;
5701 r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisample")) == NULL) || r;
5702 r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisample")) == NULL) || r;
5703
5704 return r;
5705 }
5706
5707 #endif /* GL_ARB_texture_multisample */
5708
5709 #ifdef GL_ARB_texture_storage
5710
5711 static GLboolean _glewInit_GL_ARB_texture_storage (GLEW_CONTEXT_ARG_DEF_INIT)
5712 {
5713 GLboolean r = GL_FALSE;
5714
5715 r = ((glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1D")) == NULL) || r;
5716 r = ((glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2D")) == NULL) || r;
5717 r = ((glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3D")) == NULL) || r;
5718 r = ((glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1DEXT")) == NULL) || r;
5719 r = ((glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DEXT")) == NULL) || r;
5720 r = ((glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DEXT")) == NULL) || r;
5721
5722 return r;
5723 }
5724
5725 #endif /* GL_ARB_texture_storage */
5726
5727 #ifdef GL_ARB_texture_storage_multisample
5728
5729 static GLboolean _glewInit_GL_ARB_texture_storage_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
5730 {
5731 GLboolean r = GL_FALSE;
5732
5733 r = ((glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DMultisample")) == NULL) || r;
5734 r = ((glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DMultisample")) == NULL) || r;
5735 r = ((glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisampleEXT")) == NULL) || r;
5736 r = ((glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisampleEXT")) == NULL) || r;
5737
5738 return r;
5739 }
5740
5741 #endif /* GL_ARB_texture_storage_multisample */
5742
5743 #ifdef GL_ARB_texture_view
5744
5745 static GLboolean _glewInit_GL_ARB_texture_view (GLEW_CONTEXT_ARG_DEF_INIT)
5746 {
5747 GLboolean r = GL_FALSE;
5748
5749 r = ((glTextureView = (PFNGLTEXTUREVIEWPROC)glewGetProcAddress((const GLubyte*)"glTextureView")) == NULL) || r;
5750
5751 return r;
5752 }
5753
5754 #endif /* GL_ARB_texture_view */
5755
5756 #ifdef GL_ARB_timer_query
5757
5758 static GLboolean _glewInit_GL_ARB_timer_query (GLEW_CONTEXT_ARG_DEF_INIT)
5759 {
5760 GLboolean r = GL_FALSE;
5761
5762 r = ((glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64v")) == NULL) || r;
5763 r = ((glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64v")) == NULL) || r;
5764 r = ((glQueryCounter = (PFNGLQUERYCOUNTERPROC)glewGetProcAddress((const GLubyte*)"glQueryCounter")) == NULL) || r;
5765
5766 return r;
5767 }
5768
5769 #endif /* GL_ARB_timer_query */
5770
5771 #ifdef GL_ARB_transform_feedback2
5772
5773 static GLboolean _glewInit_GL_ARB_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT)
5774 {
5775 GLboolean r = GL_FALSE;
5776
5777 r = ((glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedback")) == NULL) || r;
5778 r = ((glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacks")) == NULL) || r;
5779 r = ((glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedback")) == NULL) || r;
5780 r = ((glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacks")) == NULL) || r;
5781 r = ((glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedback")) == NULL) || r;
5782 r = ((glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedback")) == NULL) || r;
5783 r = ((glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedback")) == NULL) || r;
5784
5785 return r;
5786 }
5787
5788 #endif /* GL_ARB_transform_feedback2 */
5789
5790 #ifdef GL_ARB_transform_feedback3
5791
5792 static GLboolean _glewInit_GL_ARB_transform_feedback3 (GLEW_CONTEXT_ARG_DEF_INIT)
5793 {
5794 GLboolean r = GL_FALSE;
5795
5796 r = ((glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryIndexed")) == NULL) || r;
5797 r = ((glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStream")) == NULL) || r;
5798 r = ((glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glEndQueryIndexed")) == NULL) || r;
5799 r = ((glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryIndexediv")) == NULL) || r;
5800
5801 return r;
5802 }
5803
5804 #endif /* GL_ARB_transform_feedback3 */
5805
5806 #ifdef GL_ARB_transform_feedback_instanced
5807
5808 static GLboolean _glewInit_GL_ARB_transform_feedback_instanced (GLEW_CONTEXT_ARG_DEF_INIT)
5809 {
5810 GLboolean r = GL_FALSE;
5811
5812 r = ((glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackInstanced")) == NULL) || r;
5813 r = ((glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStreamInstanced")) == NULL) || r;
5814
5815 return r;
5816 }
5817
5818 #endif /* GL_ARB_transform_feedback_instanced */
5819
5820 #ifdef GL_ARB_transpose_matrix
5821
5822 static GLboolean _glewInit_GL_ARB_transpose_matrix (GLEW_CONTEXT_ARG_DEF_INIT)
5823 {
5824 GLboolean r = GL_FALSE;
5825
5826 r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r;
5827 r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r;
5828 r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r;
5829 r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r;
5830
5831 return r;
5832 }
5833
5834 #endif /* GL_ARB_transpose_matrix */
5835
5836 #ifdef GL_ARB_uniform_buffer_object
5837
5838 static GLboolean _glewInit_GL_ARB_uniform_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
5839 {
5840 GLboolean r = GL_FALSE;
5841
5842 r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r;
5843 r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r;
5844 r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockName")) == NULL) || r;
5845 r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockiv")) == NULL) || r;
5846 r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformName")) == NULL) || r;
5847 r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformsiv")) == NULL) || r;
5848 r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r;
5849 r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBlockIndex")) == NULL) || r;
5850 r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)"glGetUniformIndices")) == NULL) || r;
5851 r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glUniformBlockBinding")) == NULL) || r;
5852
5853 return r;
5854 }
5855
5856 #endif /* GL_ARB_uniform_buffer_object */
5857
5858 #ifdef GL_ARB_vertex_array_object
5859
5860 static GLboolean _glewInit_GL_ARB_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT)
5861 {
5862 GLboolean r = GL_FALSE;
5863
5864 r = ((glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArray")) == NULL) || r;
5865 r = ((glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArrays")) == NULL) || r;
5866 r = ((glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArrays")) == NULL) || r;
5867 r = ((glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArray")) == NULL) || r;
5868
5869 return r;
5870 }
5871
5872 #endif /* GL_ARB_vertex_array_object */
5873
5874 #ifdef GL_ARB_vertex_attrib_64bit
5875
5876 static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT)
5877 {
5878 GLboolean r = GL_FALSE;
5879
5880 r = ((glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdv")) == NULL) || r;
5881 r = ((glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1d")) == NULL) || r;
5882 r = ((glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dv")) == NULL) || r;
5883 r = ((glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2d")) == NULL) || r;
5884 r = ((glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dv")) == NULL) || r;
5885 r = ((glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3d")) == NULL) || r;
5886 r = ((glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dv")) == NULL) || r;
5887 r = ((glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4d")) == NULL) || r;
5888 r = ((glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dv")) == NULL) || r;
5889 r = ((glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointer")) == NULL) || r;
5890
5891 return r;
5892 }
5893
5894 #endif /* GL_ARB_vertex_attrib_64bit */
5895
5896 #ifdef GL_ARB_vertex_attrib_binding
5897
5898 static GLboolean _glewInit_GL_ARB_vertex_attrib_binding (GLEW_CONTEXT_ARG_DEF_INIT)
5899 {
5900 GLboolean r = GL_FALSE;
5901
5902 r = ((glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffer")) == NULL) || r;
5903 r = ((glVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindVertexBufferEXT")) == NULL) || r;
5904 r = ((glVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribBindingEXT")) == NULL) || r;
5905 r = ((glVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribFormatEXT")) == NULL) || r;
5906 r = ((glVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIFormatEXT")) == NULL) || r;
5907 r = ((glVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLFormatEXT")) == NULL) || r;
5908 r = ((glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBindingDivisorEXT")) == NULL) || r;
5909 r = ((glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribBinding")) == NULL) || r;
5910 r = ((glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormat")) == NULL) || r;
5911 r = ((glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormat")) == NULL) || r;
5912 r = ((glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormat")) == NULL) || r;
5913 r = ((glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexBindingDivisor")) == NULL) || r;
5914
5915 return r;
5916 }
5917
5918 #endif /* GL_ARB_vertex_attrib_binding */
5919
5920 #ifdef GL_ARB_vertex_blend
5921
5922 static GLboolean _glewInit_GL_ARB_vertex_blend (GLEW_CONTEXT_ARG_DEF_INIT)
5923 {
5924 GLboolean r = GL_FALSE;
5925
5926 r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r;
5927 r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r;
5928 r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r;
5929 r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r;
5930 r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r;
5931 r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r;
5932 r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r;
5933 r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r;
5934 r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r;
5935 r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r;
5936
5937 return r;
5938 }
5939
5940 #endif /* GL_ARB_vertex_blend */
5941
5942 #ifdef GL_ARB_vertex_buffer_object
5943
5944 static GLboolean _glewInit_GL_ARB_vertex_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
5945 {
5946 GLboolean r = GL_FALSE;
5947
5948 r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r;
5949 r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r;
5950 r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r;
5951 r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r;
5952 r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r;
5953 r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r;
5954 r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r;
5955 r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r;
5956 r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r;
5957 r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r;
5958 r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r;
5959
5960 return r;
5961 }
5962
5963 #endif /* GL_ARB_vertex_buffer_object */
5964
5965 #ifdef GL_ARB_vertex_program
5966
5967 static GLboolean _glewInit_GL_ARB_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT)
5968 {
5969 GLboolean r = GL_FALSE;
5970
5971 r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r;
5972 r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r;
5973 r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r;
5974 r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r;
5975 r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r;
5976 r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r;
5977 r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r;
5978 r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r;
5979 r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r;
5980 r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r;
5981 r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r;
5982 r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r;
5983 r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r;
5984 r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r;
5985 r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r;
5986 r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r;
5987 r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r;
5988 r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r;
5989 r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r;
5990 r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r;
5991 r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r;
5992 r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r;
5993 r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r;
5994 r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r;
5995 r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r;
5996 r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r;
5997 r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r;
5998 r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r;
5999 r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r;
6000 r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r;
6001 r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r;
6002 r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r;
6003 r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r;
6004 r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r;
6005 r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r;
6006 r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r;
6007 r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r;
6008 r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r;
6009 r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r;
6010 r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r;
6011 r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r;
6012 r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r;
6013 r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r;
6014 r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r;
6015 r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r;
6016 r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r;
6017 r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r;
6018 r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r;
6019 r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r;
6020 r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r;
6021 r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r;
6022 r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r;
6023 r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r;
6024 r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r;
6025 r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r;
6026 r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r;
6027 r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r;
6028 r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r;
6029 r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r;
6030 r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r;
6031 r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r;
6032 r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r;
6033
6034 return r;
6035 }
6036
6037 #endif /* GL_ARB_vertex_program */
6038
6039 #ifdef GL_ARB_vertex_shader
6040
6041 static GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT)
6042 {
6043 GLboolean r = GL_FALSE;
6044
6045 r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r;
6046 r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r;
6047 r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r;
6048
6049 return r;
6050 }
6051
6052 #endif /* GL_ARB_vertex_shader */
6053
6054 #ifdef GL_ARB_vertex_type_2_10_10_10_rev
6055
6056 static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (GLEW_CONTEXT_ARG_DEF_INIT)
6057 {
6058 GLboolean r = GL_FALSE;
6059
6060 r = ((glColorP3ui = (PFNGLCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glColorP3ui")) == NULL) || r;
6061 r = ((glColorP3uiv = (PFNGLCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP3uiv")) == NULL) || r;
6062 r = ((glColorP4ui = (PFNGLCOLORP4UIPROC)glewGetProcAddress((const GLubyte*)"glColorP4ui")) == NULL) || r;
6063 r = ((glColorP4uiv = (PFNGLCOLORP4UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP4uiv")) == NULL) || r;
6064 r = ((glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1ui")) == NULL) || r;
6065 r = ((glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1uiv")) == NULL) || r;
6066 r = ((glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2ui")) == NULL) || r;
6067 r = ((glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2uiv")) == NULL) || r;
6068 r = ((glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3ui")) == NULL) || r;
6069 r = ((glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3uiv")) == NULL) || r;
6070 r = ((glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4ui")) == NULL) || r;
6071 r = ((glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4uiv")) == NULL) || r;
6072 r = ((glNormalP3ui = (PFNGLNORMALP3UIPROC)glewGetProcAddress((const GLubyte*)"glNormalP3ui")) == NULL) || r;
6073 r = ((glNormalP3uiv = (PFNGLNORMALP3UIVPROC)glewGetProcAddress((const GLubyte*)"glNormalP3uiv")) == NULL) || r;
6074 r = ((glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3ui")) == NULL) || r;
6075 r = ((glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3uiv")) == NULL) || r;
6076 r = ((glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1ui")) == NULL) || r;
6077 r = ((glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1uiv")) == NULL) || r;
6078 r = ((glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2ui")) == NULL) || r;
6079 r = ((glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2uiv")) == NULL) || r;
6080 r = ((glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3ui")) == NULL) || r;
6081 r = ((glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3uiv")) == NULL) || r;
6082 r = ((glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4ui")) == NULL) || r;
6083 r = ((glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4uiv")) == NULL) || r;
6084 r = ((glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1ui")) == NULL) || r;
6085 r = ((glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1uiv")) == NULL) || r;
6086 r = ((glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2ui")) == NULL) || r;
6087 r = ((glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2uiv")) == NULL) || r;
6088 r = ((glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3ui")) == NULL) || r;
6089 r = ((glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3uiv")) == NULL) || r;
6090 r = ((glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4ui")) == NULL) || r;
6091 r = ((glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4uiv")) == NULL) || r;
6092 r = ((glVertexP2ui = (PFNGLVERTEXP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP2ui")) == NULL) || r;
6093 r = ((glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP2uiv")) == NULL) || r;
6094 r = ((glVertexP3ui = (PFNGLVERTEXP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP3ui")) == NULL) || r;
6095 r = ((glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP3uiv")) == NULL) || r;
6096 r = ((glVertexP4ui = (PFNGLVERTEXP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP4ui")) == NULL) || r;
6097 r = ((glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP4uiv")) == NULL) || r;
6098
6099 return r;
6100 }
6101
6102 #endif /* GL_ARB_vertex_type_2_10_10_10_rev */
6103
6104 #ifdef GL_ARB_viewport_array
6105
6106 static GLboolean _glewInit_GL_ARB_viewport_array (GLEW_CONTEXT_ARG_DEF_INIT)
6107 {
6108 GLboolean r = GL_FALSE;
6109
6110 r = ((glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayv")) == NULL) || r;
6111 r = ((glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexed")) == NULL) || r;
6112 r = ((glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_v")) == NULL) || r;
6113 r = ((glGetFloati_v = (PFNGLGETFLOATI_VPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_v")) == NULL) || r;
6114 r = ((glScissorArrayv = (PFNGLSCISSORARRAYVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayv")) == NULL) || r;
6115 r = ((glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexed")) == NULL) || r;
6116 r = ((glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedv")) == NULL) || r;
6117 r = ((glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayv")) == NULL) || r;
6118 r = ((glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedf")) == NULL) || r;
6119 r = ((glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfv")) == NULL) || r;
6120
6121 return r;
6122 }
6123
6124 #endif /* GL_ARB_viewport_array */
6125
6126 #ifdef GL_ARB_window_pos
6127
6128 static GLboolean _glewInit_GL_ARB_window_pos (GLEW_CONTEXT_ARG_DEF_INIT)
6129 {
6130 GLboolean r = GL_FALSE;
6131
6132 r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r;
6133 r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r;
6134 r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r;
6135 r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r;
6136 r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r;
6137 r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r;
6138 r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r;
6139 r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r;
6140 r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r;
6141 r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r;
6142 r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r;
6143 r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r;
6144 r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r;
6145 r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r;
6146 r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r;
6147 r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r;
6148
6149 return r;
6150 }
6151
6152 #endif /* GL_ARB_window_pos */
6153
6154 #ifdef GL_ATI_draw_buffers
6155
6156 static GLboolean _glewInit_GL_ATI_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT)
6157 {
6158 GLboolean r = GL_FALSE;
6159
6160 r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r;
6161
6162 return r;
6163 }
6164
6165 #endif /* GL_ATI_draw_buffers */
6166
6167 #ifdef GL_ATI_element_array
6168
6169 static GLboolean _glewInit_GL_ATI_element_array (GLEW_CONTEXT_ARG_DEF_INIT)
6170 {
6171 GLboolean r = GL_FALSE;
6172
6173 r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r;
6174 r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r;
6175 r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r;
6176
6177 return r;
6178 }
6179
6180 #endif /* GL_ATI_element_array */
6181
6182 #ifdef GL_ATI_envmap_bumpmap
6183
6184 static GLboolean _glewInit_GL_ATI_envmap_bumpmap (GLEW_CONTEXT_ARG_DEF_INIT)
6185 {
6186 GLboolean r = GL_FALSE;
6187
6188 r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r;
6189 r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r;
6190 r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r;
6191 r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r;
6192
6193 return r;
6194 }
6195
6196 #endif /* GL_ATI_envmap_bumpmap */
6197
6198 #ifdef GL_ATI_fragment_shader
6199
6200 static GLboolean _glewInit_GL_ATI_fragment_shader (GLEW_CONTEXT_ARG_DEF_INIT)
6201 {
6202 GLboolean r = GL_FALSE;
6203
6204 r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r;
6205 r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r;
6206 r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r;
6207 r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r;
6208 r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r;
6209 r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r;
6210 r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r;
6211 r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r;
6212 r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r;
6213 r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r;
6214 r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r;
6215 r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r;
6216 r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r;
6217 r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r;
6218
6219 return r;
6220 }
6221
6222 #endif /* GL_ATI_fragment_shader */
6223
6224 #ifdef GL_ATI_map_object_buffer
6225
6226 static GLboolean _glewInit_GL_ATI_map_object_buffer (GLEW_CONTEXT_ARG_DEF_INIT)
6227 {
6228 GLboolean r = GL_FALSE;
6229
6230 r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r;
6231 r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r;
6232
6233 return r;
6234 }
6235
6236 #endif /* GL_ATI_map_object_buffer */
6237
6238 #ifdef GL_ATI_pn_triangles
6239
6240 static GLboolean _glewInit_GL_ATI_pn_triangles (GLEW_CONTEXT_ARG_DEF_INIT)
6241 {
6242 GLboolean r = GL_FALSE;
6243
6244 r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r;
6245 r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r;
6246
6247 return r;
6248 }
6249
6250 #endif /* GL_ATI_pn_triangles */
6251
6252 #ifdef GL_ATI_separate_stencil
6253
6254 static GLboolean _glewInit_GL_ATI_separate_stencil (GLEW_CONTEXT_ARG_DEF_INIT)
6255 {
6256 GLboolean r = GL_FALSE;
6257
6258 r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r;
6259 r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r;
6260
6261 return r;
6262 }
6263
6264 #endif /* GL_ATI_separate_stencil */
6265
6266 #ifdef GL_ATI_vertex_array_object
6267
6268 static GLboolean _glewInit_GL_ATI_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT)
6269 {
6270 GLboolean r = GL_FALSE;
6271
6272 r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r;
6273 r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r;
6274 r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r;
6275 r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r;
6276 r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r;
6277 r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r;
6278 r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r;
6279 r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r;
6280 r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r;
6281 r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r;
6282 r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r;
6283 r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r;
6284
6285 return r;
6286 }
6287
6288 #endif /* GL_ATI_vertex_array_object */
6289
6290 #ifdef GL_ATI_vertex_attrib_array_object
6291
6292 static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (GLEW_CONTEXT_ARG_DEF_INIT)
6293 {
6294 GLboolean r = GL_FALSE;
6295
6296 r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r;
6297 r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r;
6298 r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r;
6299
6300 return r;
6301 }
6302
6303 #endif /* GL_ATI_vertex_attrib_array_object */
6304
6305 #ifdef GL_ATI_vertex_streams
6306
6307 static GLboolean _glewInit_GL_ATI_vertex_streams (GLEW_CONTEXT_ARG_DEF_INIT)
6308 {
6309 GLboolean r = GL_FALSE;
6310
6311 r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r;
6312 r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r;
6313 r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r;
6314 r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r;
6315 r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r;
6316 r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r;
6317 r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r;
6318 r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r;
6319 r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r;
6320 r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r;
6321 r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r;
6322 r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r;
6323 r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r;
6324 r = ((glVertexStream1dATI = (PFNGLVERTEXSTREAM1DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dATI")) == NULL) || r;
6325 r = ((glVertexStream1dvATI = (PFNGLVERTEXSTREAM1DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dvATI")) == NULL) || r;
6326 r = ((glVertexStream1fATI = (PFNGLVERTEXSTREAM1FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fATI")) == NULL) || r;
6327 r = ((glVertexStream1fvATI = (PFNGLVERTEXSTREAM1FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fvATI")) == NULL) || r;
6328 r = ((glVertexStream1iATI = (PFNGLVERTEXSTREAM1IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1iATI")) == NULL) || r;
6329 r = ((glVertexStream1ivATI = (PFNGLVERTEXSTREAM1IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1ivATI")) == NULL) || r;
6330 r = ((glVertexStream1sATI = (PFNGLVERTEXSTREAM1SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1sATI")) == NULL) || r;
6331 r = ((glVertexStream1svATI = (PFNGLVERTEXSTREAM1SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1svATI")) == NULL) || r;
6332 r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r;
6333 r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r;
6334 r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r;
6335 r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r;
6336 r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r;
6337 r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r;
6338 r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r;
6339 r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r;
6340 r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r;
6341 r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r;
6342 r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r;
6343 r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r;
6344 r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r;
6345 r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r;
6346 r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r;
6347 r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r;
6348 r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r;
6349 r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r;
6350 r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r;
6351 r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r;
6352 r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r;
6353 r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r;
6354 r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r;
6355 r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r;
6356
6357 return r;
6358 }
6359
6360 #endif /* GL_ATI_vertex_streams */
6361
6362 #ifdef GL_EXT_bindable_uniform
6363
6364 static GLboolean _glewInit_GL_EXT_bindable_uniform (GLEW_CONTEXT_ARG_DEF_INIT)
6365 {
6366 GLboolean r = GL_FALSE;
6367
6368 r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBufferSizeEXT")) == NULL) || r;
6369 r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformOffsetEXT")) == NULL) || r;
6370 r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUniformBufferEXT")) == NULL) || r;
6371
6372 return r;
6373 }
6374
6375 #endif /* GL_EXT_bindable_uniform */
6376
6377 #ifdef GL_EXT_blend_color
6378
6379 static GLboolean _glewInit_GL_EXT_blend_color (GLEW_CONTEXT_ARG_DEF_INIT)
6380 {
6381 GLboolean r = GL_FALSE;
6382
6383 r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r;
6384
6385 return r;
6386 }
6387
6388 #endif /* GL_EXT_blend_color */
6389
6390 #ifdef GL_EXT_blend_equation_separate
6391
6392 static GLboolean _glewInit_GL_EXT_blend_equation_separate (GLEW_CONTEXT_ARG_DEF_INIT)
6393 {
6394 GLboolean r = GL_FALSE;
6395
6396 r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r;
6397
6398 return r;
6399 }
6400
6401 #endif /* GL_EXT_blend_equation_separate */
6402
6403 #ifdef GL_EXT_blend_func_separate
6404
6405 static GLboolean _glewInit_GL_EXT_blend_func_separate (GLEW_CONTEXT_ARG_DEF_INIT)
6406 {
6407 GLboolean r = GL_FALSE;
6408
6409 r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r;
6410
6411 return r;
6412 }
6413
6414 #endif /* GL_EXT_blend_func_separate */
6415
6416 #ifdef GL_EXT_blend_minmax
6417
6418 static GLboolean _glewInit_GL_EXT_blend_minmax (GLEW_CONTEXT_ARG_DEF_INIT)
6419 {
6420 GLboolean r = GL_FALSE;
6421
6422 r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r;
6423
6424 return r;
6425 }
6426
6427 #endif /* GL_EXT_blend_minmax */
6428
6429 #ifdef GL_EXT_color_subtable
6430
6431 static GLboolean _glewInit_GL_EXT_color_subtable (GLEW_CONTEXT_ARG_DEF_INIT)
6432 {
6433 GLboolean r = GL_FALSE;
6434
6435 r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r;
6436 r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r;
6437
6438 return r;
6439 }
6440
6441 #endif /* GL_EXT_color_subtable */
6442
6443 #ifdef GL_EXT_compiled_vertex_array
6444
6445 static GLboolean _glewInit_GL_EXT_compiled_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT)
6446 {
6447 GLboolean r = GL_FALSE;
6448
6449 r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r;
6450 r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r;
6451
6452 return r;
6453 }
6454
6455 #endif /* GL_EXT_compiled_vertex_array */
6456
6457 #ifdef GL_EXT_convolution
6458
6459 static GLboolean _glewInit_GL_EXT_convolution (GLEW_CONTEXT_ARG_DEF_INIT)
6460 {
6461 GLboolean r = GL_FALSE;
6462
6463 r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r;
6464 r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r;
6465 r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r;
6466 r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r;
6467 r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r;
6468 r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r;
6469 r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r;
6470 r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r;
6471 r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r;
6472 r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r;
6473 r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r;
6474 r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r;
6475 r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r;
6476
6477 return r;
6478 }
6479
6480 #endif /* GL_EXT_convolution */
6481
6482 #ifdef GL_EXT_coordinate_frame
6483
6484 static GLboolean _glewInit_GL_EXT_coordinate_frame (GLEW_CONTEXT_ARG_DEF_INIT)
6485 {
6486 GLboolean r = GL_FALSE;
6487
6488 r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r;
6489 r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r;
6490
6491 return r;
6492 }
6493
6494 #endif /* GL_EXT_coordinate_frame */
6495
6496 #ifdef GL_EXT_copy_texture
6497
6498 static GLboolean _glewInit_GL_EXT_copy_texture (GLEW_CONTEXT_ARG_DEF_INIT)
6499 {
6500 GLboolean r = GL_FALSE;
6501
6502 r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r;
6503 r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r;
6504 r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r;
6505 r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r;
6506 r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r;
6507
6508 return r;
6509 }
6510
6511 #endif /* GL_EXT_copy_texture */
6512
6513 #ifdef GL_EXT_cull_vertex
6514
6515 static GLboolean _glewInit_GL_EXT_cull_vertex (GLEW_CONTEXT_ARG_DEF_INIT)
6516 {
6517 GLboolean r = GL_FALSE;
6518
6519 r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r;
6520 r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r;
6521
6522 return r;
6523 }
6524
6525 #endif /* GL_EXT_cull_vertex */
6526
6527 #ifdef GL_EXT_debug_label
6528
6529 static GLboolean _glewInit_GL_EXT_debug_label (GLEW_CONTEXT_ARG_DEF_INIT)
6530 {
6531 GLboolean r = GL_FALSE;
6532
6533 r = ((glGetObjectLabelEXT = (PFNGLGETOBJECTLABELEXTPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabelEXT")) == NULL) || r;
6534 r = ((glLabelObjectEXT = (PFNGLLABELOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glLabelObjectEXT")) == NULL) || r;
6535
6536 return r;
6537 }
6538
6539 #endif /* GL_EXT_debug_label */
6540
6541 #ifdef GL_EXT_debug_marker
6542
6543 static GLboolean _glewInit_GL_EXT_debug_marker (GLEW_CONTEXT_ARG_DEF_INIT)
6544 {
6545 GLboolean r = GL_FALSE;
6546
6547 r = ((glInsertEventMarkerEXT = (PFNGLINSERTEVENTMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glInsertEventMarkerEXT")) == NULL) || r;
6548 r = ((glPopGroupMarkerEXT = (PFNGLPOPGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPopGroupMarkerEXT")) == NULL) || r;
6549 r = ((glPushGroupMarkerEXT = (PFNGLPUSHGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPushGroupMarkerEXT")) == NULL) || r;
6550
6551 return r;
6552 }
6553
6554 #endif /* GL_EXT_debug_marker */
6555
6556 #ifdef GL_EXT_depth_bounds_test
6557
6558 static GLboolean _glewInit_GL_EXT_depth_bounds_test (GLEW_CONTEXT_ARG_DEF_INIT)
6559 {
6560 GLboolean r = GL_FALSE;
6561
6562 r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r;
6563
6564 return r;
6565 }
6566
6567 #endif /* GL_EXT_depth_bounds_test */
6568
6569 #ifdef GL_EXT_direct_state_access
6570
6571 static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT)
6572 {
6573 GLboolean r = GL_FALSE;
6574
6575 r = ((glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindMultiTextureEXT")) == NULL) || r;
6576 r = ((glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatusEXT")) == NULL) || r;
6577 r = ((glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glClientAttribDefaultEXT")) == NULL) || r;
6578 r = ((glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage1DEXT")) == NULL) || r;
6579 r = ((glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage2DEXT")) == NULL) || r;
6580 r = ((glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage3DEXT")) == NULL) || r;
6581 r = ((glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage1DEXT")) == NULL) || r;
6582 r = ((glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage2DEXT")) == NULL) || r;
6583 r = ((glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage3DEXT")) == NULL) || r;
6584 r = ((glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage1DEXT")) == NULL) || r;
6585 r = ((glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage2DEXT")) == NULL) || r;
6586 r = ((glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage3DEXT")) == NULL) || r;
6587 r = ((glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1DEXT")) == NULL) || r;
6588 r = ((glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2DEXT")) == NULL) || r;
6589 r = ((glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3DEXT")) == NULL) || r;
6590 r = ((glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage1DEXT")) == NULL) || r;
6591 r = ((glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage2DEXT")) == NULL) || r;
6592 r = ((glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage1DEXT")) == NULL) || r;
6593 r = ((glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage2DEXT")) == NULL) || r;
6594 r = ((glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage3DEXT")) == NULL) || r;
6595 r = ((glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage1DEXT")) == NULL) || r;
6596 r = ((glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage2DEXT")) == NULL) || r;
6597 r = ((glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1DEXT")) == NULL) || r;
6598 r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2DEXT")) == NULL) || r;
6599 r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3DEXT")) == NULL) || r;
6600 r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateIndexedEXT")) == NULL) || r;
6601 r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateiEXT")) == NULL) || r;
6602 r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttribEXT")) == NULL) || r;
6603 r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayEXT")) == NULL) || r;
6604 r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateIndexedEXT")) == NULL) || r;
6605 r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateiEXT")) == NULL) || r;
6606 r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttribEXT")) == NULL) || r;
6607 r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayEXT")) == NULL) || r;
6608 r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRangeEXT")) == NULL) || r;
6609 r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBufferEXT")) == NULL) || r;
6610 r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBuffersEXT")) == NULL) || r;
6611 r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferReadBufferEXT")) == NULL) || r;
6612 r = ((glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMultiTexMipmapEXT")) == NULL) || r;
6613 r = ((glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmapEXT")) == NULL) || r;
6614 r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedMultiTexImageEXT")) == NULL) || r;
6615 r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImageEXT")) == NULL) || r;
6616 r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoubleIndexedvEXT")) == NULL) || r;
6617 r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_vEXT")) == NULL) || r;
6618 r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloatIndexedvEXT")) == NULL) || r;
6619 r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vEXT")) == NULL) || r;
6620 r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivEXT")) == NULL) || r;
6621 r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvfvEXT")) == NULL) || r;
6622 r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvivEXT")) == NULL) || r;
6623 r = ((glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGendvEXT")) == NULL) || r;
6624 r = ((glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenfvEXT")) == NULL) || r;
6625 r = ((glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenivEXT")) == NULL) || r;
6626 r = ((glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexImageEXT")) == NULL) || r;
6627 r = ((glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterfvEXT")) == NULL) || r;
6628 r = ((glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterivEXT")) == NULL) || r;
6629 r = ((glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIivEXT")) == NULL) || r;
6630 r = ((glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIuivEXT")) == NULL) || r;
6631 r = ((glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterfvEXT")) == NULL) || r;
6632 r = ((glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterivEXT")) == NULL) || r;
6633 r = ((glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterivEXT")) == NULL) || r;
6634 r = ((glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointervEXT")) == NULL) || r;
6635 r = ((glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubDataEXT")) == NULL) || r;
6636 r = ((glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameterivEXT")) == NULL) || r;
6637 r = ((glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIivEXT")) == NULL) || r;
6638 r = ((glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIuivEXT")) == NULL) || r;
6639 r = ((glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterdvEXT")) == NULL) || r;
6640 r = ((glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterfvEXT")) == NULL) || r;
6641 r = ((glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramStringEXT")) == NULL) || r;
6642 r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramivEXT")) == NULL) || r;
6643 r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameterivEXT")) == NULL) || r;
6644 r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointerIndexedvEXT")) == NULL) || r;
6645 r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointeri_vEXT")) == NULL) || r;
6646 r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImageEXT")) == NULL) || r;
6647 r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfvEXT")) == NULL) || r;
6648 r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterivEXT")) == NULL) || r;
6649 r = ((glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIivEXT")) == NULL) || r;
6650 r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuivEXT")) == NULL) || r;
6651 r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfvEXT")) == NULL) || r;
6652 r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterivEXT")) == NULL) || r;
6653 r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegeri_vEXT")) == NULL) || r;
6654 r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegervEXT")) == NULL) || r;
6655 r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointeri_vEXT")) == NULL) || r;
6656 r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointervEXT")) == NULL) || r;
6657 r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferEXT")) == NULL) || r;
6658 r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRangeEXT")) == NULL) || r;
6659 r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixFrustumEXT")) == NULL) || r;
6660 r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadIdentityEXT")) == NULL) || r;
6661 r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposedEXT")) == NULL) || r;
6662 r = ((glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposefEXT")) == NULL) || r;
6663 r = ((glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoaddEXT")) == NULL) || r;
6664 r = ((glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadfEXT")) == NULL) || r;
6665 r = ((glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposedEXT")) == NULL) || r;
6666 r = ((glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposefEXT")) == NULL) || r;
6667 r = ((glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultdEXT")) == NULL) || r;
6668 r = ((glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultfEXT")) == NULL) || r;
6669 r = ((glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixOrthoEXT")) == NULL) || r;
6670 r = ((glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPopEXT")) == NULL) || r;
6671 r = ((glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPushEXT")) == NULL) || r;
6672 r = ((glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatedEXT")) == NULL) || r;
6673 r = ((glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatefEXT")) == NULL) || r;
6674 r = ((glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScaledEXT")) == NULL) || r;
6675 r = ((glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScalefEXT")) == NULL) || r;
6676 r = ((glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatedEXT")) == NULL) || r;
6677 r = ((glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatefEXT")) == NULL) || r;
6678 r = ((glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexBufferEXT")) == NULL) || r;
6679 r = ((glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordPointerEXT")) == NULL) || r;
6680 r = ((glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfEXT")) == NULL) || r;
6681 r = ((glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfvEXT")) == NULL) || r;
6682 r = ((glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnviEXT")) == NULL) || r;
6683 r = ((glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvivEXT")) == NULL) || r;
6684 r = ((glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendEXT")) == NULL) || r;
6685 r = ((glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendvEXT")) == NULL) || r;
6686 r = ((glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfEXT")) == NULL) || r;
6687 r = ((glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfvEXT")) == NULL) || r;
6688 r = ((glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGeniEXT")) == NULL) || r;
6689 r = ((glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenivEXT")) == NULL) || r;
6690 r = ((glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage1DEXT")) == NULL) || r;
6691 r = ((glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage2DEXT")) == NULL) || r;
6692 r = ((glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage3DEXT")) == NULL) || r;
6693 r = ((glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIivEXT")) == NULL) || r;
6694 r = ((glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIuivEXT")) == NULL) || r;
6695 r = ((glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfEXT")) == NULL) || r;
6696 r = ((glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfvEXT")) == NULL) || r;
6697 r = ((glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameteriEXT")) == NULL) || r;
6698 r = ((glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterivEXT")) == NULL) || r;
6699 r = ((glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexRenderbufferEXT")) == NULL) || r;
6700 r = ((glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage1DEXT")) == NULL) || r;
6701 r = ((glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage2DEXT")) == NULL) || r;
6702 r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage3DEXT")) == NULL) || r;
6703 r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferDataEXT")) == NULL) || r;
6704 r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubDataEXT")) == NULL) || r;
6705 r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedCopyBufferSubDataEXT")) == NULL) || r;
6706 r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbufferEXT")) == NULL) || r;
6707 r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture1DEXT")) == NULL) || r;
6708 r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture2DEXT")) == NULL) || r;
6709 r = ((glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture3DEXT")) == NULL) || r;
6710 r = ((glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureEXT")) == NULL) || r;
6711 r = ((glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureFaceEXT")) == NULL) || r;
6712 r = ((glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayerEXT")) == NULL) || r;
6713 r = ((glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dEXT")) == NULL) || r;
6714 r = ((glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dvEXT")) == NULL) || r;
6715 r = ((glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fEXT")) == NULL) || r;
6716 r = ((glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fvEXT")) == NULL) || r;
6717 r = ((glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4iEXT")) == NULL) || r;
6718 r = ((glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4ivEXT")) == NULL) || r;
6719 r = ((glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uiEXT")) == NULL) || r;
6720 r = ((glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uivEXT")) == NULL) || r;
6721 r = ((glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameters4fvEXT")) == NULL) || r;
6722 r = ((glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4ivEXT")) == NULL) || r;
6723 r = ((glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4uivEXT")) == NULL) || r;
6724 r = ((glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramStringEXT")) == NULL) || r;
6725 r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r;
6726 r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r;
6727 r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r;
6728 r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r;
6729 r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r;
6730 r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r;
6731 r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r;
6732 r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r;
6733 r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r;
6734 r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r;
6735 r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r;
6736 r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r;
6737 r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r;
6738 r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r;
6739 r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r;
6740 r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r;
6741 r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r;
6742 r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r;
6743 r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r;
6744 r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r;
6745 r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r;
6746 r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r;
6747 r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r;
6748 r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r;
6749 r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r;
6750 r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r;
6751 r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r;
6752 r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r;
6753 r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r;
6754 r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r;
6755 r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r;
6756 r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r;
6757 r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r;
6758 r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r;
6759 r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r;
6760 r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r;
6761 r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r;
6762 r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r;
6763 r = ((glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage1DEXT")) == NULL) || r;
6764 r = ((glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DEXT")) == NULL) || r;
6765 r = ((glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DEXT")) == NULL) || r;
6766 r = ((glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIivEXT")) == NULL) || r;
6767 r = ((glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuivEXT")) == NULL) || r;
6768 r = ((glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfEXT")) == NULL) || r;
6769 r = ((glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfvEXT")) == NULL) || r;
6770 r = ((glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriEXT")) == NULL) || r;
6771 r = ((glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterivEXT")) == NULL) || r;
6772 r = ((glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureRenderbufferEXT")) == NULL) || r;
6773 r = ((glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1DEXT")) == NULL) || r;
6774 r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2DEXT")) == NULL) || r;
6775 r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3DEXT")) == NULL) || r;
6776 r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBufferEXT")) == NULL) || r;
6777 r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayColorOffsetEXT")) == NULL) || r;
6778 r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayEdgeFlagOffsetEXT")) == NULL) || r;
6779 r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayFogCoordOffsetEXT")) == NULL) || r;
6780 r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayIndexOffsetEXT")) == NULL) || r;
6781 r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayMultiTexCoordOffsetEXT")) == NULL) || r;
6782 r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayNormalOffsetEXT")) == NULL) || r;
6783 r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArraySecondaryColorOffsetEXT")) == NULL) || r;
6784 r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayTexCoordOffsetEXT")) == NULL) || r;
6785 r = ((glVertexArrayVertexAttribDivisorEXT = (PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribDivisorEXT")) == NULL) || r;
6786 r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIOffsetEXT")) == NULL) || r;
6787 r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribOffsetEXT")) == NULL) || r;
6788 r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexOffsetEXT")) == NULL) || r;
6789
6790 return r;
6791 }
6792
6793 #endif /* GL_EXT_direct_state_access */
6794
6795 #ifdef GL_EXT_draw_buffers2
6796
6797 static GLboolean _glewInit_GL_EXT_draw_buffers2 (GLEW_CONTEXT_ARG_DEF_INIT)
6798 {
6799 GLboolean r = GL_FALSE;
6800
6801 r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskIndexedEXT")) == NULL) || r;
6802 r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableIndexedEXT")) == NULL) || r;
6803 r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableIndexedEXT")) == NULL) || r;
6804 r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetBooleanIndexedvEXT")) == NULL) || r;
6805 r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerIndexedvEXT")) == NULL) || r;
6806 r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledIndexedEXT")) == NULL) || r;
6807
6808 return r;
6809 }
6810
6811 #endif /* GL_EXT_draw_buffers2 */
6812
6813 #ifdef GL_EXT_draw_instanced
6814
6815 static GLboolean _glewInit_GL_EXT_draw_instanced (GLEW_CONTEXT_ARG_DEF_INIT)
6816 {
6817 GLboolean r = GL_FALSE;
6818
6819 r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedEXT")) == NULL) || r;
6820 r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedEXT")) == NULL) || r;
6821
6822 return r;
6823 }
6824
6825 #endif /* GL_EXT_draw_instanced */
6826
6827 #ifdef GL_EXT_draw_range_elements
6828
6829 static GLboolean _glewInit_GL_EXT_draw_range_elements (GLEW_CONTEXT_ARG_DEF_INIT)
6830 {
6831 GLboolean r = GL_FALSE;
6832
6833 r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r;
6834
6835 return r;
6836 }
6837
6838 #endif /* GL_EXT_draw_range_elements */
6839
6840 #ifdef GL_EXT_fog_coord
6841
6842 static GLboolean _glewInit_GL_EXT_fog_coord (GLEW_CONTEXT_ARG_DEF_INIT)
6843 {
6844 GLboolean r = GL_FALSE;
6845
6846 r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r;
6847 r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r;
6848 r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r;
6849 r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r;
6850 r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r;
6851
6852 return r;
6853 }
6854
6855 #endif /* GL_EXT_fog_coord */
6856
6857 #ifdef GL_EXT_fragment_lighting
6858
6859 static GLboolean _glewInit_GL_EXT_fragment_lighting (GLEW_CONTEXT_ARG_DEF_INIT)
6860 {
6861 GLboolean r = GL_FALSE;
6862
6863 r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r;
6864 r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r;
6865 r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r;
6866 r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r;
6867 r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r;
6868 r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r;
6869 r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r;
6870 r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r;
6871 r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r;
6872 r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r;
6873 r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r;
6874 r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r;
6875 r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r;
6876 r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r;
6877 r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r;
6878 r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r;
6879 r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r;
6880 r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r;
6881
6882 return r;
6883 }
6884
6885 #endif /* GL_EXT_fragment_lighting */
6886
6887 #ifdef GL_EXT_framebuffer_blit
6888
6889 static GLboolean _glewInit_GL_EXT_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT)
6890 {
6891 GLboolean r = GL_FALSE;
6892
6893 r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r;
6894
6895 return r;
6896 }
6897
6898 #endif /* GL_EXT_framebuffer_blit */
6899
6900 #ifdef GL_EXT_framebuffer_multisample
6901
6902 static GLboolean _glewInit_GL_EXT_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
6903 {
6904 GLboolean r = GL_FALSE;
6905
6906 r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r;
6907
6908 return r;
6909 }
6910
6911 #endif /* GL_EXT_framebuffer_multisample */
6912
6913 #ifdef GL_EXT_framebuffer_object
6914
6915 static GLboolean _glewInit_GL_EXT_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
6916 {
6917 GLboolean r = GL_FALSE;
6918
6919 r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r;
6920 r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r;
6921 r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r;
6922 r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r;
6923 r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r;
6924 r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r;
6925 r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r;
6926 r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r;
6927 r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r;
6928 r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r;
6929 r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r;
6930 r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r;
6931 r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r;
6932 r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r;
6933 r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r;
6934 r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r;
6935 r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r;
6936
6937 return r;
6938 }
6939
6940 #endif /* GL_EXT_framebuffer_object */
6941
6942 #ifdef GL_EXT_geometry_shader4
6943
6944 static GLboolean _glewInit_GL_EXT_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT)
6945 {
6946 GLboolean r = GL_FALSE;
6947
6948 r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureEXT")) == NULL) || r;
6949 r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceEXT")) == NULL) || r;
6950 r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriEXT")) == NULL) || r;
6951
6952 return r;
6953 }
6954
6955 #endif /* GL_EXT_geometry_shader4 */
6956
6957 #ifdef GL_EXT_gpu_program_parameters
6958
6959 static GLboolean _glewInit_GL_EXT_gpu_program_parameters (GLEW_CONTEXT_ARG_DEF_INIT)
6960 {
6961 GLboolean r = GL_FALSE;
6962
6963 r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameters4fvEXT")) == NULL) || r;
6964 r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameters4fvEXT")) == NULL) || r;
6965
6966 return r;
6967 }
6968
6969 #endif /* GL_EXT_gpu_program_parameters */
6970
6971 #ifdef GL_EXT_gpu_shader4
6972
6973 static GLboolean _glewInit_GL_EXT_gpu_shader4 (GLEW_CONTEXT_ARG_DEF_INIT)
6974 {
6975 GLboolean r = GL_FALSE;
6976
6977 r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationEXT")) == NULL) || r;
6978 r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocationEXT")) == NULL) || r;
6979 r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuivEXT")) == NULL) || r;
6980 r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIivEXT")) == NULL) || r;
6981 r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuivEXT")) == NULL) || r;
6982 r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiEXT")) == NULL) || r;
6983 r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uivEXT")) == NULL) || r;
6984 r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiEXT")) == NULL) || r;
6985 r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uivEXT")) == NULL) || r;
6986 r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiEXT")) == NULL) || r;
6987 r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uivEXT")) == NULL) || r;
6988 r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiEXT")) == NULL) || r;
6989 r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uivEXT")) == NULL) || r;
6990 r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iEXT")) == NULL) || r;
6991 r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ivEXT")) == NULL) || r;
6992 r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiEXT")) == NULL) || r;
6993 r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uivEXT")) == NULL) || r;
6994 r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iEXT")) == NULL) || r;
6995 r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ivEXT")) == NULL) || r;
6996 r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiEXT")) == NULL) || r;
6997 r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uivEXT")) == NULL) || r;
6998 r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iEXT")) == NULL) || r;
6999 r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ivEXT")) == NULL) || r;
7000 r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiEXT")) == NULL) || r;
7001 r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uivEXT")) == NULL) || r;
7002 r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bvEXT")) == NULL) || r;
7003 r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iEXT")) == NULL) || r;
7004 r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ivEXT")) == NULL) || r;
7005 r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4svEXT")) == NULL) || r;
7006 r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubvEXT")) == NULL) || r;
7007 r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiEXT")) == NULL) || r;
7008 r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uivEXT")) == NULL) || r;
7009 r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usvEXT")) == NULL) || r;
7010 r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointerEXT")) == NULL) || r;
7011
7012 return r;
7013 }
7014
7015 #endif /* GL_EXT_gpu_shader4 */
7016
7017 #ifdef GL_EXT_histogram
7018
7019 static GLboolean _glewInit_GL_EXT_histogram (GLEW_CONTEXT_ARG_DEF_INIT)
7020 {
7021 GLboolean r = GL_FALSE;
7022
7023 r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r;
7024 r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r;
7025 r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r;
7026 r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r;
7027 r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r;
7028 r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r;
7029 r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r;
7030 r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r;
7031 r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r;
7032 r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r;
7033
7034 return r;
7035 }
7036
7037 #endif /* GL_EXT_histogram */
7038
7039 #ifdef GL_EXT_index_func
7040
7041 static GLboolean _glewInit_GL_EXT_index_func (GLEW_CONTEXT_ARG_DEF_INIT)
7042 {
7043 GLboolean r = GL_FALSE;
7044
7045 r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r;
7046
7047 return r;
7048 }
7049
7050 #endif /* GL_EXT_index_func */
7051
7052 #ifdef GL_EXT_index_material
7053
7054 static GLboolean _glewInit_GL_EXT_index_material (GLEW_CONTEXT_ARG_DEF_INIT)
7055 {
7056 GLboolean r = GL_FALSE;
7057
7058 r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r;
7059
7060 return r;
7061 }
7062
7063 #endif /* GL_EXT_index_material */
7064
7065 #ifdef GL_EXT_light_texture
7066
7067 static GLboolean _glewInit_GL_EXT_light_texture (GLEW_CONTEXT_ARG_DEF_INIT)
7068 {
7069 GLboolean r = GL_FALSE;
7070
7071 r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r;
7072 r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r;
7073 r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r;
7074
7075 return r;
7076 }
7077
7078 #endif /* GL_EXT_light_texture */
7079
7080 #ifdef GL_EXT_multi_draw_arrays
7081
7082 static GLboolean _glewInit_GL_EXT_multi_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT)
7083 {
7084 GLboolean r = GL_FALSE;
7085
7086 r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r;
7087 r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r;
7088
7089 return r;
7090 }
7091
7092 #endif /* GL_EXT_multi_draw_arrays */
7093
7094 #ifdef GL_EXT_multisample
7095
7096 static GLboolean _glewInit_GL_EXT_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
7097 {
7098 GLboolean r = GL_FALSE;
7099
7100 r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r;
7101 r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r;
7102
7103 return r;
7104 }
7105
7106 #endif /* GL_EXT_multisample */
7107
7108 #ifdef GL_EXT_paletted_texture
7109
7110 static GLboolean _glewInit_GL_EXT_paletted_texture (GLEW_CONTEXT_ARG_DEF_INIT)
7111 {
7112 GLboolean r = GL_FALSE;
7113
7114 r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r;
7115 r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r;
7116 r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r;
7117 r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r;
7118
7119 return r;
7120 }
7121
7122 #endif /* GL_EXT_paletted_texture */
7123
7124 #ifdef GL_EXT_pixel_transform
7125
7126 static GLboolean _glewInit_GL_EXT_pixel_transform (GLEW_CONTEXT_ARG_DEF_INIT)
7127 {
7128 GLboolean r = GL_FALSE;
7129
7130 r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r;
7131 r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r;
7132 r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r;
7133 r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r;
7134 r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r;
7135 r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r;
7136
7137 return r;
7138 }
7139
7140 #endif /* GL_EXT_pixel_transform */
7141
7142 #ifdef GL_EXT_point_parameters
7143
7144 static GLboolean _glewInit_GL_EXT_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT)
7145 {
7146 GLboolean r = GL_FALSE;
7147
7148 r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r;
7149 r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r;
7150
7151 return r;
7152 }
7153
7154 #endif /* GL_EXT_point_parameters */
7155
7156 #ifdef GL_EXT_polygon_offset
7157
7158 static GLboolean _glewInit_GL_EXT_polygon_offset (GLEW_CONTEXT_ARG_DEF_INIT)
7159 {
7160 GLboolean r = GL_FALSE;
7161
7162 r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r;
7163
7164 return r;
7165 }
7166
7167 #endif /* GL_EXT_polygon_offset */
7168
7169 #ifdef GL_EXT_polygon_offset_clamp
7170
7171 static GLboolean _glewInit_GL_EXT_polygon_offset_clamp (GLEW_CONTEXT_ARG_DEF_INIT)
7172 {
7173 GLboolean r = GL_FALSE;
7174
7175 r = ((glPolygonOffsetClampEXT = (PFNGLPOLYGONOFFSETCLAMPEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClampEXT")) == NULL) || r;
7176
7177 return r;
7178 }
7179
7180 #endif /* GL_EXT_polygon_offset_clamp */
7181
7182 #ifdef GL_EXT_provoking_vertex
7183
7184 static GLboolean _glewInit_GL_EXT_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT)
7185 {
7186 GLboolean r = GL_FALSE;
7187
7188 r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertexEXT")) == NULL) || r;
7189
7190 return r;
7191 }
7192
7193 #endif /* GL_EXT_provoking_vertex */
7194
7195 #ifdef GL_EXT_raster_multisample
7196
7197 static GLboolean _glewInit_GL_EXT_raster_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
7198 {
7199 GLboolean r = GL_FALSE;
7200
7201 r = ((glCoverageModulationNV = (PFNGLCOVERAGEMODULATIONNVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationNV")) == NULL) || r;
7202 r = ((glCoverageModulationTableNV = (PFNGLCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationTableNV")) == NULL) || r;
7203 r = ((glGetCoverageModulationTableNV = (PFNGLGETCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glGetCoverageModulationTableNV")) == NULL) || r;
7204 r = ((glRasterSamplesEXT = (PFNGLRASTERSAMPLESEXTPROC)glewGetProcAddress((const GLubyte*)"glRasterSamplesEXT")) == NULL) || r;
7205
7206 return r;
7207 }
7208
7209 #endif /* GL_EXT_raster_multisample */
7210
7211 #ifdef GL_EXT_scene_marker
7212
7213 static GLboolean _glewInit_GL_EXT_scene_marker (GLEW_CONTEXT_ARG_DEF_INIT)
7214 {
7215 GLboolean r = GL_FALSE;
7216
7217 r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r;
7218 r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r;
7219
7220 return r;
7221 }
7222
7223 #endif /* GL_EXT_scene_marker */
7224
7225 #ifdef GL_EXT_secondary_color
7226
7227 static GLboolean _glewInit_GL_EXT_secondary_color (GLEW_CONTEXT_ARG_DEF_INIT)
7228 {
7229 GLboolean r = GL_FALSE;
7230
7231 r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r;
7232 r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r;
7233 r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r;
7234 r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r;
7235 r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r;
7236 r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r;
7237 r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r;
7238 r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r;
7239 r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r;
7240 r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r;
7241 r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r;
7242 r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r;
7243 r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r;
7244 r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r;
7245 r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r;
7246 r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r;
7247 r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r;
7248
7249 return r;
7250 }
7251
7252 #endif /* GL_EXT_secondary_color */
7253
7254 #ifdef GL_EXT_separate_shader_objects
7255
7256 static GLboolean _glewInit_GL_EXT_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT)
7257 {
7258 GLboolean r = GL_FALSE;
7259
7260 r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveProgramEXT")) == NULL) || r;
7261 r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramEXT")) == NULL) || r;
7262 r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glUseShaderProgramEXT")) == NULL) || r;
7263
7264 return r;
7265 }
7266
7267 #endif /* GL_EXT_separate_shader_objects */
7268
7269 #ifdef GL_EXT_shader_image_load_store
7270
7271 static GLboolean _glewInit_GL_EXT_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT)
7272 {
7273 GLboolean r = GL_FALSE;
7274
7275 r = ((glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextureEXT")) == NULL) || r;
7276 r = ((glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierEXT")) == NULL) || r;
7277
7278 return r;
7279 }
7280
7281 #endif /* GL_EXT_shader_image_load_store */
7282
7283 #ifdef GL_EXT_stencil_two_side
7284
7285 static GLboolean _glewInit_GL_EXT_stencil_two_side (GLEW_CONTEXT_ARG_DEF_INIT)
7286 {
7287 GLboolean r = GL_FALSE;
7288
7289 r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r;
7290
7291 return r;
7292 }
7293
7294 #endif /* GL_EXT_stencil_two_side */
7295
7296 #ifdef GL_EXT_subtexture
7297
7298 static GLboolean _glewInit_GL_EXT_subtexture (GLEW_CONTEXT_ARG_DEF_INIT)
7299 {
7300 GLboolean r = GL_FALSE;
7301
7302 r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r;
7303 r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r;
7304 r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r;
7305
7306 return r;
7307 }
7308
7309 #endif /* GL_EXT_subtexture */
7310
7311 #ifdef GL_EXT_texture3D
7312
7313 static GLboolean _glewInit_GL_EXT_texture3D (GLEW_CONTEXT_ARG_DEF_INIT)
7314 {
7315 GLboolean r = GL_FALSE;
7316
7317 r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r;
7318
7319 return r;
7320 }
7321
7322 #endif /* GL_EXT_texture3D */
7323
7324 #ifdef GL_EXT_texture_array
7325
7326 static GLboolean _glewInit_GL_EXT_texture_array (GLEW_CONTEXT_ARG_DEF_INIT)
7327 {
7328 GLboolean r = GL_FALSE;
7329
7330 r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerEXT")) == NULL) || r;
7331
7332 return r;
7333 }
7334
7335 #endif /* GL_EXT_texture_array */
7336
7337 #ifdef GL_EXT_texture_buffer_object
7338
7339 static GLboolean _glewInit_GL_EXT_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
7340 {
7341 GLboolean r = GL_FALSE;
7342
7343 r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexBufferEXT")) == NULL) || r;
7344
7345 return r;
7346 }
7347
7348 #endif /* GL_EXT_texture_buffer_object */
7349
7350 #ifdef GL_EXT_texture_integer
7351
7352 static GLboolean _glewInit_GL_EXT_texture_integer (GLEW_CONTEXT_ARG_DEF_INIT)
7353 {
7354 GLboolean r = GL_FALSE;
7355
7356 r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIiEXT")) == NULL) || r;
7357 r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIuiEXT")) == NULL) || r;
7358 r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivEXT")) == NULL) || r;
7359 r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivEXT")) == NULL) || r;
7360 r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivEXT")) == NULL) || r;
7361 r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivEXT")) == NULL) || r;
7362
7363 return r;
7364 }
7365
7366 #endif /* GL_EXT_texture_integer */
7367
7368 #ifdef GL_EXT_texture_object
7369
7370 static GLboolean _glewInit_GL_EXT_texture_object (GLEW_CONTEXT_ARG_DEF_INIT)
7371 {
7372 GLboolean r = GL_FALSE;
7373
7374 r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r;
7375 r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r;
7376 r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r;
7377 r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r;
7378 r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r;
7379 r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r;
7380
7381 return r;
7382 }
7383
7384 #endif /* GL_EXT_texture_object */
7385
7386 #ifdef GL_EXT_texture_perturb_normal
7387
7388 static GLboolean _glewInit_GL_EXT_texture_perturb_normal (GLEW_CONTEXT_ARG_DEF_INIT)
7389 {
7390 GLboolean r = GL_FALSE;
7391
7392 r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r;
7393
7394 return r;
7395 }
7396
7397 #endif /* GL_EXT_texture_perturb_normal */
7398
7399 #ifdef GL_EXT_timer_query
7400
7401 static GLboolean _glewInit_GL_EXT_timer_query (GLEW_CONTEXT_ARG_DEF_INIT)
7402 {
7403 GLboolean r = GL_FALSE;
7404
7405 r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vEXT")) == NULL) || r;
7406 r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vEXT")) == NULL) || r;
7407
7408 return r;
7409 }
7410
7411 #endif /* GL_EXT_timer_query */
7412
7413 #ifdef GL_EXT_transform_feedback
7414
7415 static GLboolean _glewInit_GL_EXT_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT)
7416 {
7417 GLboolean r = GL_FALSE;
7418
7419 r = ((glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackEXT")) == NULL) || r;
7420 r = ((glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseEXT")) == NULL) || r;
7421 r = ((glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetEXT")) == NULL) || r;
7422 r = ((glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeEXT")) == NULL) || r;
7423 r = ((glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackEXT")) == NULL) || r;
7424 r = ((glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingEXT")) == NULL) || r;
7425 r = ((glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsEXT")) == NULL) || r;
7426
7427 return r;
7428 }
7429
7430 #endif /* GL_EXT_transform_feedback */
7431
7432 #ifdef GL_EXT_vertex_array
7433
7434 static GLboolean _glewInit_GL_EXT_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT)
7435 {
7436 GLboolean r = GL_FALSE;
7437
7438 r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r;
7439 r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r;
7440 r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r;
7441 r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r;
7442 r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r;
7443 r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r;
7444 r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r;
7445 r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r;
7446
7447 return r;
7448 }
7449
7450 #endif /* GL_EXT_vertex_array */
7451
7452 #ifdef GL_EXT_vertex_attrib_64bit
7453
7454 static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT)
7455 {
7456 GLboolean r = GL_FALSE;
7457
7458 r = ((glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdvEXT")) == NULL) || r;
7459 r = ((glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLOffsetEXT")) == NULL) || r;
7460 r = ((glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dEXT")) == NULL) || r;
7461 r = ((glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dvEXT")) == NULL) || r;
7462 r = ((glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dEXT")) == NULL) || r;
7463 r = ((glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dvEXT")) == NULL) || r;
7464 r = ((glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dEXT")) == NULL) || r;
7465 r = ((glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dvEXT")) == NULL) || r;
7466 r = ((glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dEXT")) == NULL) || r;
7467 r = ((glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dvEXT")) == NULL) || r;
7468 r = ((glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointerEXT")) == NULL) || r;
7469
7470 return r;
7471 }
7472
7473 #endif /* GL_EXT_vertex_attrib_64bit */
7474
7475 #ifdef GL_EXT_vertex_shader
7476
7477 static GLboolean _glewInit_GL_EXT_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT)
7478 {
7479 GLboolean r = GL_FALSE;
7480
7481 r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r;
7482 r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r;
7483 r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r;
7484 r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r;
7485 r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r;
7486 r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r;
7487 r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r;
7488 r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r;
7489 r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r;
7490 r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r;
7491 r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r;
7492 r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r;
7493 r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r;
7494 r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r;
7495 r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r;
7496 r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r;
7497 r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r;
7498 r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r;
7499 r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r;
7500 r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r;
7501 r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r;
7502 r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r;
7503 r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r;
7504 r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r;
7505 r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r;
7506 r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r;
7507 r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r;
7508 r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r;
7509 r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r;
7510 r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r;
7511 r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r;
7512 r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r;
7513 r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r;
7514 r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r;
7515 r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r;
7516 r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r;
7517 r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r;
7518 r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r;
7519 r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r;
7520 r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r;
7521 r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r;
7522 r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r;
7523
7524 return r;
7525 }
7526
7527 #endif /* GL_EXT_vertex_shader */
7528
7529 #ifdef GL_EXT_vertex_weighting
7530
7531 static GLboolean _glewInit_GL_EXT_vertex_weighting (GLEW_CONTEXT_ARG_DEF_INIT)
7532 {
7533 GLboolean r = GL_FALSE;
7534
7535 r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r;
7536 r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r;
7537 r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r;
7538
7539 return r;
7540 }
7541
7542 #endif /* GL_EXT_vertex_weighting */
7543
7544 #ifdef GL_EXT_x11_sync_object
7545
7546 static GLboolean _glewInit_GL_EXT_x11_sync_object (GLEW_CONTEXT_ARG_DEF_INIT)
7547 {
7548 GLboolean r = GL_FALSE;
7549
7550 r = ((glImportSyncEXT = (PFNGLIMPORTSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSyncEXT")) == NULL) || r;
7551
7552 return r;
7553 }
7554
7555 #endif /* GL_EXT_x11_sync_object */
7556
7557 #ifdef GL_GREMEDY_frame_terminator
7558
7559 static GLboolean _glewInit_GL_GREMEDY_frame_terminator (GLEW_CONTEXT_ARG_DEF_INIT)
7560 {
7561 GLboolean r = GL_FALSE;
7562
7563 r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glFrameTerminatorGREMEDY")) == NULL) || r;
7564
7565 return r;
7566 }
7567
7568 #endif /* GL_GREMEDY_frame_terminator */
7569
7570 #ifdef GL_GREMEDY_string_marker
7571
7572 static GLboolean _glewInit_GL_GREMEDY_string_marker (GLEW_CONTEXT_ARG_DEF_INIT)
7573 {
7574 GLboolean r = GL_FALSE;
7575
7576 r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r;
7577
7578 return r;
7579 }
7580
7581 #endif /* GL_GREMEDY_string_marker */
7582
7583 #ifdef GL_HP_image_transform
7584
7585 static GLboolean _glewInit_GL_HP_image_transform (GLEW_CONTEXT_ARG_DEF_INIT)
7586 {
7587 GLboolean r = GL_FALSE;
7588
7589 r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r;
7590 r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r;
7591 r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r;
7592 r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r;
7593 r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r;
7594 r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r;
7595
7596 return r;
7597 }
7598
7599 #endif /* GL_HP_image_transform */
7600
7601 #ifdef GL_IBM_multimode_draw_arrays
7602
7603 static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT)
7604 {
7605 GLboolean r = GL_FALSE;
7606
7607 r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r;
7608 r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r;
7609
7610 return r;
7611 }
7612
7613 #endif /* GL_IBM_multimode_draw_arrays */
7614
7615 #ifdef GL_IBM_vertex_array_lists
7616
7617 static GLboolean _glewInit_GL_IBM_vertex_array_lists (GLEW_CONTEXT_ARG_DEF_INIT)
7618 {
7619 GLboolean r = GL_FALSE;
7620
7621 r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r;
7622 r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r;
7623 r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r;
7624 r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r;
7625 r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r;
7626 r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r;
7627 r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r;
7628 r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r;
7629
7630 return r;
7631 }
7632
7633 #endif /* GL_IBM_vertex_array_lists */
7634
7635 #ifdef GL_INTEL_map_texture
7636
7637 static GLboolean _glewInit_GL_INTEL_map_texture (GLEW_CONTEXT_ARG_DEF_INIT)
7638 {
7639 GLboolean r = GL_FALSE;
7640
7641 r = ((glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glMapTexture2DINTEL")) == NULL) || r;
7642 r = ((glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC)glewGetProcAddress((const GLubyte*)"glSyncTextureINTEL")) == NULL) || r;
7643 r = ((glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glUnmapTexture2DINTEL")) == NULL) || r;
7644
7645 return r;
7646 }
7647
7648 #endif /* GL_INTEL_map_texture */
7649
7650 #ifdef GL_INTEL_parallel_arrays
7651
7652 static GLboolean _glewInit_GL_INTEL_parallel_arrays (GLEW_CONTEXT_ARG_DEF_INIT)
7653 {
7654 GLboolean r = GL_FALSE;
7655
7656 r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r;
7657 r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r;
7658 r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r;
7659 r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r;
7660
7661 return r;
7662 }
7663
7664 #endif /* GL_INTEL_parallel_arrays */
7665
7666 #ifdef GL_INTEL_performance_query
7667
7668 static GLboolean _glewInit_GL_INTEL_performance_query (GLEW_CONTEXT_ARG_DEF_INIT)
7669 {
7670 GLboolean r = GL_FALSE;
7671
7672 r = ((glBeginPerfQueryINTEL = (PFNGLBEGINPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfQueryINTEL")) == NULL) || r;
7673 r = ((glCreatePerfQueryINTEL = (PFNGLCREATEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glCreatePerfQueryINTEL")) == NULL) || r;
7674 r = ((glDeletePerfQueryINTEL = (PFNGLDELETEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfQueryINTEL")) == NULL) || r;
7675 r = ((glEndPerfQueryINTEL = (PFNGLENDPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glEndPerfQueryINTEL")) == NULL) || r;
7676 r = ((glGetFirstPerfQueryIdINTEL = (PFNGLGETFIRSTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetFirstPerfQueryIdINTEL")) == NULL) || r;
7677 r = ((glGetNextPerfQueryIdINTEL = (PFNGLGETNEXTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetNextPerfQueryIdINTEL")) == NULL) || r;
7678 r = ((glGetPerfCounterInfoINTEL = (PFNGLGETPERFCOUNTERINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfCounterInfoINTEL")) == NULL) || r;
7679 r = ((glGetPerfQueryDataINTEL = (PFNGLGETPERFQUERYDATAINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryDataINTEL")) == NULL) || r;
7680 r = ((glGetPerfQueryIdByNameINTEL = (PFNGLGETPERFQUERYIDBYNAMEINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryIdByNameINTEL")) == NULL) || r;
7681 r = ((glGetPerfQueryInfoINTEL = (PFNGLGETPERFQUERYINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryInfoINTEL")) == NULL) || r;
7682
7683 return r;
7684 }
7685
7686 #endif /* GL_INTEL_performance_query */
7687
7688 #ifdef GL_INTEL_texture_scissor
7689
7690 static GLboolean _glewInit_GL_INTEL_texture_scissor (GLEW_CONTEXT_ARG_DEF_INIT)
7691 {
7692 GLboolean r = GL_FALSE;
7693
7694 r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r;
7695 r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r;
7696
7697 return r;
7698 }
7699
7700 #endif /* GL_INTEL_texture_scissor */
7701
7702 #ifdef GL_KHR_blend_equation_advanced
7703
7704 static GLboolean _glewInit_GL_KHR_blend_equation_advanced (GLEW_CONTEXT_ARG_DEF_INIT)
7705 {
7706 GLboolean r = GL_FALSE;
7707
7708 r = ((glBlendBarrierKHR = (PFNGLBLENDBARRIERKHRPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierKHR")) == NULL) || r;
7709
7710 return r;
7711 }
7712
7713 #endif /* GL_KHR_blend_equation_advanced */
7714
7715 #ifdef GL_KHR_debug
7716
7717 static GLboolean _glewInit_GL_KHR_debug (GLEW_CONTEXT_ARG_DEF_INIT)
7718 {
7719 GLboolean r = GL_FALSE;
7720
7721 r = ((glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallback")) == NULL) || r;
7722 r = ((glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControl")) == NULL) || r;
7723 r = ((glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsert")) == NULL) || r;
7724 r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r;
7725 r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r;
7726 r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r;
7727 r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r;
7728 r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r;
7729 r = ((glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPopDebugGroup")) == NULL) || r;
7730 r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r;
7731
7732 return r;
7733 }
7734
7735 #endif /* GL_KHR_debug */
7736
7737 #ifdef GL_KHR_robustness
7738
7739 static GLboolean _glewInit_GL_KHR_robustness (GLEW_CONTEXT_ARG_DEF_INIT)
7740 {
7741 GLboolean r = GL_FALSE;
7742
7743 r = ((glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfv")) == NULL) || r;
7744 r = ((glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformiv")) == NULL) || r;
7745 r = ((glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuiv")) == NULL) || r;
7746 r = ((glReadnPixels = (PFNGLREADNPIXELSPROC)glewGetProcAddress((const GLubyte*)"glReadnPixels")) == NULL) || r;
7747
7748 return r;
7749 }
7750
7751 #endif /* GL_KHR_robustness */
7752
7753 #ifdef GL_KTX_buffer_region
7754
7755 static GLboolean _glewInit_GL_KTX_buffer_region (GLEW_CONTEXT_ARG_DEF_INIT)
7756 {
7757 GLboolean r = GL_FALSE;
7758
7759 r = ((glBufferRegionEnabled = (PFNGLBUFFERREGIONENABLEDPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabled")) == NULL) || r;
7760 r = ((glDeleteBufferRegion = (PFNGLDELETEBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegion")) == NULL) || r;
7761 r = ((glDrawBufferRegion = (PFNGLDRAWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegion")) == NULL) || r;
7762 r = ((glNewBufferRegion = (PFNGLNEWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegion")) == NULL) || r;
7763 r = ((glReadBufferRegion = (PFNGLREADBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegion")) == NULL) || r;
7764
7765 return r;
7766 }
7767
7768 #endif /* GL_KTX_buffer_region */
7769
7770 #ifdef GL_MESA_resize_buffers
7771
7772 static GLboolean _glewInit_GL_MESA_resize_buffers (GLEW_CONTEXT_ARG_DEF_INIT)
7773 {
7774 GLboolean r = GL_FALSE;
7775
7776 r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r;
7777
7778 return r;
7779 }
7780
7781 #endif /* GL_MESA_resize_buffers */
7782
7783 #ifdef GL_MESA_window_pos
7784
7785 static GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT)
7786 {
7787 GLboolean r = GL_FALSE;
7788
7789 r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r;
7790 r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r;
7791 r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r;
7792 r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r;
7793 r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r;
7794 r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r;
7795 r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r;
7796 r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r;
7797 r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r;
7798 r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r;
7799 r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r;
7800 r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r;
7801 r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r;
7802 r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r;
7803 r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r;
7804 r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r;
7805 r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r;
7806 r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r;
7807 r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r;
7808 r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r;
7809 r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r;
7810 r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r;
7811 r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r;
7812 r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r;
7813
7814 return r;
7815 }
7816
7817 #endif /* GL_MESA_window_pos */
7818
7819 #ifdef GL_NVX_conditional_render
7820
7821 static GLboolean _glewInit_GL_NVX_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT)
7822 {
7823 GLboolean r = GL_FALSE;
7824
7825 r = ((glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNVX")) == NULL) || r;
7826 r = ((glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNVX")) == NULL) || r;
7827
7828 return r;
7829 }
7830
7831 #endif /* GL_NVX_conditional_render */
7832
7833 #ifdef GL_NV_bindless_multi_draw_indirect
7834
7835 static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT)
7836 {
7837 GLboolean r = GL_FALSE;
7838
7839 r = ((glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessNV")) == NULL) || r;
7840 r = ((glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessNV")) == NULL) || r;
7841
7842 return r;
7843 }
7844
7845 #endif /* GL_NV_bindless_multi_draw_indirect */
7846
7847 #ifdef GL_NV_bindless_multi_draw_indirect_count
7848
7849 static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count (GLEW_CONTEXT_ARG_DEF_INIT)
7850 {
7851 GLboolean r = GL_FALSE;
7852
7853 r = ((glMultiDrawArraysIndirectBindlessCountNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessCountNV")) == NULL) || r;
7854 r = ((glMultiDrawElementsIndirectBindlessCountNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessCountNV")) == NULL) || r;
7855
7856 return r;
7857 }
7858
7859 #endif /* GL_NV_bindless_multi_draw_indirect_count */
7860
7861 #ifdef GL_NV_bindless_texture
7862
7863 static GLboolean _glewInit_GL_NV_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT)
7864 {
7865 GLboolean r = GL_FALSE;
7866
7867 r = ((glGetImageHandleNV = (PFNGLGETIMAGEHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleNV")) == NULL) || r;
7868 r = ((glGetTextureHandleNV = (PFNGLGETTEXTUREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleNV")) == NULL) || r;
7869 r = ((glGetTextureSamplerHandleNV = (PFNGLGETTEXTURESAMPLERHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleNV")) == NULL) || r;
7870 r = ((glIsImageHandleResidentNV = (PFNGLISIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentNV")) == NULL) || r;
7871 r = ((glIsTextureHandleResidentNV = (PFNGLISTEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentNV")) == NULL) || r;
7872 r = ((glMakeImageHandleNonResidentNV = (PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentNV")) == NULL) || r;
7873 r = ((glMakeImageHandleResidentNV = (PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentNV")) == NULL) || r;
7874 r = ((glMakeTextureHandleNonResidentNV = (PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentNV")) == NULL) || r;
7875 r = ((glMakeTextureHandleResidentNV = (PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentNV")) == NULL) || r;
7876 r = ((glProgramUniformHandleui64NV = (PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64NV")) == NULL) || r;
7877 r = ((glProgramUniformHandleui64vNV = (PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vNV")) == NULL) || r;
7878 r = ((glUniformHandleui64NV = (PFNGLUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64NV")) == NULL) || r;
7879 r = ((glUniformHandleui64vNV = (PFNGLUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vNV")) == NULL) || r;
7880
7881 return r;
7882 }
7883
7884 #endif /* GL_NV_bindless_texture */
7885
7886 #ifdef GL_NV_blend_equation_advanced
7887
7888 static GLboolean _glewInit_GL_NV_blend_equation_advanced (GLEW_CONTEXT_ARG_DEF_INIT)
7889 {
7890 GLboolean r = GL_FALSE;
7891
7892 r = ((glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierNV")) == NULL) || r;
7893 r = ((glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glBlendParameteriNV")) == NULL) || r;
7894
7895 return r;
7896 }
7897
7898 #endif /* GL_NV_blend_equation_advanced */
7899
7900 #ifdef GL_NV_conditional_render
7901
7902 static GLboolean _glewInit_GL_NV_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT)
7903 {
7904 GLboolean r = GL_FALSE;
7905
7906 r = ((glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNV")) == NULL) || r;
7907 r = ((glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNV")) == NULL) || r;
7908
7909 return r;
7910 }
7911
7912 #endif /* GL_NV_conditional_render */
7913
7914 #ifdef GL_NV_conservative_raster
7915
7916 static GLboolean _glewInit_GL_NV_conservative_raster (GLEW_CONTEXT_ARG_DEF_INIT)
7917 {
7918 GLboolean r = GL_FALSE;
7919
7920 r = ((glSubpixelPrecisionBiasNV = (PFNGLSUBPIXELPRECISIONBIASNVPROC)glewGetProcAddress((const GLubyte*)"glSubpixelPrecisionBiasNV")) == NULL) || r;
7921
7922 return r;
7923 }
7924
7925 #endif /* GL_NV_conservative_raster */
7926
7927 #ifdef GL_NV_conservative_raster_dilate
7928
7929 static GLboolean _glewInit_GL_NV_conservative_raster_dilate (GLEW_CONTEXT_ARG_DEF_INIT)
7930 {
7931 GLboolean r = GL_FALSE;
7932
7933 r = ((glConservativeRasterParameterfNV = (PFNGLCONSERVATIVERASTERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameterfNV")) == NULL) || r;
7934
7935 return r;
7936 }
7937
7938 #endif /* GL_NV_conservative_raster_dilate */
7939
7940 #ifdef GL_NV_copy_image
7941
7942 static GLboolean _glewInit_GL_NV_copy_image (GLEW_CONTEXT_ARG_DEF_INIT)
7943 {
7944 GLboolean r = GL_FALSE;
7945
7946 r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataNV")) == NULL) || r;
7947
7948 return r;
7949 }
7950
7951 #endif /* GL_NV_copy_image */
7952
7953 #ifdef GL_NV_depth_buffer_float
7954
7955 static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT)
7956 {
7957 GLboolean r = GL_FALSE;
7958
7959 r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)"glClearDepthdNV")) == NULL) || r;
7960 r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsdNV")) == NULL) || r;
7961 r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangedNV")) == NULL) || r;
7962
7963 return r;
7964 }
7965
7966 #endif /* GL_NV_depth_buffer_float */
7967
7968 #ifdef GL_NV_draw_texture
7969
7970 static GLboolean _glewInit_GL_NV_draw_texture (GLEW_CONTEXT_ARG_DEF_INIT)
7971 {
7972 GLboolean r = GL_FALSE;
7973
7974 r = ((glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glDrawTextureNV")) == NULL) || r;
7975
7976 return r;
7977 }
7978
7979 #endif /* GL_NV_draw_texture */
7980
7981 #ifdef GL_NV_evaluators
7982
7983 static GLboolean _glewInit_GL_NV_evaluators (GLEW_CONTEXT_ARG_DEF_INIT)
7984 {
7985 GLboolean r = GL_FALSE;
7986
7987 r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r;
7988 r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r;
7989 r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r;
7990 r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r;
7991 r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r;
7992 r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r;
7993 r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r;
7994 r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r;
7995 r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r;
7996
7997 return r;
7998 }
7999
8000 #endif /* GL_NV_evaluators */
8001
8002 #ifdef GL_NV_explicit_multisample
8003
8004 static GLboolean _glewInit_GL_NV_explicit_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
8005 {
8006 GLboolean r = GL_FALSE;
8007
8008 r = ((glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefvNV")) == NULL) || r;
8009 r = ((glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskIndexedNV")) == NULL) || r;
8010 r = ((glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glTexRenderbufferNV")) == NULL) || r;
8011
8012 return r;
8013 }
8014
8015 #endif /* GL_NV_explicit_multisample */
8016
8017 #ifdef GL_NV_fence
8018
8019 static GLboolean _glewInit_GL_NV_fence (GLEW_CONTEXT_ARG_DEF_INIT)
8020 {
8021 GLboolean r = GL_FALSE;
8022
8023 r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r;
8024 r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r;
8025 r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r;
8026 r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r;
8027 r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r;
8028 r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r;
8029 r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r;
8030
8031 return r;
8032 }
8033
8034 #endif /* GL_NV_fence */
8035
8036 #ifdef GL_NV_fragment_coverage_to_color
8037
8038 static GLboolean _glewInit_GL_NV_fragment_coverage_to_color (GLEW_CONTEXT_ARG_DEF_INIT)
8039 {
8040 GLboolean r = GL_FALSE;
8041
8042 r = ((glFragmentCoverageColorNV = (PFNGLFRAGMENTCOVERAGECOLORNVPROC)glewGetProcAddress((const GLubyte*)"glFragmentCoverageColorNV")) == NULL) || r;
8043
8044 return r;
8045 }
8046
8047 #endif /* GL_NV_fragment_coverage_to_color */
8048
8049 #ifdef GL_NV_fragment_program
8050
8051 static GLboolean _glewInit_GL_NV_fragment_program (GLEW_CONTEXT_ARG_DEF_INIT)
8052 {
8053 GLboolean r = GL_FALSE;
8054
8055 r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r;
8056 r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r;
8057 r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r;
8058 r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r;
8059 r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r;
8060 r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r;
8061
8062 return r;
8063 }
8064
8065 #endif /* GL_NV_fragment_program */
8066
8067 #ifdef GL_NV_framebuffer_multisample_coverage
8068
8069 static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (GLEW_CONTEXT_ARG_DEF_INIT)
8070 {
8071 GLboolean r = GL_FALSE;
8072
8073 r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleCoverageNV")) == NULL) || r;
8074
8075 return r;
8076 }
8077
8078 #endif /* GL_NV_framebuffer_multisample_coverage */
8079
8080 #ifdef GL_NV_geometry_program4
8081
8082 static GLboolean _glewInit_GL_NV_geometry_program4 (GLEW_CONTEXT_ARG_DEF_INIT)
8083 {
8084 GLboolean r = GL_FALSE;
8085
8086 r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)"glProgramVertexLimitNV")) == NULL) || r;
8087
8088 return r;
8089 }
8090
8091 #endif /* GL_NV_geometry_program4 */
8092
8093 #ifdef GL_NV_gpu_program4
8094
8095 static GLboolean _glewInit_GL_NV_gpu_program4 (GLEW_CONTEXT_ARG_DEF_INIT)
8096 {
8097 GLboolean r = GL_FALSE;
8098
8099 r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4iNV")) == NULL) || r;
8100 r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4ivNV")) == NULL) || r;
8101 r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uiNV")) == NULL) || r;
8102 r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uivNV")) == NULL) || r;
8103 r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4ivNV")) == NULL) || r;
8104 r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4uivNV")) == NULL) || r;
8105 r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4iNV")) == NULL) || r;
8106 r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4ivNV")) == NULL) || r;
8107 r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uiNV")) == NULL) || r;
8108 r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uivNV")) == NULL) || r;
8109 r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4ivNV")) == NULL) || r;
8110 r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4uivNV")) == NULL) || r;
8111
8112 return r;
8113 }
8114
8115 #endif /* GL_NV_gpu_program4 */
8116
8117 #ifdef GL_NV_gpu_shader5
8118
8119 static GLboolean _glewInit_GL_NV_gpu_shader5 (GLEW_CONTEXT_ARG_DEF_INIT)
8120 {
8121 GLboolean r = GL_FALSE;
8122
8123 r = ((glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vNV")) == NULL) || r;
8124 r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vNV")) == NULL) || r;
8125 r = ((glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64NV")) == NULL) || r;
8126 r = ((glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vNV")) == NULL) || r;
8127 r = ((glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64NV")) == NULL) || r;
8128 r = ((glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vNV")) == NULL) || r;
8129 r = ((glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64NV")) == NULL) || r;
8130 r = ((glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vNV")) == NULL) || r;
8131 r = ((glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64NV")) == NULL) || r;
8132 r = ((glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vNV")) == NULL) || r;
8133 r = ((glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64NV")) == NULL) || r;
8134 r = ((glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vNV")) == NULL) || r;
8135 r = ((glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64NV")) == NULL) || r;
8136 r = ((glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vNV")) == NULL) || r;
8137 r = ((glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64NV")) == NULL) || r;
8138 r = ((glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vNV")) == NULL) || r;
8139 r = ((glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64NV")) == NULL) || r;
8140 r = ((glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vNV")) == NULL) || r;
8141 r = ((glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64NV")) == NULL) || r;
8142 r = ((glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vNV")) == NULL) || r;
8143 r = ((glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64NV")) == NULL) || r;
8144 r = ((glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vNV")) == NULL) || r;
8145 r = ((glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64NV")) == NULL) || r;
8146 r = ((glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vNV")) == NULL) || r;
8147 r = ((glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64NV")) == NULL) || r;
8148 r = ((glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vNV")) == NULL) || r;
8149 r = ((glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64NV")) == NULL) || r;
8150 r = ((glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vNV")) == NULL) || r;
8151 r = ((glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64NV")) == NULL) || r;
8152 r = ((glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vNV")) == NULL) || r;
8153 r = ((glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64NV")) == NULL) || r;
8154 r = ((glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vNV")) == NULL) || r;
8155 r = ((glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64NV")) == NULL) || r;
8156 r = ((glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vNV")) == NULL) || r;
8157
8158 return r;
8159 }
8160
8161 #endif /* GL_NV_gpu_shader5 */
8162
8163 #ifdef GL_NV_half_float
8164
8165 static GLboolean _glewInit_GL_NV_half_float (GLEW_CONTEXT_ARG_DEF_INIT)
8166 {
8167 GLboolean r = GL_FALSE;
8168
8169 r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r;
8170 r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r;
8171 r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r;
8172 r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r;
8173 r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r;
8174 r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r;
8175 r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r;
8176 r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r;
8177 r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r;
8178 r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r;
8179 r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r;
8180 r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r;
8181 r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r;
8182 r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r;
8183 r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r;
8184 r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r;
8185 r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r;
8186 r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r;
8187 r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r;
8188 r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r;
8189 r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r;
8190 r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r;
8191 r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r;
8192 r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r;
8193 r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r;
8194 r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r;
8195 r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r;
8196 r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r;
8197 r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r;
8198 r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r;
8199 r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r;
8200 r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r;
8201 r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r;
8202 r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r;
8203 r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r;
8204 r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r;
8205 r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r;
8206 r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r;
8207 r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r;
8208 r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r;
8209 r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r;
8210 r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r;
8211 r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r;
8212 r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r;
8213 r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r;
8214 r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r;
8215
8216 return r;
8217 }
8218
8219 #endif /* GL_NV_half_float */
8220
8221 #ifdef GL_NV_internalformat_sample_query
8222
8223 static GLboolean _glewInit_GL_NV_internalformat_sample_query (GLEW_CONTEXT_ARG_DEF_INIT)
8224 {
8225 GLboolean r = GL_FALSE;
8226
8227 r = ((glGetInternalformatSampleivNV = (PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformatSampleivNV")) == NULL) || r;
8228
8229 return r;
8230 }
8231
8232 #endif /* GL_NV_internalformat_sample_query */
8233
8234 #ifdef GL_NV_occlusion_query
8235
8236 static GLboolean _glewInit_GL_NV_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT)
8237 {
8238 GLboolean r = GL_FALSE;
8239
8240 r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r;
8241 r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r;
8242 r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r;
8243 r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r;
8244 r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r;
8245 r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r;
8246 r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r;
8247
8248 return r;
8249 }
8250
8251 #endif /* GL_NV_occlusion_query */
8252
8253 #ifdef GL_NV_parameter_buffer_object
8254
8255 static GLboolean _glewInit_GL_NV_parameter_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
8256 {
8257 GLboolean r = GL_FALSE;
8258
8259 r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIivNV")) == NULL) || r;
8260 r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIuivNV")) == NULL) || r;
8261 r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersfvNV")) == NULL) || r;
8262
8263 return r;
8264 }
8265
8266 #endif /* GL_NV_parameter_buffer_object */
8267
8268 #ifdef GL_NV_path_rendering
8269
8270 static GLboolean _glewInit_GL_NV_path_rendering (GLEW_CONTEXT_ARG_DEF_INIT)
8271 {
8272 GLboolean r = GL_FALSE;
8273
8274 r = ((glCopyPathNV = (PFNGLCOPYPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCopyPathNV")) == NULL) || r;
8275 r = ((glCoverFillPathInstancedNV = (PFNGLCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathInstancedNV")) == NULL) || r;
8276 r = ((glCoverFillPathNV = (PFNGLCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathNV")) == NULL) || r;
8277 r = ((glCoverStrokePathInstancedNV = (PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathInstancedNV")) == NULL) || r;
8278 r = ((glCoverStrokePathNV = (PFNGLCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathNV")) == NULL) || r;
8279 r = ((glDeletePathsNV = (PFNGLDELETEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glDeletePathsNV")) == NULL) || r;
8280 r = ((glGenPathsNV = (PFNGLGENPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glGenPathsNV")) == NULL) || r;
8281 r = ((glGetPathColorGenfvNV = (PFNGLGETPATHCOLORGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenfvNV")) == NULL) || r;
8282 r = ((glGetPathColorGenivNV = (PFNGLGETPATHCOLORGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenivNV")) == NULL) || r;
8283 r = ((glGetPathCommandsNV = (PFNGLGETPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCommandsNV")) == NULL) || r;
8284 r = ((glGetPathCoordsNV = (PFNGLGETPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCoordsNV")) == NULL) || r;
8285 r = ((glGetPathDashArrayNV = (PFNGLGETPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathDashArrayNV")) == NULL) || r;
8286 r = ((glGetPathLengthNV = (PFNGLGETPATHLENGTHNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathLengthNV")) == NULL) || r;
8287 r = ((glGetPathMetricRangeNV = (PFNGLGETPATHMETRICRANGENVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricRangeNV")) == NULL) || r;
8288 r = ((glGetPathMetricsNV = (PFNGLGETPATHMETRICSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricsNV")) == NULL) || r;
8289 r = ((glGetPathParameterfvNV = (PFNGLGETPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterfvNV")) == NULL) || r;
8290 r = ((glGetPathParameterivNV = (PFNGLGETPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterivNV")) == NULL) || r;
8291 r = ((glGetPathSpacingNV = (PFNGLGETPATHSPACINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathSpacingNV")) == NULL) || r;
8292 r = ((glGetPathTexGenfvNV = (PFNGLGETPATHTEXGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenfvNV")) == NULL) || r;
8293 r = ((glGetPathTexGenivNV = (PFNGLGETPATHTEXGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenivNV")) == NULL) || r;
8294 r = ((glGetProgramResourcefvNV = (PFNGLGETPROGRAMRESOURCEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourcefvNV")) == NULL) || r;
8295 r = ((glInterpolatePathsNV = (PFNGLINTERPOLATEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glInterpolatePathsNV")) == NULL) || r;
8296 r = ((glIsPathNV = (PFNGLISPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPathNV")) == NULL) || r;
8297 r = ((glIsPointInFillPathNV = (PFNGLISPOINTINFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInFillPathNV")) == NULL) || r;
8298 r = ((glIsPointInStrokePathNV = (PFNGLISPOINTINSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInStrokePathNV")) == NULL) || r;
8299 r = ((glMatrixLoad3x2fNV = (PFNGLMATRIXLOAD3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x2fNV")) == NULL) || r;
8300 r = ((glMatrixLoad3x3fNV = (PFNGLMATRIXLOAD3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x3fNV")) == NULL) || r;
8301 r = ((glMatrixLoadTranspose3x3fNV = (PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTranspose3x3fNV")) == NULL) || r;
8302 r = ((glMatrixMult3x2fNV = (PFNGLMATRIXMULT3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x2fNV")) == NULL) || r;
8303 r = ((glMatrixMult3x3fNV = (PFNGLMATRIXMULT3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x3fNV")) == NULL) || r;
8304 r = ((glMatrixMultTranspose3x3fNV = (PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTranspose3x3fNV")) == NULL) || r;
8305 r = ((glPathColorGenNV = (PFNGLPATHCOLORGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathColorGenNV")) == NULL) || r;
8306 r = ((glPathCommandsNV = (PFNGLPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCommandsNV")) == NULL) || r;
8307 r = ((glPathCoordsNV = (PFNGLPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoordsNV")) == NULL) || r;
8308 r = ((glPathCoverDepthFuncNV = (PFNGLPATHCOVERDEPTHFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoverDepthFuncNV")) == NULL) || r;
8309 r = ((glPathDashArrayNV = (PFNGLPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathDashArrayNV")) == NULL) || r;
8310 r = ((glPathFogGenNV = (PFNGLPATHFOGGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathFogGenNV")) == NULL) || r;
8311 r = ((glPathGlyphIndexArrayNV = (PFNGLPATHGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexArrayNV")) == NULL) || r;
8312 r = ((glPathGlyphIndexRangeNV = (PFNGLPATHGLYPHINDEXRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexRangeNV")) == NULL) || r;
8313 r = ((glPathGlyphRangeNV = (PFNGLPATHGLYPHRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphRangeNV")) == NULL) || r;
8314 r = ((glPathGlyphsNV = (PFNGLPATHGLYPHSNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphsNV")) == NULL) || r;
8315 r = ((glPathMemoryGlyphIndexArrayNV = (PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathMemoryGlyphIndexArrayNV")) == NULL) || r;
8316 r = ((glPathParameterfNV = (PFNGLPATHPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfNV")) == NULL) || r;
8317 r = ((glPathParameterfvNV = (PFNGLPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfvNV")) == NULL) || r;
8318 r = ((glPathParameteriNV = (PFNGLPATHPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPathParameteriNV")) == NULL) || r;
8319 r = ((glPathParameterivNV = (PFNGLPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterivNV")) == NULL) || r;
8320 r = ((glPathStencilDepthOffsetNV = (PFNGLPATHSTENCILDEPTHOFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilDepthOffsetNV")) == NULL) || r;
8321 r = ((glPathStencilFuncNV = (PFNGLPATHSTENCILFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilFuncNV")) == NULL) || r;
8322 r = ((glPathStringNV = (PFNGLPATHSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glPathStringNV")) == NULL) || r;
8323 r = ((glPathSubCommandsNV = (PFNGLPATHSUBCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCommandsNV")) == NULL) || r;
8324 r = ((glPathSubCoordsNV = (PFNGLPATHSUBCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCoordsNV")) == NULL) || r;
8325 r = ((glPathTexGenNV = (PFNGLPATHTEXGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathTexGenNV")) == NULL) || r;
8326 r = ((glPointAlongPathNV = (PFNGLPOINTALONGPATHNVPROC)glewGetProcAddress((const GLubyte*)"glPointAlongPathNV")) == NULL) || r;
8327 r = ((glProgramPathFragmentInputGenNV = (PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)glewGetProcAddress((const GLubyte*)"glProgramPathFragmentInputGenNV")) == NULL) || r;
8328 r = ((glStencilFillPathInstancedNV = (PFNGLSTENCILFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathInstancedNV")) == NULL) || r;
8329 r = ((glStencilFillPathNV = (PFNGLSTENCILFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathNV")) == NULL) || r;
8330 r = ((glStencilStrokePathInstancedNV = (PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathInstancedNV")) == NULL) || r;
8331 r = ((glStencilStrokePathNV = (PFNGLSTENCILSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathNV")) == NULL) || r;
8332 r = ((glStencilThenCoverFillPathInstancedNV = (PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathInstancedNV")) == NULL) || r;
8333 r = ((glStencilThenCoverFillPathNV = (PFNGLSTENCILTHENCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathNV")) == NULL) || r;
8334 r = ((glStencilThenCoverStrokePathInstancedNV = (PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathInstancedNV")) == NULL) || r;
8335 r = ((glStencilThenCoverStrokePathNV = (PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathNV")) == NULL) || r;
8336 r = ((glTransformPathNV = (PFNGLTRANSFORMPATHNVPROC)glewGetProcAddress((const GLubyte*)"glTransformPathNV")) == NULL) || r;
8337 r = ((glWeightPathsNV = (PFNGLWEIGHTPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glWeightPathsNV")) == NULL) || r;
8338
8339 return r;
8340 }
8341
8342 #endif /* GL_NV_path_rendering */
8343
8344 #ifdef GL_NV_pixel_data_range
8345
8346 static GLboolean _glewInit_GL_NV_pixel_data_range (GLEW_CONTEXT_ARG_DEF_INIT)
8347 {
8348 GLboolean r = GL_FALSE;
8349
8350 r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r;
8351 r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r;
8352
8353 return r;
8354 }
8355
8356 #endif /* GL_NV_pixel_data_range */
8357
8358 #ifdef GL_NV_point_sprite
8359
8360 static GLboolean _glewInit_GL_NV_point_sprite (GLEW_CONTEXT_ARG_DEF_INIT)
8361 {
8362 GLboolean r = GL_FALSE;
8363
8364 r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r;
8365 r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r;
8366
8367 return r;
8368 }
8369
8370 #endif /* GL_NV_point_sprite */
8371
8372 #ifdef GL_NV_present_video
8373
8374 static GLboolean _glewInit_GL_NV_present_video (GLEW_CONTEXT_ARG_DEF_INIT)
8375 {
8376 GLboolean r = GL_FALSE;
8377
8378 r = ((glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoi64vNV")) == NULL) || r;
8379 r = ((glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoivNV")) == NULL) || r;
8380 r = ((glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoui64vNV")) == NULL) || r;
8381 r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideouivNV")) == NULL) || r;
8382 r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameDualFillNV")) == NULL) || r;
8383 r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameKeyedNV")) == NULL) || r;
8384
8385 return r;
8386 }
8387
8388 #endif /* GL_NV_present_video */
8389
8390 #ifdef GL_NV_primitive_restart
8391
8392 static GLboolean _glewInit_GL_NV_primitive_restart (GLEW_CONTEXT_ARG_DEF_INIT)
8393 {
8394 GLboolean r = GL_FALSE;
8395
8396 r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r;
8397 r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r;
8398
8399 return r;
8400 }
8401
8402 #endif /* GL_NV_primitive_restart */
8403
8404 #ifdef GL_NV_register_combiners
8405
8406 static GLboolean _glewInit_GL_NV_register_combiners (GLEW_CONTEXT_ARG_DEF_INIT)
8407 {
8408 GLboolean r = GL_FALSE;
8409
8410 r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r;
8411 r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r;
8412 r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r;
8413 r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r;
8414 r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r;
8415 r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r;
8416 r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r;
8417 r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r;
8418 r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r;
8419 r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r;
8420 r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r;
8421 r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r;
8422 r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r;
8423
8424 return r;
8425 }
8426
8427 #endif /* GL_NV_register_combiners */
8428
8429 #ifdef GL_NV_register_combiners2
8430
8431 static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT)
8432 {
8433 GLboolean r = GL_FALSE;
8434
8435 r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r;
8436 r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r;
8437
8438 return r;
8439 }
8440
8441 #endif /* GL_NV_register_combiners2 */
8442
8443 #ifdef GL_NV_sample_locations
8444
8445 static GLboolean _glewInit_GL_NV_sample_locations (GLEW_CONTEXT_ARG_DEF_INIT)
8446 {
8447 GLboolean r = GL_FALSE;
8448
8449 r = ((glFramebufferSampleLocationsfvNV = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvNV")) == NULL) || r;
8450 r = ((glNamedFramebufferSampleLocationsfvNV = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvNV")) == NULL) || r;
8451
8452 return r;
8453 }
8454
8455 #endif /* GL_NV_sample_locations */
8456
8457 #ifdef GL_NV_shader_buffer_load
8458
8459 static GLboolean _glewInit_GL_NV_shader_buffer_load (GLEW_CONTEXT_ARG_DEF_INIT)
8460 {
8461 GLboolean r = GL_FALSE;
8462
8463 r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterui64vNV")) == NULL) || r;
8464 r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64vNV")) == NULL) || r;
8465 r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterui64vNV")) == NULL) || r;
8466 r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsBufferResidentNV")) == NULL) || r;
8467 r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsNamedBufferResidentNV")) == NULL) || r;
8468 r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferNonResidentNV")) == NULL) || r;
8469 r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferResidentNV")) == NULL) || r;
8470 r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferNonResidentNV")) == NULL) || r;
8471 r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferResidentNV")) == NULL) || r;
8472 r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64NV")) == NULL) || r;
8473 r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64vNV")) == NULL) || r;
8474 r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64NV")) == NULL) || r;
8475 r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64vNV")) == NULL) || r;
8476
8477 return r;
8478 }
8479
8480 #endif /* GL_NV_shader_buffer_load */
8481
8482 #ifdef GL_NV_texture_barrier
8483
8484 static GLboolean _glewInit_GL_NV_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT)
8485 {
8486 GLboolean r = GL_FALSE;
8487
8488 r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrierNV")) == NULL) || r;
8489
8490 return r;
8491 }
8492
8493 #endif /* GL_NV_texture_barrier */
8494
8495 #ifdef GL_NV_texture_multisample
8496
8497 static GLboolean _glewInit_GL_NV_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
8498 {
8499 GLboolean r = GL_FALSE;
8500
8501 r = ((glTexImage2DMultisampleCoverageNV = (PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisampleCoverageNV")) == NULL) || r;
8502 r = ((glTexImage3DMultisampleCoverageNV = (PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisampleCoverageNV")) == NULL) || r;
8503 r = ((glTextureImage2DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleCoverageNV")) == NULL) || r;
8504 r = ((glTextureImage2DMultisampleNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleNV")) == NULL) || r;
8505 r = ((glTextureImage3DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleCoverageNV")) == NULL) || r;
8506 r = ((glTextureImage3DMultisampleNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleNV")) == NULL) || r;
8507
8508 return r;
8509 }
8510
8511 #endif /* GL_NV_texture_multisample */
8512
8513 #ifdef GL_NV_transform_feedback
8514
8515 static GLboolean _glewInit_GL_NV_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT)
8516 {
8517 GLboolean r = GL_FALSE;
8518
8519 r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glActiveVaryingNV")) == NULL) || r;
8520 r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackNV")) == NULL) || r;
8521 r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseNV")) == NULL) || r;
8522 r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetNV")) == NULL) || r;
8523 r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeNV")) == NULL) || r;
8524 r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackNV")) == NULL) || r;
8525 r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveVaryingNV")) == NULL) || r;
8526 r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingNV")) == NULL) || r;
8527 r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)"glGetVaryingLocationNV")) == NULL) || r;
8528 r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackAttribsNV")) == NULL) || r;
8529 r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsNV")) == NULL) || r;
8530
8531 return r;
8532 }
8533
8534 #endif /* GL_NV_transform_feedback */
8535
8536 #ifdef GL_NV_transform_feedback2
8537
8538 static GLboolean _glewInit_GL_NV_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT)
8539 {
8540 GLboolean r = GL_FALSE;
8541
8542 r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedbackNV")) == NULL) || r;
8543 r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacksNV")) == NULL) || r;
8544 r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackNV")) == NULL) || r;
8545 r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacksNV")) == NULL) || r;
8546 r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedbackNV")) == NULL) || r;
8547 r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedbackNV")) == NULL) || r;
8548 r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedbackNV")) == NULL) || r;
8549
8550 return r;
8551 }
8552
8553 #endif /* GL_NV_transform_feedback2 */
8554
8555 #ifdef GL_NV_vdpau_interop
8556
8557 static GLboolean _glewInit_GL_NV_vdpau_interop (GLEW_CONTEXT_ARG_DEF_INIT)
8558 {
8559 GLboolean r = GL_FALSE;
8560
8561 r = ((glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUFiniNV")) == NULL) || r;
8562 r = ((glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUGetSurfaceivNV")) == NULL) || r;
8563 r = ((glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUInitNV")) == NULL) || r;
8564 r = ((glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUIsSurfaceNV")) == NULL) || r;
8565 r = ((glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUMapSurfacesNV")) == NULL) || r;
8566 r = ((glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterOutputSurfaceNV")) == NULL) || r;
8567 r = ((glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceNV")) == NULL) || r;
8568 r = ((glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUSurfaceAccessNV")) == NULL) || r;
8569 r = ((glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnmapSurfacesNV")) == NULL) || r;
8570 r = ((glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnregisterSurfaceNV")) == NULL) || r;
8571
8572 return r;
8573 }
8574
8575 #endif /* GL_NV_vdpau_interop */
8576
8577 #ifdef GL_NV_vertex_array_range
8578
8579 static GLboolean _glewInit_GL_NV_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT)
8580 {
8581 GLboolean r = GL_FALSE;
8582
8583 r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r;
8584 r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r;
8585
8586 return r;
8587 }
8588
8589 #endif /* GL_NV_vertex_array_range */
8590
8591 #ifdef GL_NV_vertex_attrib_integer_64bit
8592
8593 static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit (GLEW_CONTEXT_ARG_DEF_INIT)
8594 {
8595 GLboolean r = GL_FALSE;
8596
8597 r = ((glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLi64vNV")) == NULL) || r;
8598 r = ((glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vNV")) == NULL) || r;
8599 r = ((glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64NV")) == NULL) || r;
8600 r = ((glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64vNV")) == NULL) || r;
8601 r = ((glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64NV")) == NULL) || r;
8602 r = ((glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vNV")) == NULL) || r;
8603 r = ((glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64NV")) == NULL) || r;
8604 r = ((glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64vNV")) == NULL) || r;
8605 r = ((glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64NV")) == NULL) || r;
8606 r = ((glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64vNV")) == NULL) || r;
8607 r = ((glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64NV")) == NULL) || r;
8608 r = ((glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64vNV")) == NULL) || r;
8609 r = ((glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64NV")) == NULL) || r;
8610 r = ((glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64vNV")) == NULL) || r;
8611 r = ((glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64NV")) == NULL) || r;
8612 r = ((glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64vNV")) == NULL) || r;
8613 r = ((glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64NV")) == NULL) || r;
8614 r = ((glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64vNV")) == NULL) || r;
8615 r = ((glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormatNV")) == NULL) || r;
8616
8617 return r;
8618 }
8619
8620 #endif /* GL_NV_vertex_attrib_integer_64bit */
8621
8622 #ifdef GL_NV_vertex_buffer_unified_memory
8623
8624 static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (GLEW_CONTEXT_ARG_DEF_INIT)
8625 {
8626 GLboolean r = GL_FALSE;
8627
8628 r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBufferAddressRangeNV")) == NULL) || r;
8629 r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glColorFormatNV")) == NULL) || r;
8630 r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagFormatNV")) == NULL) || r;
8631 r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordFormatNV")) == NULL) || r;
8632 r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64i_vNV")) == NULL) || r;
8633 r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glIndexFormatNV")) == NULL) || r;
8634 r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glNormalFormatNV")) == NULL) || r;
8635 r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorFormatNV")) == NULL) || r;
8636 r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordFormatNV")) == NULL) || r;
8637 r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormatNV")) == NULL) || r;
8638 r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormatNV")) == NULL) || r;
8639 r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexFormatNV")) == NULL) || r;
8640
8641 return r;
8642 }
8643
8644 #endif /* GL_NV_vertex_buffer_unified_memory */
8645
8646 #ifdef GL_NV_vertex_program
8647
8648 static GLboolean _glewInit_GL_NV_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT)
8649 {
8650 GLboolean r = GL_FALSE;
8651
8652 r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r;
8653 r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r;
8654 r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r;
8655 r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r;
8656 r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r;
8657 r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r;
8658 r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r;
8659 r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r;
8660 r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r;
8661 r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r;
8662 r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r;
8663 r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r;
8664 r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r;
8665 r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r;
8666 r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r;
8667 r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r;
8668 r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r;
8669 r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r;
8670 r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r;
8671 r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r;
8672 r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r;
8673 r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r;
8674 r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r;
8675 r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r;
8676 r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r;
8677 r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r;
8678 r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r;
8679 r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r;
8680 r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r;
8681 r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r;
8682 r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r;
8683 r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r;
8684 r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r;
8685 r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r;
8686 r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r;
8687 r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r;
8688 r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r;
8689 r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r;
8690 r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r;
8691 r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r;
8692 r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r;
8693 r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r;
8694 r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r;
8695 r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r;
8696 r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r;
8697 r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r;
8698 r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r;
8699 r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r;
8700 r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r;
8701 r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r;
8702 r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r;
8703 r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r;
8704 r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r;
8705 r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r;
8706 r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r;
8707 r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r;
8708 r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r;
8709 r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r;
8710 r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r;
8711 r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r;
8712 r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r;
8713 r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r;
8714 r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r;
8715 r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r;
8716
8717 return r;
8718 }
8719
8720 #endif /* GL_NV_vertex_program */
8721
8722 #ifdef GL_NV_video_capture
8723
8724 static GLboolean _glewInit_GL_NV_video_capture (GLEW_CONTEXT_ARG_DEF_INIT)
8725 {
8726 GLboolean r = GL_FALSE;
8727
8728 r = ((glBeginVideoCaptureNV = (PFNGLBEGINVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glBeginVideoCaptureNV")) == NULL) || r;
8729 r = ((glBindVideoCaptureStreamBufferNV = (PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamBufferNV")) == NULL) || r;
8730 r = ((glBindVideoCaptureStreamTextureNV = (PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamTextureNV")) == NULL) || r;
8731 r = ((glEndVideoCaptureNV = (PFNGLENDVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glEndVideoCaptureNV")) == NULL) || r;
8732 r = ((glGetVideoCaptureStreamdvNV = (PFNGLGETVIDEOCAPTURESTREAMDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamdvNV")) == NULL) || r;
8733 r = ((glGetVideoCaptureStreamfvNV = (PFNGLGETVIDEOCAPTURESTREAMFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamfvNV")) == NULL) || r;
8734 r = ((glGetVideoCaptureStreamivNV = (PFNGLGETVIDEOCAPTURESTREAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamivNV")) == NULL) || r;
8735 r = ((glGetVideoCaptureivNV = (PFNGLGETVIDEOCAPTUREIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureivNV")) == NULL) || r;
8736 r = ((glVideoCaptureNV = (PFNGLVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureNV")) == NULL) || r;
8737 r = ((glVideoCaptureStreamParameterdvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterdvNV")) == NULL) || r;
8738 r = ((glVideoCaptureStreamParameterfvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterfvNV")) == NULL) || r;
8739 r = ((glVideoCaptureStreamParameterivNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterivNV")) == NULL) || r;
8740
8741 return r;
8742 }
8743
8744 #endif /* GL_NV_video_capture */
8745
8746 #ifdef GL_OES_single_precision
8747
8748 static GLboolean _glewInit_GL_OES_single_precision (GLEW_CONTEXT_ARG_DEF_INIT)
8749 {
8750 GLboolean r = GL_FALSE;
8751
8752 r = ((glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glewGetProcAddress((const GLubyte*)"glClearDepthfOES")) == NULL) || r;
8753 r = ((glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glClipPlanefOES")) == NULL) || r;
8754 r = ((glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glewGetProcAddress((const GLubyte*)"glDepthRangefOES")) == NULL) || r;
8755 r = ((glFrustumfOES = (PFNGLFRUSTUMFOESPROC)glewGetProcAddress((const GLubyte*)"glFrustumfOES")) == NULL) || r;
8756 r = ((glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanefOES")) == NULL) || r;
8757 r = ((glOrthofOES = (PFNGLORTHOFOESPROC)glewGetProcAddress((const GLubyte*)"glOrthofOES")) == NULL) || r;
8758
8759 return r;
8760 }
8761
8762 #endif /* GL_OES_single_precision */
8763
8764 #ifdef GL_OVR_multiview
8765
8766 static GLboolean _glewInit_GL_OVR_multiview (GLEW_CONTEXT_ARG_DEF_INIT)
8767 {
8768 GLboolean r = GL_FALSE;
8769
8770 r = ((glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultiviewOVR")) == NULL) || r;
8771
8772 return r;
8773 }
8774
8775 #endif /* GL_OVR_multiview */
8776
8777 #ifdef GL_REGAL_ES1_0_compatibility
8778
8779 static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility (GLEW_CONTEXT_ARG_DEF_INIT)
8780 {
8781 GLboolean r = GL_FALSE;
8782
8783 r = ((glAlphaFuncx = (PFNGLALPHAFUNCXPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncx")) == NULL) || r;
8784 r = ((glClearColorx = (PFNGLCLEARCOLORXPROC)glewGetProcAddress((const GLubyte*)"glClearColorx")) == NULL) || r;
8785 r = ((glClearDepthx = (PFNGLCLEARDEPTHXPROC)glewGetProcAddress((const GLubyte*)"glClearDepthx")) == NULL) || r;
8786 r = ((glColor4x = (PFNGLCOLOR4XPROC)glewGetProcAddress((const GLubyte*)"glColor4x")) == NULL) || r;
8787 r = ((glDepthRangex = (PFNGLDEPTHRANGEXPROC)glewGetProcAddress((const GLubyte*)"glDepthRangex")) == NULL) || r;
8788 r = ((glFogx = (PFNGLFOGXPROC)glewGetProcAddress((const GLubyte*)"glFogx")) == NULL) || r;
8789 r = ((glFogxv = (PFNGLFOGXVPROC)glewGetProcAddress((const GLubyte*)"glFogxv")) == NULL) || r;
8790 r = ((glFrustumf = (PFNGLFRUSTUMFPROC)glewGetProcAddress((const GLubyte*)"glFrustumf")) == NULL) || r;
8791 r = ((glFrustumx = (PFNGLFRUSTUMXPROC)glewGetProcAddress((const GLubyte*)"glFrustumx")) == NULL) || r;
8792 r = ((glLightModelx = (PFNGLLIGHTMODELXPROC)glewGetProcAddress((const GLubyte*)"glLightModelx")) == NULL) || r;
8793 r = ((glLightModelxv = (PFNGLLIGHTMODELXVPROC)glewGetProcAddress((const GLubyte*)"glLightModelxv")) == NULL) || r;
8794 r = ((glLightx = (PFNGLLIGHTXPROC)glewGetProcAddress((const GLubyte*)"glLightx")) == NULL) || r;
8795 r = ((glLightxv = (PFNGLLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glLightxv")) == NULL) || r;
8796 r = ((glLineWidthx = (PFNGLLINEWIDTHXPROC)glewGetProcAddress((const GLubyte*)"glLineWidthx")) == NULL) || r;
8797 r = ((glLoadMatrixx = (PFNGLLOADMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glLoadMatrixx")) == NULL) || r;
8798 r = ((glMaterialx = (PFNGLMATERIALXPROC)glewGetProcAddress((const GLubyte*)"glMaterialx")) == NULL) || r;
8799 r = ((glMaterialxv = (PFNGLMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glMaterialxv")) == NULL) || r;
8800 r = ((glMultMatrixx = (PFNGLMULTMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glMultMatrixx")) == NULL) || r;
8801 r = ((glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4x")) == NULL) || r;
8802 r = ((glNormal3x = (PFNGLNORMAL3XPROC)glewGetProcAddress((const GLubyte*)"glNormal3x")) == NULL) || r;
8803 r = ((glOrthof = (PFNGLORTHOFPROC)glewGetProcAddress((const GLubyte*)"glOrthof")) == NULL) || r;
8804 r = ((glOrthox = (PFNGLORTHOXPROC)glewGetProcAddress((const GLubyte*)"glOrthox")) == NULL) || r;
8805 r = ((glPointSizex = (PFNGLPOINTSIZEXPROC)glewGetProcAddress((const GLubyte*)"glPointSizex")) == NULL) || r;
8806 r = ((glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetx")) == NULL) || r;
8807 r = ((glRotatex = (PFNGLROTATEXPROC)glewGetProcAddress((const GLubyte*)"glRotatex")) == NULL) || r;
8808 r = ((glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC)glewGetProcAddress((const GLubyte*)"glSampleCoveragex")) == NULL) || r;
8809 r = ((glScalex = (PFNGLSCALEXPROC)glewGetProcAddress((const GLubyte*)"glScalex")) == NULL) || r;
8810 r = ((glTexEnvx = (PFNGLTEXENVXPROC)glewGetProcAddress((const GLubyte*)"glTexEnvx")) == NULL) || r;
8811 r = ((glTexEnvxv = (PFNGLTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glTexEnvxv")) == NULL) || r;
8812 r = ((glTexParameterx = (PFNGLTEXPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glTexParameterx")) == NULL) || r;
8813 r = ((glTranslatex = (PFNGLTRANSLATEXPROC)glewGetProcAddress((const GLubyte*)"glTranslatex")) == NULL) || r;
8814
8815 return r;
8816 }
8817
8818 #endif /* GL_REGAL_ES1_0_compatibility */
8819
8820 #ifdef GL_REGAL_ES1_1_compatibility
8821
8822 static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility (GLEW_CONTEXT_ARG_DEF_INIT)
8823 {
8824 GLboolean r = GL_FALSE;
8825
8826 r = ((glClipPlanef = (PFNGLCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glClipPlanef")) == NULL) || r;
8827 r = ((glClipPlanex = (PFNGLCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glClipPlanex")) == NULL) || r;
8828 r = ((glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanef")) == NULL) || r;
8829 r = ((glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanex")) == NULL) || r;
8830 r = ((glGetFixedv = (PFNGLGETFIXEDVPROC)glewGetProcAddress((const GLubyte*)"glGetFixedv")) == NULL) || r;
8831 r = ((glGetLightxv = (PFNGLGETLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glGetLightxv")) == NULL) || r;
8832 r = ((glGetMaterialxv = (PFNGLGETMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glGetMaterialxv")) == NULL) || r;
8833 r = ((glGetTexEnvxv = (PFNGLGETTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexEnvxv")) == NULL) || r;
8834 r = ((glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterxv")) == NULL) || r;
8835 r = ((glPointParameterx = (PFNGLPOINTPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glPointParameterx")) == NULL) || r;
8836 r = ((glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterxv")) == NULL) || r;
8837 r = ((glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glPointSizePointerOES")) == NULL) || r;
8838 r = ((glTexParameterxv = (PFNGLTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterxv")) == NULL) || r;
8839
8840 return r;
8841 }
8842
8843 #endif /* GL_REGAL_ES1_1_compatibility */
8844
8845 #ifdef GL_REGAL_error_string
8846
8847 static GLboolean _glewInit_GL_REGAL_error_string (GLEW_CONTEXT_ARG_DEF_INIT)
8848 {
8849 GLboolean r = GL_FALSE;
8850
8851 r = ((glErrorStringREGAL = (PFNGLERRORSTRINGREGALPROC)glewGetProcAddress((const GLubyte*)"glErrorStringREGAL")) == NULL) || r;
8852
8853 return r;
8854 }
8855
8856 #endif /* GL_REGAL_error_string */
8857
8858 #ifdef GL_REGAL_extension_query
8859
8860 static GLboolean _glewInit_GL_REGAL_extension_query (GLEW_CONTEXT_ARG_DEF_INIT)
8861 {
8862 GLboolean r = GL_FALSE;
8863
8864 r = ((glGetExtensionREGAL = (PFNGLGETEXTENSIONREGALPROC)glewGetProcAddress((const GLubyte*)"glGetExtensionREGAL")) == NULL) || r;
8865 r = ((glIsSupportedREGAL = (PFNGLISSUPPORTEDREGALPROC)glewGetProcAddress((const GLubyte*)"glIsSupportedREGAL")) == NULL) || r;
8866
8867 return r;
8868 }
8869
8870 #endif /* GL_REGAL_extension_query */
8871
8872 #ifdef GL_REGAL_log
8873
8874 static GLboolean _glewInit_GL_REGAL_log (GLEW_CONTEXT_ARG_DEF_INIT)
8875 {
8876 GLboolean r = GL_FALSE;
8877
8878 r = ((glLogMessageCallbackREGAL = (PFNGLLOGMESSAGECALLBACKREGALPROC)glewGetProcAddress((const GLubyte*)"glLogMessageCallbackREGAL")) == NULL) || r;
8879
8880 return r;
8881 }
8882
8883 #endif /* GL_REGAL_log */
8884
8885 #ifdef GL_REGAL_proc_address
8886
8887 static GLboolean _glewInit_GL_REGAL_proc_address (GLEW_CONTEXT_ARG_DEF_INIT)
8888 {
8889 GLboolean r = GL_FALSE;
8890
8891 r = ((glGetProcAddressREGAL = (PFNGLGETPROCADDRESSREGALPROC)glewGetProcAddress((const GLubyte*)"glGetProcAddressREGAL")) == NULL) || r;
8892
8893 return r;
8894 }
8895
8896 #endif /* GL_REGAL_proc_address */
8897
8898 #ifdef GL_SGIS_detail_texture
8899
8900 static GLboolean _glewInit_GL_SGIS_detail_texture (GLEW_CONTEXT_ARG_DEF_INIT)
8901 {
8902 GLboolean r = GL_FALSE;
8903
8904 r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r;
8905 r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r;
8906
8907 return r;
8908 }
8909
8910 #endif /* GL_SGIS_detail_texture */
8911
8912 #ifdef GL_SGIS_fog_function
8913
8914 static GLboolean _glewInit_GL_SGIS_fog_function (GLEW_CONTEXT_ARG_DEF_INIT)
8915 {
8916 GLboolean r = GL_FALSE;
8917
8918 r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r;
8919 r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r;
8920
8921 return r;
8922 }
8923
8924 #endif /* GL_SGIS_fog_function */
8925
8926 #ifdef GL_SGIS_multisample
8927
8928 static GLboolean _glewInit_GL_SGIS_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
8929 {
8930 GLboolean r = GL_FALSE;
8931
8932 r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r;
8933 r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r;
8934
8935 return r;
8936 }
8937
8938 #endif /* GL_SGIS_multisample */
8939
8940 #ifdef GL_SGIS_sharpen_texture
8941
8942 static GLboolean _glewInit_GL_SGIS_sharpen_texture (GLEW_CONTEXT_ARG_DEF_INIT)
8943 {
8944 GLboolean r = GL_FALSE;
8945
8946 r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r;
8947 r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r;
8948
8949 return r;
8950 }
8951
8952 #endif /* GL_SGIS_sharpen_texture */
8953
8954 #ifdef GL_SGIS_texture4D
8955
8956 static GLboolean _glewInit_GL_SGIS_texture4D (GLEW_CONTEXT_ARG_DEF_INIT)
8957 {
8958 GLboolean r = GL_FALSE;
8959
8960 r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r;
8961 r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r;
8962
8963 return r;
8964 }
8965
8966 #endif /* GL_SGIS_texture4D */
8967
8968 #ifdef GL_SGIS_texture_filter4
8969
8970 static GLboolean _glewInit_GL_SGIS_texture_filter4 (GLEW_CONTEXT_ARG_DEF_INIT)
8971 {
8972 GLboolean r = GL_FALSE;
8973
8974 r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r;
8975 r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r;
8976
8977 return r;
8978 }
8979
8980 #endif /* GL_SGIS_texture_filter4 */
8981
8982 #ifdef GL_SGIX_async
8983
8984 static GLboolean _glewInit_GL_SGIX_async (GLEW_CONTEXT_ARG_DEF_INIT)
8985 {
8986 GLboolean r = GL_FALSE;
8987
8988 r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r;
8989 r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r;
8990 r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r;
8991 r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r;
8992 r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r;
8993 r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r;
8994
8995 return r;
8996 }
8997
8998 #endif /* GL_SGIX_async */
8999
9000 #ifdef GL_SGIX_flush_raster
9001
9002 static GLboolean _glewInit_GL_SGIX_flush_raster (GLEW_CONTEXT_ARG_DEF_INIT)
9003 {
9004 GLboolean r = GL_FALSE;
9005
9006 r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r;
9007
9008 return r;
9009 }
9010
9011 #endif /* GL_SGIX_flush_raster */
9012
9013 #ifdef GL_SGIX_fog_texture
9014
9015 static GLboolean _glewInit_GL_SGIX_fog_texture (GLEW_CONTEXT_ARG_DEF_INIT)
9016 {
9017 GLboolean r = GL_FALSE;
9018
9019 r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r;
9020
9021 return r;
9022 }
9023
9024 #endif /* GL_SGIX_fog_texture */
9025
9026 #ifdef GL_SGIX_fragment_specular_lighting
9027
9028 static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (GLEW_CONTEXT_ARG_DEF_INIT)
9029 {
9030 GLboolean r = GL_FALSE;
9031
9032 r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r;
9033 r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r;
9034 r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r;
9035 r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r;
9036 r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r;
9037 r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r;
9038 r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r;
9039 r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r;
9040 r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r;
9041 r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r;
9042 r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r;
9043 r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r;
9044 r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r;
9045 r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r;
9046 r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r;
9047 r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r;
9048 r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r;
9049
9050 return r;
9051 }
9052
9053 #endif /* GL_SGIX_fragment_specular_lighting */
9054
9055 #ifdef GL_SGIX_framezoom
9056
9057 static GLboolean _glewInit_GL_SGIX_framezoom (GLEW_CONTEXT_ARG_DEF_INIT)
9058 {
9059 GLboolean r = GL_FALSE;
9060
9061 r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r;
9062
9063 return r;
9064 }
9065
9066 #endif /* GL_SGIX_framezoom */
9067
9068 #ifdef GL_SGIX_pixel_texture
9069
9070 static GLboolean _glewInit_GL_SGIX_pixel_texture (GLEW_CONTEXT_ARG_DEF_INIT)
9071 {
9072 GLboolean r = GL_FALSE;
9073
9074 r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r;
9075
9076 return r;
9077 }
9078
9079 #endif /* GL_SGIX_pixel_texture */
9080
9081 #ifdef GL_SGIX_reference_plane
9082
9083 static GLboolean _glewInit_GL_SGIX_reference_plane (GLEW_CONTEXT_ARG_DEF_INIT)
9084 {
9085 GLboolean r = GL_FALSE;
9086
9087 r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r;
9088
9089 return r;
9090 }
9091
9092 #endif /* GL_SGIX_reference_plane */
9093
9094 #ifdef GL_SGIX_sprite
9095
9096 static GLboolean _glewInit_GL_SGIX_sprite (GLEW_CONTEXT_ARG_DEF_INIT)
9097 {
9098 GLboolean r = GL_FALSE;
9099
9100 r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r;
9101 r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r;
9102 r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r;
9103 r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r;
9104
9105 return r;
9106 }
9107
9108 #endif /* GL_SGIX_sprite */
9109
9110 #ifdef GL_SGIX_tag_sample_buffer
9111
9112 static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (GLEW_CONTEXT_ARG_DEF_INIT)
9113 {
9114 GLboolean r = GL_FALSE;
9115
9116 r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r;
9117
9118 return r;
9119 }
9120
9121 #endif /* GL_SGIX_tag_sample_buffer */
9122
9123 #ifdef GL_SGI_color_table
9124
9125 static GLboolean _glewInit_GL_SGI_color_table (GLEW_CONTEXT_ARG_DEF_INIT)
9126 {
9127 GLboolean r = GL_FALSE;
9128
9129 r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r;
9130 r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r;
9131 r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r;
9132 r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r;
9133 r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r;
9134 r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r;
9135 r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r;
9136
9137 return r;
9138 }
9139
9140 #endif /* GL_SGI_color_table */
9141
9142 #ifdef GL_SUNX_constant_data
9143
9144 static GLboolean _glewInit_GL_SUNX_constant_data (GLEW_CONTEXT_ARG_DEF_INIT)
9145 {
9146 GLboolean r = GL_FALSE;
9147
9148 r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r;
9149
9150 return r;
9151 }
9152
9153 #endif /* GL_SUNX_constant_data */
9154
9155 #ifdef GL_SUN_global_alpha
9156
9157 static GLboolean _glewInit_GL_SUN_global_alpha (GLEW_CONTEXT_ARG_DEF_INIT)
9158 {
9159 GLboolean r = GL_FALSE;
9160
9161 r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r;
9162 r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r;
9163 r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r;
9164 r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r;
9165 r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r;
9166 r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r;
9167 r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r;
9168 r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r;
9169
9170 return r;
9171 }
9172
9173 #endif /* GL_SUN_global_alpha */
9174
9175 #ifdef GL_SUN_read_video_pixels
9176
9177 static GLboolean _glewInit_GL_SUN_read_video_pixels (GLEW_CONTEXT_ARG_DEF_INIT)
9178 {
9179 GLboolean r = GL_FALSE;
9180
9181 r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r;
9182
9183 return r;
9184 }
9185
9186 #endif /* GL_SUN_read_video_pixels */
9187
9188 #ifdef GL_SUN_triangle_list
9189
9190 static GLboolean _glewInit_GL_SUN_triangle_list (GLEW_CONTEXT_ARG_DEF_INIT)
9191 {
9192 GLboolean r = GL_FALSE;
9193
9194 r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r;
9195 r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r;
9196 r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r;
9197 r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r;
9198 r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r;
9199 r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r;
9200 r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r;
9201
9202 return r;
9203 }
9204
9205 #endif /* GL_SUN_triangle_list */
9206
9207 #ifdef GL_SUN_vertex
9208
9209 static GLboolean _glewInit_GL_SUN_vertex (GLEW_CONTEXT_ARG_DEF_INIT)
9210 {
9211 GLboolean r = GL_FALSE;
9212
9213 r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r;
9214 r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r;
9215 r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r;
9216 r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r;
9217 r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r;
9218 r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r;
9219 r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r;
9220 r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r;
9221 r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r;
9222 r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r;
9223 r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r;
9224 r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r;
9225 r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r;
9226 r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r;
9227 r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r;
9228 r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r;
9229 r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r;
9230 r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r;
9231 r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r;
9232 r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r;
9233 r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r;
9234 r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r;
9235 r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r;
9236 r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r;
9237 r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r;
9238 r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r;
9239 r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r;
9240 r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r;
9241 r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r;
9242 r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r;
9243 r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r;
9244 r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r;
9245 r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r;
9246 r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r;
9247 r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r;
9248 r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r;
9249 r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r;
9250 r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r;
9251 r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r;
9252 r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r;
9253
9254 return r;
9255 }
9256
9257 #endif /* GL_SUN_vertex */
9258
9259 #ifdef GL_WIN_swap_hint
9260
9261 static GLboolean _glewInit_GL_WIN_swap_hint (GLEW_CONTEXT_ARG_DEF_INIT)
9262 {
9263 GLboolean r = GL_FALSE;
9264
9265 r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r;
9266
9267 return r;
9268 }
9269
9270 #endif /* GL_WIN_swap_hint */
9271
9272 /* ------------------------------------------------------------------------- */
9273
9274 GLboolean GLEWAPIENTRY glewGetExtension (const char* name)
9275 {
9276 const GLubyte* start;
9277 const GLubyte* end;
9278 start = (const GLubyte*)glGetString(GL_EXTENSIONS);
9279 if (start == 0)
9280 return GL_FALSE;
9281 end = start + _glewStrLen(start);
9282 return _glewSearchExtension(name, start, end);
9283 }
9284
9285 /* ------------------------------------------------------------------------- */
9286
9287 #ifndef GLEW_MX
9288 static
9289 #endif
9290 GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
9291 {
9292 const GLubyte* s;
9293 GLuint dot;
9294 GLint major, minor;
9295 const GLubyte* extStart;
9296 const GLubyte* extEnd;
9297 /* query opengl version */
9298 s = glGetString(GL_VERSION);
9299 dot = _glewStrCLen(s, '.');
9300 if (dot == 0)
9301 return GLEW_ERROR_NO_GL_VERSION;
9302
9303 major = s[dot-1]-'0';
9304 minor = s[dot+1]-'0';
9305
9306 if (minor < 0 || minor > 9)
9307 minor = 0;
9308 if (major<0 || major>9)
9309 return GLEW_ERROR_NO_GL_VERSION;
9310
9311
9312 if (major == 1 && minor == 0)
9313 {
9314 return GLEW_ERROR_GL_VERSION_10_ONLY;
9315 }
9316 else
9317 {
9318 GLEW_VERSION_4_5 = ( major > 4 ) || ( major == 4 && minor >= 5 ) ? GL_TRUE : GL_FALSE;
9319 GLEW_VERSION_4_4 = GLEW_VERSION_4_5 == GL_TRUE || ( major == 4 && minor >= 4 ) ? GL_TRUE : GL_FALSE;
9320 GLEW_VERSION_4_3 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE;
9321 GLEW_VERSION_4_2 = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE;
9322 GLEW_VERSION_4_1 = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
9323 GLEW_VERSION_4_0 = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE;
9324 GLEW_VERSION_3_3 = GLEW_VERSION_4_0 == GL_TRUE || ( major == 3 && minor >= 3 ) ? GL_TRUE : GL_FALSE;
9325 GLEW_VERSION_3_2 = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE;
9326 GLEW_VERSION_3_1 = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
9327 GLEW_VERSION_3_0 = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE;
9328 GLEW_VERSION_2_1 = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
9329 GLEW_VERSION_2_0 = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE;
9330 GLEW_VERSION_1_5 = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE;
9331 GLEW_VERSION_1_4 = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE;
9332 GLEW_VERSION_1_3 = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE;
9333 GLEW_VERSION_1_2_1 = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE;
9334 GLEW_VERSION_1_2 = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE;
9335 GLEW_VERSION_1_1 = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
9336 }
9337
9338 /* query opengl extensions string */
9339 extStart = glGetString(GL_EXTENSIONS);
9340 if (extStart == 0)
9341 extStart = (const GLubyte*)"";
9342 extEnd = extStart + _glewStrLen(extStart);
9343
9344 /* initialize extensions */
9345 #ifdef GL_VERSION_1_2
9346 if (glewExperimental || GLEW_VERSION_1_2) GLEW_VERSION_1_2 = !_glewInit_GL_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT);
9347 #endif /* GL_VERSION_1_2 */
9348 #ifdef GL_VERSION_1_2_1
9349 #endif /* GL_VERSION_1_2_1 */
9350 #ifdef GL_VERSION_1_3
9351 if (glewExperimental || GLEW_VERSION_1_3) GLEW_VERSION_1_3 = !_glewInit_GL_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT);
9352 #endif /* GL_VERSION_1_3 */
9353 #ifdef GL_VERSION_1_4
9354 if (glewExperimental || GLEW_VERSION_1_4) GLEW_VERSION_1_4 = !_glewInit_GL_VERSION_1_4(GLEW_CONTEXT_ARG_VAR_INIT);
9355 #endif /* GL_VERSION_1_4 */
9356 #ifdef GL_VERSION_1_5
9357 if (glewExperimental || GLEW_VERSION_1_5) GLEW_VERSION_1_5 = !_glewInit_GL_VERSION_1_5(GLEW_CONTEXT_ARG_VAR_INIT);
9358 #endif /* GL_VERSION_1_5 */
9359 #ifdef GL_VERSION_2_0
9360 if (glewExperimental || GLEW_VERSION_2_0) GLEW_VERSION_2_0 = !_glewInit_GL_VERSION_2_0(GLEW_CONTEXT_ARG_VAR_INIT);
9361 #endif /* GL_VERSION_2_0 */
9362 #ifdef GL_VERSION_2_1
9363 if (glewExperimental || GLEW_VERSION_2_1) GLEW_VERSION_2_1 = !_glewInit_GL_VERSION_2_1(GLEW_CONTEXT_ARG_VAR_INIT);
9364 #endif /* GL_VERSION_2_1 */
9365 #ifdef GL_VERSION_3_0
9366 if (glewExperimental || GLEW_VERSION_3_0) GLEW_VERSION_3_0 = !_glewInit_GL_VERSION_3_0(GLEW_CONTEXT_ARG_VAR_INIT);
9367 #endif /* GL_VERSION_3_0 */
9368 #ifdef GL_VERSION_3_1
9369 if (glewExperimental || GLEW_VERSION_3_1) GLEW_VERSION_3_1 = !_glewInit_GL_VERSION_3_1(GLEW_CONTEXT_ARG_VAR_INIT);
9370 #endif /* GL_VERSION_3_1 */
9371 #ifdef GL_VERSION_3_2
9372 if (glewExperimental || GLEW_VERSION_3_2) GLEW_VERSION_3_2 = !_glewInit_GL_VERSION_3_2(GLEW_CONTEXT_ARG_VAR_INIT);
9373 #endif /* GL_VERSION_3_2 */
9374 #ifdef GL_VERSION_3_3
9375 if (glewExperimental || GLEW_VERSION_3_3) GLEW_VERSION_3_3 = !_glewInit_GL_VERSION_3_3(GLEW_CONTEXT_ARG_VAR_INIT);
9376 #endif /* GL_VERSION_3_3 */
9377 #ifdef GL_VERSION_4_0
9378 if (glewExperimental || GLEW_VERSION_4_0) GLEW_VERSION_4_0 = !_glewInit_GL_VERSION_4_0(GLEW_CONTEXT_ARG_VAR_INIT);
9379 #endif /* GL_VERSION_4_0 */
9380 #ifdef GL_VERSION_4_1
9381 #endif /* GL_VERSION_4_1 */
9382 #ifdef GL_VERSION_4_2
9383 #endif /* GL_VERSION_4_2 */
9384 #ifdef GL_VERSION_4_3
9385 #endif /* GL_VERSION_4_3 */
9386 #ifdef GL_VERSION_4_4
9387 #endif /* GL_VERSION_4_4 */
9388 #ifdef GL_VERSION_4_5
9389 if (glewExperimental || GLEW_VERSION_4_5) GLEW_VERSION_4_5 = !_glewInit_GL_VERSION_4_5(GLEW_CONTEXT_ARG_VAR_INIT);
9390 #endif /* GL_VERSION_4_5 */
9391 #ifdef GL_3DFX_multisample
9392 GLEW_3DFX_multisample = _glewSearchExtension("GL_3DFX_multisample", extStart, extEnd);
9393 #endif /* GL_3DFX_multisample */
9394 #ifdef GL_3DFX_tbuffer
9395 GLEW_3DFX_tbuffer = _glewSearchExtension("GL_3DFX_tbuffer", extStart, extEnd);
9396 if (glewExperimental || GLEW_3DFX_tbuffer) GLEW_3DFX_tbuffer = !_glewInit_GL_3DFX_tbuffer(GLEW_CONTEXT_ARG_VAR_INIT);
9397 #endif /* GL_3DFX_tbuffer */
9398 #ifdef GL_3DFX_texture_compression_FXT1
9399 GLEW_3DFX_texture_compression_FXT1 = _glewSearchExtension("GL_3DFX_texture_compression_FXT1", extStart, extEnd);
9400 #endif /* GL_3DFX_texture_compression_FXT1 */
9401 #ifdef GL_AMD_blend_minmax_factor
9402 GLEW_AMD_blend_minmax_factor = _glewSearchExtension("GL_AMD_blend_minmax_factor", extStart, extEnd);
9403 #endif /* GL_AMD_blend_minmax_factor */
9404 #ifdef GL_AMD_conservative_depth
9405 GLEW_AMD_conservative_depth = _glewSearchExtension("GL_AMD_conservative_depth", extStart, extEnd);
9406 #endif /* GL_AMD_conservative_depth */
9407 #ifdef GL_AMD_debug_output
9408 GLEW_AMD_debug_output = _glewSearchExtension("GL_AMD_debug_output", extStart, extEnd);
9409 if (glewExperimental || GLEW_AMD_debug_output) GLEW_AMD_debug_output = !_glewInit_GL_AMD_debug_output(GLEW_CONTEXT_ARG_VAR_INIT);
9410 #endif /* GL_AMD_debug_output */
9411 #ifdef GL_AMD_depth_clamp_separate
9412 GLEW_AMD_depth_clamp_separate = _glewSearchExtension("GL_AMD_depth_clamp_separate", extStart, extEnd);
9413 #endif /* GL_AMD_depth_clamp_separate */
9414 #ifdef GL_AMD_draw_buffers_blend
9415 GLEW_AMD_draw_buffers_blend = _glewSearchExtension("GL_AMD_draw_buffers_blend", extStart, extEnd);
9416 if (glewExperimental || GLEW_AMD_draw_buffers_blend) GLEW_AMD_draw_buffers_blend = !_glewInit_GL_AMD_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT);
9417 #endif /* GL_AMD_draw_buffers_blend */
9418 #ifdef GL_AMD_gcn_shader
9419 GLEW_AMD_gcn_shader = _glewSearchExtension("GL_AMD_gcn_shader", extStart, extEnd);
9420 #endif /* GL_AMD_gcn_shader */
9421 #ifdef GL_AMD_gpu_shader_int64
9422 GLEW_AMD_gpu_shader_int64 = _glewSearchExtension("GL_AMD_gpu_shader_int64", extStart, extEnd);
9423 #endif /* GL_AMD_gpu_shader_int64 */
9424 #ifdef GL_AMD_interleaved_elements
9425 GLEW_AMD_interleaved_elements = _glewSearchExtension("GL_AMD_interleaved_elements", extStart, extEnd);
9426 if (glewExperimental || GLEW_AMD_interleaved_elements) GLEW_AMD_interleaved_elements = !_glewInit_GL_AMD_interleaved_elements(GLEW_CONTEXT_ARG_VAR_INIT);
9427 #endif /* GL_AMD_interleaved_elements */
9428 #ifdef GL_AMD_multi_draw_indirect
9429 GLEW_AMD_multi_draw_indirect = _glewSearchExtension("GL_AMD_multi_draw_indirect", extStart, extEnd);
9430 if (glewExperimental || GLEW_AMD_multi_draw_indirect) GLEW_AMD_multi_draw_indirect = !_glewInit_GL_AMD_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT);
9431 #endif /* GL_AMD_multi_draw_indirect */
9432 #ifdef GL_AMD_name_gen_delete
9433 GLEW_AMD_name_gen_delete = _glewSearchExtension("GL_AMD_name_gen_delete", extStart, extEnd);
9434 if (glewExperimental || GLEW_AMD_name_gen_delete) GLEW_AMD_name_gen_delete = !_glewInit_GL_AMD_name_gen_delete(GLEW_CONTEXT_ARG_VAR_INIT);
9435 #endif /* GL_AMD_name_gen_delete */
9436 #ifdef GL_AMD_occlusion_query_event
9437 GLEW_AMD_occlusion_query_event = _glewSearchExtension("GL_AMD_occlusion_query_event", extStart, extEnd);
9438 if (glewExperimental || GLEW_AMD_occlusion_query_event) GLEW_AMD_occlusion_query_event = !_glewInit_GL_AMD_occlusion_query_event(GLEW_CONTEXT_ARG_VAR_INIT);
9439 #endif /* GL_AMD_occlusion_query_event */
9440 #ifdef GL_AMD_performance_monitor
9441 GLEW_AMD_performance_monitor = _glewSearchExtension("GL_AMD_performance_monitor", extStart, extEnd);
9442 if (glewExperimental || GLEW_AMD_performance_monitor) GLEW_AMD_performance_monitor = !_glewInit_GL_AMD_performance_monitor(GLEW_CONTEXT_ARG_VAR_INIT);
9443 #endif /* GL_AMD_performance_monitor */
9444 #ifdef GL_AMD_pinned_memory
9445 GLEW_AMD_pinned_memory = _glewSearchExtension("GL_AMD_pinned_memory", extStart, extEnd);
9446 #endif /* GL_AMD_pinned_memory */
9447 #ifdef GL_AMD_query_buffer_object
9448 GLEW_AMD_query_buffer_object = _glewSearchExtension("GL_AMD_query_buffer_object", extStart, extEnd);
9449 #endif /* GL_AMD_query_buffer_object */
9450 #ifdef GL_AMD_sample_positions
9451 GLEW_AMD_sample_positions = _glewSearchExtension("GL_AMD_sample_positions", extStart, extEnd);
9452 if (glewExperimental || GLEW_AMD_sample_positions) GLEW_AMD_sample_positions = !_glewInit_GL_AMD_sample_positions(GLEW_CONTEXT_ARG_VAR_INIT);
9453 #endif /* GL_AMD_sample_positions */
9454 #ifdef GL_AMD_seamless_cubemap_per_texture
9455 GLEW_AMD_seamless_cubemap_per_texture = _glewSearchExtension("GL_AMD_seamless_cubemap_per_texture", extStart, extEnd);
9456 #endif /* GL_AMD_seamless_cubemap_per_texture */
9457 #ifdef GL_AMD_shader_atomic_counter_ops
9458 GLEW_AMD_shader_atomic_counter_ops = _glewSearchExtension("GL_AMD_shader_atomic_counter_ops", extStart, extEnd);
9459 #endif /* GL_AMD_shader_atomic_counter_ops */
9460 #ifdef GL_AMD_shader_stencil_export
9461 GLEW_AMD_shader_stencil_export = _glewSearchExtension("GL_AMD_shader_stencil_export", extStart, extEnd);
9462 #endif /* GL_AMD_shader_stencil_export */
9463 #ifdef GL_AMD_shader_stencil_value_export
9464 GLEW_AMD_shader_stencil_value_export = _glewSearchExtension("GL_AMD_shader_stencil_value_export", extStart, extEnd);
9465 #endif /* GL_AMD_shader_stencil_value_export */
9466 #ifdef GL_AMD_shader_trinary_minmax
9467 GLEW_AMD_shader_trinary_minmax = _glewSearchExtension("GL_AMD_shader_trinary_minmax", extStart, extEnd);
9468 #endif /* GL_AMD_shader_trinary_minmax */
9469 #ifdef GL_AMD_sparse_texture
9470 GLEW_AMD_sparse_texture = _glewSearchExtension("GL_AMD_sparse_texture", extStart, extEnd);
9471 if (glewExperimental || GLEW_AMD_sparse_texture) GLEW_AMD_sparse_texture = !_glewInit_GL_AMD_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT);
9472 #endif /* GL_AMD_sparse_texture */
9473 #ifdef GL_AMD_stencil_operation_extended
9474 GLEW_AMD_stencil_operation_extended = _glewSearchExtension("GL_AMD_stencil_operation_extended", extStart, extEnd);
9475 if (glewExperimental || GLEW_AMD_stencil_operation_extended) GLEW_AMD_stencil_operation_extended = !_glewInit_GL_AMD_stencil_operation_extended(GLEW_CONTEXT_ARG_VAR_INIT);
9476 #endif /* GL_AMD_stencil_operation_extended */
9477 #ifdef GL_AMD_texture_texture4
9478 GLEW_AMD_texture_texture4 = _glewSearchExtension("GL_AMD_texture_texture4", extStart, extEnd);
9479 #endif /* GL_AMD_texture_texture4 */
9480 #ifdef GL_AMD_transform_feedback3_lines_triangles
9481 GLEW_AMD_transform_feedback3_lines_triangles = _glewSearchExtension("GL_AMD_transform_feedback3_lines_triangles", extStart, extEnd);
9482 #endif /* GL_AMD_transform_feedback3_lines_triangles */
9483 #ifdef GL_AMD_transform_feedback4
9484 GLEW_AMD_transform_feedback4 = _glewSearchExtension("GL_AMD_transform_feedback4", extStart, extEnd);
9485 #endif /* GL_AMD_transform_feedback4 */
9486 #ifdef GL_AMD_vertex_shader_layer
9487 GLEW_AMD_vertex_shader_layer = _glewSearchExtension("GL_AMD_vertex_shader_layer", extStart, extEnd);
9488 #endif /* GL_AMD_vertex_shader_layer */
9489 #ifdef GL_AMD_vertex_shader_tessellator
9490 GLEW_AMD_vertex_shader_tessellator = _glewSearchExtension("GL_AMD_vertex_shader_tessellator", extStart, extEnd);
9491 if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) GLEW_AMD_vertex_shader_tessellator = !_glewInit_GL_AMD_vertex_shader_tessellator(GLEW_CONTEXT_ARG_VAR_INIT);
9492 #endif /* GL_AMD_vertex_shader_tessellator */
9493 #ifdef GL_AMD_vertex_shader_viewport_index
9494 GLEW_AMD_vertex_shader_viewport_index = _glewSearchExtension("GL_AMD_vertex_shader_viewport_index", extStart, extEnd);
9495 #endif /* GL_AMD_vertex_shader_viewport_index */
9496 #ifdef GL_ANGLE_depth_texture
9497 GLEW_ANGLE_depth_texture = _glewSearchExtension("GL_ANGLE_depth_texture", extStart, extEnd);
9498 #endif /* GL_ANGLE_depth_texture */
9499 #ifdef GL_ANGLE_framebuffer_blit
9500 GLEW_ANGLE_framebuffer_blit = _glewSearchExtension("GL_ANGLE_framebuffer_blit", extStart, extEnd);
9501 if (glewExperimental || GLEW_ANGLE_framebuffer_blit) GLEW_ANGLE_framebuffer_blit = !_glewInit_GL_ANGLE_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT);
9502 #endif /* GL_ANGLE_framebuffer_blit */
9503 #ifdef GL_ANGLE_framebuffer_multisample
9504 GLEW_ANGLE_framebuffer_multisample = _glewSearchExtension("GL_ANGLE_framebuffer_multisample", extStart, extEnd);
9505 if (glewExperimental || GLEW_ANGLE_framebuffer_multisample) GLEW_ANGLE_framebuffer_multisample = !_glewInit_GL_ANGLE_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
9506 #endif /* GL_ANGLE_framebuffer_multisample */
9507 #ifdef GL_ANGLE_instanced_arrays
9508 GLEW_ANGLE_instanced_arrays = _glewSearchExtension("GL_ANGLE_instanced_arrays", extStart, extEnd);
9509 if (glewExperimental || GLEW_ANGLE_instanced_arrays) GLEW_ANGLE_instanced_arrays = !_glewInit_GL_ANGLE_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT);
9510 #endif /* GL_ANGLE_instanced_arrays */
9511 #ifdef GL_ANGLE_pack_reverse_row_order
9512 GLEW_ANGLE_pack_reverse_row_order = _glewSearchExtension("GL_ANGLE_pack_reverse_row_order", extStart, extEnd);
9513 #endif /* GL_ANGLE_pack_reverse_row_order */
9514 #ifdef GL_ANGLE_program_binary
9515 GLEW_ANGLE_program_binary = _glewSearchExtension("GL_ANGLE_program_binary", extStart, extEnd);
9516 #endif /* GL_ANGLE_program_binary */
9517 #ifdef GL_ANGLE_texture_compression_dxt1
9518 GLEW_ANGLE_texture_compression_dxt1 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt1", extStart, extEnd);
9519 #endif /* GL_ANGLE_texture_compression_dxt1 */
9520 #ifdef GL_ANGLE_texture_compression_dxt3
9521 GLEW_ANGLE_texture_compression_dxt3 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt3", extStart, extEnd);
9522 #endif /* GL_ANGLE_texture_compression_dxt3 */
9523 #ifdef GL_ANGLE_texture_compression_dxt5
9524 GLEW_ANGLE_texture_compression_dxt5 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt5", extStart, extEnd);
9525 #endif /* GL_ANGLE_texture_compression_dxt5 */
9526 #ifdef GL_ANGLE_texture_usage
9527 GLEW_ANGLE_texture_usage = _glewSearchExtension("GL_ANGLE_texture_usage", extStart, extEnd);
9528 #endif /* GL_ANGLE_texture_usage */
9529 #ifdef GL_ANGLE_timer_query
9530 GLEW_ANGLE_timer_query = _glewSearchExtension("GL_ANGLE_timer_query", extStart, extEnd);
9531 if (glewExperimental || GLEW_ANGLE_timer_query) GLEW_ANGLE_timer_query = !_glewInit_GL_ANGLE_timer_query(GLEW_CONTEXT_ARG_VAR_INIT);
9532 #endif /* GL_ANGLE_timer_query */
9533 #ifdef GL_ANGLE_translated_shader_source
9534 GLEW_ANGLE_translated_shader_source = _glewSearchExtension("GL_ANGLE_translated_shader_source", extStart, extEnd);
9535 if (glewExperimental || GLEW_ANGLE_translated_shader_source) GLEW_ANGLE_translated_shader_source = !_glewInit_GL_ANGLE_translated_shader_source(GLEW_CONTEXT_ARG_VAR_INIT);
9536 #endif /* GL_ANGLE_translated_shader_source */
9537 #ifdef GL_APPLE_aux_depth_stencil
9538 GLEW_APPLE_aux_depth_stencil = _glewSearchExtension("GL_APPLE_aux_depth_stencil", extStart, extEnd);
9539 #endif /* GL_APPLE_aux_depth_stencil */
9540 #ifdef GL_APPLE_client_storage
9541 GLEW_APPLE_client_storage = _glewSearchExtension("GL_APPLE_client_storage", extStart, extEnd);
9542 #endif /* GL_APPLE_client_storage */
9543 #ifdef GL_APPLE_element_array
9544 GLEW_APPLE_element_array = _glewSearchExtension("GL_APPLE_element_array", extStart, extEnd);
9545 if (glewExperimental || GLEW_APPLE_element_array) GLEW_APPLE_element_array = !_glewInit_GL_APPLE_element_array(GLEW_CONTEXT_ARG_VAR_INIT);
9546 #endif /* GL_APPLE_element_array */
9547 #ifdef GL_APPLE_fence
9548 GLEW_APPLE_fence = _glewSearchExtension("GL_APPLE_fence", extStart, extEnd);
9549 if (glewExperimental || GLEW_APPLE_fence) GLEW_APPLE_fence = !_glewInit_GL_APPLE_fence(GLEW_CONTEXT_ARG_VAR_INIT);
9550 #endif /* GL_APPLE_fence */
9551 #ifdef GL_APPLE_float_pixels
9552 GLEW_APPLE_float_pixels = _glewSearchExtension("GL_APPLE_float_pixels", extStart, extEnd);
9553 #endif /* GL_APPLE_float_pixels */
9554 #ifdef GL_APPLE_flush_buffer_range
9555 GLEW_APPLE_flush_buffer_range = _glewSearchExtension("GL_APPLE_flush_buffer_range", extStart, extEnd);
9556 if (glewExperimental || GLEW_APPLE_flush_buffer_range) GLEW_APPLE_flush_buffer_range = !_glewInit_GL_APPLE_flush_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT);
9557 #endif /* GL_APPLE_flush_buffer_range */
9558 #ifdef GL_APPLE_object_purgeable
9559 GLEW_APPLE_object_purgeable = _glewSearchExtension("GL_APPLE_object_purgeable", extStart, extEnd);
9560 if (glewExperimental || GLEW_APPLE_object_purgeable) GLEW_APPLE_object_purgeable = !_glewInit_GL_APPLE_object_purgeable(GLEW_CONTEXT_ARG_VAR_INIT);
9561 #endif /* GL_APPLE_object_purgeable */
9562 #ifdef GL_APPLE_pixel_buffer
9563 GLEW_APPLE_pixel_buffer = _glewSearchExtension("GL_APPLE_pixel_buffer", extStart, extEnd);
9564 #endif /* GL_APPLE_pixel_buffer */
9565 #ifdef GL_APPLE_rgb_422
9566 GLEW_APPLE_rgb_422 = _glewSearchExtension("GL_APPLE_rgb_422", extStart, extEnd);
9567 #endif /* GL_APPLE_rgb_422 */
9568 #ifdef GL_APPLE_row_bytes
9569 GLEW_APPLE_row_bytes = _glewSearchExtension("GL_APPLE_row_bytes", extStart, extEnd);
9570 #endif /* GL_APPLE_row_bytes */
9571 #ifdef GL_APPLE_specular_vector
9572 GLEW_APPLE_specular_vector = _glewSearchExtension("GL_APPLE_specular_vector", extStart, extEnd);
9573 #endif /* GL_APPLE_specular_vector */
9574 #ifdef GL_APPLE_texture_range
9575 GLEW_APPLE_texture_range = _glewSearchExtension("GL_APPLE_texture_range", extStart, extEnd);
9576 if (glewExperimental || GLEW_APPLE_texture_range) GLEW_APPLE_texture_range = !_glewInit_GL_APPLE_texture_range(GLEW_CONTEXT_ARG_VAR_INIT);
9577 #endif /* GL_APPLE_texture_range */
9578 #ifdef GL_APPLE_transform_hint
9579 GLEW_APPLE_transform_hint = _glewSearchExtension("GL_APPLE_transform_hint", extStart, extEnd);
9580 #endif /* GL_APPLE_transform_hint */
9581 #ifdef GL_APPLE_vertex_array_object
9582 GLEW_APPLE_vertex_array_object = _glewSearchExtension("GL_APPLE_vertex_array_object", extStart, extEnd);
9583 if (glewExperimental || GLEW_APPLE_vertex_array_object) GLEW_APPLE_vertex_array_object = !_glewInit_GL_APPLE_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT);
9584 #endif /* GL_APPLE_vertex_array_object */
9585 #ifdef GL_APPLE_vertex_array_range
9586 GLEW_APPLE_vertex_array_range = _glewSearchExtension("GL_APPLE_vertex_array_range", extStart, extEnd);
9587 if (glewExperimental || GLEW_APPLE_vertex_array_range) GLEW_APPLE_vertex_array_range = !_glewInit_GL_APPLE_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT);
9588 #endif /* GL_APPLE_vertex_array_range */
9589 #ifdef GL_APPLE_vertex_program_evaluators
9590 GLEW_APPLE_vertex_program_evaluators = _glewSearchExtension("GL_APPLE_vertex_program_evaluators", extStart, extEnd);
9591 if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) GLEW_APPLE_vertex_program_evaluators = !_glewInit_GL_APPLE_vertex_program_evaluators(GLEW_CONTEXT_ARG_VAR_INIT);
9592 #endif /* GL_APPLE_vertex_program_evaluators */
9593 #ifdef GL_APPLE_ycbcr_422
9594 GLEW_APPLE_ycbcr_422 = _glewSearchExtension("GL_APPLE_ycbcr_422", extStart, extEnd);
9595 #endif /* GL_APPLE_ycbcr_422 */
9596 #ifdef GL_ARB_ES2_compatibility
9597 GLEW_ARB_ES2_compatibility = _glewSearchExtension("GL_ARB_ES2_compatibility", extStart, extEnd);
9598 if (glewExperimental || GLEW_ARB_ES2_compatibility) GLEW_ARB_ES2_compatibility = !_glewInit_GL_ARB_ES2_compatibility(GLEW_CONTEXT_ARG_VAR_INIT);
9599 #endif /* GL_ARB_ES2_compatibility */
9600 #ifdef GL_ARB_ES3_1_compatibility
9601 GLEW_ARB_ES3_1_compatibility = _glewSearchExtension("GL_ARB_ES3_1_compatibility", extStart, extEnd);
9602 if (glewExperimental || GLEW_ARB_ES3_1_compatibility) GLEW_ARB_ES3_1_compatibility = !_glewInit_GL_ARB_ES3_1_compatibility(GLEW_CONTEXT_ARG_VAR_INIT);
9603 #endif /* GL_ARB_ES3_1_compatibility */
9604 #ifdef GL_ARB_ES3_2_compatibility
9605 GLEW_ARB_ES3_2_compatibility = _glewSearchExtension("GL_ARB_ES3_2_compatibility", extStart, extEnd);
9606 if (glewExperimental || GLEW_ARB_ES3_2_compatibility) GLEW_ARB_ES3_2_compatibility = !_glewInit_GL_ARB_ES3_2_compatibility(GLEW_CONTEXT_ARG_VAR_INIT);
9607 #endif /* GL_ARB_ES3_2_compatibility */
9608 #ifdef GL_ARB_ES3_compatibility
9609 GLEW_ARB_ES3_compatibility = _glewSearchExtension("GL_ARB_ES3_compatibility", extStart, extEnd);
9610 #endif /* GL_ARB_ES3_compatibility */
9611 #ifdef GL_ARB_arrays_of_arrays
9612 GLEW_ARB_arrays_of_arrays = _glewSearchExtension("GL_ARB_arrays_of_arrays", extStart, extEnd);
9613 #endif /* GL_ARB_arrays_of_arrays */
9614 #ifdef GL_ARB_base_instance
9615 GLEW_ARB_base_instance = _glewSearchExtension("GL_ARB_base_instance", extStart, extEnd);
9616 if (glewExperimental || GLEW_ARB_base_instance) GLEW_ARB_base_instance = !_glewInit_GL_ARB_base_instance(GLEW_CONTEXT_ARG_VAR_INIT);
9617 #endif /* GL_ARB_base_instance */
9618 #ifdef GL_ARB_bindless_texture
9619 GLEW_ARB_bindless_texture = _glewSearchExtension("GL_ARB_bindless_texture", extStart, extEnd);
9620 if (glewExperimental || GLEW_ARB_bindless_texture) GLEW_ARB_bindless_texture = !_glewInit_GL_ARB_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT);
9621 #endif /* GL_ARB_bindless_texture */
9622 #ifdef GL_ARB_blend_func_extended
9623 GLEW_ARB_blend_func_extended = _glewSearchExtension("GL_ARB_blend_func_extended", extStart, extEnd);
9624 if (glewExperimental || GLEW_ARB_blend_func_extended) GLEW_ARB_blend_func_extended = !_glewInit_GL_ARB_blend_func_extended(GLEW_CONTEXT_ARG_VAR_INIT);
9625 #endif /* GL_ARB_blend_func_extended */
9626 #ifdef GL_ARB_buffer_storage
9627 GLEW_ARB_buffer_storage = _glewSearchExtension("GL_ARB_buffer_storage", extStart, extEnd);
9628 if (glewExperimental || GLEW_ARB_buffer_storage) GLEW_ARB_buffer_storage = !_glewInit_GL_ARB_buffer_storage(GLEW_CONTEXT_ARG_VAR_INIT);
9629 #endif /* GL_ARB_buffer_storage */
9630 #ifdef GL_ARB_cl_event
9631 GLEW_ARB_cl_event = _glewSearchExtension("GL_ARB_cl_event", extStart, extEnd);
9632 if (glewExperimental || GLEW_ARB_cl_event) GLEW_ARB_cl_event = !_glewInit_GL_ARB_cl_event(GLEW_CONTEXT_ARG_VAR_INIT);
9633 #endif /* GL_ARB_cl_event */
9634 #ifdef GL_ARB_clear_buffer_object
9635 GLEW_ARB_clear_buffer_object = _glewSearchExtension("GL_ARB_clear_buffer_object", extStart, extEnd);
9636 if (glewExperimental || GLEW_ARB_clear_buffer_object) GLEW_ARB_clear_buffer_object = !_glewInit_GL_ARB_clear_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
9637 #endif /* GL_ARB_clear_buffer_object */
9638 #ifdef GL_ARB_clear_texture
9639 GLEW_ARB_clear_texture = _glewSearchExtension("GL_ARB_clear_texture", extStart, extEnd);
9640 if (glewExperimental || GLEW_ARB_clear_texture) GLEW_ARB_clear_texture = !_glewInit_GL_ARB_clear_texture(GLEW_CONTEXT_ARG_VAR_INIT);
9641 #endif /* GL_ARB_clear_texture */
9642 #ifdef GL_ARB_clip_control
9643 GLEW_ARB_clip_control = _glewSearchExtension("GL_ARB_clip_control", extStart, extEnd);
9644 if (glewExperimental || GLEW_ARB_clip_control) GLEW_ARB_clip_control = !_glewInit_GL_ARB_clip_control(GLEW_CONTEXT_ARG_VAR_INIT);
9645 #endif /* GL_ARB_clip_control */
9646 #ifdef GL_ARB_color_buffer_float
9647 GLEW_ARB_color_buffer_float = _glewSearchExtension("GL_ARB_color_buffer_float", extStart, extEnd);
9648 if (glewExperimental || GLEW_ARB_color_buffer_float) GLEW_ARB_color_buffer_float = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT);
9649 #endif /* GL_ARB_color_buffer_float */
9650 #ifdef GL_ARB_compatibility
9651 GLEW_ARB_compatibility = _glewSearchExtension("GL_ARB_compatibility", extStart, extEnd);
9652 #endif /* GL_ARB_compatibility */
9653 #ifdef GL_ARB_compressed_texture_pixel_storage
9654 GLEW_ARB_compressed_texture_pixel_storage = _glewSearchExtension("GL_ARB_compressed_texture_pixel_storage", extStart, extEnd);
9655 #endif /* GL_ARB_compressed_texture_pixel_storage */
9656 #ifdef GL_ARB_compute_shader
9657 GLEW_ARB_compute_shader = _glewSearchExtension("GL_ARB_compute_shader", extStart, extEnd);
9658 if (glewExperimental || GLEW_ARB_compute_shader) GLEW_ARB_compute_shader = !_glewInit_GL_ARB_compute_shader(GLEW_CONTEXT_ARG_VAR_INIT);
9659 #endif /* GL_ARB_compute_shader */
9660 #ifdef GL_ARB_compute_variable_group_size
9661 GLEW_ARB_compute_variable_group_size = _glewSearchExtension("GL_ARB_compute_variable_group_size", extStart, extEnd);
9662 if (glewExperimental || GLEW_ARB_compute_variable_group_size) GLEW_ARB_compute_variable_group_size = !_glewInit_GL_ARB_compute_variable_group_size(GLEW_CONTEXT_ARG_VAR_INIT);
9663 #endif /* GL_ARB_compute_variable_group_size */
9664 #ifdef GL_ARB_conditional_render_inverted
9665 GLEW_ARB_conditional_render_inverted = _glewSearchExtension("GL_ARB_conditional_render_inverted", extStart, extEnd);
9666 #endif /* GL_ARB_conditional_render_inverted */
9667 #ifdef GL_ARB_conservative_depth
9668 GLEW_ARB_conservative_depth = _glewSearchExtension("GL_ARB_conservative_depth", extStart, extEnd);
9669 #endif /* GL_ARB_conservative_depth */
9670 #ifdef GL_ARB_copy_buffer
9671 GLEW_ARB_copy_buffer = _glewSearchExtension("GL_ARB_copy_buffer", extStart, extEnd);
9672 if (glewExperimental || GLEW_ARB_copy_buffer) GLEW_ARB_copy_buffer = !_glewInit_GL_ARB_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT);
9673 #endif /* GL_ARB_copy_buffer */
9674 #ifdef GL_ARB_copy_image
9675 GLEW_ARB_copy_image = _glewSearchExtension("GL_ARB_copy_image", extStart, extEnd);
9676 if (glewExperimental || GLEW_ARB_copy_image) GLEW_ARB_copy_image = !_glewInit_GL_ARB_copy_image(GLEW_CONTEXT_ARG_VAR_INIT);
9677 #endif /* GL_ARB_copy_image */
9678 #ifdef GL_ARB_cull_distance
9679 GLEW_ARB_cull_distance = _glewSearchExtension("GL_ARB_cull_distance", extStart, extEnd);
9680 #endif /* GL_ARB_cull_distance */
9681 #ifdef GL_ARB_debug_output
9682 GLEW_ARB_debug_output = _glewSearchExtension("GL_ARB_debug_output", extStart, extEnd);
9683 if (glewExperimental || GLEW_ARB_debug_output) GLEW_ARB_debug_output = !_glewInit_GL_ARB_debug_output(GLEW_CONTEXT_ARG_VAR_INIT);
9684 #endif /* GL_ARB_debug_output */
9685 #ifdef GL_ARB_depth_buffer_float
9686 GLEW_ARB_depth_buffer_float = _glewSearchExtension("GL_ARB_depth_buffer_float", extStart, extEnd);
9687 #endif /* GL_ARB_depth_buffer_float */
9688 #ifdef GL_ARB_depth_clamp
9689 GLEW_ARB_depth_clamp = _glewSearchExtension("GL_ARB_depth_clamp", extStart, extEnd);
9690 #endif /* GL_ARB_depth_clamp */
9691 #ifdef GL_ARB_depth_texture
9692 GLEW_ARB_depth_texture = _glewSearchExtension("GL_ARB_depth_texture", extStart, extEnd);
9693 #endif /* GL_ARB_depth_texture */
9694 #ifdef GL_ARB_derivative_control
9695 GLEW_ARB_derivative_control = _glewSearchExtension("GL_ARB_derivative_control", extStart, extEnd);
9696 #endif /* GL_ARB_derivative_control */
9697 #ifdef GL_ARB_direct_state_access
9698 GLEW_ARB_direct_state_access = _glewSearchExtension("GL_ARB_direct_state_access", extStart, extEnd);
9699 if (glewExperimental || GLEW_ARB_direct_state_access) GLEW_ARB_direct_state_access = !_glewInit_GL_ARB_direct_state_access(GLEW_CONTEXT_ARG_VAR_INIT);
9700 #endif /* GL_ARB_direct_state_access */
9701 #ifdef GL_ARB_draw_buffers
9702 GLEW_ARB_draw_buffers = _glewSearchExtension("GL_ARB_draw_buffers", extStart, extEnd);
9703 if (glewExperimental || GLEW_ARB_draw_buffers) GLEW_ARB_draw_buffers = !_glewInit_GL_ARB_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT);
9704 #endif /* GL_ARB_draw_buffers */
9705 #ifdef GL_ARB_draw_buffers_blend
9706 GLEW_ARB_draw_buffers_blend = _glewSearchExtension("GL_ARB_draw_buffers_blend", extStart, extEnd);
9707 if (glewExperimental || GLEW_ARB_draw_buffers_blend) GLEW_ARB_draw_buffers_blend = !_glewInit_GL_ARB_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT);
9708 #endif /* GL_ARB_draw_buffers_blend */
9709 #ifdef GL_ARB_draw_elements_base_vertex
9710 GLEW_ARB_draw_elements_base_vertex = _glewSearchExtension("GL_ARB_draw_elements_base_vertex", extStart, extEnd);
9711 if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) GLEW_ARB_draw_elements_base_vertex = !_glewInit_GL_ARB_draw_elements_base_vertex(GLEW_CONTEXT_ARG_VAR_INIT);
9712 #endif /* GL_ARB_draw_elements_base_vertex */
9713 #ifdef GL_ARB_draw_indirect
9714 GLEW_ARB_draw_indirect = _glewSearchExtension("GL_ARB_draw_indirect", extStart, extEnd);
9715 if (glewExperimental || GLEW_ARB_draw_indirect) GLEW_ARB_draw_indirect = !_glewInit_GL_ARB_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT);
9716 #endif /* GL_ARB_draw_indirect */
9717 #ifdef GL_ARB_draw_instanced
9718 GLEW_ARB_draw_instanced = _glewSearchExtension("GL_ARB_draw_instanced", extStart, extEnd);
9719 #endif /* GL_ARB_draw_instanced */
9720 #ifdef GL_ARB_enhanced_layouts
9721 GLEW_ARB_enhanced_layouts = _glewSearchExtension("GL_ARB_enhanced_layouts", extStart, extEnd);
9722 #endif /* GL_ARB_enhanced_layouts */
9723 #ifdef GL_ARB_explicit_attrib_location
9724 GLEW_ARB_explicit_attrib_location = _glewSearchExtension("GL_ARB_explicit_attrib_location", extStart, extEnd);
9725 #endif /* GL_ARB_explicit_attrib_location */
9726 #ifdef GL_ARB_explicit_uniform_location
9727 GLEW_ARB_explicit_uniform_location = _glewSearchExtension("GL_ARB_explicit_uniform_location", extStart, extEnd);
9728 #endif /* GL_ARB_explicit_uniform_location */
9729 #ifdef GL_ARB_fragment_coord_conventions
9730 GLEW_ARB_fragment_coord_conventions = _glewSearchExtension("GL_ARB_fragment_coord_conventions", extStart, extEnd);
9731 #endif /* GL_ARB_fragment_coord_conventions */
9732 #ifdef GL_ARB_fragment_layer_viewport
9733 GLEW_ARB_fragment_layer_viewport = _glewSearchExtension("GL_ARB_fragment_layer_viewport", extStart, extEnd);
9734 #endif /* GL_ARB_fragment_layer_viewport */
9735 #ifdef GL_ARB_fragment_program
9736 GLEW_ARB_fragment_program = _glewSearchExtension("GL_ARB_fragment_program", extStart, extEnd);
9737 #endif /* GL_ARB_fragment_program */
9738 #ifdef GL_ARB_fragment_program_shadow
9739 GLEW_ARB_fragment_program_shadow = _glewSearchExtension("GL_ARB_fragment_program_shadow", extStart, extEnd);
9740 #endif /* GL_ARB_fragment_program_shadow */
9741 #ifdef GL_ARB_fragment_shader
9742 GLEW_ARB_fragment_shader = _glewSearchExtension("GL_ARB_fragment_shader", extStart, extEnd);
9743 #endif /* GL_ARB_fragment_shader */
9744 #ifdef GL_ARB_fragment_shader_interlock
9745 GLEW_ARB_fragment_shader_interlock = _glewSearchExtension("GL_ARB_fragment_shader_interlock", extStart, extEnd);
9746 #endif /* GL_ARB_fragment_shader_interlock */
9747 #ifdef GL_ARB_framebuffer_no_attachments
9748 GLEW_ARB_framebuffer_no_attachments = _glewSearchExtension("GL_ARB_framebuffer_no_attachments", extStart, extEnd);
9749 if (glewExperimental || GLEW_ARB_framebuffer_no_attachments) GLEW_ARB_framebuffer_no_attachments = !_glewInit_GL_ARB_framebuffer_no_attachments(GLEW_CONTEXT_ARG_VAR_INIT);
9750 #endif /* GL_ARB_framebuffer_no_attachments */
9751 #ifdef GL_ARB_framebuffer_object
9752 GLEW_ARB_framebuffer_object = _glewSearchExtension("GL_ARB_framebuffer_object", extStart, extEnd);
9753 if (glewExperimental || GLEW_ARB_framebuffer_object) GLEW_ARB_framebuffer_object = !_glewInit_GL_ARB_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
9754 #endif /* GL_ARB_framebuffer_object */
9755 #ifdef GL_ARB_framebuffer_sRGB
9756 GLEW_ARB_framebuffer_sRGB = _glewSearchExtension("GL_ARB_framebuffer_sRGB", extStart, extEnd);
9757 #endif /* GL_ARB_framebuffer_sRGB */
9758 #ifdef GL_ARB_geometry_shader4
9759 GLEW_ARB_geometry_shader4 = _glewSearchExtension("GL_ARB_geometry_shader4", extStart, extEnd);
9760 if (glewExperimental || GLEW_ARB_geometry_shader4) GLEW_ARB_geometry_shader4 = !_glewInit_GL_ARB_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT);
9761 #endif /* GL_ARB_geometry_shader4 */
9762 #ifdef GL_ARB_get_program_binary
9763 GLEW_ARB_get_program_binary = _glewSearchExtension("GL_ARB_get_program_binary", extStart, extEnd);
9764 if (glewExperimental || GLEW_ARB_get_program_binary) GLEW_ARB_get_program_binary = !_glewInit_GL_ARB_get_program_binary(GLEW_CONTEXT_ARG_VAR_INIT);
9765 #endif /* GL_ARB_get_program_binary */
9766 #ifdef GL_ARB_get_texture_sub_image
9767 GLEW_ARB_get_texture_sub_image = _glewSearchExtension("GL_ARB_get_texture_sub_image", extStart, extEnd);
9768 if (glewExperimental || GLEW_ARB_get_texture_sub_image) GLEW_ARB_get_texture_sub_image = !_glewInit_GL_ARB_get_texture_sub_image(GLEW_CONTEXT_ARG_VAR_INIT);
9769 #endif /* GL_ARB_get_texture_sub_image */
9770 #ifdef GL_ARB_gpu_shader5
9771 GLEW_ARB_gpu_shader5 = _glewSearchExtension("GL_ARB_gpu_shader5", extStart, extEnd);
9772 #endif /* GL_ARB_gpu_shader5 */
9773 #ifdef GL_ARB_gpu_shader_fp64
9774 GLEW_ARB_gpu_shader_fp64 = _glewSearchExtension("GL_ARB_gpu_shader_fp64", extStart, extEnd);
9775 if (glewExperimental || GLEW_ARB_gpu_shader_fp64) GLEW_ARB_gpu_shader_fp64 = !_glewInit_GL_ARB_gpu_shader_fp64(GLEW_CONTEXT_ARG_VAR_INIT);
9776 #endif /* GL_ARB_gpu_shader_fp64 */
9777 #ifdef GL_ARB_gpu_shader_int64
9778 GLEW_ARB_gpu_shader_int64 = _glewSearchExtension("GL_ARB_gpu_shader_int64", extStart, extEnd);
9779 if (glewExperimental || GLEW_ARB_gpu_shader_int64) GLEW_ARB_gpu_shader_int64 = !_glewInit_GL_ARB_gpu_shader_int64(GLEW_CONTEXT_ARG_VAR_INIT);
9780 #endif /* GL_ARB_gpu_shader_int64 */
9781 #ifdef GL_ARB_half_float_pixel
9782 GLEW_ARB_half_float_pixel = _glewSearchExtension("GL_ARB_half_float_pixel", extStart, extEnd);
9783 #endif /* GL_ARB_half_float_pixel */
9784 #ifdef GL_ARB_half_float_vertex
9785 GLEW_ARB_half_float_vertex = _glewSearchExtension("GL_ARB_half_float_vertex", extStart, extEnd);
9786 #endif /* GL_ARB_half_float_vertex */
9787 #ifdef GL_ARB_imaging
9788 GLEW_ARB_imaging = _glewSearchExtension("GL_ARB_imaging", extStart, extEnd);
9789 if (glewExperimental || GLEW_ARB_imaging) GLEW_ARB_imaging = !_glewInit_GL_ARB_imaging(GLEW_CONTEXT_ARG_VAR_INIT);
9790 #endif /* GL_ARB_imaging */
9791 #ifdef GL_ARB_indirect_parameters
9792 GLEW_ARB_indirect_parameters = _glewSearchExtension("GL_ARB_indirect_parameters", extStart, extEnd);
9793 if (glewExperimental || GLEW_ARB_indirect_parameters) GLEW_ARB_indirect_parameters = !_glewInit_GL_ARB_indirect_parameters(GLEW_CONTEXT_ARG_VAR_INIT);
9794 #endif /* GL_ARB_indirect_parameters */
9795 #ifdef GL_ARB_instanced_arrays
9796 GLEW_ARB_instanced_arrays = _glewSearchExtension("GL_ARB_instanced_arrays", extStart, extEnd);
9797 if (glewExperimental || GLEW_ARB_instanced_arrays) GLEW_ARB_instanced_arrays = !_glewInit_GL_ARB_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT);
9798 #endif /* GL_ARB_instanced_arrays */
9799 #ifdef GL_ARB_internalformat_query
9800 GLEW_ARB_internalformat_query = _glewSearchExtension("GL_ARB_internalformat_query", extStart, extEnd);
9801 if (glewExperimental || GLEW_ARB_internalformat_query) GLEW_ARB_internalformat_query = !_glewInit_GL_ARB_internalformat_query(GLEW_CONTEXT_ARG_VAR_INIT);
9802 #endif /* GL_ARB_internalformat_query */
9803 #ifdef GL_ARB_internalformat_query2
9804 GLEW_ARB_internalformat_query2 = _glewSearchExtension("GL_ARB_internalformat_query2", extStart, extEnd);
9805 if (glewExperimental || GLEW_ARB_internalformat_query2) GLEW_ARB_internalformat_query2 = !_glewInit_GL_ARB_internalformat_query2(GLEW_CONTEXT_ARG_VAR_INIT);
9806 #endif /* GL_ARB_internalformat_query2 */
9807 #ifdef GL_ARB_invalidate_subdata
9808 GLEW_ARB_invalidate_subdata = _glewSearchExtension("GL_ARB_invalidate_subdata", extStart, extEnd);
9809 if (glewExperimental || GLEW_ARB_invalidate_subdata) GLEW_ARB_invalidate_subdata = !_glewInit_GL_ARB_invalidate_subdata(GLEW_CONTEXT_ARG_VAR_INIT);
9810 #endif /* GL_ARB_invalidate_subdata */
9811 #ifdef GL_ARB_map_buffer_alignment
9812 GLEW_ARB_map_buffer_alignment = _glewSearchExtension("GL_ARB_map_buffer_alignment", extStart, extEnd);
9813 #endif /* GL_ARB_map_buffer_alignment */
9814 #ifdef GL_ARB_map_buffer_range
9815 GLEW_ARB_map_buffer_range = _glewSearchExtension("GL_ARB_map_buffer_range", extStart, extEnd);
9816 if (glewExperimental || GLEW_ARB_map_buffer_range) GLEW_ARB_map_buffer_range = !_glewInit_GL_ARB_map_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT);
9817 #endif /* GL_ARB_map_buffer_range */
9818 #ifdef GL_ARB_matrix_palette
9819 GLEW_ARB_matrix_palette = _glewSearchExtension("GL_ARB_matrix_palette", extStart, extEnd);
9820 if (glewExperimental || GLEW_ARB_matrix_palette) GLEW_ARB_matrix_palette = !_glewInit_GL_ARB_matrix_palette(GLEW_CONTEXT_ARG_VAR_INIT);
9821 #endif /* GL_ARB_matrix_palette */
9822 #ifdef GL_ARB_multi_bind
9823 GLEW_ARB_multi_bind = _glewSearchExtension("GL_ARB_multi_bind", extStart, extEnd);
9824 if (glewExperimental || GLEW_ARB_multi_bind) GLEW_ARB_multi_bind = !_glewInit_GL_ARB_multi_bind(GLEW_CONTEXT_ARG_VAR_INIT);
9825 #endif /* GL_ARB_multi_bind */
9826 #ifdef GL_ARB_multi_draw_indirect
9827 GLEW_ARB_multi_draw_indirect = _glewSearchExtension("GL_ARB_multi_draw_indirect", extStart, extEnd);
9828 if (glewExperimental || GLEW_ARB_multi_draw_indirect) GLEW_ARB_multi_draw_indirect = !_glewInit_GL_ARB_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT);
9829 #endif /* GL_ARB_multi_draw_indirect */
9830 #ifdef GL_ARB_multisample
9831 GLEW_ARB_multisample = _glewSearchExtension("GL_ARB_multisample", extStart, extEnd);
9832 if (glewExperimental || GLEW_ARB_multisample) GLEW_ARB_multisample = !_glewInit_GL_ARB_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
9833 #endif /* GL_ARB_multisample */
9834 #ifdef GL_ARB_multitexture
9835 GLEW_ARB_multitexture = _glewSearchExtension("GL_ARB_multitexture", extStart, extEnd);
9836 if (glewExperimental || GLEW_ARB_multitexture) GLEW_ARB_multitexture = !_glewInit_GL_ARB_multitexture(GLEW_CONTEXT_ARG_VAR_INIT);
9837 #endif /* GL_ARB_multitexture */
9838 #ifdef GL_ARB_occlusion_query
9839 GLEW_ARB_occlusion_query = _glewSearchExtension("GL_ARB_occlusion_query", extStart, extEnd);
9840 if (glewExperimental || GLEW_ARB_occlusion_query) GLEW_ARB_occlusion_query = !_glewInit_GL_ARB_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT);
9841 #endif /* GL_ARB_occlusion_query */
9842 #ifdef GL_ARB_occlusion_query2
9843 GLEW_ARB_occlusion_query2 = _glewSearchExtension("GL_ARB_occlusion_query2", extStart, extEnd);
9844 #endif /* GL_ARB_occlusion_query2 */
9845 #ifdef GL_ARB_parallel_shader_compile
9846 GLEW_ARB_parallel_shader_compile = _glewSearchExtension("GL_ARB_parallel_shader_compile", extStart, extEnd);
9847 if (glewExperimental || GLEW_ARB_parallel_shader_compile) GLEW_ARB_parallel_shader_compile = !_glewInit_GL_ARB_parallel_shader_compile(GLEW_CONTEXT_ARG_VAR_INIT);
9848 #endif /* GL_ARB_parallel_shader_compile */
9849 #ifdef GL_ARB_pipeline_statistics_query
9850 GLEW_ARB_pipeline_statistics_query = _glewSearchExtension("GL_ARB_pipeline_statistics_query", extStart, extEnd);
9851 #endif /* GL_ARB_pipeline_statistics_query */
9852 #ifdef GL_ARB_pixel_buffer_object
9853 GLEW_ARB_pixel_buffer_object = _glewSearchExtension("GL_ARB_pixel_buffer_object", extStart, extEnd);
9854 #endif /* GL_ARB_pixel_buffer_object */
9855 #ifdef GL_ARB_point_parameters
9856 GLEW_ARB_point_parameters = _glewSearchExtension("GL_ARB_point_parameters", extStart, extEnd);
9857 if (glewExperimental || GLEW_ARB_point_parameters) GLEW_ARB_point_parameters = !_glewInit_GL_ARB_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT);
9858 #endif /* GL_ARB_point_parameters */
9859 #ifdef GL_ARB_point_sprite
9860 GLEW_ARB_point_sprite = _glewSearchExtension("GL_ARB_point_sprite", extStart, extEnd);
9861 #endif /* GL_ARB_point_sprite */
9862 #ifdef GL_ARB_post_depth_coverage
9863 GLEW_ARB_post_depth_coverage = _glewSearchExtension("GL_ARB_post_depth_coverage", extStart, extEnd);
9864 #endif /* GL_ARB_post_depth_coverage */
9865 #ifdef GL_ARB_program_interface_query
9866 GLEW_ARB_program_interface_query = _glewSearchExtension("GL_ARB_program_interface_query", extStart, extEnd);
9867 if (glewExperimental || GLEW_ARB_program_interface_query) GLEW_ARB_program_interface_query = !_glewInit_GL_ARB_program_interface_query(GLEW_CONTEXT_ARG_VAR_INIT);
9868 #endif /* GL_ARB_program_interface_query */
9869 #ifdef GL_ARB_provoking_vertex
9870 GLEW_ARB_provoking_vertex = _glewSearchExtension("GL_ARB_provoking_vertex", extStart, extEnd);
9871 if (glewExperimental || GLEW_ARB_provoking_vertex) GLEW_ARB_provoking_vertex = !_glewInit_GL_ARB_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT);
9872 #endif /* GL_ARB_provoking_vertex */
9873 #ifdef GL_ARB_query_buffer_object
9874 GLEW_ARB_query_buffer_object = _glewSearchExtension("GL_ARB_query_buffer_object", extStart, extEnd);
9875 #endif /* GL_ARB_query_buffer_object */
9876 #ifdef GL_ARB_robust_buffer_access_behavior
9877 GLEW_ARB_robust_buffer_access_behavior = _glewSearchExtension("GL_ARB_robust_buffer_access_behavior", extStart, extEnd);
9878 #endif /* GL_ARB_robust_buffer_access_behavior */
9879 #ifdef GL_ARB_robustness
9880 GLEW_ARB_robustness = _glewSearchExtension("GL_ARB_robustness", extStart, extEnd);
9881 if (glewExperimental || GLEW_ARB_robustness) GLEW_ARB_robustness = !_glewInit_GL_ARB_robustness(GLEW_CONTEXT_ARG_VAR_INIT);
9882 #endif /* GL_ARB_robustness */
9883 #ifdef GL_ARB_robustness_application_isolation
9884 GLEW_ARB_robustness_application_isolation = _glewSearchExtension("GL_ARB_robustness_application_isolation", extStart, extEnd);
9885 #endif /* GL_ARB_robustness_application_isolation */
9886 #ifdef GL_ARB_robustness_share_group_isolation
9887 GLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GL_ARB_robustness_share_group_isolation", extStart, extEnd);
9888 #endif /* GL_ARB_robustness_share_group_isolation */
9889 #ifdef GL_ARB_sample_locations
9890 GLEW_ARB_sample_locations = _glewSearchExtension("GL_ARB_sample_locations", extStart, extEnd);
9891 if (glewExperimental || GLEW_ARB_sample_locations) GLEW_ARB_sample_locations = !_glewInit_GL_ARB_sample_locations(GLEW_CONTEXT_ARG_VAR_INIT);
9892 #endif /* GL_ARB_sample_locations */
9893 #ifdef GL_ARB_sample_shading
9894 GLEW_ARB_sample_shading = _glewSearchExtension("GL_ARB_sample_shading", extStart, extEnd);
9895 if (glewExperimental || GLEW_ARB_sample_shading) GLEW_ARB_sample_shading = !_glewInit_GL_ARB_sample_shading(GLEW_CONTEXT_ARG_VAR_INIT);
9896 #endif /* GL_ARB_sample_shading */
9897 #ifdef GL_ARB_sampler_objects
9898 GLEW_ARB_sampler_objects = _glewSearchExtension("GL_ARB_sampler_objects", extStart, extEnd);
9899 if (glewExperimental || GLEW_ARB_sampler_objects) GLEW_ARB_sampler_objects = !_glewInit_GL_ARB_sampler_objects(GLEW_CONTEXT_ARG_VAR_INIT);
9900 #endif /* GL_ARB_sampler_objects */
9901 #ifdef GL_ARB_seamless_cube_map
9902 GLEW_ARB_seamless_cube_map = _glewSearchExtension("GL_ARB_seamless_cube_map", extStart, extEnd);
9903 #endif /* GL_ARB_seamless_cube_map */
9904 #ifdef GL_ARB_seamless_cubemap_per_texture
9905 GLEW_ARB_seamless_cubemap_per_texture = _glewSearchExtension("GL_ARB_seamless_cubemap_per_texture", extStart, extEnd);
9906 #endif /* GL_ARB_seamless_cubemap_per_texture */
9907 #ifdef GL_ARB_separate_shader_objects
9908 GLEW_ARB_separate_shader_objects = _glewSearchExtension("GL_ARB_separate_shader_objects", extStart, extEnd);
9909 if (glewExperimental || GLEW_ARB_separate_shader_objects) GLEW_ARB_separate_shader_objects = !_glewInit_GL_ARB_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT);
9910 #endif /* GL_ARB_separate_shader_objects */
9911 #ifdef GL_ARB_shader_atomic_counter_ops
9912 GLEW_ARB_shader_atomic_counter_ops = _glewSearchExtension("GL_ARB_shader_atomic_counter_ops", extStart, extEnd);
9913 #endif /* GL_ARB_shader_atomic_counter_ops */
9914 #ifdef GL_ARB_shader_atomic_counters
9915 GLEW_ARB_shader_atomic_counters = _glewSearchExtension("GL_ARB_shader_atomic_counters", extStart, extEnd);
9916 if (glewExperimental || GLEW_ARB_shader_atomic_counters) GLEW_ARB_shader_atomic_counters = !_glewInit_GL_ARB_shader_atomic_counters(GLEW_CONTEXT_ARG_VAR_INIT);
9917 #endif /* GL_ARB_shader_atomic_counters */
9918 #ifdef GL_ARB_shader_ballot
9919 GLEW_ARB_shader_ballot = _glewSearchExtension("GL_ARB_shader_ballot", extStart, extEnd);
9920 #endif /* GL_ARB_shader_ballot */
9921 #ifdef GL_ARB_shader_bit_encoding
9922 GLEW_ARB_shader_bit_encoding = _glewSearchExtension("GL_ARB_shader_bit_encoding", extStart, extEnd);
9923 #endif /* GL_ARB_shader_bit_encoding */
9924 #ifdef GL_ARB_shader_clock
9925 GLEW_ARB_shader_clock = _glewSearchExtension("GL_ARB_shader_clock", extStart, extEnd);
9926 #endif /* GL_ARB_shader_clock */
9927 #ifdef GL_ARB_shader_draw_parameters
9928 GLEW_ARB_shader_draw_parameters = _glewSearchExtension("GL_ARB_shader_draw_parameters", extStart, extEnd);
9929 #endif /* GL_ARB_shader_draw_parameters */
9930 #ifdef GL_ARB_shader_group_vote
9931 GLEW_ARB_shader_group_vote = _glewSearchExtension("GL_ARB_shader_group_vote", extStart, extEnd);
9932 #endif /* GL_ARB_shader_group_vote */
9933 #ifdef GL_ARB_shader_image_load_store
9934 GLEW_ARB_shader_image_load_store = _glewSearchExtension("GL_ARB_shader_image_load_store", extStart, extEnd);
9935 if (glewExperimental || GLEW_ARB_shader_image_load_store) GLEW_ARB_shader_image_load_store = !_glewInit_GL_ARB_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT);
9936 #endif /* GL_ARB_shader_image_load_store */
9937 #ifdef GL_ARB_shader_image_size
9938 GLEW_ARB_shader_image_size = _glewSearchExtension("GL_ARB_shader_image_size", extStart, extEnd);
9939 #endif /* GL_ARB_shader_image_size */
9940 #ifdef GL_ARB_shader_objects
9941 GLEW_ARB_shader_objects = _glewSearchExtension("GL_ARB_shader_objects", extStart, extEnd);
9942 if (glewExperimental || GLEW_ARB_shader_objects) GLEW_ARB_shader_objects = !_glewInit_GL_ARB_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT);
9943 #endif /* GL_ARB_shader_objects */
9944 #ifdef GL_ARB_shader_precision
9945 GLEW_ARB_shader_precision = _glewSearchExtension("GL_ARB_shader_precision", extStart, extEnd);
9946 #endif /* GL_ARB_shader_precision */
9947 #ifdef GL_ARB_shader_stencil_export
9948 GLEW_ARB_shader_stencil_export = _glewSearchExtension("GL_ARB_shader_stencil_export", extStart, extEnd);
9949 #endif /* GL_ARB_shader_stencil_export */
9950 #ifdef GL_ARB_shader_storage_buffer_object
9951 GLEW_ARB_shader_storage_buffer_object = _glewSearchExtension("GL_ARB_shader_storage_buffer_object", extStart, extEnd);
9952 if (glewExperimental || GLEW_ARB_shader_storage_buffer_object) GLEW_ARB_shader_storage_buffer_object = !_glewInit_GL_ARB_shader_storage_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
9953 #endif /* GL_ARB_shader_storage_buffer_object */
9954 #ifdef GL_ARB_shader_subroutine
9955 GLEW_ARB_shader_subroutine = _glewSearchExtension("GL_ARB_shader_subroutine", extStart, extEnd);
9956 if (glewExperimental || GLEW_ARB_shader_subroutine) GLEW_ARB_shader_subroutine = !_glewInit_GL_ARB_shader_subroutine(GLEW_CONTEXT_ARG_VAR_INIT);
9957 #endif /* GL_ARB_shader_subroutine */
9958 #ifdef GL_ARB_shader_texture_image_samples
9959 GLEW_ARB_shader_texture_image_samples = _glewSearchExtension("GL_ARB_shader_texture_image_samples", extStart, extEnd);
9960 #endif /* GL_ARB_shader_texture_image_samples */
9961 #ifdef GL_ARB_shader_texture_lod
9962 GLEW_ARB_shader_texture_lod = _glewSearchExtension("GL_ARB_shader_texture_lod", extStart, extEnd);
9963 #endif /* GL_ARB_shader_texture_lod */
9964 #ifdef GL_ARB_shader_viewport_layer_array
9965 GLEW_ARB_shader_viewport_layer_array = _glewSearchExtension("GL_ARB_shader_viewport_layer_array", extStart, extEnd);
9966 #endif /* GL_ARB_shader_viewport_layer_array */
9967 #ifdef GL_ARB_shading_language_100
9968 GLEW_ARB_shading_language_100 = _glewSearchExtension("GL_ARB_shading_language_100", extStart, extEnd);
9969 #endif /* GL_ARB_shading_language_100 */
9970 #ifdef GL_ARB_shading_language_420pack
9971 GLEW_ARB_shading_language_420pack = _glewSearchExtension("GL_ARB_shading_language_420pack", extStart, extEnd);
9972 #endif /* GL_ARB_shading_language_420pack */
9973 #ifdef GL_ARB_shading_language_include
9974 GLEW_ARB_shading_language_include = _glewSearchExtension("GL_ARB_shading_language_include", extStart, extEnd);
9975 if (glewExperimental || GLEW_ARB_shading_language_include) GLEW_ARB_shading_language_include = !_glewInit_GL_ARB_shading_language_include(GLEW_CONTEXT_ARG_VAR_INIT);
9976 #endif /* GL_ARB_shading_language_include */
9977 #ifdef GL_ARB_shading_language_packing
9978 GLEW_ARB_shading_language_packing = _glewSearchExtension("GL_ARB_shading_language_packing", extStart, extEnd);
9979 #endif /* GL_ARB_shading_language_packing */
9980 #ifdef GL_ARB_shadow
9981 GLEW_ARB_shadow = _glewSearchExtension("GL_ARB_shadow", extStart, extEnd);
9982 #endif /* GL_ARB_shadow */
9983 #ifdef GL_ARB_shadow_ambient
9984 GLEW_ARB_shadow_ambient = _glewSearchExtension("GL_ARB_shadow_ambient", extStart, extEnd);
9985 #endif /* GL_ARB_shadow_ambient */
9986 #ifdef GL_ARB_sparse_buffer
9987 GLEW_ARB_sparse_buffer = _glewSearchExtension("GL_ARB_sparse_buffer", extStart, extEnd);
9988 if (glewExperimental || GLEW_ARB_sparse_buffer) GLEW_ARB_sparse_buffer = !_glewInit_GL_ARB_sparse_buffer(GLEW_CONTEXT_ARG_VAR_INIT);
9989 #endif /* GL_ARB_sparse_buffer */
9990 #ifdef GL_ARB_sparse_texture
9991 GLEW_ARB_sparse_texture = _glewSearchExtension("GL_ARB_sparse_texture", extStart, extEnd);
9992 if (glewExperimental || GLEW_ARB_sparse_texture) GLEW_ARB_sparse_texture = !_glewInit_GL_ARB_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT);
9993 #endif /* GL_ARB_sparse_texture */
9994 #ifdef GL_ARB_sparse_texture2
9995 GLEW_ARB_sparse_texture2 = _glewSearchExtension("GL_ARB_sparse_texture2", extStart, extEnd);
9996 #endif /* GL_ARB_sparse_texture2 */
9997 #ifdef GL_ARB_sparse_texture_clamp
9998 GLEW_ARB_sparse_texture_clamp = _glewSearchExtension("GL_ARB_sparse_texture_clamp", extStart, extEnd);
9999 #endif /* GL_ARB_sparse_texture_clamp */
10000 #ifdef GL_ARB_stencil_texturing
10001 GLEW_ARB_stencil_texturing = _glewSearchExtension("GL_ARB_stencil_texturing", extStart, extEnd);
10002 #endif /* GL_ARB_stencil_texturing */
10003 #ifdef GL_ARB_sync
10004 GLEW_ARB_sync = _glewSearchExtension("GL_ARB_sync", extStart, extEnd);
10005 if (glewExperimental || GLEW_ARB_sync) GLEW_ARB_sync = !_glewInit_GL_ARB_sync(GLEW_CONTEXT_ARG_VAR_INIT);
10006 #endif /* GL_ARB_sync */
10007 #ifdef GL_ARB_tessellation_shader
10008 GLEW_ARB_tessellation_shader = _glewSearchExtension("GL_ARB_tessellation_shader", extStart, extEnd);
10009 if (glewExperimental || GLEW_ARB_tessellation_shader) GLEW_ARB_tessellation_shader = !_glewInit_GL_ARB_tessellation_shader(GLEW_CONTEXT_ARG_VAR_INIT);
10010 #endif /* GL_ARB_tessellation_shader */
10011 #ifdef GL_ARB_texture_barrier
10012 GLEW_ARB_texture_barrier = _glewSearchExtension("GL_ARB_texture_barrier", extStart, extEnd);
10013 if (glewExperimental || GLEW_ARB_texture_barrier) GLEW_ARB_texture_barrier = !_glewInit_GL_ARB_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT);
10014 #endif /* GL_ARB_texture_barrier */
10015 #ifdef GL_ARB_texture_border_clamp
10016 GLEW_ARB_texture_border_clamp = _glewSearchExtension("GL_ARB_texture_border_clamp", extStart, extEnd);
10017 #endif /* GL_ARB_texture_border_clamp */
10018 #ifdef GL_ARB_texture_buffer_object
10019 GLEW_ARB_texture_buffer_object = _glewSearchExtension("GL_ARB_texture_buffer_object", extStart, extEnd);
10020 if (glewExperimental || GLEW_ARB_texture_buffer_object) GLEW_ARB_texture_buffer_object = !_glewInit_GL_ARB_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
10021 #endif /* GL_ARB_texture_buffer_object */
10022 #ifdef GL_ARB_texture_buffer_object_rgb32
10023 GLEW_ARB_texture_buffer_object_rgb32 = _glewSearchExtension("GL_ARB_texture_buffer_object_rgb32", extStart, extEnd);
10024 #endif /* GL_ARB_texture_buffer_object_rgb32 */
10025 #ifdef GL_ARB_texture_buffer_range
10026 GLEW_ARB_texture_buffer_range = _glewSearchExtension("GL_ARB_texture_buffer_range", extStart, extEnd);
10027 if (glewExperimental || GLEW_ARB_texture_buffer_range) GLEW_ARB_texture_buffer_range = !_glewInit_GL_ARB_texture_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT);
10028 #endif /* GL_ARB_texture_buffer_range */
10029 #ifdef GL_ARB_texture_compression
10030 GLEW_ARB_texture_compression = _glewSearchExtension("GL_ARB_texture_compression", extStart, extEnd);
10031 if (glewExperimental || GLEW_ARB_texture_compression) GLEW_ARB_texture_compression = !_glewInit_GL_ARB_texture_compression(GLEW_CONTEXT_ARG_VAR_INIT);
10032 #endif /* GL_ARB_texture_compression */
10033 #ifdef GL_ARB_texture_compression_bptc
10034 GLEW_ARB_texture_compression_bptc = _glewSearchExtension("GL_ARB_texture_compression_bptc", extStart, extEnd);
10035 #endif /* GL_ARB_texture_compression_bptc */
10036 #ifdef GL_ARB_texture_compression_rgtc
10037 GLEW_ARB_texture_compression_rgtc = _glewSearchExtension("GL_ARB_texture_compression_rgtc", extStart, extEnd);
10038 #endif /* GL_ARB_texture_compression_rgtc */
10039 #ifdef GL_ARB_texture_cube_map
10040 GLEW_ARB_texture_cube_map = _glewSearchExtension("GL_ARB_texture_cube_map", extStart, extEnd);
10041 #endif /* GL_ARB_texture_cube_map */
10042 #ifdef GL_ARB_texture_cube_map_array
10043 GLEW_ARB_texture_cube_map_array = _glewSearchExtension("GL_ARB_texture_cube_map_array", extStart, extEnd);
10044 #endif /* GL_ARB_texture_cube_map_array */
10045 #ifdef GL_ARB_texture_env_add
10046 GLEW_ARB_texture_env_add = _glewSearchExtension("GL_ARB_texture_env_add", extStart, extEnd);
10047 #endif /* GL_ARB_texture_env_add */
10048 #ifdef GL_ARB_texture_env_combine
10049 GLEW_ARB_texture_env_combine = _glewSearchExtension("GL_ARB_texture_env_combine", extStart, extEnd);
10050 #endif /* GL_ARB_texture_env_combine */
10051 #ifdef GL_ARB_texture_env_crossbar
10052 GLEW_ARB_texture_env_crossbar = _glewSearchExtension("GL_ARB_texture_env_crossbar", extStart, extEnd);
10053 #endif /* GL_ARB_texture_env_crossbar */
10054 #ifdef GL_ARB_texture_env_dot3
10055 GLEW_ARB_texture_env_dot3 = _glewSearchExtension("GL_ARB_texture_env_dot3", extStart, extEnd);
10056 #endif /* GL_ARB_texture_env_dot3 */
10057 #ifdef GL_ARB_texture_filter_minmax
10058 GLEW_ARB_texture_filter_minmax = _glewSearchExtension("GL_ARB_texture_filter_minmax", extStart, extEnd);
10059 #endif /* GL_ARB_texture_filter_minmax */
10060 #ifdef GL_ARB_texture_float
10061 GLEW_ARB_texture_float = _glewSearchExtension("GL_ARB_texture_float", extStart, extEnd);
10062 #endif /* GL_ARB_texture_float */
10063 #ifdef GL_ARB_texture_gather
10064 GLEW_ARB_texture_gather = _glewSearchExtension("GL_ARB_texture_gather", extStart, extEnd);
10065 #endif /* GL_ARB_texture_gather */
10066 #ifdef GL_ARB_texture_mirror_clamp_to_edge
10067 GLEW_ARB_texture_mirror_clamp_to_edge = _glewSearchExtension("GL_ARB_texture_mirror_clamp_to_edge", extStart, extEnd);
10068 #endif /* GL_ARB_texture_mirror_clamp_to_edge */
10069 #ifdef GL_ARB_texture_mirrored_repeat
10070 GLEW_ARB_texture_mirrored_repeat = _glewSearchExtension("GL_ARB_texture_mirrored_repeat", extStart, extEnd);
10071 #endif /* GL_ARB_texture_mirrored_repeat */
10072 #ifdef GL_ARB_texture_multisample
10073 GLEW_ARB_texture_multisample = _glewSearchExtension("GL_ARB_texture_multisample", extStart, extEnd);
10074 if (glewExperimental || GLEW_ARB_texture_multisample) GLEW_ARB_texture_multisample = !_glewInit_GL_ARB_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
10075 #endif /* GL_ARB_texture_multisample */
10076 #ifdef GL_ARB_texture_non_power_of_two
10077 GLEW_ARB_texture_non_power_of_two = _glewSearchExtension("GL_ARB_texture_non_power_of_two", extStart, extEnd);
10078 #endif /* GL_ARB_texture_non_power_of_two */
10079 #ifdef GL_ARB_texture_query_levels
10080 GLEW_ARB_texture_query_levels = _glewSearchExtension("GL_ARB_texture_query_levels", extStart, extEnd);
10081 #endif /* GL_ARB_texture_query_levels */
10082 #ifdef GL_ARB_texture_query_lod
10083 GLEW_ARB_texture_query_lod = _glewSearchExtension("GL_ARB_texture_query_lod", extStart, extEnd);
10084 #endif /* GL_ARB_texture_query_lod */
10085 #ifdef GL_ARB_texture_rectangle
10086 GLEW_ARB_texture_rectangle = _glewSearchExtension("GL_ARB_texture_rectangle", extStart, extEnd);
10087 #endif /* GL_ARB_texture_rectangle */
10088 #ifdef GL_ARB_texture_rg
10089 GLEW_ARB_texture_rg = _glewSearchExtension("GL_ARB_texture_rg", extStart, extEnd);
10090 #endif /* GL_ARB_texture_rg */
10091 #ifdef GL_ARB_texture_rgb10_a2ui
10092 GLEW_ARB_texture_rgb10_a2ui = _glewSearchExtension("GL_ARB_texture_rgb10_a2ui", extStart, extEnd);
10093 #endif /* GL_ARB_texture_rgb10_a2ui */
10094 #ifdef GL_ARB_texture_stencil8
10095 GLEW_ARB_texture_stencil8 = _glewSearchExtension("GL_ARB_texture_stencil8", extStart, extEnd);
10096 #endif /* GL_ARB_texture_stencil8 */
10097 #ifdef GL_ARB_texture_storage
10098 GLEW_ARB_texture_storage = _glewSearchExtension("GL_ARB_texture_storage", extStart, extEnd);
10099 if (glewExperimental || GLEW_ARB_texture_storage) GLEW_ARB_texture_storage = !_glewInit_GL_ARB_texture_storage(GLEW_CONTEXT_ARG_VAR_INIT);
10100 #endif /* GL_ARB_texture_storage */
10101 #ifdef GL_ARB_texture_storage_multisample
10102 GLEW_ARB_texture_storage_multisample = _glewSearchExtension("GL_ARB_texture_storage_multisample", extStart, extEnd);
10103 if (glewExperimental || GLEW_ARB_texture_storage_multisample) GLEW_ARB_texture_storage_multisample = !_glewInit_GL_ARB_texture_storage_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
10104 #endif /* GL_ARB_texture_storage_multisample */
10105 #ifdef GL_ARB_texture_swizzle
10106 GLEW_ARB_texture_swizzle = _glewSearchExtension("GL_ARB_texture_swizzle", extStart, extEnd);
10107 #endif /* GL_ARB_texture_swizzle */
10108 #ifdef GL_ARB_texture_view
10109 GLEW_ARB_texture_view = _glewSearchExtension("GL_ARB_texture_view", extStart, extEnd);
10110 if (glewExperimental || GLEW_ARB_texture_view) GLEW_ARB_texture_view = !_glewInit_GL_ARB_texture_view(GLEW_CONTEXT_ARG_VAR_INIT);
10111 #endif /* GL_ARB_texture_view */
10112 #ifdef GL_ARB_timer_query
10113 GLEW_ARB_timer_query = _glewSearchExtension("GL_ARB_timer_query", extStart, extEnd);
10114 if (glewExperimental || GLEW_ARB_timer_query) GLEW_ARB_timer_query = !_glewInit_GL_ARB_timer_query(GLEW_CONTEXT_ARG_VAR_INIT);
10115 #endif /* GL_ARB_timer_query */
10116 #ifdef GL_ARB_transform_feedback2
10117 GLEW_ARB_transform_feedback2 = _glewSearchExtension("GL_ARB_transform_feedback2", extStart, extEnd);
10118 if (glewExperimental || GLEW_ARB_transform_feedback2) GLEW_ARB_transform_feedback2 = !_glewInit_GL_ARB_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT);
10119 #endif /* GL_ARB_transform_feedback2 */
10120 #ifdef GL_ARB_transform_feedback3
10121 GLEW_ARB_transform_feedback3 = _glewSearchExtension("GL_ARB_transform_feedback3", extStart, extEnd);
10122 if (glewExperimental || GLEW_ARB_transform_feedback3) GLEW_ARB_transform_feedback3 = !_glewInit_GL_ARB_transform_feedback3(GLEW_CONTEXT_ARG_VAR_INIT);
10123 #endif /* GL_ARB_transform_feedback3 */
10124 #ifdef GL_ARB_transform_feedback_instanced
10125 GLEW_ARB_transform_feedback_instanced = _glewSearchExtension("GL_ARB_transform_feedback_instanced", extStart, extEnd);
10126 if (glewExperimental || GLEW_ARB_transform_feedback_instanced) GLEW_ARB_transform_feedback_instanced = !_glewInit_GL_ARB_transform_feedback_instanced(GLEW_CONTEXT_ARG_VAR_INIT);
10127 #endif /* GL_ARB_transform_feedback_instanced */
10128 #ifdef GL_ARB_transform_feedback_overflow_query
10129 GLEW_ARB_transform_feedback_overflow_query = _glewSearchExtension("GL_ARB_transform_feedback_overflow_query", extStart, extEnd);
10130 #endif /* GL_ARB_transform_feedback_overflow_query */
10131 #ifdef GL_ARB_transpose_matrix
10132 GLEW_ARB_transpose_matrix = _glewSearchExtension("GL_ARB_transpose_matrix", extStart, extEnd);
10133 if (glewExperimental || GLEW_ARB_transpose_matrix) GLEW_ARB_transpose_matrix = !_glewInit_GL_ARB_transpose_matrix(GLEW_CONTEXT_ARG_VAR_INIT);
10134 #endif /* GL_ARB_transpose_matrix */
10135 #ifdef GL_ARB_uniform_buffer_object
10136 GLEW_ARB_uniform_buffer_object = _glewSearchExtension("GL_ARB_uniform_buffer_object", extStart, extEnd);
10137 if (glewExperimental || GLEW_ARB_uniform_buffer_object) GLEW_ARB_uniform_buffer_object = !_glewInit_GL_ARB_uniform_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
10138 #endif /* GL_ARB_uniform_buffer_object */
10139 #ifdef GL_ARB_vertex_array_bgra
10140 GLEW_ARB_vertex_array_bgra = _glewSearchExtension("GL_ARB_vertex_array_bgra", extStart, extEnd);
10141 #endif /* GL_ARB_vertex_array_bgra */
10142 #ifdef GL_ARB_vertex_array_object
10143 GLEW_ARB_vertex_array_object = _glewSearchExtension("GL_ARB_vertex_array_object", extStart, extEnd);
10144 if (glewExperimental || GLEW_ARB_vertex_array_object) GLEW_ARB_vertex_array_object = !_glewInit_GL_ARB_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT);
10145 #endif /* GL_ARB_vertex_array_object */
10146 #ifdef GL_ARB_vertex_attrib_64bit
10147 GLEW_ARB_vertex_attrib_64bit = _glewSearchExtension("GL_ARB_vertex_attrib_64bit", extStart, extEnd);
10148 if (glewExperimental || GLEW_ARB_vertex_attrib_64bit) GLEW_ARB_vertex_attrib_64bit = !_glewInit_GL_ARB_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT);
10149 #endif /* GL_ARB_vertex_attrib_64bit */
10150 #ifdef GL_ARB_vertex_attrib_binding
10151 GLEW_ARB_vertex_attrib_binding = _glewSearchExtension("GL_ARB_vertex_attrib_binding", extStart, extEnd);
10152 if (glewExperimental || GLEW_ARB_vertex_attrib_binding) GLEW_ARB_vertex_attrib_binding = !_glewInit_GL_ARB_vertex_attrib_binding(GLEW_CONTEXT_ARG_VAR_INIT);
10153 #endif /* GL_ARB_vertex_attrib_binding */
10154 #ifdef GL_ARB_vertex_blend
10155 GLEW_ARB_vertex_blend = _glewSearchExtension("GL_ARB_vertex_blend", extStart, extEnd);
10156 if (glewExperimental || GLEW_ARB_vertex_blend) GLEW_ARB_vertex_blend = !_glewInit_GL_ARB_vertex_blend(GLEW_CONTEXT_ARG_VAR_INIT);
10157 #endif /* GL_ARB_vertex_blend */
10158 #ifdef GL_ARB_vertex_buffer_object
10159 GLEW_ARB_vertex_buffer_object = _glewSearchExtension("GL_ARB_vertex_buffer_object", extStart, extEnd);
10160 if (glewExperimental || GLEW_ARB_vertex_buffer_object) GLEW_ARB_vertex_buffer_object = !_glewInit_GL_ARB_vertex_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
10161 #endif /* GL_ARB_vertex_buffer_object */
10162 #ifdef GL_ARB_vertex_program
10163 GLEW_ARB_vertex_program = _glewSearchExtension("GL_ARB_vertex_program", extStart, extEnd);
10164 if (glewExperimental || GLEW_ARB_vertex_program) GLEW_ARB_vertex_program = !_glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT);
10165 #endif /* GL_ARB_vertex_program */
10166 #ifdef GL_ARB_vertex_shader
10167 GLEW_ARB_vertex_shader = _glewSearchExtension("GL_ARB_vertex_shader", extStart, extEnd);
10168 if (glewExperimental || GLEW_ARB_vertex_shader) { GLEW_ARB_vertex_shader = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); _glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); }
10169 #endif /* GL_ARB_vertex_shader */
10170 #ifdef GL_ARB_vertex_type_10f_11f_11f_rev
10171 GLEW_ARB_vertex_type_10f_11f_11f_rev = _glewSearchExtension("GL_ARB_vertex_type_10f_11f_11f_rev", extStart, extEnd);
10172 #endif /* GL_ARB_vertex_type_10f_11f_11f_rev */
10173 #ifdef GL_ARB_vertex_type_2_10_10_10_rev
10174 GLEW_ARB_vertex_type_2_10_10_10_rev = _glewSearchExtension("GL_ARB_vertex_type_2_10_10_10_rev", extStart, extEnd);
10175 if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) GLEW_ARB_vertex_type_2_10_10_10_rev = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(GLEW_CONTEXT_ARG_VAR_INIT);
10176 #endif /* GL_ARB_vertex_type_2_10_10_10_rev */
10177 #ifdef GL_ARB_viewport_array
10178 GLEW_ARB_viewport_array = _glewSearchExtension("GL_ARB_viewport_array", extStart, extEnd);
10179 if (glewExperimental || GLEW_ARB_viewport_array) GLEW_ARB_viewport_array = !_glewInit_GL_ARB_viewport_array(GLEW_CONTEXT_ARG_VAR_INIT);
10180 #endif /* GL_ARB_viewport_array */
10181 #ifdef GL_ARB_window_pos
10182 GLEW_ARB_window_pos = _glewSearchExtension("GL_ARB_window_pos", extStart, extEnd);
10183 if (glewExperimental || GLEW_ARB_window_pos) GLEW_ARB_window_pos = !_glewInit_GL_ARB_window_pos(GLEW_CONTEXT_ARG_VAR_INIT);
10184 #endif /* GL_ARB_window_pos */
10185 #ifdef GL_ATIX_point_sprites
10186 GLEW_ATIX_point_sprites = _glewSearchExtension("GL_ATIX_point_sprites", extStart, extEnd);
10187 #endif /* GL_ATIX_point_sprites */
10188 #ifdef GL_ATIX_texture_env_combine3
10189 GLEW_ATIX_texture_env_combine3 = _glewSearchExtension("GL_ATIX_texture_env_combine3", extStart, extEnd);
10190 #endif /* GL_ATIX_texture_env_combine3 */
10191 #ifdef GL_ATIX_texture_env_route
10192 GLEW_ATIX_texture_env_route = _glewSearchExtension("GL_ATIX_texture_env_route", extStart, extEnd);
10193 #endif /* GL_ATIX_texture_env_route */
10194 #ifdef GL_ATIX_vertex_shader_output_point_size
10195 GLEW_ATIX_vertex_shader_output_point_size = _glewSearchExtension("GL_ATIX_vertex_shader_output_point_size", extStart, extEnd);
10196 #endif /* GL_ATIX_vertex_shader_output_point_size */
10197 #ifdef GL_ATI_draw_buffers
10198 GLEW_ATI_draw_buffers = _glewSearchExtension("GL_ATI_draw_buffers", extStart, extEnd);
10199 if (glewExperimental || GLEW_ATI_draw_buffers) GLEW_ATI_draw_buffers = !_glewInit_GL_ATI_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT);
10200 #endif /* GL_ATI_draw_buffers */
10201 #ifdef GL_ATI_element_array
10202 GLEW_ATI_element_array = _glewSearchExtension("GL_ATI_element_array", extStart, extEnd);
10203 if (glewExperimental || GLEW_ATI_element_array) GLEW_ATI_element_array = !_glewInit_GL_ATI_element_array(GLEW_CONTEXT_ARG_VAR_INIT);
10204 #endif /* GL_ATI_element_array */
10205 #ifdef GL_ATI_envmap_bumpmap
10206 GLEW_ATI_envmap_bumpmap = _glewSearchExtension("GL_ATI_envmap_bumpmap", extStart, extEnd);
10207 if (glewExperimental || GLEW_ATI_envmap_bumpmap) GLEW_ATI_envmap_bumpmap = !_glewInit_GL_ATI_envmap_bumpmap(GLEW_CONTEXT_ARG_VAR_INIT);
10208 #endif /* GL_ATI_envmap_bumpmap */
10209 #ifdef GL_ATI_fragment_shader
10210 GLEW_ATI_fragment_shader = _glewSearchExtension("GL_ATI_fragment_shader", extStart, extEnd);
10211 if (glewExperimental || GLEW_ATI_fragment_shader) GLEW_ATI_fragment_shader = !_glewInit_GL_ATI_fragment_shader(GLEW_CONTEXT_ARG_VAR_INIT);
10212 #endif /* GL_ATI_fragment_shader */
10213 #ifdef GL_ATI_map_object_buffer
10214 GLEW_ATI_map_object_buffer = _glewSearchExtension("GL_ATI_map_object_buffer", extStart, extEnd);
10215 if (glewExperimental || GLEW_ATI_map_object_buffer) GLEW_ATI_map_object_buffer = !_glewInit_GL_ATI_map_object_buffer(GLEW_CONTEXT_ARG_VAR_INIT);
10216 #endif /* GL_ATI_map_object_buffer */
10217 #ifdef GL_ATI_meminfo
10218 GLEW_ATI_meminfo = _glewSearchExtension("GL_ATI_meminfo", extStart, extEnd);
10219 #endif /* GL_ATI_meminfo */
10220 #ifdef GL_ATI_pn_triangles
10221 GLEW_ATI_pn_triangles = _glewSearchExtension("GL_ATI_pn_triangles", extStart, extEnd);
10222 if (glewExperimental || GLEW_ATI_pn_triangles) GLEW_ATI_pn_triangles = !_glewInit_GL_ATI_pn_triangles(GLEW_CONTEXT_ARG_VAR_INIT);
10223 #endif /* GL_ATI_pn_triangles */
10224 #ifdef GL_ATI_separate_stencil
10225 GLEW_ATI_separate_stencil = _glewSearchExtension("GL_ATI_separate_stencil", extStart, extEnd);
10226 if (glewExperimental || GLEW_ATI_separate_stencil) GLEW_ATI_separate_stencil = !_glewInit_GL_ATI_separate_stencil(GLEW_CONTEXT_ARG_VAR_INIT);
10227 #endif /* GL_ATI_separate_stencil */
10228 #ifdef GL_ATI_shader_texture_lod
10229 GLEW_ATI_shader_texture_lod = _glewSearchExtension("GL_ATI_shader_texture_lod", extStart, extEnd);
10230 #endif /* GL_ATI_shader_texture_lod */
10231 #ifdef GL_ATI_text_fragment_shader
10232 GLEW_ATI_text_fragment_shader = _glewSearchExtension("GL_ATI_text_fragment_shader", extStart, extEnd);
10233 #endif /* GL_ATI_text_fragment_shader */
10234 #ifdef GL_ATI_texture_compression_3dc
10235 GLEW_ATI_texture_compression_3dc = _glewSearchExtension("GL_ATI_texture_compression_3dc", extStart, extEnd);
10236 #endif /* GL_ATI_texture_compression_3dc */
10237 #ifdef GL_ATI_texture_env_combine3
10238 GLEW_ATI_texture_env_combine3 = _glewSearchExtension("GL_ATI_texture_env_combine3", extStart, extEnd);
10239 #endif /* GL_ATI_texture_env_combine3 */
10240 #ifdef GL_ATI_texture_float
10241 GLEW_ATI_texture_float = _glewSearchExtension("GL_ATI_texture_float", extStart, extEnd);
10242 #endif /* GL_ATI_texture_float */
10243 #ifdef GL_ATI_texture_mirror_once
10244 GLEW_ATI_texture_mirror_once = _glewSearchExtension("GL_ATI_texture_mirror_once", extStart, extEnd);
10245 #endif /* GL_ATI_texture_mirror_once */
10246 #ifdef GL_ATI_vertex_array_object
10247 GLEW_ATI_vertex_array_object = _glewSearchExtension("GL_ATI_vertex_array_object", extStart, extEnd);
10248 if (glewExperimental || GLEW_ATI_vertex_array_object) GLEW_ATI_vertex_array_object = !_glewInit_GL_ATI_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT);
10249 #endif /* GL_ATI_vertex_array_object */
10250 #ifdef GL_ATI_vertex_attrib_array_object
10251 GLEW_ATI_vertex_attrib_array_object = _glewSearchExtension("GL_ATI_vertex_attrib_array_object", extStart, extEnd);
10252 if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) GLEW_ATI_vertex_attrib_array_object = !_glewInit_GL_ATI_vertex_attrib_array_object(GLEW_CONTEXT_ARG_VAR_INIT);
10253 #endif /* GL_ATI_vertex_attrib_array_object */
10254 #ifdef GL_ATI_vertex_streams
10255 GLEW_ATI_vertex_streams = _glewSearchExtension("GL_ATI_vertex_streams", extStart, extEnd);
10256 if (glewExperimental || GLEW_ATI_vertex_streams) GLEW_ATI_vertex_streams = !_glewInit_GL_ATI_vertex_streams(GLEW_CONTEXT_ARG_VAR_INIT);
10257 #endif /* GL_ATI_vertex_streams */
10258 #ifdef GL_EXT_422_pixels
10259 GLEW_EXT_422_pixels = _glewSearchExtension("GL_EXT_422_pixels", extStart, extEnd);
10260 #endif /* GL_EXT_422_pixels */
10261 #ifdef GL_EXT_Cg_shader
10262 GLEW_EXT_Cg_shader = _glewSearchExtension("GL_EXT_Cg_shader", extStart, extEnd);
10263 #endif /* GL_EXT_Cg_shader */
10264 #ifdef GL_EXT_abgr
10265 GLEW_EXT_abgr = _glewSearchExtension("GL_EXT_abgr", extStart, extEnd);
10266 #endif /* GL_EXT_abgr */
10267 #ifdef GL_EXT_bgra
10268 GLEW_EXT_bgra = _glewSearchExtension("GL_EXT_bgra", extStart, extEnd);
10269 #endif /* GL_EXT_bgra */
10270 #ifdef GL_EXT_bindable_uniform
10271 GLEW_EXT_bindable_uniform = _glewSearchExtension("GL_EXT_bindable_uniform", extStart, extEnd);
10272 if (glewExperimental || GLEW_EXT_bindable_uniform) GLEW_EXT_bindable_uniform = !_glewInit_GL_EXT_bindable_uniform(GLEW_CONTEXT_ARG_VAR_INIT);
10273 #endif /* GL_EXT_bindable_uniform */
10274 #ifdef GL_EXT_blend_color
10275 GLEW_EXT_blend_color = _glewSearchExtension("GL_EXT_blend_color", extStart, extEnd);
10276 if (glewExperimental || GLEW_EXT_blend_color) GLEW_EXT_blend_color = !_glewInit_GL_EXT_blend_color(GLEW_CONTEXT_ARG_VAR_INIT);
10277 #endif /* GL_EXT_blend_color */
10278 #ifdef GL_EXT_blend_equation_separate
10279 GLEW_EXT_blend_equation_separate = _glewSearchExtension("GL_EXT_blend_equation_separate", extStart, extEnd);
10280 if (glewExperimental || GLEW_EXT_blend_equation_separate) GLEW_EXT_blend_equation_separate = !_glewInit_GL_EXT_blend_equation_separate(GLEW_CONTEXT_ARG_VAR_INIT);
10281 #endif /* GL_EXT_blend_equation_separate */
10282 #ifdef GL_EXT_blend_func_separate
10283 GLEW_EXT_blend_func_separate = _glewSearchExtension("GL_EXT_blend_func_separate", extStart, extEnd);
10284 if (glewExperimental || GLEW_EXT_blend_func_separate) GLEW_EXT_blend_func_separate = !_glewInit_GL_EXT_blend_func_separate(GLEW_CONTEXT_ARG_VAR_INIT);
10285 #endif /* GL_EXT_blend_func_separate */
10286 #ifdef GL_EXT_blend_logic_op
10287 GLEW_EXT_blend_logic_op = _glewSearchExtension("GL_EXT_blend_logic_op", extStart, extEnd);
10288 #endif /* GL_EXT_blend_logic_op */
10289 #ifdef GL_EXT_blend_minmax
10290 GLEW_EXT_blend_minmax = _glewSearchExtension("GL_EXT_blend_minmax", extStart, extEnd);
10291 if (glewExperimental || GLEW_EXT_blend_minmax) GLEW_EXT_blend_minmax = !_glewInit_GL_EXT_blend_minmax(GLEW_CONTEXT_ARG_VAR_INIT);
10292 #endif /* GL_EXT_blend_minmax */
10293 #ifdef GL_EXT_blend_subtract
10294 GLEW_EXT_blend_subtract = _glewSearchExtension("GL_EXT_blend_subtract", extStart, extEnd);
10295 #endif /* GL_EXT_blend_subtract */
10296 #ifdef GL_EXT_clip_volume_hint
10297 GLEW_EXT_clip_volume_hint = _glewSearchExtension("GL_EXT_clip_volume_hint", extStart, extEnd);
10298 #endif /* GL_EXT_clip_volume_hint */
10299 #ifdef GL_EXT_cmyka
10300 GLEW_EXT_cmyka = _glewSearchExtension("GL_EXT_cmyka", extStart, extEnd);
10301 #endif /* GL_EXT_cmyka */
10302 #ifdef GL_EXT_color_subtable
10303 GLEW_EXT_color_subtable = _glewSearchExtension("GL_EXT_color_subtable", extStart, extEnd);
10304 if (glewExperimental || GLEW_EXT_color_subtable) GLEW_EXT_color_subtable = !_glewInit_GL_EXT_color_subtable(GLEW_CONTEXT_ARG_VAR_INIT);
10305 #endif /* GL_EXT_color_subtable */
10306 #ifdef GL_EXT_compiled_vertex_array
10307 GLEW_EXT_compiled_vertex_array = _glewSearchExtension("GL_EXT_compiled_vertex_array", extStart, extEnd);
10308 if (glewExperimental || GLEW_EXT_compiled_vertex_array) GLEW_EXT_compiled_vertex_array = !_glewInit_GL_EXT_compiled_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT);
10309 #endif /* GL_EXT_compiled_vertex_array */
10310 #ifdef GL_EXT_convolution
10311 GLEW_EXT_convolution = _glewSearchExtension("GL_EXT_convolution", extStart, extEnd);
10312 if (glewExperimental || GLEW_EXT_convolution) GLEW_EXT_convolution = !_glewInit_GL_EXT_convolution(GLEW_CONTEXT_ARG_VAR_INIT);
10313 #endif /* GL_EXT_convolution */
10314 #ifdef GL_EXT_coordinate_frame
10315 GLEW_EXT_coordinate_frame = _glewSearchExtension("GL_EXT_coordinate_frame", extStart, extEnd);
10316 if (glewExperimental || GLEW_EXT_coordinate_frame) GLEW_EXT_coordinate_frame = !_glewInit_GL_EXT_coordinate_frame(GLEW_CONTEXT_ARG_VAR_INIT);
10317 #endif /* GL_EXT_coordinate_frame */
10318 #ifdef GL_EXT_copy_texture
10319 GLEW_EXT_copy_texture = _glewSearchExtension("GL_EXT_copy_texture", extStart, extEnd);
10320 if (glewExperimental || GLEW_EXT_copy_texture) GLEW_EXT_copy_texture = !_glewInit_GL_EXT_copy_texture(GLEW_CONTEXT_ARG_VAR_INIT);
10321 #endif /* GL_EXT_copy_texture */
10322 #ifdef GL_EXT_cull_vertex
10323 GLEW_EXT_cull_vertex = _glewSearchExtension("GL_EXT_cull_vertex", extStart, extEnd);
10324 if (glewExperimental || GLEW_EXT_cull_vertex) GLEW_EXT_cull_vertex = !_glewInit_GL_EXT_cull_vertex(GLEW_CONTEXT_ARG_VAR_INIT);
10325 #endif /* GL_EXT_cull_vertex */
10326 #ifdef GL_EXT_debug_label
10327 GLEW_EXT_debug_label = _glewSearchExtension("GL_EXT_debug_label", extStart, extEnd);
10328 if (glewExperimental || GLEW_EXT_debug_label) GLEW_EXT_debug_label = !_glewInit_GL_EXT_debug_label(GLEW_CONTEXT_ARG_VAR_INIT);
10329 #endif /* GL_EXT_debug_label */
10330 #ifdef GL_EXT_debug_marker
10331 GLEW_EXT_debug_marker = _glewSearchExtension("GL_EXT_debug_marker", extStart, extEnd);
10332 if (glewExperimental || GLEW_EXT_debug_marker) GLEW_EXT_debug_marker = !_glewInit_GL_EXT_debug_marker(GLEW_CONTEXT_ARG_VAR_INIT);
10333 #endif /* GL_EXT_debug_marker */
10334 #ifdef GL_EXT_depth_bounds_test
10335 GLEW_EXT_depth_bounds_test = _glewSearchExtension("GL_EXT_depth_bounds_test", extStart, extEnd);
10336 if (glewExperimental || GLEW_EXT_depth_bounds_test) GLEW_EXT_depth_bounds_test = !_glewInit_GL_EXT_depth_bounds_test(GLEW_CONTEXT_ARG_VAR_INIT);
10337 #endif /* GL_EXT_depth_bounds_test */
10338 #ifdef GL_EXT_direct_state_access
10339 GLEW_EXT_direct_state_access = _glewSearchExtension("GL_EXT_direct_state_access", extStart, extEnd);
10340 if (glewExperimental || GLEW_EXT_direct_state_access) GLEW_EXT_direct_state_access = !_glewInit_GL_EXT_direct_state_access(GLEW_CONTEXT_ARG_VAR_INIT);
10341 #endif /* GL_EXT_direct_state_access */
10342 #ifdef GL_EXT_draw_buffers2
10343 GLEW_EXT_draw_buffers2 = _glewSearchExtension("GL_EXT_draw_buffers2", extStart, extEnd);
10344 if (glewExperimental || GLEW_EXT_draw_buffers2) GLEW_EXT_draw_buffers2 = !_glewInit_GL_EXT_draw_buffers2(GLEW_CONTEXT_ARG_VAR_INIT);
10345 #endif /* GL_EXT_draw_buffers2 */
10346 #ifdef GL_EXT_draw_instanced
10347 GLEW_EXT_draw_instanced = _glewSearchExtension("GL_EXT_draw_instanced", extStart, extEnd);
10348 if (glewExperimental || GLEW_EXT_draw_instanced) GLEW_EXT_draw_instanced = !_glewInit_GL_EXT_draw_instanced(GLEW_CONTEXT_ARG_VAR_INIT);
10349 #endif /* GL_EXT_draw_instanced */
10350 #ifdef GL_EXT_draw_range_elements
10351 GLEW_EXT_draw_range_elements = _glewSearchExtension("GL_EXT_draw_range_elements", extStart, extEnd);
10352 if (glewExperimental || GLEW_EXT_draw_range_elements) GLEW_EXT_draw_range_elements = !_glewInit_GL_EXT_draw_range_elements(GLEW_CONTEXT_ARG_VAR_INIT);
10353 #endif /* GL_EXT_draw_range_elements */
10354 #ifdef GL_EXT_fog_coord
10355 GLEW_EXT_fog_coord = _glewSearchExtension("GL_EXT_fog_coord", extStart, extEnd);
10356 if (glewExperimental || GLEW_EXT_fog_coord) GLEW_EXT_fog_coord = !_glewInit_GL_EXT_fog_coord(GLEW_CONTEXT_ARG_VAR_INIT);
10357 #endif /* GL_EXT_fog_coord */
10358 #ifdef GL_EXT_fragment_lighting
10359 GLEW_EXT_fragment_lighting = _glewSearchExtension("GL_EXT_fragment_lighting", extStart, extEnd);
10360 if (glewExperimental || GLEW_EXT_fragment_lighting) GLEW_EXT_fragment_lighting = !_glewInit_GL_EXT_fragment_lighting(GLEW_CONTEXT_ARG_VAR_INIT);
10361 #endif /* GL_EXT_fragment_lighting */
10362 #ifdef GL_EXT_framebuffer_blit
10363 GLEW_EXT_framebuffer_blit = _glewSearchExtension("GL_EXT_framebuffer_blit", extStart, extEnd);
10364 if (glewExperimental || GLEW_EXT_framebuffer_blit) GLEW_EXT_framebuffer_blit = !_glewInit_GL_EXT_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT);
10365 #endif /* GL_EXT_framebuffer_blit */
10366 #ifdef GL_EXT_framebuffer_multisample
10367 GLEW_EXT_framebuffer_multisample = _glewSearchExtension("GL_EXT_framebuffer_multisample", extStart, extEnd);
10368 if (glewExperimental || GLEW_EXT_framebuffer_multisample) GLEW_EXT_framebuffer_multisample = !_glewInit_GL_EXT_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
10369 #endif /* GL_EXT_framebuffer_multisample */
10370 #ifdef GL_EXT_framebuffer_multisample_blit_scaled
10371 GLEW_EXT_framebuffer_multisample_blit_scaled = _glewSearchExtension("GL_EXT_framebuffer_multisample_blit_scaled", extStart, extEnd);
10372 #endif /* GL_EXT_framebuffer_multisample_blit_scaled */
10373 #ifdef GL_EXT_framebuffer_object
10374 GLEW_EXT_framebuffer_object = _glewSearchExtension("GL_EXT_framebuffer_object", extStart, extEnd);
10375 if (glewExperimental || GLEW_EXT_framebuffer_object) GLEW_EXT_framebuffer_object = !_glewInit_GL_EXT_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
10376 #endif /* GL_EXT_framebuffer_object */
10377 #ifdef GL_EXT_framebuffer_sRGB
10378 GLEW_EXT_framebuffer_sRGB = _glewSearchExtension("GL_EXT_framebuffer_sRGB", extStart, extEnd);
10379 #endif /* GL_EXT_framebuffer_sRGB */
10380 #ifdef GL_EXT_geometry_shader4
10381 GLEW_EXT_geometry_shader4 = _glewSearchExtension("GL_EXT_geometry_shader4", extStart, extEnd);
10382 if (glewExperimental || GLEW_EXT_geometry_shader4) GLEW_EXT_geometry_shader4 = !_glewInit_GL_EXT_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT);
10383 #endif /* GL_EXT_geometry_shader4 */
10384 #ifdef GL_EXT_gpu_program_parameters
10385 GLEW_EXT_gpu_program_parameters = _glewSearchExtension("GL_EXT_gpu_program_parameters", extStart, extEnd);
10386 if (glewExperimental || GLEW_EXT_gpu_program_parameters) GLEW_EXT_gpu_program_parameters = !_glewInit_GL_EXT_gpu_program_parameters(GLEW_CONTEXT_ARG_VAR_INIT);
10387 #endif /* GL_EXT_gpu_program_parameters */
10388 #ifdef GL_EXT_gpu_shader4
10389 GLEW_EXT_gpu_shader4 = _glewSearchExtension("GL_EXT_gpu_shader4", extStart, extEnd);
10390 if (glewExperimental || GLEW_EXT_gpu_shader4) GLEW_EXT_gpu_shader4 = !_glewInit_GL_EXT_gpu_shader4(GLEW_CONTEXT_ARG_VAR_INIT);
10391 #endif /* GL_EXT_gpu_shader4 */
10392 #ifdef GL_EXT_histogram
10393 GLEW_EXT_histogram = _glewSearchExtension("GL_EXT_histogram", extStart, extEnd);
10394 if (glewExperimental || GLEW_EXT_histogram) GLEW_EXT_histogram = !_glewInit_GL_EXT_histogram(GLEW_CONTEXT_ARG_VAR_INIT);
10395 #endif /* GL_EXT_histogram */
10396 #ifdef GL_EXT_index_array_formats
10397 GLEW_EXT_index_array_formats = _glewSearchExtension("GL_EXT_index_array_formats", extStart, extEnd);
10398 #endif /* GL_EXT_index_array_formats */
10399 #ifdef GL_EXT_index_func
10400 GLEW_EXT_index_func = _glewSearchExtension("GL_EXT_index_func", extStart, extEnd);
10401 if (glewExperimental || GLEW_EXT_index_func) GLEW_EXT_index_func = !_glewInit_GL_EXT_index_func(GLEW_CONTEXT_ARG_VAR_INIT);
10402 #endif /* GL_EXT_index_func */
10403 #ifdef GL_EXT_index_material
10404 GLEW_EXT_index_material = _glewSearchExtension("GL_EXT_index_material", extStart, extEnd);
10405 if (glewExperimental || GLEW_EXT_index_material) GLEW_EXT_index_material = !_glewInit_GL_EXT_index_material(GLEW_CONTEXT_ARG_VAR_INIT);
10406 #endif /* GL_EXT_index_material */
10407 #ifdef GL_EXT_index_texture
10408 GLEW_EXT_index_texture = _glewSearchExtension("GL_EXT_index_texture", extStart, extEnd);
10409 #endif /* GL_EXT_index_texture */
10410 #ifdef GL_EXT_light_texture
10411 GLEW_EXT_light_texture = _glewSearchExtension("GL_EXT_light_texture", extStart, extEnd);
10412 if (glewExperimental || GLEW_EXT_light_texture) GLEW_EXT_light_texture = !_glewInit_GL_EXT_light_texture(GLEW_CONTEXT_ARG_VAR_INIT);
10413 #endif /* GL_EXT_light_texture */
10414 #ifdef GL_EXT_misc_attribute
10415 GLEW_EXT_misc_attribute = _glewSearchExtension("GL_EXT_misc_attribute", extStart, extEnd);
10416 #endif /* GL_EXT_misc_attribute */
10417 #ifdef GL_EXT_multi_draw_arrays
10418 GLEW_EXT_multi_draw_arrays = _glewSearchExtension("GL_EXT_multi_draw_arrays", extStart, extEnd);
10419 if (glewExperimental || GLEW_EXT_multi_draw_arrays) GLEW_EXT_multi_draw_arrays = !_glewInit_GL_EXT_multi_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT);
10420 #endif /* GL_EXT_multi_draw_arrays */
10421 #ifdef GL_EXT_multisample
10422 GLEW_EXT_multisample = _glewSearchExtension("GL_EXT_multisample", extStart, extEnd);
10423 if (glewExperimental || GLEW_EXT_multisample) GLEW_EXT_multisample = !_glewInit_GL_EXT_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
10424 #endif /* GL_EXT_multisample */
10425 #ifdef GL_EXT_packed_depth_stencil
10426 GLEW_EXT_packed_depth_stencil = _glewSearchExtension("GL_EXT_packed_depth_stencil", extStart, extEnd);
10427 #endif /* GL_EXT_packed_depth_stencil */
10428 #ifdef GL_EXT_packed_float
10429 GLEW_EXT_packed_float = _glewSearchExtension("GL_EXT_packed_float", extStart, extEnd);
10430 #endif /* GL_EXT_packed_float */
10431 #ifdef GL_EXT_packed_pixels
10432 GLEW_EXT_packed_pixels = _glewSearchExtension("GL_EXT_packed_pixels", extStart, extEnd);
10433 #endif /* GL_EXT_packed_pixels */
10434 #ifdef GL_EXT_paletted_texture
10435 GLEW_EXT_paletted_texture = _glewSearchExtension("GL_EXT_paletted_texture", extStart, extEnd);
10436 if (glewExperimental || GLEW_EXT_paletted_texture) GLEW_EXT_paletted_texture = !_glewInit_GL_EXT_paletted_texture(GLEW_CONTEXT_ARG_VAR_INIT);
10437 #endif /* GL_EXT_paletted_texture */
10438 #ifdef GL_EXT_pixel_buffer_object
10439 GLEW_EXT_pixel_buffer_object = _glewSearchExtension("GL_EXT_pixel_buffer_object", extStart, extEnd);
10440 #endif /* GL_EXT_pixel_buffer_object */
10441 #ifdef GL_EXT_pixel_transform
10442 GLEW_EXT_pixel_transform = _glewSearchExtension("GL_EXT_pixel_transform", extStart, extEnd);
10443 if (glewExperimental || GLEW_EXT_pixel_transform) GLEW_EXT_pixel_transform = !_glewInit_GL_EXT_pixel_transform(GLEW_CONTEXT_ARG_VAR_INIT);
10444 #endif /* GL_EXT_pixel_transform */
10445 #ifdef GL_EXT_pixel_transform_color_table
10446 GLEW_EXT_pixel_transform_color_table = _glewSearchExtension("GL_EXT_pixel_transform_color_table", extStart, extEnd);
10447 #endif /* GL_EXT_pixel_transform_color_table */
10448 #ifdef GL_EXT_point_parameters
10449 GLEW_EXT_point_parameters = _glewSearchExtension("GL_EXT_point_parameters", extStart, extEnd);
10450 if (glewExperimental || GLEW_EXT_point_parameters) GLEW_EXT_point_parameters = !_glewInit_GL_EXT_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT);
10451 #endif /* GL_EXT_point_parameters */
10452 #ifdef GL_EXT_polygon_offset
10453 GLEW_EXT_polygon_offset = _glewSearchExtension("GL_EXT_polygon_offset", extStart, extEnd);
10454 if (glewExperimental || GLEW_EXT_polygon_offset) GLEW_EXT_polygon_offset = !_glewInit_GL_EXT_polygon_offset(GLEW_CONTEXT_ARG_VAR_INIT);
10455 #endif /* GL_EXT_polygon_offset */
10456 #ifdef GL_EXT_polygon_offset_clamp
10457 GLEW_EXT_polygon_offset_clamp = _glewSearchExtension("GL_EXT_polygon_offset_clamp", extStart, extEnd);
10458 if (glewExperimental || GLEW_EXT_polygon_offset_clamp) GLEW_EXT_polygon_offset_clamp = !_glewInit_GL_EXT_polygon_offset_clamp(GLEW_CONTEXT_ARG_VAR_INIT);
10459 #endif /* GL_EXT_polygon_offset_clamp */
10460 #ifdef GL_EXT_post_depth_coverage
10461 GLEW_EXT_post_depth_coverage = _glewSearchExtension("GL_EXT_post_depth_coverage", extStart, extEnd);
10462 #endif /* GL_EXT_post_depth_coverage */
10463 #ifdef GL_EXT_provoking_vertex
10464 GLEW_EXT_provoking_vertex = _glewSearchExtension("GL_EXT_provoking_vertex", extStart, extEnd);
10465 if (glewExperimental || GLEW_EXT_provoking_vertex) GLEW_EXT_provoking_vertex = !_glewInit_GL_EXT_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT);
10466 #endif /* GL_EXT_provoking_vertex */
10467 #ifdef GL_EXT_raster_multisample
10468 GLEW_EXT_raster_multisample = _glewSearchExtension("GL_EXT_raster_multisample", extStart, extEnd);
10469 if (glewExperimental || GLEW_EXT_raster_multisample) GLEW_EXT_raster_multisample = !_glewInit_GL_EXT_raster_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
10470 #endif /* GL_EXT_raster_multisample */
10471 #ifdef GL_EXT_rescale_normal
10472 GLEW_EXT_rescale_normal = _glewSearchExtension("GL_EXT_rescale_normal", extStart, extEnd);
10473 #endif /* GL_EXT_rescale_normal */
10474 #ifdef GL_EXT_scene_marker
10475 GLEW_EXT_scene_marker = _glewSearchExtension("GL_EXT_scene_marker", extStart, extEnd);
10476 if (glewExperimental || GLEW_EXT_scene_marker) GLEW_EXT_scene_marker = !_glewInit_GL_EXT_scene_marker(GLEW_CONTEXT_ARG_VAR_INIT);
10477 #endif /* GL_EXT_scene_marker */
10478 #ifdef GL_EXT_secondary_color
10479 GLEW_EXT_secondary_color = _glewSearchExtension("GL_EXT_secondary_color", extStart, extEnd);
10480 if (glewExperimental || GLEW_EXT_secondary_color) GLEW_EXT_secondary_color = !_glewInit_GL_EXT_secondary_color(GLEW_CONTEXT_ARG_VAR_INIT);
10481 #endif /* GL_EXT_secondary_color */
10482 #ifdef GL_EXT_separate_shader_objects
10483 GLEW_EXT_separate_shader_objects = _glewSearchExtension("GL_EXT_separate_shader_objects", extStart, extEnd);
10484 if (glewExperimental || GLEW_EXT_separate_shader_objects) GLEW_EXT_separate_shader_objects = !_glewInit_GL_EXT_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT);
10485 #endif /* GL_EXT_separate_shader_objects */
10486 #ifdef GL_EXT_separate_specular_color
10487 GLEW_EXT_separate_specular_color = _glewSearchExtension("GL_EXT_separate_specular_color", extStart, extEnd);
10488 #endif /* GL_EXT_separate_specular_color */
10489 #ifdef GL_EXT_shader_image_load_formatted
10490 GLEW_EXT_shader_image_load_formatted = _glewSearchExtension("GL_EXT_shader_image_load_formatted", extStart, extEnd);
10491 #endif /* GL_EXT_shader_image_load_formatted */
10492 #ifdef GL_EXT_shader_image_load_store
10493 GLEW_EXT_shader_image_load_store = _glewSearchExtension("GL_EXT_shader_image_load_store", extStart, extEnd);
10494 if (glewExperimental || GLEW_EXT_shader_image_load_store) GLEW_EXT_shader_image_load_store = !_glewInit_GL_EXT_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT);
10495 #endif /* GL_EXT_shader_image_load_store */
10496 #ifdef GL_EXT_shader_integer_mix
10497 GLEW_EXT_shader_integer_mix = _glewSearchExtension("GL_EXT_shader_integer_mix", extStart, extEnd);
10498 #endif /* GL_EXT_shader_integer_mix */
10499 #ifdef GL_EXT_shadow_funcs
10500 GLEW_EXT_shadow_funcs = _glewSearchExtension("GL_EXT_shadow_funcs", extStart, extEnd);
10501 #endif /* GL_EXT_shadow_funcs */
10502 #ifdef GL_EXT_shared_texture_palette
10503 GLEW_EXT_shared_texture_palette = _glewSearchExtension("GL_EXT_shared_texture_palette", extStart, extEnd);
10504 #endif /* GL_EXT_shared_texture_palette */
10505 #ifdef GL_EXT_sparse_texture2
10506 GLEW_EXT_sparse_texture2 = _glewSearchExtension("GL_EXT_sparse_texture2", extStart, extEnd);
10507 #endif /* GL_EXT_sparse_texture2 */
10508 #ifdef GL_EXT_stencil_clear_tag
10509 GLEW_EXT_stencil_clear_tag = _glewSearchExtension("GL_EXT_stencil_clear_tag", extStart, extEnd);
10510 #endif /* GL_EXT_stencil_clear_tag */
10511 #ifdef GL_EXT_stencil_two_side
10512 GLEW_EXT_stencil_two_side = _glewSearchExtension("GL_EXT_stencil_two_side", extStart, extEnd);
10513 if (glewExperimental || GLEW_EXT_stencil_two_side) GLEW_EXT_stencil_two_side = !_glewInit_GL_EXT_stencil_two_side(GLEW_CONTEXT_ARG_VAR_INIT);
10514 #endif /* GL_EXT_stencil_two_side */
10515 #ifdef GL_EXT_stencil_wrap
10516 GLEW_EXT_stencil_wrap = _glewSearchExtension("GL_EXT_stencil_wrap", extStart, extEnd);
10517 #endif /* GL_EXT_stencil_wrap */
10518 #ifdef GL_EXT_subtexture
10519 GLEW_EXT_subtexture = _glewSearchExtension("GL_EXT_subtexture", extStart, extEnd);
10520 if (glewExperimental || GLEW_EXT_subtexture) GLEW_EXT_subtexture = !_glewInit_GL_EXT_subtexture(GLEW_CONTEXT_ARG_VAR_INIT);
10521 #endif /* GL_EXT_subtexture */
10522 #ifdef GL_EXT_texture
10523 GLEW_EXT_texture = _glewSearchExtension("GL_EXT_texture", extStart, extEnd);
10524 #endif /* GL_EXT_texture */
10525 #ifdef GL_EXT_texture3D
10526 GLEW_EXT_texture3D = _glewSearchExtension("GL_EXT_texture3D", extStart, extEnd);
10527 if (glewExperimental || GLEW_EXT_texture3D) GLEW_EXT_texture3D = !_glewInit_GL_EXT_texture3D(GLEW_CONTEXT_ARG_VAR_INIT);
10528 #endif /* GL_EXT_texture3D */
10529 #ifdef GL_EXT_texture_array
10530 GLEW_EXT_texture_array = _glewSearchExtension("GL_EXT_texture_array", extStart, extEnd);
10531 if (glewExperimental || GLEW_EXT_texture_array) GLEW_EXT_texture_array = !_glewInit_GL_EXT_texture_array(GLEW_CONTEXT_ARG_VAR_INIT);
10532 #endif /* GL_EXT_texture_array */
10533 #ifdef GL_EXT_texture_buffer_object
10534 GLEW_EXT_texture_buffer_object = _glewSearchExtension("GL_EXT_texture_buffer_object", extStart, extEnd);
10535 if (glewExperimental || GLEW_EXT_texture_buffer_object) GLEW_EXT_texture_buffer_object = !_glewInit_GL_EXT_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
10536 #endif /* GL_EXT_texture_buffer_object */
10537 #ifdef GL_EXT_texture_compression_dxt1
10538 GLEW_EXT_texture_compression_dxt1 = _glewSearchExtension("GL_EXT_texture_compression_dxt1", extStart, extEnd);
10539 #endif /* GL_EXT_texture_compression_dxt1 */
10540 #ifdef GL_EXT_texture_compression_latc
10541 GLEW_EXT_texture_compression_latc = _glewSearchExtension("GL_EXT_texture_compression_latc", extStart, extEnd);
10542 #endif /* GL_EXT_texture_compression_latc */
10543 #ifdef GL_EXT_texture_compression_rgtc
10544 GLEW_EXT_texture_compression_rgtc = _glewSearchExtension("GL_EXT_texture_compression_rgtc", extStart, extEnd);
10545 #endif /* GL_EXT_texture_compression_rgtc */
10546 #ifdef GL_EXT_texture_compression_s3tc
10547 GLEW_EXT_texture_compression_s3tc = _glewSearchExtension("GL_EXT_texture_compression_s3tc", extStart, extEnd);
10548 #endif /* GL_EXT_texture_compression_s3tc */
10549 #ifdef GL_EXT_texture_cube_map
10550 GLEW_EXT_texture_cube_map = _glewSearchExtension("GL_EXT_texture_cube_map", extStart, extEnd);
10551 #endif /* GL_EXT_texture_cube_map */
10552 #ifdef GL_EXT_texture_edge_clamp
10553 GLEW_EXT_texture_edge_clamp = _glewSearchExtension("GL_EXT_texture_edge_clamp", extStart, extEnd);
10554 #endif /* GL_EXT_texture_edge_clamp */
10555 #ifdef GL_EXT_texture_env
10556 GLEW_EXT_texture_env = _glewSearchExtension("GL_EXT_texture_env", extStart, extEnd);
10557 #endif /* GL_EXT_texture_env */
10558 #ifdef GL_EXT_texture_env_add
10559 GLEW_EXT_texture_env_add = _glewSearchExtension("GL_EXT_texture_env_add", extStart, extEnd);
10560 #endif /* GL_EXT_texture_env_add */
10561 #ifdef GL_EXT_texture_env_combine
10562 GLEW_EXT_texture_env_combine = _glewSearchExtension("GL_EXT_texture_env_combine", extStart, extEnd);
10563 #endif /* GL_EXT_texture_env_combine */
10564 #ifdef GL_EXT_texture_env_dot3
10565 GLEW_EXT_texture_env_dot3 = _glewSearchExtension("GL_EXT_texture_env_dot3", extStart, extEnd);
10566 #endif /* GL_EXT_texture_env_dot3 */
10567 #ifdef GL_EXT_texture_filter_anisotropic
10568 GLEW_EXT_texture_filter_anisotropic = _glewSearchExtension("GL_EXT_texture_filter_anisotropic", extStart, extEnd);
10569 #endif /* GL_EXT_texture_filter_anisotropic */
10570 #ifdef GL_EXT_texture_filter_minmax
10571 GLEW_EXT_texture_filter_minmax = _glewSearchExtension("GL_EXT_texture_filter_minmax", extStart, extEnd);
10572 #endif /* GL_EXT_texture_filter_minmax */
10573 #ifdef GL_EXT_texture_integer
10574 GLEW_EXT_texture_integer = _glewSearchExtension("GL_EXT_texture_integer", extStart, extEnd);
10575 if (glewExperimental || GLEW_EXT_texture_integer) GLEW_EXT_texture_integer = !_glewInit_GL_EXT_texture_integer(GLEW_CONTEXT_ARG_VAR_INIT);
10576 #endif /* GL_EXT_texture_integer */
10577 #ifdef GL_EXT_texture_lod_bias
10578 GLEW_EXT_texture_lod_bias = _glewSearchExtension("GL_EXT_texture_lod_bias", extStart, extEnd);
10579 #endif /* GL_EXT_texture_lod_bias */
10580 #ifdef GL_EXT_texture_mirror_clamp
10581 GLEW_EXT_texture_mirror_clamp = _glewSearchExtension("GL_EXT_texture_mirror_clamp", extStart, extEnd);
10582 #endif /* GL_EXT_texture_mirror_clamp */
10583 #ifdef GL_EXT_texture_object
10584 GLEW_EXT_texture_object = _glewSearchExtension("GL_EXT_texture_object", extStart, extEnd);
10585 if (glewExperimental || GLEW_EXT_texture_object) GLEW_EXT_texture_object = !_glewInit_GL_EXT_texture_object(GLEW_CONTEXT_ARG_VAR_INIT);
10586 #endif /* GL_EXT_texture_object */
10587 #ifdef GL_EXT_texture_perturb_normal
10588 GLEW_EXT_texture_perturb_normal = _glewSearchExtension("GL_EXT_texture_perturb_normal", extStart, extEnd);
10589 if (glewExperimental || GLEW_EXT_texture_perturb_normal) GLEW_EXT_texture_perturb_normal = !_glewInit_GL_EXT_texture_perturb_normal(GLEW_CONTEXT_ARG_VAR_INIT);
10590 #endif /* GL_EXT_texture_perturb_normal */
10591 #ifdef GL_EXT_texture_rectangle
10592 GLEW_EXT_texture_rectangle = _glewSearchExtension("GL_EXT_texture_rectangle", extStart, extEnd);
10593 #endif /* GL_EXT_texture_rectangle */
10594 #ifdef GL_EXT_texture_sRGB
10595 GLEW_EXT_texture_sRGB = _glewSearchExtension("GL_EXT_texture_sRGB", extStart, extEnd);
10596 #endif /* GL_EXT_texture_sRGB */
10597 #ifdef GL_EXT_texture_sRGB_decode
10598 GLEW_EXT_texture_sRGB_decode = _glewSearchExtension("GL_EXT_texture_sRGB_decode", extStart, extEnd);
10599 #endif /* GL_EXT_texture_sRGB_decode */
10600 #ifdef GL_EXT_texture_shared_exponent
10601 GLEW_EXT_texture_shared_exponent = _glewSearchExtension("GL_EXT_texture_shared_exponent", extStart, extEnd);
10602 #endif /* GL_EXT_texture_shared_exponent */
10603 #ifdef GL_EXT_texture_snorm
10604 GLEW_EXT_texture_snorm = _glewSearchExtension("GL_EXT_texture_snorm", extStart, extEnd);
10605 #endif /* GL_EXT_texture_snorm */
10606 #ifdef GL_EXT_texture_swizzle
10607 GLEW_EXT_texture_swizzle = _glewSearchExtension("GL_EXT_texture_swizzle", extStart, extEnd);
10608 #endif /* GL_EXT_texture_swizzle */
10609 #ifdef GL_EXT_timer_query
10610 GLEW_EXT_timer_query = _glewSearchExtension("GL_EXT_timer_query", extStart, extEnd);
10611 if (glewExperimental || GLEW_EXT_timer_query) GLEW_EXT_timer_query = !_glewInit_GL_EXT_timer_query(GLEW_CONTEXT_ARG_VAR_INIT);
10612 #endif /* GL_EXT_timer_query */
10613 #ifdef GL_EXT_transform_feedback
10614 GLEW_EXT_transform_feedback = _glewSearchExtension("GL_EXT_transform_feedback", extStart, extEnd);
10615 if (glewExperimental || GLEW_EXT_transform_feedback) GLEW_EXT_transform_feedback = !_glewInit_GL_EXT_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT);
10616 #endif /* GL_EXT_transform_feedback */
10617 #ifdef GL_EXT_vertex_array
10618 GLEW_EXT_vertex_array = _glewSearchExtension("GL_EXT_vertex_array", extStart, extEnd);
10619 if (glewExperimental || GLEW_EXT_vertex_array) GLEW_EXT_vertex_array = !_glewInit_GL_EXT_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT);
10620 #endif /* GL_EXT_vertex_array */
10621 #ifdef GL_EXT_vertex_array_bgra
10622 GLEW_EXT_vertex_array_bgra = _glewSearchExtension("GL_EXT_vertex_array_bgra", extStart, extEnd);
10623 #endif /* GL_EXT_vertex_array_bgra */
10624 #ifdef GL_EXT_vertex_attrib_64bit
10625 GLEW_EXT_vertex_attrib_64bit = _glewSearchExtension("GL_EXT_vertex_attrib_64bit", extStart, extEnd);
10626 if (glewExperimental || GLEW_EXT_vertex_attrib_64bit) GLEW_EXT_vertex_attrib_64bit = !_glewInit_GL_EXT_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT);
10627 #endif /* GL_EXT_vertex_attrib_64bit */
10628 #ifdef GL_EXT_vertex_shader
10629 GLEW_EXT_vertex_shader = _glewSearchExtension("GL_EXT_vertex_shader", extStart, extEnd);
10630 if (glewExperimental || GLEW_EXT_vertex_shader) GLEW_EXT_vertex_shader = !_glewInit_GL_EXT_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT);
10631 #endif /* GL_EXT_vertex_shader */
10632 #ifdef GL_EXT_vertex_weighting
10633 GLEW_EXT_vertex_weighting = _glewSearchExtension("GL_EXT_vertex_weighting", extStart, extEnd);
10634 if (glewExperimental || GLEW_EXT_vertex_weighting) GLEW_EXT_vertex_weighting = !_glewInit_GL_EXT_vertex_weighting(GLEW_CONTEXT_ARG_VAR_INIT);
10635 #endif /* GL_EXT_vertex_weighting */
10636 #ifdef GL_EXT_x11_sync_object
10637 GLEW_EXT_x11_sync_object = _glewSearchExtension("GL_EXT_x11_sync_object", extStart, extEnd);
10638 if (glewExperimental || GLEW_EXT_x11_sync_object) GLEW_EXT_x11_sync_object = !_glewInit_GL_EXT_x11_sync_object(GLEW_CONTEXT_ARG_VAR_INIT);
10639 #endif /* GL_EXT_x11_sync_object */
10640 #ifdef GL_GREMEDY_frame_terminator
10641 GLEW_GREMEDY_frame_terminator = _glewSearchExtension("GL_GREMEDY_frame_terminator", extStart, extEnd);
10642 if (glewExperimental || GLEW_GREMEDY_frame_terminator) GLEW_GREMEDY_frame_terminator = !_glewInit_GL_GREMEDY_frame_terminator(GLEW_CONTEXT_ARG_VAR_INIT);
10643 #endif /* GL_GREMEDY_frame_terminator */
10644 #ifdef GL_GREMEDY_string_marker
10645 GLEW_GREMEDY_string_marker = _glewSearchExtension("GL_GREMEDY_string_marker", extStart, extEnd);
10646 if (glewExperimental || GLEW_GREMEDY_string_marker) GLEW_GREMEDY_string_marker = !_glewInit_GL_GREMEDY_string_marker(GLEW_CONTEXT_ARG_VAR_INIT);
10647 #endif /* GL_GREMEDY_string_marker */
10648 #ifdef GL_HP_convolution_border_modes
10649 GLEW_HP_convolution_border_modes = _glewSearchExtension("GL_HP_convolution_border_modes", extStart, extEnd);
10650 #endif /* GL_HP_convolution_border_modes */
10651 #ifdef GL_HP_image_transform
10652 GLEW_HP_image_transform = _glewSearchExtension("GL_HP_image_transform", extStart, extEnd);
10653 if (glewExperimental || GLEW_HP_image_transform) GLEW_HP_image_transform = !_glewInit_GL_HP_image_transform(GLEW_CONTEXT_ARG_VAR_INIT);
10654 #endif /* GL_HP_image_transform */
10655 #ifdef GL_HP_occlusion_test
10656 GLEW_HP_occlusion_test = _glewSearchExtension("GL_HP_occlusion_test", extStart, extEnd);
10657 #endif /* GL_HP_occlusion_test */
10658 #ifdef GL_HP_texture_lighting
10659 GLEW_HP_texture_lighting = _glewSearchExtension("GL_HP_texture_lighting", extStart, extEnd);
10660 #endif /* GL_HP_texture_lighting */
10661 #ifdef GL_IBM_cull_vertex
10662 GLEW_IBM_cull_vertex = _glewSearchExtension("GL_IBM_cull_vertex", extStart, extEnd);
10663 #endif /* GL_IBM_cull_vertex */
10664 #ifdef GL_IBM_multimode_draw_arrays
10665 GLEW_IBM_multimode_draw_arrays = _glewSearchExtension("GL_IBM_multimode_draw_arrays", extStart, extEnd);
10666 if (glewExperimental || GLEW_IBM_multimode_draw_arrays) GLEW_IBM_multimode_draw_arrays = !_glewInit_GL_IBM_multimode_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT);
10667 #endif /* GL_IBM_multimode_draw_arrays */
10668 #ifdef GL_IBM_rasterpos_clip
10669 GLEW_IBM_rasterpos_clip = _glewSearchExtension("GL_IBM_rasterpos_clip", extStart, extEnd);
10670 #endif /* GL_IBM_rasterpos_clip */
10671 #ifdef GL_IBM_static_data
10672 GLEW_IBM_static_data = _glewSearchExtension("GL_IBM_static_data", extStart, extEnd);
10673 #endif /* GL_IBM_static_data */
10674 #ifdef GL_IBM_texture_mirrored_repeat
10675 GLEW_IBM_texture_mirrored_repeat = _glewSearchExtension("GL_IBM_texture_mirrored_repeat", extStart, extEnd);
10676 #endif /* GL_IBM_texture_mirrored_repeat */
10677 #ifdef GL_IBM_vertex_array_lists
10678 GLEW_IBM_vertex_array_lists = _glewSearchExtension("GL_IBM_vertex_array_lists", extStart, extEnd);
10679 if (glewExperimental || GLEW_IBM_vertex_array_lists) GLEW_IBM_vertex_array_lists = !_glewInit_GL_IBM_vertex_array_lists(GLEW_CONTEXT_ARG_VAR_INIT);
10680 #endif /* GL_IBM_vertex_array_lists */
10681 #ifdef GL_INGR_color_clamp
10682 GLEW_INGR_color_clamp = _glewSearchExtension("GL_INGR_color_clamp", extStart, extEnd);
10683 #endif /* GL_INGR_color_clamp */
10684 #ifdef GL_INGR_interlace_read
10685 GLEW_INGR_interlace_read = _glewSearchExtension("GL_INGR_interlace_read", extStart, extEnd);
10686 #endif /* GL_INGR_interlace_read */
10687 #ifdef GL_INTEL_fragment_shader_ordering
10688 GLEW_INTEL_fragment_shader_ordering = _glewSearchExtension("GL_INTEL_fragment_shader_ordering", extStart, extEnd);
10689 #endif /* GL_INTEL_fragment_shader_ordering */
10690 #ifdef GL_INTEL_framebuffer_CMAA
10691 GLEW_INTEL_framebuffer_CMAA = _glewSearchExtension("GL_INTEL_framebuffer_CMAA", extStart, extEnd);
10692 #endif /* GL_INTEL_framebuffer_CMAA */
10693 #ifdef GL_INTEL_map_texture
10694 GLEW_INTEL_map_texture = _glewSearchExtension("GL_INTEL_map_texture", extStart, extEnd);
10695 if (glewExperimental || GLEW_INTEL_map_texture) GLEW_INTEL_map_texture = !_glewInit_GL_INTEL_map_texture(GLEW_CONTEXT_ARG_VAR_INIT);
10696 #endif /* GL_INTEL_map_texture */
10697 #ifdef GL_INTEL_parallel_arrays
10698 GLEW_INTEL_parallel_arrays = _glewSearchExtension("GL_INTEL_parallel_arrays", extStart, extEnd);
10699 if (glewExperimental || GLEW_INTEL_parallel_arrays) GLEW_INTEL_parallel_arrays = !_glewInit_GL_INTEL_parallel_arrays(GLEW_CONTEXT_ARG_VAR_INIT);
10700 #endif /* GL_INTEL_parallel_arrays */
10701 #ifdef GL_INTEL_performance_query
10702 GLEW_INTEL_performance_query = _glewSearchExtension("GL_INTEL_performance_query", extStart, extEnd);
10703 if (glewExperimental || GLEW_INTEL_performance_query) GLEW_INTEL_performance_query = !_glewInit_GL_INTEL_performance_query(GLEW_CONTEXT_ARG_VAR_INIT);
10704 #endif /* GL_INTEL_performance_query */
10705 #ifdef GL_INTEL_texture_scissor
10706 GLEW_INTEL_texture_scissor = _glewSearchExtension("GL_INTEL_texture_scissor", extStart, extEnd);
10707 if (glewExperimental || GLEW_INTEL_texture_scissor) GLEW_INTEL_texture_scissor = !_glewInit_GL_INTEL_texture_scissor(GLEW_CONTEXT_ARG_VAR_INIT);
10708 #endif /* GL_INTEL_texture_scissor */
10709 #ifdef GL_KHR_blend_equation_advanced
10710 GLEW_KHR_blend_equation_advanced = _glewSearchExtension("GL_KHR_blend_equation_advanced", extStart, extEnd);
10711 if (glewExperimental || GLEW_KHR_blend_equation_advanced) GLEW_KHR_blend_equation_advanced = !_glewInit_GL_KHR_blend_equation_advanced(GLEW_CONTEXT_ARG_VAR_INIT);
10712 #endif /* GL_KHR_blend_equation_advanced */
10713 #ifdef GL_KHR_blend_equation_advanced_coherent
10714 GLEW_KHR_blend_equation_advanced_coherent = _glewSearchExtension("GL_KHR_blend_equation_advanced_coherent", extStart, extEnd);
10715 #endif /* GL_KHR_blend_equation_advanced_coherent */
10716 #ifdef GL_KHR_context_flush_control
10717 GLEW_KHR_context_flush_control = _glewSearchExtension("GL_KHR_context_flush_control", extStart, extEnd);
10718 #endif /* GL_KHR_context_flush_control */
10719 #ifdef GL_KHR_debug
10720 GLEW_KHR_debug = _glewSearchExtension("GL_KHR_debug", extStart, extEnd);
10721 if (glewExperimental || GLEW_KHR_debug) GLEW_KHR_debug = !_glewInit_GL_KHR_debug(GLEW_CONTEXT_ARG_VAR_INIT);
10722 #endif /* GL_KHR_debug */
10723 #ifdef GL_KHR_no_error
10724 GLEW_KHR_no_error = _glewSearchExtension("GL_KHR_no_error", extStart, extEnd);
10725 #endif /* GL_KHR_no_error */
10726 #ifdef GL_KHR_robust_buffer_access_behavior
10727 GLEW_KHR_robust_buffer_access_behavior = _glewSearchExtension("GL_KHR_robust_buffer_access_behavior", extStart, extEnd);
10728 #endif /* GL_KHR_robust_buffer_access_behavior */
10729 #ifdef GL_KHR_robustness
10730 GLEW_KHR_robustness = _glewSearchExtension("GL_KHR_robustness", extStart, extEnd);
10731 if (glewExperimental || GLEW_KHR_robustness) GLEW_KHR_robustness = !_glewInit_GL_KHR_robustness(GLEW_CONTEXT_ARG_VAR_INIT);
10732 #endif /* GL_KHR_robustness */
10733 #ifdef GL_KHR_texture_compression_astc_hdr
10734 GLEW_KHR_texture_compression_astc_hdr = _glewSearchExtension("GL_KHR_texture_compression_astc_hdr", extStart, extEnd);
10735 #endif /* GL_KHR_texture_compression_astc_hdr */
10736 #ifdef GL_KHR_texture_compression_astc_ldr
10737 GLEW_KHR_texture_compression_astc_ldr = _glewSearchExtension("GL_KHR_texture_compression_astc_ldr", extStart, extEnd);
10738 #endif /* GL_KHR_texture_compression_astc_ldr */
10739 #ifdef GL_KTX_buffer_region
10740 GLEW_KTX_buffer_region = _glewSearchExtension("GL_KTX_buffer_region", extStart, extEnd);
10741 if (glewExperimental || GLEW_KTX_buffer_region) GLEW_KTX_buffer_region = !_glewInit_GL_KTX_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT);
10742 #endif /* GL_KTX_buffer_region */
10743 #ifdef GL_MESAX_texture_stack
10744 GLEW_MESAX_texture_stack = _glewSearchExtension("GL_MESAX_texture_stack", extStart, extEnd);
10745 #endif /* GL_MESAX_texture_stack */
10746 #ifdef GL_MESA_pack_invert
10747 GLEW_MESA_pack_invert = _glewSearchExtension("GL_MESA_pack_invert", extStart, extEnd);
10748 #endif /* GL_MESA_pack_invert */
10749 #ifdef GL_MESA_resize_buffers
10750 GLEW_MESA_resize_buffers = _glewSearchExtension("GL_MESA_resize_buffers", extStart, extEnd);
10751 if (glewExperimental || GLEW_MESA_resize_buffers) GLEW_MESA_resize_buffers = !_glewInit_GL_MESA_resize_buffers(GLEW_CONTEXT_ARG_VAR_INIT);
10752 #endif /* GL_MESA_resize_buffers */
10753 #ifdef GL_MESA_window_pos
10754 GLEW_MESA_window_pos = _glewSearchExtension("GL_MESA_window_pos", extStart, extEnd);
10755 if (glewExperimental || GLEW_MESA_window_pos) GLEW_MESA_window_pos = !_glewInit_GL_MESA_window_pos(GLEW_CONTEXT_ARG_VAR_INIT);
10756 #endif /* GL_MESA_window_pos */
10757 #ifdef GL_MESA_ycbcr_texture
10758 GLEW_MESA_ycbcr_texture = _glewSearchExtension("GL_MESA_ycbcr_texture", extStart, extEnd);
10759 #endif /* GL_MESA_ycbcr_texture */
10760 #ifdef GL_NVX_conditional_render
10761 GLEW_NVX_conditional_render = _glewSearchExtension("GL_NVX_conditional_render", extStart, extEnd);
10762 if (glewExperimental || GLEW_NVX_conditional_render) GLEW_NVX_conditional_render = !_glewInit_GL_NVX_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT);
10763 #endif /* GL_NVX_conditional_render */
10764 #ifdef GL_NVX_gpu_memory_info
10765 GLEW_NVX_gpu_memory_info = _glewSearchExtension("GL_NVX_gpu_memory_info", extStart, extEnd);
10766 #endif /* GL_NVX_gpu_memory_info */
10767 #ifdef GL_NV_bindless_multi_draw_indirect
10768 GLEW_NV_bindless_multi_draw_indirect = _glewSearchExtension("GL_NV_bindless_multi_draw_indirect", extStart, extEnd);
10769 if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect) GLEW_NV_bindless_multi_draw_indirect = !_glewInit_GL_NV_bindless_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT);
10770 #endif /* GL_NV_bindless_multi_draw_indirect */
10771 #ifdef GL_NV_bindless_multi_draw_indirect_count
10772 GLEW_NV_bindless_multi_draw_indirect_count = _glewSearchExtension("GL_NV_bindless_multi_draw_indirect_count", extStart, extEnd);
10773 if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect_count) GLEW_NV_bindless_multi_draw_indirect_count = !_glewInit_GL_NV_bindless_multi_draw_indirect_count(GLEW_CONTEXT_ARG_VAR_INIT);
10774 #endif /* GL_NV_bindless_multi_draw_indirect_count */
10775 #ifdef GL_NV_bindless_texture
10776 GLEW_NV_bindless_texture = _glewSearchExtension("GL_NV_bindless_texture", extStart, extEnd);
10777 if (glewExperimental || GLEW_NV_bindless_texture) GLEW_NV_bindless_texture = !_glewInit_GL_NV_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT);
10778 #endif /* GL_NV_bindless_texture */
10779 #ifdef GL_NV_blend_equation_advanced
10780 GLEW_NV_blend_equation_advanced = _glewSearchExtension("GL_NV_blend_equation_advanced", extStart, extEnd);
10781 if (glewExperimental || GLEW_NV_blend_equation_advanced) GLEW_NV_blend_equation_advanced = !_glewInit_GL_NV_blend_equation_advanced(GLEW_CONTEXT_ARG_VAR_INIT);
10782 #endif /* GL_NV_blend_equation_advanced */
10783 #ifdef GL_NV_blend_equation_advanced_coherent
10784 GLEW_NV_blend_equation_advanced_coherent = _glewSearchExtension("GL_NV_blend_equation_advanced_coherent", extStart, extEnd);
10785 #endif /* GL_NV_blend_equation_advanced_coherent */
10786 #ifdef GL_NV_blend_square
10787 GLEW_NV_blend_square = _glewSearchExtension("GL_NV_blend_square", extStart, extEnd);
10788 #endif /* GL_NV_blend_square */
10789 #ifdef GL_NV_compute_program5
10790 GLEW_NV_compute_program5 = _glewSearchExtension("GL_NV_compute_program5", extStart, extEnd);
10791 #endif /* GL_NV_compute_program5 */
10792 #ifdef GL_NV_conditional_render
10793 GLEW_NV_conditional_render = _glewSearchExtension("GL_NV_conditional_render", extStart, extEnd);
10794 if (glewExperimental || GLEW_NV_conditional_render) GLEW_NV_conditional_render = !_glewInit_GL_NV_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT);
10795 #endif /* GL_NV_conditional_render */
10796 #ifdef GL_NV_conservative_raster
10797 GLEW_NV_conservative_raster = _glewSearchExtension("GL_NV_conservative_raster", extStart, extEnd);
10798 if (glewExperimental || GLEW_NV_conservative_raster) GLEW_NV_conservative_raster = !_glewInit_GL_NV_conservative_raster(GLEW_CONTEXT_ARG_VAR_INIT);
10799 #endif /* GL_NV_conservative_raster */
10800 #ifdef GL_NV_conservative_raster_dilate
10801 GLEW_NV_conservative_raster_dilate = _glewSearchExtension("GL_NV_conservative_raster_dilate", extStart, extEnd);
10802 if (glewExperimental || GLEW_NV_conservative_raster_dilate) GLEW_NV_conservative_raster_dilate = !_glewInit_GL_NV_conservative_raster_dilate(GLEW_CONTEXT_ARG_VAR_INIT);
10803 #endif /* GL_NV_conservative_raster_dilate */
10804 #ifdef GL_NV_copy_depth_to_color
10805 GLEW_NV_copy_depth_to_color = _glewSearchExtension("GL_NV_copy_depth_to_color", extStart, extEnd);
10806 #endif /* GL_NV_copy_depth_to_color */
10807 #ifdef GL_NV_copy_image
10808 GLEW_NV_copy_image = _glewSearchExtension("GL_NV_copy_image", extStart, extEnd);
10809 if (glewExperimental || GLEW_NV_copy_image) GLEW_NV_copy_image = !_glewInit_GL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT);
10810 #endif /* GL_NV_copy_image */
10811 #ifdef GL_NV_deep_texture3D
10812 GLEW_NV_deep_texture3D = _glewSearchExtension("GL_NV_deep_texture3D", extStart, extEnd);
10813 #endif /* GL_NV_deep_texture3D */
10814 #ifdef GL_NV_depth_buffer_float
10815 GLEW_NV_depth_buffer_float = _glewSearchExtension("GL_NV_depth_buffer_float", extStart, extEnd);
10816 if (glewExperimental || GLEW_NV_depth_buffer_float) GLEW_NV_depth_buffer_float = !_glewInit_GL_NV_depth_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT);
10817 #endif /* GL_NV_depth_buffer_float */
10818 #ifdef GL_NV_depth_clamp
10819 GLEW_NV_depth_clamp = _glewSearchExtension("GL_NV_depth_clamp", extStart, extEnd);
10820 #endif /* GL_NV_depth_clamp */
10821 #ifdef GL_NV_depth_range_unclamped
10822 GLEW_NV_depth_range_unclamped = _glewSearchExtension("GL_NV_depth_range_unclamped", extStart, extEnd);
10823 #endif /* GL_NV_depth_range_unclamped */
10824 #ifdef GL_NV_draw_texture
10825 GLEW_NV_draw_texture = _glewSearchExtension("GL_NV_draw_texture", extStart, extEnd);
10826 if (glewExperimental || GLEW_NV_draw_texture) GLEW_NV_draw_texture = !_glewInit_GL_NV_draw_texture(GLEW_CONTEXT_ARG_VAR_INIT);
10827 #endif /* GL_NV_draw_texture */
10828 #ifdef GL_NV_evaluators
10829 GLEW_NV_evaluators = _glewSearchExtension("GL_NV_evaluators", extStart, extEnd);
10830 if (glewExperimental || GLEW_NV_evaluators) GLEW_NV_evaluators = !_glewInit_GL_NV_evaluators(GLEW_CONTEXT_ARG_VAR_INIT);
10831 #endif /* GL_NV_evaluators */
10832 #ifdef GL_NV_explicit_multisample
10833 GLEW_NV_explicit_multisample = _glewSearchExtension("GL_NV_explicit_multisample", extStart, extEnd);
10834 if (glewExperimental || GLEW_NV_explicit_multisample) GLEW_NV_explicit_multisample = !_glewInit_GL_NV_explicit_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
10835 #endif /* GL_NV_explicit_multisample */
10836 #ifdef GL_NV_fence
10837 GLEW_NV_fence = _glewSearchExtension("GL_NV_fence", extStart, extEnd);
10838 if (glewExperimental || GLEW_NV_fence) GLEW_NV_fence = !_glewInit_GL_NV_fence(GLEW_CONTEXT_ARG_VAR_INIT);
10839 #endif /* GL_NV_fence */
10840 #ifdef GL_NV_fill_rectangle
10841 GLEW_NV_fill_rectangle = _glewSearchExtension("GL_NV_fill_rectangle", extStart, extEnd);
10842 #endif /* GL_NV_fill_rectangle */
10843 #ifdef GL_NV_float_buffer
10844 GLEW_NV_float_buffer = _glewSearchExtension("GL_NV_float_buffer", extStart, extEnd);
10845 #endif /* GL_NV_float_buffer */
10846 #ifdef GL_NV_fog_distance
10847 GLEW_NV_fog_distance = _glewSearchExtension("GL_NV_fog_distance", extStart, extEnd);
10848 #endif /* GL_NV_fog_distance */
10849 #ifdef GL_NV_fragment_coverage_to_color
10850 GLEW_NV_fragment_coverage_to_color = _glewSearchExtension("GL_NV_fragment_coverage_to_color", extStart, extEnd);
10851 if (glewExperimental || GLEW_NV_fragment_coverage_to_color) GLEW_NV_fragment_coverage_to_color = !_glewInit_GL_NV_fragment_coverage_to_color(GLEW_CONTEXT_ARG_VAR_INIT);
10852 #endif /* GL_NV_fragment_coverage_to_color */
10853 #ifdef GL_NV_fragment_program
10854 GLEW_NV_fragment_program = _glewSearchExtension("GL_NV_fragment_program", extStart, extEnd);
10855 if (glewExperimental || GLEW_NV_fragment_program) GLEW_NV_fragment_program = !_glewInit_GL_NV_fragment_program(GLEW_CONTEXT_ARG_VAR_INIT);
10856 #endif /* GL_NV_fragment_program */
10857 #ifdef GL_NV_fragment_program2
10858 GLEW_NV_fragment_program2 = _glewSearchExtension("GL_NV_fragment_program2", extStart, extEnd);
10859 #endif /* GL_NV_fragment_program2 */
10860 #ifdef GL_NV_fragment_program4
10861 GLEW_NV_fragment_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd);
10862 #endif /* GL_NV_fragment_program4 */
10863 #ifdef GL_NV_fragment_program_option
10864 GLEW_NV_fragment_program_option = _glewSearchExtension("GL_NV_fragment_program_option", extStart, extEnd);
10865 #endif /* GL_NV_fragment_program_option */
10866 #ifdef GL_NV_fragment_shader_interlock
10867 GLEW_NV_fragment_shader_interlock = _glewSearchExtension("GL_NV_fragment_shader_interlock", extStart, extEnd);
10868 #endif /* GL_NV_fragment_shader_interlock */
10869 #ifdef GL_NV_framebuffer_mixed_samples
10870 GLEW_NV_framebuffer_mixed_samples = _glewSearchExtension("GL_NV_framebuffer_mixed_samples", extStart, extEnd);
10871 #endif /* GL_NV_framebuffer_mixed_samples */
10872 #ifdef GL_NV_framebuffer_multisample_coverage
10873 GLEW_NV_framebuffer_multisample_coverage = _glewSearchExtension("GL_NV_framebuffer_multisample_coverage", extStart, extEnd);
10874 if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) GLEW_NV_framebuffer_multisample_coverage = !_glewInit_GL_NV_framebuffer_multisample_coverage(GLEW_CONTEXT_ARG_VAR_INIT);
10875 #endif /* GL_NV_framebuffer_multisample_coverage */
10876 #ifdef GL_NV_geometry_program4
10877 GLEW_NV_geometry_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd);
10878 if (glewExperimental || GLEW_NV_geometry_program4) GLEW_NV_geometry_program4 = !_glewInit_GL_NV_geometry_program4(GLEW_CONTEXT_ARG_VAR_INIT);
10879 #endif /* GL_NV_geometry_program4 */
10880 #ifdef GL_NV_geometry_shader4
10881 GLEW_NV_geometry_shader4 = _glewSearchExtension("GL_NV_geometry_shader4", extStart, extEnd);
10882 #endif /* GL_NV_geometry_shader4 */
10883 #ifdef GL_NV_geometry_shader_passthrough
10884 GLEW_NV_geometry_shader_passthrough = _glewSearchExtension("GL_NV_geometry_shader_passthrough", extStart, extEnd);
10885 #endif /* GL_NV_geometry_shader_passthrough */
10886 #ifdef GL_NV_gpu_program4
10887 GLEW_NV_gpu_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd);
10888 if (glewExperimental || GLEW_NV_gpu_program4) GLEW_NV_gpu_program4 = !_glewInit_GL_NV_gpu_program4(GLEW_CONTEXT_ARG_VAR_INIT);
10889 #endif /* GL_NV_gpu_program4 */
10890 #ifdef GL_NV_gpu_program5
10891 GLEW_NV_gpu_program5 = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd);
10892 #endif /* GL_NV_gpu_program5 */
10893 #ifdef GL_NV_gpu_program5_mem_extended
10894 GLEW_NV_gpu_program5_mem_extended = _glewSearchExtension("GL_NV_gpu_program5_mem_extended", extStart, extEnd);
10895 #endif /* GL_NV_gpu_program5_mem_extended */
10896 #ifdef GL_NV_gpu_program_fp64
10897 GLEW_NV_gpu_program_fp64 = _glewSearchExtension("GL_NV_gpu_program_fp64", extStart, extEnd);
10898 #endif /* GL_NV_gpu_program_fp64 */
10899 #ifdef GL_NV_gpu_shader5
10900 GLEW_NV_gpu_shader5 = _glewSearchExtension("GL_NV_gpu_shader5", extStart, extEnd);
10901 if (glewExperimental || GLEW_NV_gpu_shader5) GLEW_NV_gpu_shader5 = !_glewInit_GL_NV_gpu_shader5(GLEW_CONTEXT_ARG_VAR_INIT);
10902 #endif /* GL_NV_gpu_shader5 */
10903 #ifdef GL_NV_half_float
10904 GLEW_NV_half_float = _glewSearchExtension("GL_NV_half_float", extStart, extEnd);
10905 if (glewExperimental || GLEW_NV_half_float) GLEW_NV_half_float = !_glewInit_GL_NV_half_float(GLEW_CONTEXT_ARG_VAR_INIT);
10906 #endif /* GL_NV_half_float */
10907 #ifdef GL_NV_internalformat_sample_query
10908 GLEW_NV_internalformat_sample_query = _glewSearchExtension("GL_NV_internalformat_sample_query", extStart, extEnd);
10909 if (glewExperimental || GLEW_NV_internalformat_sample_query) GLEW_NV_internalformat_sample_query = !_glewInit_GL_NV_internalformat_sample_query(GLEW_CONTEXT_ARG_VAR_INIT);
10910 #endif /* GL_NV_internalformat_sample_query */
10911 #ifdef GL_NV_light_max_exponent
10912 GLEW_NV_light_max_exponent = _glewSearchExtension("GL_NV_light_max_exponent", extStart, extEnd);
10913 #endif /* GL_NV_light_max_exponent */
10914 #ifdef GL_NV_multisample_coverage
10915 GLEW_NV_multisample_coverage = _glewSearchExtension("GL_NV_multisample_coverage", extStart, extEnd);
10916 #endif /* GL_NV_multisample_coverage */
10917 #ifdef GL_NV_multisample_filter_hint
10918 GLEW_NV_multisample_filter_hint = _glewSearchExtension("GL_NV_multisample_filter_hint", extStart, extEnd);
10919 #endif /* GL_NV_multisample_filter_hint */
10920 #ifdef GL_NV_occlusion_query
10921 GLEW_NV_occlusion_query = _glewSearchExtension("GL_NV_occlusion_query", extStart, extEnd);
10922 if (glewExperimental || GLEW_NV_occlusion_query) GLEW_NV_occlusion_query = !_glewInit_GL_NV_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT);
10923 #endif /* GL_NV_occlusion_query */
10924 #ifdef GL_NV_packed_depth_stencil
10925 GLEW_NV_packed_depth_stencil = _glewSearchExtension("GL_NV_packed_depth_stencil", extStart, extEnd);
10926 #endif /* GL_NV_packed_depth_stencil */
10927 #ifdef GL_NV_parameter_buffer_object
10928 GLEW_NV_parameter_buffer_object = _glewSearchExtension("GL_NV_parameter_buffer_object", extStart, extEnd);
10929 if (glewExperimental || GLEW_NV_parameter_buffer_object) GLEW_NV_parameter_buffer_object = !_glewInit_GL_NV_parameter_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
10930 #endif /* GL_NV_parameter_buffer_object */
10931 #ifdef GL_NV_parameter_buffer_object2
10932 GLEW_NV_parameter_buffer_object2 = _glewSearchExtension("GL_NV_parameter_buffer_object2", extStart, extEnd);
10933 #endif /* GL_NV_parameter_buffer_object2 */
10934 #ifdef GL_NV_path_rendering
10935 GLEW_NV_path_rendering = _glewSearchExtension("GL_NV_path_rendering", extStart, extEnd);
10936 if (glewExperimental || GLEW_NV_path_rendering) GLEW_NV_path_rendering = !_glewInit_GL_NV_path_rendering(GLEW_CONTEXT_ARG_VAR_INIT);
10937 #endif /* GL_NV_path_rendering */
10938 #ifdef GL_NV_path_rendering_shared_edge
10939 GLEW_NV_path_rendering_shared_edge = _glewSearchExtension("GL_NV_path_rendering_shared_edge", extStart, extEnd);
10940 #endif /* GL_NV_path_rendering_shared_edge */
10941 #ifdef GL_NV_pixel_data_range
10942 GLEW_NV_pixel_data_range = _glewSearchExtension("GL_NV_pixel_data_range", extStart, extEnd);
10943 if (glewExperimental || GLEW_NV_pixel_data_range) GLEW_NV_pixel_data_range = !_glewInit_GL_NV_pixel_data_range(GLEW_CONTEXT_ARG_VAR_INIT);
10944 #endif /* GL_NV_pixel_data_range */
10945 #ifdef GL_NV_point_sprite
10946 GLEW_NV_point_sprite = _glewSearchExtension("GL_NV_point_sprite", extStart, extEnd);
10947 if (glewExperimental || GLEW_NV_point_sprite) GLEW_NV_point_sprite = !_glewInit_GL_NV_point_sprite(GLEW_CONTEXT_ARG_VAR_INIT);
10948 #endif /* GL_NV_point_sprite */
10949 #ifdef GL_NV_present_video
10950 GLEW_NV_present_video = _glewSearchExtension("GL_NV_present_video", extStart, extEnd);
10951 if (glewExperimental || GLEW_NV_present_video) GLEW_NV_present_video = !_glewInit_GL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT);
10952 #endif /* GL_NV_present_video */
10953 #ifdef GL_NV_primitive_restart
10954 GLEW_NV_primitive_restart = _glewSearchExtension("GL_NV_primitive_restart", extStart, extEnd);
10955 if (glewExperimental || GLEW_NV_primitive_restart) GLEW_NV_primitive_restart = !_glewInit_GL_NV_primitive_restart(GLEW_CONTEXT_ARG_VAR_INIT);
10956 #endif /* GL_NV_primitive_restart */
10957 #ifdef GL_NV_register_combiners
10958 GLEW_NV_register_combiners = _glewSearchExtension("GL_NV_register_combiners", extStart, extEnd);
10959 if (glewExperimental || GLEW_NV_register_combiners) GLEW_NV_register_combiners = !_glewInit_GL_NV_register_combiners(GLEW_CONTEXT_ARG_VAR_INIT);
10960 #endif /* GL_NV_register_combiners */
10961 #ifdef GL_NV_register_combiners2
10962 GLEW_NV_register_combiners2 = _glewSearchExtension("GL_NV_register_combiners2", extStart, extEnd);
10963 if (glewExperimental || GLEW_NV_register_combiners2) GLEW_NV_register_combiners2 = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT);
10964 #endif /* GL_NV_register_combiners2 */
10965 #ifdef GL_NV_sample_locations
10966 GLEW_NV_sample_locations = _glewSearchExtension("GL_NV_sample_locations", extStart, extEnd);
10967 if (glewExperimental || GLEW_NV_sample_locations) GLEW_NV_sample_locations = !_glewInit_GL_NV_sample_locations(GLEW_CONTEXT_ARG_VAR_INIT);
10968 #endif /* GL_NV_sample_locations */
10969 #ifdef GL_NV_sample_mask_override_coverage
10970 GLEW_NV_sample_mask_override_coverage = _glewSearchExtension("GL_NV_sample_mask_override_coverage", extStart, extEnd);
10971 #endif /* GL_NV_sample_mask_override_coverage */
10972 #ifdef GL_NV_shader_atomic_counters
10973 GLEW_NV_shader_atomic_counters = _glewSearchExtension("GL_NV_shader_atomic_counters", extStart, extEnd);
10974 #endif /* GL_NV_shader_atomic_counters */
10975 #ifdef GL_NV_shader_atomic_float
10976 GLEW_NV_shader_atomic_float = _glewSearchExtension("GL_NV_shader_atomic_float", extStart, extEnd);
10977 #endif /* GL_NV_shader_atomic_float */
10978 #ifdef GL_NV_shader_atomic_fp16_vector
10979 GLEW_NV_shader_atomic_fp16_vector = _glewSearchExtension("GL_NV_shader_atomic_fp16_vector", extStart, extEnd);
10980 #endif /* GL_NV_shader_atomic_fp16_vector */
10981 #ifdef GL_NV_shader_atomic_int64
10982 GLEW_NV_shader_atomic_int64 = _glewSearchExtension("GL_NV_shader_atomic_int64", extStart, extEnd);
10983 #endif /* GL_NV_shader_atomic_int64 */
10984 #ifdef GL_NV_shader_buffer_load
10985 GLEW_NV_shader_buffer_load = _glewSearchExtension("GL_NV_shader_buffer_load", extStart, extEnd);
10986 if (glewExperimental || GLEW_NV_shader_buffer_load) GLEW_NV_shader_buffer_load = !_glewInit_GL_NV_shader_buffer_load(GLEW_CONTEXT_ARG_VAR_INIT);
10987 #endif /* GL_NV_shader_buffer_load */
10988 #ifdef GL_NV_shader_storage_buffer_object
10989 GLEW_NV_shader_storage_buffer_object = _glewSearchExtension("GL_NV_shader_storage_buffer_object", extStart, extEnd);
10990 #endif /* GL_NV_shader_storage_buffer_object */
10991 #ifdef GL_NV_shader_thread_group
10992 GLEW_NV_shader_thread_group = _glewSearchExtension("GL_NV_shader_thread_group", extStart, extEnd);
10993 #endif /* GL_NV_shader_thread_group */
10994 #ifdef GL_NV_shader_thread_shuffle
10995 GLEW_NV_shader_thread_shuffle = _glewSearchExtension("GL_NV_shader_thread_shuffle", extStart, extEnd);
10996 #endif /* GL_NV_shader_thread_shuffle */
10997 #ifdef GL_NV_tessellation_program5
10998 GLEW_NV_tessellation_program5 = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd);
10999 #endif /* GL_NV_tessellation_program5 */
11000 #ifdef GL_NV_texgen_emboss
11001 GLEW_NV_texgen_emboss = _glewSearchExtension("GL_NV_texgen_emboss", extStart, extEnd);
11002 #endif /* GL_NV_texgen_emboss */
11003 #ifdef GL_NV_texgen_reflection
11004 GLEW_NV_texgen_reflection = _glewSearchExtension("GL_NV_texgen_reflection", extStart, extEnd);
11005 #endif /* GL_NV_texgen_reflection */
11006 #ifdef GL_NV_texture_barrier
11007 GLEW_NV_texture_barrier = _glewSearchExtension("GL_NV_texture_barrier", extStart, extEnd);
11008 if (glewExperimental || GLEW_NV_texture_barrier) GLEW_NV_texture_barrier = !_glewInit_GL_NV_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT);
11009 #endif /* GL_NV_texture_barrier */
11010 #ifdef GL_NV_texture_compression_vtc
11011 GLEW_NV_texture_compression_vtc = _glewSearchExtension("GL_NV_texture_compression_vtc", extStart, extEnd);
11012 #endif /* GL_NV_texture_compression_vtc */
11013 #ifdef GL_NV_texture_env_combine4
11014 GLEW_NV_texture_env_combine4 = _glewSearchExtension("GL_NV_texture_env_combine4", extStart, extEnd);
11015 #endif /* GL_NV_texture_env_combine4 */
11016 #ifdef GL_NV_texture_expand_normal
11017 GLEW_NV_texture_expand_normal = _glewSearchExtension("GL_NV_texture_expand_normal", extStart, extEnd);
11018 #endif /* GL_NV_texture_expand_normal */
11019 #ifdef GL_NV_texture_multisample
11020 GLEW_NV_texture_multisample = _glewSearchExtension("GL_NV_texture_multisample", extStart, extEnd);
11021 if (glewExperimental || GLEW_NV_texture_multisample) GLEW_NV_texture_multisample = !_glewInit_GL_NV_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
11022 #endif /* GL_NV_texture_multisample */
11023 #ifdef GL_NV_texture_rectangle
11024 GLEW_NV_texture_rectangle = _glewSearchExtension("GL_NV_texture_rectangle", extStart, extEnd);
11025 #endif /* GL_NV_texture_rectangle */
11026 #ifdef GL_NV_texture_shader
11027 GLEW_NV_texture_shader = _glewSearchExtension("GL_NV_texture_shader", extStart, extEnd);
11028 #endif /* GL_NV_texture_shader */
11029 #ifdef GL_NV_texture_shader2
11030 GLEW_NV_texture_shader2 = _glewSearchExtension("GL_NV_texture_shader2", extStart, extEnd);
11031 #endif /* GL_NV_texture_shader2 */
11032 #ifdef GL_NV_texture_shader3
11033 GLEW_NV_texture_shader3 = _glewSearchExtension("GL_NV_texture_shader3", extStart, extEnd);
11034 #endif /* GL_NV_texture_shader3 */
11035 #ifdef GL_NV_transform_feedback
11036 GLEW_NV_transform_feedback = _glewSearchExtension("GL_NV_transform_feedback", extStart, extEnd);
11037 if (glewExperimental || GLEW_NV_transform_feedback) GLEW_NV_transform_feedback = !_glewInit_GL_NV_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT);
11038 #endif /* GL_NV_transform_feedback */
11039 #ifdef GL_NV_transform_feedback2
11040 GLEW_NV_transform_feedback2 = _glewSearchExtension("GL_NV_transform_feedback2", extStart, extEnd);
11041 if (glewExperimental || GLEW_NV_transform_feedback2) GLEW_NV_transform_feedback2 = !_glewInit_GL_NV_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT);
11042 #endif /* GL_NV_transform_feedback2 */
11043 #ifdef GL_NV_uniform_buffer_unified_memory
11044 GLEW_NV_uniform_buffer_unified_memory = _glewSearchExtension("GL_NV_uniform_buffer_unified_memory", extStart, extEnd);
11045 #endif /* GL_NV_uniform_buffer_unified_memory */
11046 #ifdef GL_NV_vdpau_interop
11047 GLEW_NV_vdpau_interop = _glewSearchExtension("GL_NV_vdpau_interop", extStart, extEnd);
11048 if (glewExperimental || GLEW_NV_vdpau_interop) GLEW_NV_vdpau_interop = !_glewInit_GL_NV_vdpau_interop(GLEW_CONTEXT_ARG_VAR_INIT);
11049 #endif /* GL_NV_vdpau_interop */
11050 #ifdef GL_NV_vertex_array_range
11051 GLEW_NV_vertex_array_range = _glewSearchExtension("GL_NV_vertex_array_range", extStart, extEnd);
11052 if (glewExperimental || GLEW_NV_vertex_array_range) GLEW_NV_vertex_array_range = !_glewInit_GL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT);
11053 #endif /* GL_NV_vertex_array_range */
11054 #ifdef GL_NV_vertex_array_range2
11055 GLEW_NV_vertex_array_range2 = _glewSearchExtension("GL_NV_vertex_array_range2", extStart, extEnd);
11056 #endif /* GL_NV_vertex_array_range2 */
11057 #ifdef GL_NV_vertex_attrib_integer_64bit
11058 GLEW_NV_vertex_attrib_integer_64bit = _glewSearchExtension("GL_NV_vertex_attrib_integer_64bit", extStart, extEnd);
11059 if (glewExperimental || GLEW_NV_vertex_attrib_integer_64bit) GLEW_NV_vertex_attrib_integer_64bit = !_glewInit_GL_NV_vertex_attrib_integer_64bit(GLEW_CONTEXT_ARG_VAR_INIT);
11060 #endif /* GL_NV_vertex_attrib_integer_64bit */
11061 #ifdef GL_NV_vertex_buffer_unified_memory
11062 GLEW_NV_vertex_buffer_unified_memory = _glewSearchExtension("GL_NV_vertex_buffer_unified_memory", extStart, extEnd);
11063 if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) GLEW_NV_vertex_buffer_unified_memory = !_glewInit_GL_NV_vertex_buffer_unified_memory(GLEW_CONTEXT_ARG_VAR_INIT);
11064 #endif /* GL_NV_vertex_buffer_unified_memory */
11065 #ifdef GL_NV_vertex_program
11066 GLEW_NV_vertex_program = _glewSearchExtension("GL_NV_vertex_program", extStart, extEnd);
11067 if (glewExperimental || GLEW_NV_vertex_program) GLEW_NV_vertex_program = !_glewInit_GL_NV_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT);
11068 #endif /* GL_NV_vertex_program */
11069 #ifdef GL_NV_vertex_program1_1
11070 GLEW_NV_vertex_program1_1 = _glewSearchExtension("GL_NV_vertex_program1_1", extStart, extEnd);
11071 #endif /* GL_NV_vertex_program1_1 */
11072 #ifdef GL_NV_vertex_program2
11073 GLEW_NV_vertex_program2 = _glewSearchExtension("GL_NV_vertex_program2", extStart, extEnd);
11074 #endif /* GL_NV_vertex_program2 */
11075 #ifdef GL_NV_vertex_program2_option
11076 GLEW_NV_vertex_program2_option = _glewSearchExtension("GL_NV_vertex_program2_option", extStart, extEnd);
11077 #endif /* GL_NV_vertex_program2_option */
11078 #ifdef GL_NV_vertex_program3
11079 GLEW_NV_vertex_program3 = _glewSearchExtension("GL_NV_vertex_program3", extStart, extEnd);
11080 #endif /* GL_NV_vertex_program3 */
11081 #ifdef GL_NV_vertex_program4
11082 GLEW_NV_vertex_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd);
11083 #endif /* GL_NV_vertex_program4 */
11084 #ifdef GL_NV_video_capture
11085 GLEW_NV_video_capture = _glewSearchExtension("GL_NV_video_capture", extStart, extEnd);
11086 if (glewExperimental || GLEW_NV_video_capture) GLEW_NV_video_capture = !_glewInit_GL_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT);
11087 #endif /* GL_NV_video_capture */
11088 #ifdef GL_NV_viewport_array2
11089 GLEW_NV_viewport_array2 = _glewSearchExtension("GL_NV_viewport_array2", extStart, extEnd);
11090 #endif /* GL_NV_viewport_array2 */
11091 #ifdef GL_OES_byte_coordinates
11092 GLEW_OES_byte_coordinates = _glewSearchExtension("GL_OES_byte_coordinates", extStart, extEnd);
11093 #endif /* GL_OES_byte_coordinates */
11094 #ifdef GL_OES_compressed_paletted_texture
11095 GLEW_OES_compressed_paletted_texture = _glewSearchExtension("GL_OES_compressed_paletted_texture", extStart, extEnd);
11096 #endif /* GL_OES_compressed_paletted_texture */
11097 #ifdef GL_OES_read_format
11098 GLEW_OES_read_format = _glewSearchExtension("GL_OES_read_format", extStart, extEnd);
11099 #endif /* GL_OES_read_format */
11100 #ifdef GL_OES_single_precision
11101 GLEW_OES_single_precision = _glewSearchExtension("GL_OES_single_precision", extStart, extEnd);
11102 if (glewExperimental || GLEW_OES_single_precision) GLEW_OES_single_precision = !_glewInit_GL_OES_single_precision(GLEW_CONTEXT_ARG_VAR_INIT);
11103 #endif /* GL_OES_single_precision */
11104 #ifdef GL_OML_interlace
11105 GLEW_OML_interlace = _glewSearchExtension("GL_OML_interlace", extStart, extEnd);
11106 #endif /* GL_OML_interlace */
11107 #ifdef GL_OML_resample
11108 GLEW_OML_resample = _glewSearchExtension("GL_OML_resample", extStart, extEnd);
11109 #endif /* GL_OML_resample */
11110 #ifdef GL_OML_subsample
11111 GLEW_OML_subsample = _glewSearchExtension("GL_OML_subsample", extStart, extEnd);
11112 #endif /* GL_OML_subsample */
11113 #ifdef GL_OVR_multiview
11114 GLEW_OVR_multiview = _glewSearchExtension("GL_OVR_multiview", extStart, extEnd);
11115 if (glewExperimental || GLEW_OVR_multiview) GLEW_OVR_multiview = !_glewInit_GL_OVR_multiview(GLEW_CONTEXT_ARG_VAR_INIT);
11116 #endif /* GL_OVR_multiview */
11117 #ifdef GL_OVR_multiview2
11118 GLEW_OVR_multiview2 = _glewSearchExtension("GL_OVR_multiview2", extStart, extEnd);
11119 #endif /* GL_OVR_multiview2 */
11120 #ifdef GL_PGI_misc_hints
11121 GLEW_PGI_misc_hints = _glewSearchExtension("GL_PGI_misc_hints", extStart, extEnd);
11122 #endif /* GL_PGI_misc_hints */
11123 #ifdef GL_PGI_vertex_hints
11124 GLEW_PGI_vertex_hints = _glewSearchExtension("GL_PGI_vertex_hints", extStart, extEnd);
11125 #endif /* GL_PGI_vertex_hints */
11126 #ifdef GL_REGAL_ES1_0_compatibility
11127 GLEW_REGAL_ES1_0_compatibility = _glewSearchExtension("GL_REGAL_ES1_0_compatibility", extStart, extEnd);
11128 if (glewExperimental || GLEW_REGAL_ES1_0_compatibility) GLEW_REGAL_ES1_0_compatibility = !_glewInit_GL_REGAL_ES1_0_compatibility(GLEW_CONTEXT_ARG_VAR_INIT);
11129 #endif /* GL_REGAL_ES1_0_compatibility */
11130 #ifdef GL_REGAL_ES1_1_compatibility
11131 GLEW_REGAL_ES1_1_compatibility = _glewSearchExtension("GL_REGAL_ES1_1_compatibility", extStart, extEnd);
11132 if (glewExperimental || GLEW_REGAL_ES1_1_compatibility) GLEW_REGAL_ES1_1_compatibility = !_glewInit_GL_REGAL_ES1_1_compatibility(GLEW_CONTEXT_ARG_VAR_INIT);
11133 #endif /* GL_REGAL_ES1_1_compatibility */
11134 #ifdef GL_REGAL_enable
11135 GLEW_REGAL_enable = _glewSearchExtension("GL_REGAL_enable", extStart, extEnd);
11136 #endif /* GL_REGAL_enable */
11137 #ifdef GL_REGAL_error_string
11138 GLEW_REGAL_error_string = _glewSearchExtension("GL_REGAL_error_string", extStart, extEnd);
11139 if (glewExperimental || GLEW_REGAL_error_string) GLEW_REGAL_error_string = !_glewInit_GL_REGAL_error_string(GLEW_CONTEXT_ARG_VAR_INIT);
11140 #endif /* GL_REGAL_error_string */
11141 #ifdef GL_REGAL_extension_query
11142 GLEW_REGAL_extension_query = _glewSearchExtension("GL_REGAL_extension_query", extStart, extEnd);
11143 if (glewExperimental || GLEW_REGAL_extension_query) GLEW_REGAL_extension_query = !_glewInit_GL_REGAL_extension_query(GLEW_CONTEXT_ARG_VAR_INIT);
11144 #endif /* GL_REGAL_extension_query */
11145 #ifdef GL_REGAL_log
11146 GLEW_REGAL_log = _glewSearchExtension("GL_REGAL_log", extStart, extEnd);
11147 if (glewExperimental || GLEW_REGAL_log) GLEW_REGAL_log = !_glewInit_GL_REGAL_log(GLEW_CONTEXT_ARG_VAR_INIT);
11148 #endif /* GL_REGAL_log */
11149 #ifdef GL_REGAL_proc_address
11150 GLEW_REGAL_proc_address = _glewSearchExtension("GL_REGAL_proc_address", extStart, extEnd);
11151 if (glewExperimental || GLEW_REGAL_proc_address) GLEW_REGAL_proc_address = !_glewInit_GL_REGAL_proc_address(GLEW_CONTEXT_ARG_VAR_INIT);
11152 #endif /* GL_REGAL_proc_address */
11153 #ifdef GL_REND_screen_coordinates
11154 GLEW_REND_screen_coordinates = _glewSearchExtension("GL_REND_screen_coordinates", extStart, extEnd);
11155 #endif /* GL_REND_screen_coordinates */
11156 #ifdef GL_S3_s3tc
11157 GLEW_S3_s3tc = _glewSearchExtension("GL_S3_s3tc", extStart, extEnd);
11158 #endif /* GL_S3_s3tc */
11159 #ifdef GL_SGIS_color_range
11160 GLEW_SGIS_color_range = _glewSearchExtension("GL_SGIS_color_range", extStart, extEnd);
11161 #endif /* GL_SGIS_color_range */
11162 #ifdef GL_SGIS_detail_texture
11163 GLEW_SGIS_detail_texture = _glewSearchExtension("GL_SGIS_detail_texture", extStart, extEnd);
11164 if (glewExperimental || GLEW_SGIS_detail_texture) GLEW_SGIS_detail_texture = !_glewInit_GL_SGIS_detail_texture(GLEW_CONTEXT_ARG_VAR_INIT);
11165 #endif /* GL_SGIS_detail_texture */
11166 #ifdef GL_SGIS_fog_function
11167 GLEW_SGIS_fog_function = _glewSearchExtension("GL_SGIS_fog_function", extStart, extEnd);
11168 if (glewExperimental || GLEW_SGIS_fog_function) GLEW_SGIS_fog_function = !_glewInit_GL_SGIS_fog_function(GLEW_CONTEXT_ARG_VAR_INIT);
11169 #endif /* GL_SGIS_fog_function */
11170 #ifdef GL_SGIS_generate_mipmap
11171 GLEW_SGIS_generate_mipmap = _glewSearchExtension("GL_SGIS_generate_mipmap", extStart, extEnd);
11172 #endif /* GL_SGIS_generate_mipmap */
11173 #ifdef GL_SGIS_multisample
11174 GLEW_SGIS_multisample = _glewSearchExtension("GL_SGIS_multisample", extStart, extEnd);
11175 if (glewExperimental || GLEW_SGIS_multisample) GLEW_SGIS_multisample = !_glewInit_GL_SGIS_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
11176 #endif /* GL_SGIS_multisample */
11177 #ifdef GL_SGIS_pixel_texture
11178 GLEW_SGIS_pixel_texture = _glewSearchExtension("GL_SGIS_pixel_texture", extStart, extEnd);
11179 #endif /* GL_SGIS_pixel_texture */
11180 #ifdef GL_SGIS_point_line_texgen
11181 GLEW_SGIS_point_line_texgen = _glewSearchExtension("GL_SGIS_point_line_texgen", extStart, extEnd);
11182 #endif /* GL_SGIS_point_line_texgen */
11183 #ifdef GL_SGIS_sharpen_texture
11184 GLEW_SGIS_sharpen_texture = _glewSearchExtension("GL_SGIS_sharpen_texture", extStart, extEnd);
11185 if (glewExperimental || GLEW_SGIS_sharpen_texture) GLEW_SGIS_sharpen_texture = !_glewInit_GL_SGIS_sharpen_texture(GLEW_CONTEXT_ARG_VAR_INIT);
11186 #endif /* GL_SGIS_sharpen_texture */
11187 #ifdef GL_SGIS_texture4D
11188 GLEW_SGIS_texture4D = _glewSearchExtension("GL_SGIS_texture4D", extStart, extEnd);
11189 if (glewExperimental || GLEW_SGIS_texture4D) GLEW_SGIS_texture4D = !_glewInit_GL_SGIS_texture4D(GLEW_CONTEXT_ARG_VAR_INIT);
11190 #endif /* GL_SGIS_texture4D */
11191 #ifdef GL_SGIS_texture_border_clamp
11192 GLEW_SGIS_texture_border_clamp = _glewSearchExtension("GL_SGIS_texture_border_clamp", extStart, extEnd);
11193 #endif /* GL_SGIS_texture_border_clamp */
11194 #ifdef GL_SGIS_texture_edge_clamp
11195 GLEW_SGIS_texture_edge_clamp = _glewSearchExtension("GL_SGIS_texture_edge_clamp", extStart, extEnd);
11196 #endif /* GL_SGIS_texture_edge_clamp */
11197 #ifdef GL_SGIS_texture_filter4
11198 GLEW_SGIS_texture_filter4 = _glewSearchExtension("GL_SGIS_texture_filter4", extStart, extEnd);
11199 if (glewExperimental || GLEW_SGIS_texture_filter4) GLEW_SGIS_texture_filter4 = !_glewInit_GL_SGIS_texture_filter4(GLEW_CONTEXT_ARG_VAR_INIT);
11200 #endif /* GL_SGIS_texture_filter4 */
11201 #ifdef GL_SGIS_texture_lod
11202 GLEW_SGIS_texture_lod = _glewSearchExtension("GL_SGIS_texture_lod", extStart, extEnd);
11203 #endif /* GL_SGIS_texture_lod */
11204 #ifdef GL_SGIS_texture_select
11205 GLEW_SGIS_texture_select = _glewSearchExtension("GL_SGIS_texture_select", extStart, extEnd);
11206 #endif /* GL_SGIS_texture_select */
11207 #ifdef GL_SGIX_async
11208 GLEW_SGIX_async = _glewSearchExtension("GL_SGIX_async", extStart, extEnd);
11209 if (glewExperimental || GLEW_SGIX_async) GLEW_SGIX_async = !_glewInit_GL_SGIX_async(GLEW_CONTEXT_ARG_VAR_INIT);
11210 #endif /* GL_SGIX_async */
11211 #ifdef GL_SGIX_async_histogram
11212 GLEW_SGIX_async_histogram = _glewSearchExtension("GL_SGIX_async_histogram", extStart, extEnd);
11213 #endif /* GL_SGIX_async_histogram */
11214 #ifdef GL_SGIX_async_pixel
11215 GLEW_SGIX_async_pixel = _glewSearchExtension("GL_SGIX_async_pixel", extStart, extEnd);
11216 #endif /* GL_SGIX_async_pixel */
11217 #ifdef GL_SGIX_blend_alpha_minmax
11218 GLEW_SGIX_blend_alpha_minmax = _glewSearchExtension("GL_SGIX_blend_alpha_minmax", extStart, extEnd);
11219 #endif /* GL_SGIX_blend_alpha_minmax */
11220 #ifdef GL_SGIX_clipmap
11221 GLEW_SGIX_clipmap = _glewSearchExtension("GL_SGIX_clipmap", extStart, extEnd);
11222 #endif /* GL_SGIX_clipmap */
11223 #ifdef GL_SGIX_convolution_accuracy
11224 GLEW_SGIX_convolution_accuracy = _glewSearchExtension("GL_SGIX_convolution_accuracy", extStart, extEnd);
11225 #endif /* GL_SGIX_convolution_accuracy */
11226 #ifdef GL_SGIX_depth_texture
11227 GLEW_SGIX_depth_texture = _glewSearchExtension("GL_SGIX_depth_texture", extStart, extEnd);
11228 #endif /* GL_SGIX_depth_texture */
11229 #ifdef GL_SGIX_flush_raster
11230 GLEW_SGIX_flush_raster = _glewSearchExtension("GL_SGIX_flush_raster", extStart, extEnd);
11231 if (glewExperimental || GLEW_SGIX_flush_raster) GLEW_SGIX_flush_raster = !_glewInit_GL_SGIX_flush_raster(GLEW_CONTEXT_ARG_VAR_INIT);
11232 #endif /* GL_SGIX_flush_raster */
11233 #ifdef GL_SGIX_fog_offset
11234 GLEW_SGIX_fog_offset = _glewSearchExtension("GL_SGIX_fog_offset", extStart, extEnd);
11235 #endif /* GL_SGIX_fog_offset */
11236 #ifdef GL_SGIX_fog_texture
11237 GLEW_SGIX_fog_texture = _glewSearchExtension("GL_SGIX_fog_texture", extStart, extEnd);
11238 if (glewExperimental || GLEW_SGIX_fog_texture) GLEW_SGIX_fog_texture = !_glewInit_GL_SGIX_fog_texture(GLEW_CONTEXT_ARG_VAR_INIT);
11239 #endif /* GL_SGIX_fog_texture */
11240 #ifdef GL_SGIX_fragment_specular_lighting
11241 GLEW_SGIX_fragment_specular_lighting = _glewSearchExtension("GL_SGIX_fragment_specular_lighting", extStart, extEnd);
11242 if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) GLEW_SGIX_fragment_specular_lighting = !_glewInit_GL_SGIX_fragment_specular_lighting(GLEW_CONTEXT_ARG_VAR_INIT);
11243 #endif /* GL_SGIX_fragment_specular_lighting */
11244 #ifdef GL_SGIX_framezoom
11245 GLEW_SGIX_framezoom = _glewSearchExtension("GL_SGIX_framezoom", extStart, extEnd);
11246 if (glewExperimental || GLEW_SGIX_framezoom) GLEW_SGIX_framezoom = !_glewInit_GL_SGIX_framezoom(GLEW_CONTEXT_ARG_VAR_INIT);
11247 #endif /* GL_SGIX_framezoom */
11248 #ifdef GL_SGIX_interlace
11249 GLEW_SGIX_interlace = _glewSearchExtension("GL_SGIX_interlace", extStart, extEnd);
11250 #endif /* GL_SGIX_interlace */
11251 #ifdef GL_SGIX_ir_instrument1
11252 GLEW_SGIX_ir_instrument1 = _glewSearchExtension("GL_SGIX_ir_instrument1", extStart, extEnd);
11253 #endif /* GL_SGIX_ir_instrument1 */
11254 #ifdef GL_SGIX_list_priority
11255 GLEW_SGIX_list_priority = _glewSearchExtension("GL_SGIX_list_priority", extStart, extEnd);
11256 #endif /* GL_SGIX_list_priority */
11257 #ifdef GL_SGIX_pixel_texture
11258 GLEW_SGIX_pixel_texture = _glewSearchExtension("GL_SGIX_pixel_texture", extStart, extEnd);
11259 if (glewExperimental || GLEW_SGIX_pixel_texture) GLEW_SGIX_pixel_texture = !_glewInit_GL_SGIX_pixel_texture(GLEW_CONTEXT_ARG_VAR_INIT);
11260 #endif /* GL_SGIX_pixel_texture */
11261 #ifdef GL_SGIX_pixel_texture_bits
11262 GLEW_SGIX_pixel_texture_bits = _glewSearchExtension("GL_SGIX_pixel_texture_bits", extStart, extEnd);
11263 #endif /* GL_SGIX_pixel_texture_bits */
11264 #ifdef GL_SGIX_reference_plane
11265 GLEW_SGIX_reference_plane = _glewSearchExtension("GL_SGIX_reference_plane", extStart, extEnd);
11266 if (glewExperimental || GLEW_SGIX_reference_plane) GLEW_SGIX_reference_plane = !_glewInit_GL_SGIX_reference_plane(GLEW_CONTEXT_ARG_VAR_INIT);
11267 #endif /* GL_SGIX_reference_plane */
11268 #ifdef GL_SGIX_resample
11269 GLEW_SGIX_resample = _glewSearchExtension("GL_SGIX_resample", extStart, extEnd);
11270 #endif /* GL_SGIX_resample */
11271 #ifdef GL_SGIX_shadow
11272 GLEW_SGIX_shadow = _glewSearchExtension("GL_SGIX_shadow", extStart, extEnd);
11273 #endif /* GL_SGIX_shadow */
11274 #ifdef GL_SGIX_shadow_ambient
11275 GLEW_SGIX_shadow_ambient = _glewSearchExtension("GL_SGIX_shadow_ambient", extStart, extEnd);
11276 #endif /* GL_SGIX_shadow_ambient */
11277 #ifdef GL_SGIX_sprite
11278 GLEW_SGIX_sprite = _glewSearchExtension("GL_SGIX_sprite", extStart, extEnd);
11279 if (glewExperimental || GLEW_SGIX_sprite) GLEW_SGIX_sprite = !_glewInit_GL_SGIX_sprite(GLEW_CONTEXT_ARG_VAR_INIT);
11280 #endif /* GL_SGIX_sprite */
11281 #ifdef GL_SGIX_tag_sample_buffer
11282 GLEW_SGIX_tag_sample_buffer = _glewSearchExtension("GL_SGIX_tag_sample_buffer", extStart, extEnd);
11283 if (glewExperimental || GLEW_SGIX_tag_sample_buffer) GLEW_SGIX_tag_sample_buffer = !_glewInit_GL_SGIX_tag_sample_buffer(GLEW_CONTEXT_ARG_VAR_INIT);
11284 #endif /* GL_SGIX_tag_sample_buffer */
11285 #ifdef GL_SGIX_texture_add_env
11286 GLEW_SGIX_texture_add_env = _glewSearchExtension("GL_SGIX_texture_add_env", extStart, extEnd);
11287 #endif /* GL_SGIX_texture_add_env */
11288 #ifdef GL_SGIX_texture_coordinate_clamp
11289 GLEW_SGIX_texture_coordinate_clamp = _glewSearchExtension("GL_SGIX_texture_coordinate_clamp", extStart, extEnd);
11290 #endif /* GL_SGIX_texture_coordinate_clamp */
11291 #ifdef GL_SGIX_texture_lod_bias
11292 GLEW_SGIX_texture_lod_bias = _glewSearchExtension("GL_SGIX_texture_lod_bias", extStart, extEnd);
11293 #endif /* GL_SGIX_texture_lod_bias */
11294 #ifdef GL_SGIX_texture_multi_buffer
11295 GLEW_SGIX_texture_multi_buffer = _glewSearchExtension("GL_SGIX_texture_multi_buffer", extStart, extEnd);
11296 #endif /* GL_SGIX_texture_multi_buffer */
11297 #ifdef GL_SGIX_texture_range
11298 GLEW_SGIX_texture_range = _glewSearchExtension("GL_SGIX_texture_range", extStart, extEnd);
11299 #endif /* GL_SGIX_texture_range */
11300 #ifdef GL_SGIX_texture_scale_bias
11301 GLEW_SGIX_texture_scale_bias = _glewSearchExtension("GL_SGIX_texture_scale_bias", extStart, extEnd);
11302 #endif /* GL_SGIX_texture_scale_bias */
11303 #ifdef GL_SGIX_vertex_preclip
11304 GLEW_SGIX_vertex_preclip = _glewSearchExtension("GL_SGIX_vertex_preclip", extStart, extEnd);
11305 #endif /* GL_SGIX_vertex_preclip */
11306 #ifdef GL_SGIX_vertex_preclip_hint
11307 GLEW_SGIX_vertex_preclip_hint = _glewSearchExtension("GL_SGIX_vertex_preclip_hint", extStart, extEnd);
11308 #endif /* GL_SGIX_vertex_preclip_hint */
11309 #ifdef GL_SGIX_ycrcb
11310 GLEW_SGIX_ycrcb = _glewSearchExtension("GL_SGIX_ycrcb", extStart, extEnd);
11311 #endif /* GL_SGIX_ycrcb */
11312 #ifdef GL_SGI_color_matrix
11313 GLEW_SGI_color_matrix = _glewSearchExtension("GL_SGI_color_matrix", extStart, extEnd);
11314 #endif /* GL_SGI_color_matrix */
11315 #ifdef GL_SGI_color_table
11316 GLEW_SGI_color_table = _glewSearchExtension("GL_SGI_color_table", extStart, extEnd);
11317 if (glewExperimental || GLEW_SGI_color_table) GLEW_SGI_color_table = !_glewInit_GL_SGI_color_table(GLEW_CONTEXT_ARG_VAR_INIT);
11318 #endif /* GL_SGI_color_table */
11319 #ifdef GL_SGI_texture_color_table
11320 GLEW_SGI_texture_color_table = _glewSearchExtension("GL_SGI_texture_color_table", extStart, extEnd);
11321 #endif /* GL_SGI_texture_color_table */
11322 #ifdef GL_SUNX_constant_data
11323 GLEW_SUNX_constant_data = _glewSearchExtension("GL_SUNX_constant_data", extStart, extEnd);
11324 if (glewExperimental || GLEW_SUNX_constant_data) GLEW_SUNX_constant_data = !_glewInit_GL_SUNX_constant_data(GLEW_CONTEXT_ARG_VAR_INIT);
11325 #endif /* GL_SUNX_constant_data */
11326 #ifdef GL_SUN_convolution_border_modes
11327 GLEW_SUN_convolution_border_modes = _glewSearchExtension("GL_SUN_convolution_border_modes", extStart, extEnd);
11328 #endif /* GL_SUN_convolution_border_modes */
11329 #ifdef GL_SUN_global_alpha
11330 GLEW_SUN_global_alpha = _glewSearchExtension("GL_SUN_global_alpha", extStart, extEnd);
11331 if (glewExperimental || GLEW_SUN_global_alpha) GLEW_SUN_global_alpha = !_glewInit_GL_SUN_global_alpha(GLEW_CONTEXT_ARG_VAR_INIT);
11332 #endif /* GL_SUN_global_alpha */
11333 #ifdef GL_SUN_mesh_array
11334 GLEW_SUN_mesh_array = _glewSearchExtension("GL_SUN_mesh_array", extStart, extEnd);
11335 #endif /* GL_SUN_mesh_array */
11336 #ifdef GL_SUN_read_video_pixels
11337 GLEW_SUN_read_video_pixels = _glewSearchExtension("GL_SUN_read_video_pixels", extStart, extEnd);
11338 if (glewExperimental || GLEW_SUN_read_video_pixels) GLEW_SUN_read_video_pixels = !_glewInit_GL_SUN_read_video_pixels(GLEW_CONTEXT_ARG_VAR_INIT);
11339 #endif /* GL_SUN_read_video_pixels */
11340 #ifdef GL_SUN_slice_accum
11341 GLEW_SUN_slice_accum = _glewSearchExtension("GL_SUN_slice_accum", extStart, extEnd);
11342 #endif /* GL_SUN_slice_accum */
11343 #ifdef GL_SUN_triangle_list
11344 GLEW_SUN_triangle_list = _glewSearchExtension("GL_SUN_triangle_list", extStart, extEnd);
11345 if (glewExperimental || GLEW_SUN_triangle_list) GLEW_SUN_triangle_list = !_glewInit_GL_SUN_triangle_list(GLEW_CONTEXT_ARG_VAR_INIT);
11346 #endif /* GL_SUN_triangle_list */
11347 #ifdef GL_SUN_vertex
11348 GLEW_SUN_vertex = _glewSearchExtension("GL_SUN_vertex", extStart, extEnd);
11349 if (glewExperimental || GLEW_SUN_vertex) GLEW_SUN_vertex = !_glewInit_GL_SUN_vertex(GLEW_CONTEXT_ARG_VAR_INIT);
11350 #endif /* GL_SUN_vertex */
11351 #ifdef GL_WIN_phong_shading
11352 GLEW_WIN_phong_shading = _glewSearchExtension("GL_WIN_phong_shading", extStart, extEnd);
11353 #endif /* GL_WIN_phong_shading */
11354 #ifdef GL_WIN_specular_fog
11355 GLEW_WIN_specular_fog = _glewSearchExtension("GL_WIN_specular_fog", extStart, extEnd);
11356 #endif /* GL_WIN_specular_fog */
11357 #ifdef GL_WIN_swap_hint
11358 GLEW_WIN_swap_hint = _glewSearchExtension("GL_WIN_swap_hint", extStart, extEnd);
11359 if (glewExperimental || GLEW_WIN_swap_hint) GLEW_WIN_swap_hint = !_glewInit_GL_WIN_swap_hint(GLEW_CONTEXT_ARG_VAR_INIT);
11360 #endif /* GL_WIN_swap_hint */
11361
11362 return GLEW_OK;
11363 }
11364
11365
11366 #if defined(_WIN32)
11367
11368 #if !defined(GLEW_MX)
11369
11370 PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL;
11371
11372 PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL;
11373 PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL;
11374 PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL;
11375 PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL;
11376 PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL;
11377 PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL;
11378 PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL;
11379 PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL;
11380 PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL;
11381
11382 PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL;
11383 PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL;
11384 PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL;
11385 PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL;
11386
11387 PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB = NULL;
11388
11389 PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL;
11390
11391 PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL;
11392 PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL;
11393
11394 PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL;
11395 PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL;
11396 PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL;
11397 PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL;
11398 PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL;
11399
11400 PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL;
11401 PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL;
11402 PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL;
11403
11404 PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL;
11405 PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL;
11406 PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL;
11407
11408 PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL;
11409 PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL;
11410 PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL;
11411 PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL;
11412
11413 PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL;
11414
11415 PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL;
11416 PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL;
11417
11418 PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL;
11419 PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL;
11420 PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL;
11421 PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL;
11422 PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL;
11423
11424 PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL;
11425 PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL;
11426 PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL;
11427
11428 PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL;
11429 PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL;
11430
11431 PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL;
11432 PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL;
11433
11434 PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL;
11435 PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL;
11436 PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL;
11437 PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL;
11438
11439 PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL;
11440 PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL;
11441 PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL;
11442 PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL;
11443 PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL;
11444 PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL;
11445 PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL;
11446 PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL;
11447 PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL;
11448 PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL;
11449 PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL;
11450 PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL;
11451
11452 PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL;
11453 PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL;
11454 PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL;
11455 PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL;
11456
11457 PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL;
11458 PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL;
11459 PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL;
11460 PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL;
11461
11462 PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL;
11463 PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL;
11464 PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL;
11465 PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL;
11466
11467 PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV = NULL;
11468 PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV = NULL;
11469 PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV = NULL;
11470 PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV = NULL;
11471 PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV = NULL;
11472 PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV = NULL;
11473 PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV = NULL;
11474 PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV = NULL;
11475
11476 PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL;
11477
11478 PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV = NULL;
11479
11480 PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL;
11481 PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL;
11482 PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL;
11483 PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL;
11484 PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL;
11485
11486 PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV = NULL;
11487 PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV = NULL;
11488 PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV = NULL;
11489
11490 PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV = NULL;
11491 PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV = NULL;
11492 PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV = NULL;
11493 PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV = NULL;
11494 PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV = NULL;
11495 PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV = NULL;
11496
11497 PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL;
11498 PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL;
11499
11500 PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV = NULL;
11501 PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV = NULL;
11502 PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV = NULL;
11503 PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV = NULL;
11504 PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV = NULL;
11505
11506 PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV = NULL;
11507 PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV = NULL;
11508 PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV = NULL;
11509 PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV = NULL;
11510 PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV = NULL;
11511 PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV = NULL;
11512
11513 PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL;
11514 PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL;
11515 PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL;
11516 PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL;
11517 PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL;
11518 PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL;
11519 GLboolean __WGLEW_3DFX_multisample = GL_FALSE;
11520 GLboolean __WGLEW_3DL_stereo_control = GL_FALSE;
11521 GLboolean __WGLEW_AMD_gpu_association = GL_FALSE;
11522 GLboolean __WGLEW_ARB_buffer_region = GL_FALSE;
11523 GLboolean __WGLEW_ARB_context_flush_control = GL_FALSE;
11524 GLboolean __WGLEW_ARB_create_context = GL_FALSE;
11525 GLboolean __WGLEW_ARB_create_context_profile = GL_FALSE;
11526 GLboolean __WGLEW_ARB_create_context_robustness = GL_FALSE;
11527 GLboolean __WGLEW_ARB_extensions_string = GL_FALSE;
11528 GLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE;
11529 GLboolean __WGLEW_ARB_make_current_read = GL_FALSE;
11530 GLboolean __WGLEW_ARB_multisample = GL_FALSE;
11531 GLboolean __WGLEW_ARB_pbuffer = GL_FALSE;
11532 GLboolean __WGLEW_ARB_pixel_format = GL_FALSE;
11533 GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE;
11534 GLboolean __WGLEW_ARB_render_texture = GL_FALSE;
11535 GLboolean __WGLEW_ARB_robustness_application_isolation = GL_FALSE;
11536 GLboolean __WGLEW_ARB_robustness_share_group_isolation = GL_FALSE;
11537 GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE;
11538 GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE;
11539 GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE;
11540 GLboolean __WGLEW_EXT_create_context_es_profile = GL_FALSE;
11541 GLboolean __WGLEW_EXT_depth_float = GL_FALSE;
11542 GLboolean __WGLEW_EXT_display_color_table = GL_FALSE;
11543 GLboolean __WGLEW_EXT_extensions_string = GL_FALSE;
11544 GLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE;
11545 GLboolean __WGLEW_EXT_make_current_read = GL_FALSE;
11546 GLboolean __WGLEW_EXT_multisample = GL_FALSE;
11547 GLboolean __WGLEW_EXT_pbuffer = GL_FALSE;
11548 GLboolean __WGLEW_EXT_pixel_format = GL_FALSE;
11549 GLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE;
11550 GLboolean __WGLEW_EXT_swap_control = GL_FALSE;
11551 GLboolean __WGLEW_EXT_swap_control_tear = GL_FALSE;
11552 GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE;
11553 GLboolean __WGLEW_I3D_gamma = GL_FALSE;
11554 GLboolean __WGLEW_I3D_genlock = GL_FALSE;
11555 GLboolean __WGLEW_I3D_image_buffer = GL_FALSE;
11556 GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE;
11557 GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE;
11558 GLboolean __WGLEW_NV_DX_interop = GL_FALSE;
11559 GLboolean __WGLEW_NV_DX_interop2 = GL_FALSE;
11560 GLboolean __WGLEW_NV_copy_image = GL_FALSE;
11561 GLboolean __WGLEW_NV_delay_before_swap = GL_FALSE;
11562 GLboolean __WGLEW_NV_float_buffer = GL_FALSE;
11563 GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE;
11564 GLboolean __WGLEW_NV_multisample_coverage = GL_FALSE;
11565 GLboolean __WGLEW_NV_present_video = GL_FALSE;
11566 GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE;
11567 GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE;
11568 GLboolean __WGLEW_NV_swap_group = GL_FALSE;
11569 GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE;
11570 GLboolean __WGLEW_NV_video_capture = GL_FALSE;
11571 GLboolean __WGLEW_NV_video_output = GL_FALSE;
11572 GLboolean __WGLEW_OML_sync_control = GL_FALSE;
11573
11574 #endif /* !GLEW_MX */
11575
11576 #ifdef WGL_3DL_stereo_control
11577
11578 static GLboolean _glewInit_WGL_3DL_stereo_control (WGLEW_CONTEXT_ARG_DEF_INIT)
11579 {
11580 GLboolean r = GL_FALSE;
11581
11582 r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r;
11583
11584 return r;
11585 }
11586
11587 #endif /* WGL_3DL_stereo_control */
11588
11589 #ifdef WGL_AMD_gpu_association
11590
11591 static GLboolean _glewInit_WGL_AMD_gpu_association (WGLEW_CONTEXT_ARG_DEF_INIT)
11592 {
11593 GLboolean r = GL_FALSE;
11594
11595 r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"wglBlitContextFramebufferAMD")) == NULL) || r;
11596 r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAMD")) == NULL) || r;
11597 r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAttribsAMD")) == NULL) || r;
11598 r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglDeleteAssociatedContextAMD")) == NULL) || r;
11599 r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetContextGPUIDAMD")) == NULL) || r;
11600 r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentAssociatedContextAMD")) == NULL) || r;
11601 r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUIDsAMD")) == NULL) || r;
11602 r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUInfoAMD")) == NULL) || r;
11603 r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"wglMakeAssociatedContextCurrentAMD")) == NULL) || r;
11604
11605 return r;
11606 }
11607
11608 #endif /* WGL_AMD_gpu_association */
11609
11610 #ifdef WGL_ARB_buffer_region
11611
11612 static GLboolean _glewInit_WGL_ARB_buffer_region (WGLEW_CONTEXT_ARG_DEF_INIT)
11613 {
11614 GLboolean r = GL_FALSE;
11615
11616 r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r;
11617 r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r;
11618 r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r;
11619 r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r;
11620
11621 return r;
11622 }
11623
11624 #endif /* WGL_ARB_buffer_region */
11625
11626 #ifdef WGL_ARB_create_context
11627
11628 static GLboolean _glewInit_WGL_ARB_create_context (WGLEW_CONTEXT_ARG_DEF_INIT)
11629 {
11630 GLboolean r = GL_FALSE;
11631
11632 r = ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateContextAttribsARB")) == NULL) || r;
11633
11634 return r;
11635 }
11636
11637 #endif /* WGL_ARB_create_context */
11638
11639 #ifdef WGL_ARB_extensions_string
11640
11641 static GLboolean _glewInit_WGL_ARB_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT)
11642 {
11643 GLboolean r = GL_FALSE;
11644
11645 r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r;
11646
11647 return r;
11648 }
11649
11650 #endif /* WGL_ARB_extensions_string */
11651
11652 #ifdef WGL_ARB_make_current_read
11653
11654 static GLboolean _glewInit_WGL_ARB_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT)
11655 {
11656 GLboolean r = GL_FALSE;
11657
11658 r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r;
11659 r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r;
11660
11661 return r;
11662 }
11663
11664 #endif /* WGL_ARB_make_current_read */
11665
11666 #ifdef WGL_ARB_pbuffer
11667
11668 static GLboolean _glewInit_WGL_ARB_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT)
11669 {
11670 GLboolean r = GL_FALSE;
11671
11672 r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r;
11673 r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r;
11674 r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r;
11675 r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r;
11676 r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r;
11677
11678 return r;
11679 }
11680
11681 #endif /* WGL_ARB_pbuffer */
11682
11683 #ifdef WGL_ARB_pixel_format
11684
11685 static GLboolean _glewInit_WGL_ARB_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT)
11686 {
11687 GLboolean r = GL_FALSE;
11688
11689 r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r;
11690 r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r;
11691 r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r;
11692
11693 return r;
11694 }
11695
11696 #endif /* WGL_ARB_pixel_format */
11697
11698 #ifdef WGL_ARB_render_texture
11699
11700 static GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT)
11701 {
11702 GLboolean r = GL_FALSE;
11703
11704 r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r;
11705 r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r;
11706 r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r;
11707
11708 return r;
11709 }
11710
11711 #endif /* WGL_ARB_render_texture */
11712
11713 #ifdef WGL_EXT_display_color_table
11714
11715 static GLboolean _glewInit_WGL_EXT_display_color_table (WGLEW_CONTEXT_ARG_DEF_INIT)
11716 {
11717 GLboolean r = GL_FALSE;
11718
11719 r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r;
11720 r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r;
11721 r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r;
11722 r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r;
11723
11724 return r;
11725 }
11726
11727 #endif /* WGL_EXT_display_color_table */
11728
11729 #ifdef WGL_EXT_extensions_string
11730
11731 static GLboolean _glewInit_WGL_EXT_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT)
11732 {
11733 GLboolean r = GL_FALSE;
11734
11735 r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r;
11736
11737 return r;
11738 }
11739
11740 #endif /* WGL_EXT_extensions_string */
11741
11742 #ifdef WGL_EXT_make_current_read
11743
11744 static GLboolean _glewInit_WGL_EXT_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT)
11745 {
11746 GLboolean r = GL_FALSE;
11747
11748 r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r;
11749 r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r;
11750
11751 return r;
11752 }
11753
11754 #endif /* WGL_EXT_make_current_read */
11755
11756 #ifdef WGL_EXT_pbuffer
11757
11758 static GLboolean _glewInit_WGL_EXT_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT)
11759 {
11760 GLboolean r = GL_FALSE;
11761
11762 r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r;
11763 r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r;
11764 r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r;
11765 r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r;
11766 r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r;
11767
11768 return r;
11769 }
11770
11771 #endif /* WGL_EXT_pbuffer */
11772
11773 #ifdef WGL_EXT_pixel_format
11774
11775 static GLboolean _glewInit_WGL_EXT_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT)
11776 {
11777 GLboolean r = GL_FALSE;
11778
11779 r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r;
11780 r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r;
11781 r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r;
11782
11783 return r;
11784 }
11785
11786 #endif /* WGL_EXT_pixel_format */
11787
11788 #ifdef WGL_EXT_swap_control
11789
11790 static GLboolean _glewInit_WGL_EXT_swap_control (WGLEW_CONTEXT_ARG_DEF_INIT)
11791 {
11792 GLboolean r = GL_FALSE;
11793
11794 r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r;
11795 r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r;
11796
11797 return r;
11798 }
11799
11800 #endif /* WGL_EXT_swap_control */
11801
11802 #ifdef WGL_I3D_digital_video_control
11803
11804 static GLboolean _glewInit_WGL_I3D_digital_video_control (WGLEW_CONTEXT_ARG_DEF_INIT)
11805 {
11806 GLboolean r = GL_FALSE;
11807
11808 r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r;
11809 r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r;
11810
11811 return r;
11812 }
11813
11814 #endif /* WGL_I3D_digital_video_control */
11815
11816 #ifdef WGL_I3D_gamma
11817
11818 static GLboolean _glewInit_WGL_I3D_gamma (WGLEW_CONTEXT_ARG_DEF_INIT)
11819 {
11820 GLboolean r = GL_FALSE;
11821
11822 r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r;
11823 r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r;
11824 r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r;
11825 r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r;
11826
11827 return r;
11828 }
11829
11830 #endif /* WGL_I3D_gamma */
11831
11832 #ifdef WGL_I3D_genlock
11833
11834 static GLboolean _glewInit_WGL_I3D_genlock (WGLEW_CONTEXT_ARG_DEF_INIT)
11835 {
11836 GLboolean r = GL_FALSE;
11837
11838 r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r;
11839 r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r;
11840 r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r;
11841 r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r;
11842 r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r;
11843 r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r;
11844 r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r;
11845 r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r;
11846 r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r;
11847 r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r;
11848 r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r;
11849 r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r;
11850
11851 return r;
11852 }
11853
11854 #endif /* WGL_I3D_genlock */
11855
11856 #ifdef WGL_I3D_image_buffer
11857
11858 static GLboolean _glewInit_WGL_I3D_image_buffer (WGLEW_CONTEXT_ARG_DEF_INIT)
11859 {
11860 GLboolean r = GL_FALSE;
11861
11862 r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r;
11863 r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r;
11864 r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r;
11865 r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r;
11866
11867 return r;
11868 }
11869
11870 #endif /* WGL_I3D_image_buffer */
11871
11872 #ifdef WGL_I3D_swap_frame_lock
11873
11874 static GLboolean _glewInit_WGL_I3D_swap_frame_lock (WGLEW_CONTEXT_ARG_DEF_INIT)
11875 {
11876 GLboolean r = GL_FALSE;
11877
11878 r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r;
11879 r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r;
11880 r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r;
11881 r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r;
11882
11883 return r;
11884 }
11885
11886 #endif /* WGL_I3D_swap_frame_lock */
11887
11888 #ifdef WGL_I3D_swap_frame_usage
11889
11890 static GLboolean _glewInit_WGL_I3D_swap_frame_usage (WGLEW_CONTEXT_ARG_DEF_INIT)
11891 {
11892 GLboolean r = GL_FALSE;
11893
11894 r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r;
11895 r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r;
11896 r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r;
11897 r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r;
11898
11899 return r;
11900 }
11901
11902 #endif /* WGL_I3D_swap_frame_usage */
11903
11904 #ifdef WGL_NV_DX_interop
11905
11906 static GLboolean _glewInit_WGL_NV_DX_interop (WGLEW_CONTEXT_ARG_DEF_INIT)
11907 {
11908 GLboolean r = GL_FALSE;
11909
11910 r = ((wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXCloseDeviceNV")) == NULL) || r;
11911 r = ((wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXLockObjectsNV")) == NULL) || r;
11912 r = ((wglDXObjectAccessNV = (PFNWGLDXOBJECTACCESSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXObjectAccessNV")) == NULL) || r;
11913 r = ((wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXOpenDeviceNV")) == NULL) || r;
11914 r = ((wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXRegisterObjectNV")) == NULL) || r;
11915 r = ((wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"wglDXSetResourceShareHandleNV")) == NULL) || r;
11916 r = ((wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnlockObjectsNV")) == NULL) || r;
11917 r = ((wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnregisterObjectNV")) == NULL) || r;
11918
11919 return r;
11920 }
11921
11922 #endif /* WGL_NV_DX_interop */
11923
11924 #ifdef WGL_NV_copy_image
11925
11926 static GLboolean _glewInit_WGL_NV_copy_image (WGLEW_CONTEXT_ARG_DEF_INIT)
11927 {
11928 GLboolean r = GL_FALSE;
11929
11930 r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"wglCopyImageSubDataNV")) == NULL) || r;
11931
11932 return r;
11933 }
11934
11935 #endif /* WGL_NV_copy_image */
11936
11937 #ifdef WGL_NV_delay_before_swap
11938
11939 static GLboolean _glewInit_WGL_NV_delay_before_swap (WGLEW_CONTEXT_ARG_DEF_INIT)
11940 {
11941 GLboolean r = GL_FALSE;
11942
11943 r = ((wglDelayBeforeSwapNV = (PFNWGLDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"wglDelayBeforeSwapNV")) == NULL) || r;
11944
11945 return r;
11946 }
11947
11948 #endif /* WGL_NV_delay_before_swap */
11949
11950 #ifdef WGL_NV_gpu_affinity
11951
11952 static GLboolean _glewInit_WGL_NV_gpu_affinity (WGLEW_CONTEXT_ARG_DEF_INIT)
11953 {
11954 GLboolean r = GL_FALSE;
11955
11956 r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglCreateAffinityDCNV")) == NULL) || r;
11957 r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)"wglDeleteDCNV")) == NULL) || r;
11958 r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpuDevicesNV")) == NULL) || r;
11959 r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusFromAffinityDCNV")) == NULL) || r;
11960 r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusNV")) == NULL) || r;
11961
11962 return r;
11963 }
11964
11965 #endif /* WGL_NV_gpu_affinity */
11966
11967 #ifdef WGL_NV_present_video
11968
11969 static GLboolean _glewInit_WGL_NV_present_video (WGLEW_CONTEXT_ARG_DEF_INIT)
11970 {
11971 GLboolean r = GL_FALSE;
11972
11973 r = ((wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoDeviceNV")) == NULL) || r;
11974 r = ((wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoDevicesNV")) == NULL) || r;
11975 r = ((wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryCurrentContextNV")) == NULL) || r;
11976
11977 return r;
11978 }
11979
11980 #endif /* WGL_NV_present_video */
11981
11982 #ifdef WGL_NV_swap_group
11983
11984 static GLboolean _glewInit_WGL_NV_swap_group (WGLEW_CONTEXT_ARG_DEF_INIT)
11985 {
11986 GLboolean r = GL_FALSE;
11987
11988 r = ((wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"wglBindSwapBarrierNV")) == NULL) || r;
11989 r = ((wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglJoinSwapGroupNV")) == NULL) || r;
11990 r = ((wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameCountNV")) == NULL) || r;
11991 r = ((wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryMaxSwapGroupsNV")) == NULL) || r;
11992 r = ((wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglQuerySwapGroupNV")) == NULL) || r;
11993 r = ((wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglResetFrameCountNV")) == NULL) || r;
11994
11995 return r;
11996 }
11997
11998 #endif /* WGL_NV_swap_group */
11999
12000 #ifdef WGL_NV_vertex_array_range
12001
12002 static GLboolean _glewInit_WGL_NV_vertex_array_range (WGLEW_CONTEXT_ARG_DEF_INIT)
12003 {
12004 GLboolean r = GL_FALSE;
12005
12006 r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r;
12007 r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r;
12008
12009 return r;
12010 }
12011
12012 #endif /* WGL_NV_vertex_array_range */
12013
12014 #ifdef WGL_NV_video_capture
12015
12016 static GLboolean _glewInit_WGL_NV_video_capture (WGLEW_CONTEXT_ARG_DEF_INIT)
12017 {
12018 GLboolean r = GL_FALSE;
12019
12020 r = ((wglBindVideoCaptureDeviceNV = (PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoCaptureDeviceNV")) == NULL) || r;
12021 r = ((wglEnumerateVideoCaptureDevicesNV = (PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoCaptureDevicesNV")) == NULL) || r;
12022 r = ((wglLockVideoCaptureDeviceNV = (PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglLockVideoCaptureDeviceNV")) == NULL) || r;
12023 r = ((wglQueryVideoCaptureDeviceNV = (PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglQueryVideoCaptureDeviceNV")) == NULL) || r;
12024 r = ((wglReleaseVideoCaptureDeviceNV = (PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoCaptureDeviceNV")) == NULL) || r;
12025
12026 return r;
12027 }
12028
12029 #endif /* WGL_NV_video_capture */
12030
12031 #ifdef WGL_NV_video_output
12032
12033 static GLboolean _glewInit_WGL_NV_video_output (WGLEW_CONTEXT_ARG_DEF_INIT)
12034 {
12035 GLboolean r = GL_FALSE;
12036
12037 r = ((wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoImageNV")) == NULL) || r;
12038 r = ((wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoDeviceNV")) == NULL) || r;
12039 r = ((wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoInfoNV")) == NULL) || r;
12040 r = ((wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoDeviceNV")) == NULL) || r;
12041 r = ((wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoImageNV")) == NULL) || r;
12042 r = ((wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"wglSendPbufferToVideoNV")) == NULL) || r;
12043
12044 return r;
12045 }
12046
12047 #endif /* WGL_NV_video_output */
12048
12049 #ifdef WGL_OML_sync_control
12050
12051 static GLboolean _glewInit_WGL_OML_sync_control (WGLEW_CONTEXT_ARG_DEF_INIT)
12052 {
12053 GLboolean r = GL_FALSE;
12054
12055 r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r;
12056 r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r;
12057 r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r;
12058 r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r;
12059 r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r;
12060 r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r;
12061
12062 return r;
12063 }
12064
12065 #endif /* WGL_OML_sync_control */
12066
12067 /* ------------------------------------------------------------------------- */
12068
12069 static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL;
12070 static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL;
12071
12072 GLboolean GLEWAPIENTRY wglewGetExtension (const char* name)
12073 {
12074 const GLubyte* start;
12075 const GLubyte* end;
12076 if (_wglewGetExtensionsStringARB == NULL)
12077 if (_wglewGetExtensionsStringEXT == NULL)
12078 return GL_FALSE;
12079 else
12080 start = (const GLubyte*)_wglewGetExtensionsStringEXT();
12081 else
12082 start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC());
12083 if (start == 0)
12084 return GL_FALSE;
12085 end = start + _glewStrLen(start);
12086 return _glewSearchExtension(name, start, end);
12087 }
12088
12089 #ifdef GLEW_MX
12090 GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)
12091 #else
12092 GLenum GLEWAPIENTRY wglewInit (WGLEW_CONTEXT_ARG_DEF_LIST)
12093 #endif
12094 {
12095 GLboolean crippled;
12096 const GLubyte* extStart;
12097 const GLubyte* extEnd;
12098 /* find wgl extension string query functions */
12099 _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB");
12100 _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT");
12101 /* query wgl extension string */
12102 if (_wglewGetExtensionsStringARB == NULL)
12103 if (_wglewGetExtensionsStringEXT == NULL)
12104 extStart = (const GLubyte*)"";
12105 else
12106 extStart = (const GLubyte*)_wglewGetExtensionsStringEXT();
12107 else
12108 extStart = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC());
12109 extEnd = extStart + _glewStrLen(extStart);
12110 /* initialize extensions */
12111 crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL;
12112 #ifdef WGL_3DFX_multisample
12113 WGLEW_3DFX_multisample = _glewSearchExtension("WGL_3DFX_multisample", extStart, extEnd);
12114 #endif /* WGL_3DFX_multisample */
12115 #ifdef WGL_3DL_stereo_control
12116 WGLEW_3DL_stereo_control = _glewSearchExtension("WGL_3DL_stereo_control", extStart, extEnd);
12117 if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) WGLEW_3DL_stereo_control= !_glewInit_WGL_3DL_stereo_control(GLEW_CONTEXT_ARG_VAR_INIT);
12118 #endif /* WGL_3DL_stereo_control */
12119 #ifdef WGL_AMD_gpu_association
12120 WGLEW_AMD_gpu_association = _glewSearchExtension("WGL_AMD_gpu_association", extStart, extEnd);
12121 if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) WGLEW_AMD_gpu_association= !_glewInit_WGL_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT);
12122 #endif /* WGL_AMD_gpu_association */
12123 #ifdef WGL_ARB_buffer_region
12124 WGLEW_ARB_buffer_region = _glewSearchExtension("WGL_ARB_buffer_region", extStart, extEnd);
12125 if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) WGLEW_ARB_buffer_region= !_glewInit_WGL_ARB_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT);
12126 #endif /* WGL_ARB_buffer_region */
12127 #ifdef WGL_ARB_context_flush_control
12128 WGLEW_ARB_context_flush_control = _glewSearchExtension("WGL_ARB_context_flush_control", extStart, extEnd);
12129 #endif /* WGL_ARB_context_flush_control */
12130 #ifdef WGL_ARB_create_context
12131 WGLEW_ARB_create_context = _glewSearchExtension("WGL_ARB_create_context", extStart, extEnd);
12132 if (glewExperimental || WGLEW_ARB_create_context|| crippled) WGLEW_ARB_create_context= !_glewInit_WGL_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT);
12133 #endif /* WGL_ARB_create_context */
12134 #ifdef WGL_ARB_create_context_profile
12135 WGLEW_ARB_create_context_profile = _glewSearchExtension("WGL_ARB_create_context_profile", extStart, extEnd);
12136 #endif /* WGL_ARB_create_context_profile */
12137 #ifdef WGL_ARB_create_context_robustness
12138 WGLEW_ARB_create_context_robustness = _glewSearchExtension("WGL_ARB_create_context_robustness", extStart, extEnd);
12139 #endif /* WGL_ARB_create_context_robustness */
12140 #ifdef WGL_ARB_extensions_string
12141 WGLEW_ARB_extensions_string = _glewSearchExtension("WGL_ARB_extensions_string", extStart, extEnd);
12142 if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) WGLEW_ARB_extensions_string= !_glewInit_WGL_ARB_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT);
12143 #endif /* WGL_ARB_extensions_string */
12144 #ifdef WGL_ARB_framebuffer_sRGB
12145 WGLEW_ARB_framebuffer_sRGB = _glewSearchExtension("WGL_ARB_framebuffer_sRGB", extStart, extEnd);
12146 #endif /* WGL_ARB_framebuffer_sRGB */
12147 #ifdef WGL_ARB_make_current_read
12148 WGLEW_ARB_make_current_read = _glewSearchExtension("WGL_ARB_make_current_read", extStart, extEnd);
12149 if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) WGLEW_ARB_make_current_read= !_glewInit_WGL_ARB_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT);
12150 #endif /* WGL_ARB_make_current_read */
12151 #ifdef WGL_ARB_multisample
12152 WGLEW_ARB_multisample = _glewSearchExtension("WGL_ARB_multisample", extStart, extEnd);
12153 #endif /* WGL_ARB_multisample */
12154 #ifdef WGL_ARB_pbuffer
12155 WGLEW_ARB_pbuffer = _glewSearchExtension("WGL_ARB_pbuffer", extStart, extEnd);
12156 if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) WGLEW_ARB_pbuffer= !_glewInit_WGL_ARB_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT);
12157 #endif /* WGL_ARB_pbuffer */
12158 #ifdef WGL_ARB_pixel_format
12159 WGLEW_ARB_pixel_format = _glewSearchExtension("WGL_ARB_pixel_format", extStart, extEnd);
12160 if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) WGLEW_ARB_pixel_format= !_glewInit_WGL_ARB_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT);
12161 #endif /* WGL_ARB_pixel_format */
12162 #ifdef WGL_ARB_pixel_format_float
12163 WGLEW_ARB_pixel_format_float = _glewSearchExtension("WGL_ARB_pixel_format_float", extStart, extEnd);
12164 #endif /* WGL_ARB_pixel_format_float */
12165 #ifdef WGL_ARB_render_texture
12166 WGLEW_ARB_render_texture = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd);
12167 if (glewExperimental || WGLEW_ARB_render_texture|| crippled) WGLEW_ARB_render_texture= !_glewInit_WGL_ARB_render_texture(GLEW_CONTEXT_ARG_VAR_INIT);
12168 #endif /* WGL_ARB_render_texture */
12169 #ifdef WGL_ARB_robustness_application_isolation
12170 WGLEW_ARB_robustness_application_isolation = _glewSearchExtension("WGL_ARB_robustness_application_isolation", extStart, extEnd);
12171 #endif /* WGL_ARB_robustness_application_isolation */
12172 #ifdef WGL_ARB_robustness_share_group_isolation
12173 WGLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("WGL_ARB_robustness_share_group_isolation", extStart, extEnd);
12174 #endif /* WGL_ARB_robustness_share_group_isolation */
12175 #ifdef WGL_ATI_pixel_format_float
12176 WGLEW_ATI_pixel_format_float = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd);
12177 #endif /* WGL_ATI_pixel_format_float */
12178 #ifdef WGL_ATI_render_texture_rectangle
12179 WGLEW_ATI_render_texture_rectangle = _glewSearchExtension("WGL_ATI_render_texture_rectangle", extStart, extEnd);
12180 #endif /* WGL_ATI_render_texture_rectangle */
12181 #ifdef WGL_EXT_create_context_es2_profile
12182 WGLEW_EXT_create_context_es2_profile = _glewSearchExtension("WGL_EXT_create_context_es2_profile", extStart, extEnd);
12183 #endif /* WGL_EXT_create_context_es2_profile */
12184 #ifdef WGL_EXT_create_context_es_profile
12185 WGLEW_EXT_create_context_es_profile = _glewSearchExtension("WGL_EXT_create_context_es_profile", extStart, extEnd);
12186 #endif /* WGL_EXT_create_context_es_profile */
12187 #ifdef WGL_EXT_depth_float
12188 WGLEW_EXT_depth_float = _glewSearchExtension("WGL_EXT_depth_float", extStart, extEnd);
12189 #endif /* WGL_EXT_depth_float */
12190 #ifdef WGL_EXT_display_color_table
12191 WGLEW_EXT_display_color_table = _glewSearchExtension("WGL_EXT_display_color_table", extStart, extEnd);
12192 if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) WGLEW_EXT_display_color_table= !_glewInit_WGL_EXT_display_color_table(GLEW_CONTEXT_ARG_VAR_INIT);
12193 #endif /* WGL_EXT_display_color_table */
12194 #ifdef WGL_EXT_extensions_string
12195 WGLEW_EXT_extensions_string = _glewSearchExtension("WGL_EXT_extensions_string", extStart, extEnd);
12196 if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) WGLEW_EXT_extensions_string= !_glewInit_WGL_EXT_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT);
12197 #endif /* WGL_EXT_extensions_string */
12198 #ifdef WGL_EXT_framebuffer_sRGB
12199 WGLEW_EXT_framebuffer_sRGB = _glewSearchExtension("WGL_EXT_framebuffer_sRGB", extStart, extEnd);
12200 #endif /* WGL_EXT_framebuffer_sRGB */
12201 #ifdef WGL_EXT_make_current_read
12202 WGLEW_EXT_make_current_read = _glewSearchExtension("WGL_EXT_make_current_read", extStart, extEnd);
12203 if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) WGLEW_EXT_make_current_read= !_glewInit_WGL_EXT_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT);
12204 #endif /* WGL_EXT_make_current_read */
12205 #ifdef WGL_EXT_multisample
12206 WGLEW_EXT_multisample = _glewSearchExtension("WGL_EXT_multisample", extStart, extEnd);
12207 #endif /* WGL_EXT_multisample */
12208 #ifdef WGL_EXT_pbuffer
12209 WGLEW_EXT_pbuffer = _glewSearchExtension("WGL_EXT_pbuffer", extStart, extEnd);
12210 if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) WGLEW_EXT_pbuffer= !_glewInit_WGL_EXT_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT);
12211 #endif /* WGL_EXT_pbuffer */
12212 #ifdef WGL_EXT_pixel_format
12213 WGLEW_EXT_pixel_format = _glewSearchExtension("WGL_EXT_pixel_format", extStart, extEnd);
12214 if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) WGLEW_EXT_pixel_format= !_glewInit_WGL_EXT_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT);
12215 #endif /* WGL_EXT_pixel_format */
12216 #ifdef WGL_EXT_pixel_format_packed_float
12217 WGLEW_EXT_pixel_format_packed_float = _glewSearchExtension("WGL_EXT_pixel_format_packed_float", extStart, extEnd);
12218 #endif /* WGL_EXT_pixel_format_packed_float */
12219 #ifdef WGL_EXT_swap_control
12220 WGLEW_EXT_swap_control = _glewSearchExtension("WGL_EXT_swap_control", extStart, extEnd);
12221 if (glewExperimental || WGLEW_EXT_swap_control|| crippled) WGLEW_EXT_swap_control= !_glewInit_WGL_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT);
12222 #endif /* WGL_EXT_swap_control */
12223 #ifdef WGL_EXT_swap_control_tear
12224 WGLEW_EXT_swap_control_tear = _glewSearchExtension("WGL_EXT_swap_control_tear", extStart, extEnd);
12225 #endif /* WGL_EXT_swap_control_tear */
12226 #ifdef WGL_I3D_digital_video_control
12227 WGLEW_I3D_digital_video_control = _glewSearchExtension("WGL_I3D_digital_video_control", extStart, extEnd);
12228 if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) WGLEW_I3D_digital_video_control= !_glewInit_WGL_I3D_digital_video_control(GLEW_CONTEXT_ARG_VAR_INIT);
12229 #endif /* WGL_I3D_digital_video_control */
12230 #ifdef WGL_I3D_gamma
12231 WGLEW_I3D_gamma = _glewSearchExtension("WGL_I3D_gamma", extStart, extEnd);
12232 if (glewExperimental || WGLEW_I3D_gamma|| crippled) WGLEW_I3D_gamma= !_glewInit_WGL_I3D_gamma(GLEW_CONTEXT_ARG_VAR_INIT);
12233 #endif /* WGL_I3D_gamma */
12234 #ifdef WGL_I3D_genlock
12235 WGLEW_I3D_genlock = _glewSearchExtension("WGL_I3D_genlock", extStart, extEnd);
12236 if (glewExperimental || WGLEW_I3D_genlock|| crippled) WGLEW_I3D_genlock= !_glewInit_WGL_I3D_genlock(GLEW_CONTEXT_ARG_VAR_INIT);
12237 #endif /* WGL_I3D_genlock */
12238 #ifdef WGL_I3D_image_buffer
12239 WGLEW_I3D_image_buffer = _glewSearchExtension("WGL_I3D_image_buffer", extStart, extEnd);
12240 if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) WGLEW_I3D_image_buffer= !_glewInit_WGL_I3D_image_buffer(GLEW_CONTEXT_ARG_VAR_INIT);
12241 #endif /* WGL_I3D_image_buffer */
12242 #ifdef WGL_I3D_swap_frame_lock
12243 WGLEW_I3D_swap_frame_lock = _glewSearchExtension("WGL_I3D_swap_frame_lock", extStart, extEnd);
12244 if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) WGLEW_I3D_swap_frame_lock= !_glewInit_WGL_I3D_swap_frame_lock(GLEW_CONTEXT_ARG_VAR_INIT);
12245 #endif /* WGL_I3D_swap_frame_lock */
12246 #ifdef WGL_I3D_swap_frame_usage
12247 WGLEW_I3D_swap_frame_usage = _glewSearchExtension("WGL_I3D_swap_frame_usage", extStart, extEnd);
12248 if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) WGLEW_I3D_swap_frame_usage= !_glewInit_WGL_I3D_swap_frame_usage(GLEW_CONTEXT_ARG_VAR_INIT);
12249 #endif /* WGL_I3D_swap_frame_usage */
12250 #ifdef WGL_NV_DX_interop
12251 WGLEW_NV_DX_interop = _glewSearchExtension("WGL_NV_DX_interop", extStart, extEnd);
12252 if (glewExperimental || WGLEW_NV_DX_interop|| crippled) WGLEW_NV_DX_interop= !_glewInit_WGL_NV_DX_interop(GLEW_CONTEXT_ARG_VAR_INIT);
12253 #endif /* WGL_NV_DX_interop */
12254 #ifdef WGL_NV_DX_interop2
12255 WGLEW_NV_DX_interop2 = _glewSearchExtension("WGL_NV_DX_interop2", extStart, extEnd);
12256 #endif /* WGL_NV_DX_interop2 */
12257 #ifdef WGL_NV_copy_image
12258 WGLEW_NV_copy_image = _glewSearchExtension("WGL_NV_copy_image", extStart, extEnd);
12259 if (glewExperimental || WGLEW_NV_copy_image|| crippled) WGLEW_NV_copy_image= !_glewInit_WGL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT);
12260 #endif /* WGL_NV_copy_image */
12261 #ifdef WGL_NV_delay_before_swap
12262 WGLEW_NV_delay_before_swap = _glewSearchExtension("WGL_NV_delay_before_swap", extStart, extEnd);
12263 if (glewExperimental || WGLEW_NV_delay_before_swap|| crippled) WGLEW_NV_delay_before_swap= !_glewInit_WGL_NV_delay_before_swap(GLEW_CONTEXT_ARG_VAR_INIT);
12264 #endif /* WGL_NV_delay_before_swap */
12265 #ifdef WGL_NV_float_buffer
12266 WGLEW_NV_float_buffer = _glewSearchExtension("WGL_NV_float_buffer", extStart, extEnd);
12267 #endif /* WGL_NV_float_buffer */
12268 #ifdef WGL_NV_gpu_affinity
12269 WGLEW_NV_gpu_affinity = _glewSearchExtension("WGL_NV_gpu_affinity", extStart, extEnd);
12270 if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) WGLEW_NV_gpu_affinity= !_glewInit_WGL_NV_gpu_affinity(GLEW_CONTEXT_ARG_VAR_INIT);
12271 #endif /* WGL_NV_gpu_affinity */
12272 #ifdef WGL_NV_multisample_coverage
12273 WGLEW_NV_multisample_coverage = _glewSearchExtension("WGL_NV_multisample_coverage", extStart, extEnd);
12274 #endif /* WGL_NV_multisample_coverage */
12275 #ifdef WGL_NV_present_video
12276 WGLEW_NV_present_video = _glewSearchExtension("WGL_NV_present_video", extStart, extEnd);
12277 if (glewExperimental || WGLEW_NV_present_video|| crippled) WGLEW_NV_present_video= !_glewInit_WGL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT);
12278 #endif /* WGL_NV_present_video */
12279 #ifdef WGL_NV_render_depth_texture
12280 WGLEW_NV_render_depth_texture = _glewSearchExtension("WGL_NV_render_depth_texture", extStart, extEnd);
12281 #endif /* WGL_NV_render_depth_texture */
12282 #ifdef WGL_NV_render_texture_rectangle
12283 WGLEW_NV_render_texture_rectangle = _glewSearchExtension("WGL_NV_render_texture_rectangle", extStart, extEnd);
12284 #endif /* WGL_NV_render_texture_rectangle */
12285 #ifdef WGL_NV_swap_group
12286 WGLEW_NV_swap_group = _glewSearchExtension("WGL_NV_swap_group", extStart, extEnd);
12287 if (glewExperimental || WGLEW_NV_swap_group|| crippled) WGLEW_NV_swap_group= !_glewInit_WGL_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT);
12288 #endif /* WGL_NV_swap_group */
12289 #ifdef WGL_NV_vertex_array_range
12290 WGLEW_NV_vertex_array_range = _glewSearchExtension("WGL_NV_vertex_array_range", extStart, extEnd);
12291 if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) WGLEW_NV_vertex_array_range= !_glewInit_WGL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT);
12292 #endif /* WGL_NV_vertex_array_range */
12293 #ifdef WGL_NV_video_capture
12294 WGLEW_NV_video_capture = _glewSearchExtension("WGL_NV_video_capture", extStart, extEnd);
12295 if (glewExperimental || WGLEW_NV_video_capture|| crippled) WGLEW_NV_video_capture= !_glewInit_WGL_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT);
12296 #endif /* WGL_NV_video_capture */
12297 #ifdef WGL_NV_video_output
12298 WGLEW_NV_video_output = _glewSearchExtension("WGL_NV_video_output", extStart, extEnd);
12299 if (glewExperimental || WGLEW_NV_video_output|| crippled) WGLEW_NV_video_output= !_glewInit_WGL_NV_video_output(GLEW_CONTEXT_ARG_VAR_INIT);
12300 #endif /* WGL_NV_video_output */
12301 #ifdef WGL_OML_sync_control
12302 WGLEW_OML_sync_control = _glewSearchExtension("WGL_OML_sync_control", extStart, extEnd);
12303 if (glewExperimental || WGLEW_OML_sync_control|| crippled) WGLEW_OML_sync_control= !_glewInit_WGL_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT);
12304 #endif /* WGL_OML_sync_control */
12305
12306 return GLEW_OK;
12307 }
12308
12309 #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))
12310
12311 PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL;
12312
12313 PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL;
12314 PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL;
12315 PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL;
12316 PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL;
12317 PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL;
12318 PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL;
12319 PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL;
12320 PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL;
12321 PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL;
12322 PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL;
12323 PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL;
12324 PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL;
12325 PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL;
12326 PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL;
12327 PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL;
12328 PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL;
12329 PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL;
12330
12331 PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD = NULL;
12332 PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD = NULL;
12333 PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD = NULL;
12334 PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD = NULL;
12335 PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD = NULL;
12336 PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD = NULL;
12337 PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD = NULL;
12338 PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD = NULL;
12339 PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD = NULL;
12340
12341 PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL;
12342
12343 PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL;
12344 PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL;
12345 PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL;
12346
12347 PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL;
12348 PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL;
12349 PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL;
12350 PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL;
12351
12352 PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL;
12353
12354 PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL;
12355 PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL;
12356
12357 PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL;
12358
12359 PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL;
12360
12361 PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL;
12362
12363 PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA = NULL;
12364 PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA = NULL;
12365 PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA = NULL;
12366 PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA = NULL;
12367
12368 PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL;
12369
12370 PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL;
12371
12372 PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA = NULL;
12373 PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA = NULL;
12374
12375 PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV = NULL;
12376 PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV = NULL;
12377
12378 PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL;
12379
12380 PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV = NULL;
12381
12382 PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL;
12383 PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL;
12384
12385 PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV = NULL;
12386 PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV = NULL;
12387 PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV = NULL;
12388 PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV = NULL;
12389 PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV = NULL;
12390 PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV = NULL;
12391
12392 PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL;
12393 PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL;
12394
12395 PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV = NULL;
12396 PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV = NULL;
12397 PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV = NULL;
12398 PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV = NULL;
12399 PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV = NULL;
12400
12401 PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV = NULL;
12402 PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV = NULL;
12403 PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV = NULL;
12404 PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV = NULL;
12405 PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV = NULL;
12406 PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV = NULL;
12407
12408 PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL;
12409 PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL;
12410 PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL;
12411 PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL;
12412 PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL;
12413
12414 PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL;
12415 PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL;
12416 PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL;
12417 PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL;
12418 PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL;
12419 PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL;
12420
12421 PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL;
12422 PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL;
12423 PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL;
12424 PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL;
12425 PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL;
12426 PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL;
12427 PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL;
12428 PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL;
12429
12430 PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL;
12431 PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL;
12432 PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL;
12433 PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL;
12434 PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL;
12435
12436 PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL;
12437 PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL;
12438
12439 PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL;
12440
12441 PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL;
12442 PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL;
12443 PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL;
12444 PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL;
12445 PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL;
12446
12447 PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL;
12448
12449 PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL;
12450 PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL;
12451
12452 PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL;
12453
12454 PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL;
12455 PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL;
12456
12457 PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL;
12458
12459 PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL;
12460 PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL;
12461
12462 #if !defined(GLEW_MX)
12463
12464 GLboolean __GLXEW_VERSION_1_0 = GL_FALSE;
12465 GLboolean __GLXEW_VERSION_1_1 = GL_FALSE;
12466 GLboolean __GLXEW_VERSION_1_2 = GL_FALSE;
12467 GLboolean __GLXEW_VERSION_1_3 = GL_FALSE;
12468 GLboolean __GLXEW_VERSION_1_4 = GL_FALSE;
12469 GLboolean __GLXEW_3DFX_multisample = GL_FALSE;
12470 GLboolean __GLXEW_AMD_gpu_association = GL_FALSE;
12471 GLboolean __GLXEW_ARB_context_flush_control = GL_FALSE;
12472 GLboolean __GLXEW_ARB_create_context = GL_FALSE;
12473 GLboolean __GLXEW_ARB_create_context_profile = GL_FALSE;
12474 GLboolean __GLXEW_ARB_create_context_robustness = GL_FALSE;
12475 GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE;
12476 GLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE;
12477 GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE;
12478 GLboolean __GLXEW_ARB_multisample = GL_FALSE;
12479 GLboolean __GLXEW_ARB_robustness_application_isolation = GL_FALSE;
12480 GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE;
12481 GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE;
12482 GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE;
12483 GLboolean __GLXEW_ATI_render_texture = GL_FALSE;
12484 GLboolean __GLXEW_EXT_buffer_age = GL_FALSE;
12485 GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE;
12486 GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE;
12487 GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE;
12488 GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE;
12489 GLboolean __GLXEW_EXT_import_context = GL_FALSE;
12490 GLboolean __GLXEW_EXT_scene_marker = GL_FALSE;
12491 GLboolean __GLXEW_EXT_stereo_tree = GL_FALSE;
12492 GLboolean __GLXEW_EXT_swap_control = GL_FALSE;
12493 GLboolean __GLXEW_EXT_swap_control_tear = GL_FALSE;
12494 GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE;
12495 GLboolean __GLXEW_EXT_visual_info = GL_FALSE;
12496 GLboolean __GLXEW_EXT_visual_rating = GL_FALSE;
12497 GLboolean __GLXEW_INTEL_swap_event = GL_FALSE;
12498 GLboolean __GLXEW_MESA_agp_offset = GL_FALSE;
12499 GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE;
12500 GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE;
12501 GLboolean __GLXEW_MESA_query_renderer = GL_FALSE;
12502 GLboolean __GLXEW_MESA_release_buffers = GL_FALSE;
12503 GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE;
12504 GLboolean __GLXEW_MESA_swap_control = GL_FALSE;
12505 GLboolean __GLXEW_NV_copy_buffer = GL_FALSE;
12506 GLboolean __GLXEW_NV_copy_image = GL_FALSE;
12507 GLboolean __GLXEW_NV_delay_before_swap = GL_FALSE;
12508 GLboolean __GLXEW_NV_float_buffer = GL_FALSE;
12509 GLboolean __GLXEW_NV_multisample_coverage = GL_FALSE;
12510 GLboolean __GLXEW_NV_present_video = GL_FALSE;
12511 GLboolean __GLXEW_NV_swap_group = GL_FALSE;
12512 GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE;
12513 GLboolean __GLXEW_NV_video_capture = GL_FALSE;
12514 GLboolean __GLXEW_NV_video_out = GL_FALSE;
12515 GLboolean __GLXEW_OML_swap_method = GL_FALSE;
12516 GLboolean __GLXEW_OML_sync_control = GL_FALSE;
12517 GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE;
12518 GLboolean __GLXEW_SGIS_color_range = GL_FALSE;
12519 GLboolean __GLXEW_SGIS_multisample = GL_FALSE;
12520 GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE;
12521 GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE;
12522 GLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE;
12523 GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE;
12524 GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE;
12525 GLboolean __GLXEW_SGIX_swap_group = GL_FALSE;
12526 GLboolean __GLXEW_SGIX_video_resize = GL_FALSE;
12527 GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE;
12528 GLboolean __GLXEW_SGI_cushion = GL_FALSE;
12529 GLboolean __GLXEW_SGI_make_current_read = GL_FALSE;
12530 GLboolean __GLXEW_SGI_swap_control = GL_FALSE;
12531 GLboolean __GLXEW_SGI_video_sync = GL_FALSE;
12532 GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE;
12533 GLboolean __GLXEW_SUN_video_resize = GL_FALSE;
12534
12535 #endif /* !GLEW_MX */
12536
12537 #ifdef GLX_VERSION_1_2
12538
12539 static GLboolean _glewInit_GLX_VERSION_1_2 (GLXEW_CONTEXT_ARG_DEF_INIT)
12540 {
12541 GLboolean r = GL_FALSE;
12542
12543 r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r;
12544
12545 return r;
12546 }
12547
12548 #endif /* GLX_VERSION_1_2 */
12549
12550 #ifdef GLX_VERSION_1_3
12551
12552 static GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT)
12553 {
12554 GLboolean r = GL_FALSE;
12555
12556 r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r;
12557 r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r;
12558 r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r;
12559 r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r;
12560 r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r;
12561 r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r;
12562 r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r;
12563 r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r;
12564 r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r;
12565 r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r;
12566 r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r;
12567 r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r;
12568 r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r;
12569 r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r;
12570 r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r;
12571 r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r;
12572 r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r;
12573
12574 return r;
12575 }
12576
12577 #endif /* GLX_VERSION_1_3 */
12578
12579 #ifdef GLX_AMD_gpu_association
12580
12581 static GLboolean _glewInit_GLX_AMD_gpu_association (GLXEW_CONTEXT_ARG_DEF_INIT)
12582 {
12583 GLboolean r = GL_FALSE;
12584
12585 r = ((glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"glXBlitContextFramebufferAMD")) == NULL) || r;
12586 r = ((glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAMD")) == NULL) || r;
12587 r = ((glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAttribsAMD")) == NULL) || r;
12588 r = ((glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXDeleteAssociatedContextAMD")) == NULL) || r;
12589 r = ((glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetContextGPUIDAMD")) == NULL) || r;
12590 r = ((glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentAssociatedContextAMD")) == NULL) || r;
12591 r = ((glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUIDsAMD")) == NULL) || r;
12592 r = ((glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUInfoAMD")) == NULL) || r;
12593 r = ((glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"glXMakeAssociatedContextCurrentAMD")) == NULL) || r;
12594
12595 return r;
12596 }
12597
12598 #endif /* GLX_AMD_gpu_association */
12599
12600 #ifdef GLX_ARB_create_context
12601
12602 static GLboolean _glewInit_GLX_ARB_create_context (GLXEW_CONTEXT_ARG_DEF_INIT)
12603 {
12604 GLboolean r = GL_FALSE;
12605
12606 r = ((glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB")) == NULL) || r;
12607
12608 return r;
12609 }
12610
12611 #endif /* GLX_ARB_create_context */
12612
12613 #ifdef GLX_ATI_render_texture
12614
12615 static GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT)
12616 {
12617 GLboolean r = GL_FALSE;
12618
12619 r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r;
12620 r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r;
12621 r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r;
12622
12623 return r;
12624 }
12625
12626 #endif /* GLX_ATI_render_texture */
12627
12628 #ifdef GLX_EXT_import_context
12629
12630 static GLboolean _glewInit_GLX_EXT_import_context (GLXEW_CONTEXT_ARG_DEF_INIT)
12631 {
12632 GLboolean r = GL_FALSE;
12633
12634 r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r;
12635 r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r;
12636 r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r;
12637 r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r;
12638
12639 return r;
12640 }
12641
12642 #endif /* GLX_EXT_import_context */
12643
12644 #ifdef GLX_EXT_swap_control
12645
12646 static GLboolean _glewInit_GLX_EXT_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT)
12647 {
12648 GLboolean r = GL_FALSE;
12649
12650 r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalEXT")) == NULL) || r;
12651
12652 return r;
12653 }
12654
12655 #endif /* GLX_EXT_swap_control */
12656
12657 #ifdef GLX_EXT_texture_from_pixmap
12658
12659 static GLboolean _glewInit_GLX_EXT_texture_from_pixmap (GLXEW_CONTEXT_ARG_DEF_INIT)
12660 {
12661 GLboolean r = GL_FALSE;
12662
12663 r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageEXT")) == NULL) || r;
12664 r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageEXT")) == NULL) || r;
12665
12666 return r;
12667 }
12668
12669 #endif /* GLX_EXT_texture_from_pixmap */
12670
12671 #ifdef GLX_MESA_agp_offset
12672
12673 static GLboolean _glewInit_GLX_MESA_agp_offset (GLXEW_CONTEXT_ARG_DEF_INIT)
12674 {
12675 GLboolean r = GL_FALSE;
12676
12677 r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r;
12678
12679 return r;
12680 }
12681
12682 #endif /* GLX_MESA_agp_offset */
12683
12684 #ifdef GLX_MESA_copy_sub_buffer
12685
12686 static GLboolean _glewInit_GLX_MESA_copy_sub_buffer (GLXEW_CONTEXT_ARG_DEF_INIT)
12687 {
12688 GLboolean r = GL_FALSE;
12689
12690 r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r;
12691
12692 return r;
12693 }
12694
12695 #endif /* GLX_MESA_copy_sub_buffer */
12696
12697 #ifdef GLX_MESA_pixmap_colormap
12698
12699 static GLboolean _glewInit_GLX_MESA_pixmap_colormap (GLXEW_CONTEXT_ARG_DEF_INIT)
12700 {
12701 GLboolean r = GL_FALSE;
12702
12703 r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r;
12704
12705 return r;
12706 }
12707
12708 #endif /* GLX_MESA_pixmap_colormap */
12709
12710 #ifdef GLX_MESA_query_renderer
12711
12712 static GLboolean _glewInit_GLX_MESA_query_renderer (GLXEW_CONTEXT_ARG_DEF_INIT)
12713 {
12714 GLboolean r = GL_FALSE;
12715
12716 r = ((glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererIntegerMESA")) == NULL) || r;
12717 r = ((glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererStringMESA")) == NULL) || r;
12718 r = ((glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererIntegerMESA")) == NULL) || r;
12719 r = ((glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererStringMESA")) == NULL) || r;
12720
12721 return r;
12722 }
12723
12724 #endif /* GLX_MESA_query_renderer */
12725
12726 #ifdef GLX_MESA_release_buffers
12727
12728 static GLboolean _glewInit_GLX_MESA_release_buffers (GLXEW_CONTEXT_ARG_DEF_INIT)
12729 {
12730 GLboolean r = GL_FALSE;
12731
12732 r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r;
12733
12734 return r;
12735 }
12736
12737 #endif /* GLX_MESA_release_buffers */
12738
12739 #ifdef GLX_MESA_set_3dfx_mode
12740
12741 static GLboolean _glewInit_GLX_MESA_set_3dfx_mode (GLXEW_CONTEXT_ARG_DEF_INIT)
12742 {
12743 GLboolean r = GL_FALSE;
12744
12745 r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r;
12746
12747 return r;
12748 }
12749
12750 #endif /* GLX_MESA_set_3dfx_mode */
12751
12752 #ifdef GLX_MESA_swap_control
12753
12754 static GLboolean _glewInit_GLX_MESA_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT)
12755 {
12756 GLboolean r = GL_FALSE;
12757
12758 r = ((glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetSwapIntervalMESA")) == NULL) || r;
12759 r = ((glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalMESA")) == NULL) || r;
12760
12761 return r;
12762 }
12763
12764 #endif /* GLX_MESA_swap_control */
12765
12766 #ifdef GLX_NV_copy_buffer
12767
12768 static GLboolean _glewInit_GLX_NV_copy_buffer (GLXEW_CONTEXT_ARG_DEF_INIT)
12769 {
12770 GLboolean r = GL_FALSE;
12771
12772 r = ((glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyBufferSubDataNV")) == NULL) || r;
12773 r = ((glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXNamedCopyBufferSubDataNV")) == NULL) || r;
12774
12775 return r;
12776 }
12777
12778 #endif /* GLX_NV_copy_buffer */
12779
12780 #ifdef GLX_NV_copy_image
12781
12782 static GLboolean _glewInit_GLX_NV_copy_image (GLXEW_CONTEXT_ARG_DEF_INIT)
12783 {
12784 GLboolean r = GL_FALSE;
12785
12786 r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyImageSubDataNV")) == NULL) || r;
12787
12788 return r;
12789 }
12790
12791 #endif /* GLX_NV_copy_image */
12792
12793 #ifdef GLX_NV_delay_before_swap
12794
12795 static GLboolean _glewInit_GLX_NV_delay_before_swap (GLXEW_CONTEXT_ARG_DEF_INIT)
12796 {
12797 GLboolean r = GL_FALSE;
12798
12799 r = ((glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"glXDelayBeforeSwapNV")) == NULL) || r;
12800
12801 return r;
12802 }
12803
12804 #endif /* GLX_NV_delay_before_swap */
12805
12806 #ifdef GLX_NV_present_video
12807
12808 static GLboolean _glewInit_GLX_NV_present_video (GLXEW_CONTEXT_ARG_DEF_INIT)
12809 {
12810 GLboolean r = GL_FALSE;
12811
12812 r = ((glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoDeviceNV")) == NULL) || r;
12813 r = ((glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoDevicesNV")) == NULL) || r;
12814
12815 return r;
12816 }
12817
12818 #endif /* GLX_NV_present_video */
12819
12820 #ifdef GLX_NV_swap_group
12821
12822 static GLboolean _glewInit_GLX_NV_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT)
12823 {
12824 GLboolean r = GL_FALSE;
12825
12826 r = ((glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierNV")) == NULL) || r;
12827 r = ((glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupNV")) == NULL) || r;
12828 r = ((glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryFrameCountNV")) == NULL) || r;
12829 r = ((glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapGroupsNV")) == NULL) || r;
12830 r = ((glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXQuerySwapGroupNV")) == NULL) || r;
12831 r = ((glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXResetFrameCountNV")) == NULL) || r;
12832
12833 return r;
12834 }
12835
12836 #endif /* GLX_NV_swap_group */
12837
12838 #ifdef GLX_NV_vertex_array_range
12839
12840 static GLboolean _glewInit_GLX_NV_vertex_array_range (GLXEW_CONTEXT_ARG_DEF_INIT)
12841 {
12842 GLboolean r = GL_FALSE;
12843
12844 r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r;
12845 r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r;
12846
12847 return r;
12848 }
12849
12850 #endif /* GLX_NV_vertex_array_range */
12851
12852 #ifdef GLX_NV_video_capture
12853
12854 static GLboolean _glewInit_GLX_NV_video_capture (GLXEW_CONTEXT_ARG_DEF_INIT)
12855 {
12856 GLboolean r = GL_FALSE;
12857
12858 r = ((glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoCaptureDeviceNV")) == NULL) || r;
12859 r = ((glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoCaptureDevicesNV")) == NULL) || r;
12860 r = ((glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXLockVideoCaptureDeviceNV")) == NULL) || r;
12861 r = ((glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXQueryVideoCaptureDeviceNV")) == NULL) || r;
12862 r = ((glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoCaptureDeviceNV")) == NULL) || r;
12863
12864 return r;
12865 }
12866
12867 #endif /* GLX_NV_video_capture */
12868
12869 #ifdef GLX_NV_video_out
12870
12871 static GLboolean _glewInit_GLX_NV_video_out (GLXEW_CONTEXT_ARG_DEF_INIT)
12872 {
12873 GLboolean r = GL_FALSE;
12874
12875 r = ((glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoImageNV")) == NULL) || r;
12876 r = ((glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoDeviceNV")) == NULL) || r;
12877 r = ((glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoInfoNV")) == NULL) || r;
12878 r = ((glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoDeviceNV")) == NULL) || r;
12879 r = ((glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoImageNV")) == NULL) || r;
12880 r = ((glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"glXSendPbufferToVideoNV")) == NULL) || r;
12881
12882 return r;
12883 }
12884
12885 #endif /* GLX_NV_video_out */
12886
12887 #ifdef GLX_OML_sync_control
12888
12889 static GLboolean _glewInit_GLX_OML_sync_control (GLXEW_CONTEXT_ARG_DEF_INIT)
12890 {
12891 GLboolean r = GL_FALSE;
12892
12893 r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r;
12894 r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r;
12895 r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r;
12896 r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r;
12897 r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r;
12898
12899 return r;
12900 }
12901
12902 #endif /* GLX_OML_sync_control */
12903
12904 #ifdef GLX_SGIX_fbconfig
12905
12906 static GLboolean _glewInit_GLX_SGIX_fbconfig (GLXEW_CONTEXT_ARG_DEF_INIT)
12907 {
12908 GLboolean r = GL_FALSE;
12909
12910 r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r;
12911 r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r;
12912 r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r;
12913 r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r;
12914 r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r;
12915 r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r;
12916
12917 return r;
12918 }
12919
12920 #endif /* GLX_SGIX_fbconfig */
12921
12922 #ifdef GLX_SGIX_hyperpipe
12923
12924 static GLboolean _glewInit_GLX_SGIX_hyperpipe (GLXEW_CONTEXT_ARG_DEF_INIT)
12925 {
12926 GLboolean r = GL_FALSE;
12927
12928 r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindHyperpipeSGIX")) == NULL) || r;
12929 r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyHyperpipeConfigSGIX")) == NULL) || r;
12930 r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeAttribSGIX")) == NULL) || r;
12931 r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeConfigSGIX")) == NULL) || r;
12932 r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeAttribSGIX")) == NULL) || r;
12933 r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeBestAttribSGIX")) == NULL) || r;
12934 r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeConfigSGIX")) == NULL) || r;
12935 r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeNetworkSGIX")) == NULL) || r;
12936
12937 return r;
12938 }
12939
12940 #endif /* GLX_SGIX_hyperpipe */
12941
12942 #ifdef GLX_SGIX_pbuffer
12943
12944 static GLboolean _glewInit_GLX_SGIX_pbuffer (GLXEW_CONTEXT_ARG_DEF_INIT)
12945 {
12946 GLboolean r = GL_FALSE;
12947
12948 r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r;
12949 r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r;
12950 r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r;
12951 r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r;
12952 r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r;
12953
12954 return r;
12955 }
12956
12957 #endif /* GLX_SGIX_pbuffer */
12958
12959 #ifdef GLX_SGIX_swap_barrier
12960
12961 static GLboolean _glewInit_GLX_SGIX_swap_barrier (GLXEW_CONTEXT_ARG_DEF_INIT)
12962 {
12963 GLboolean r = GL_FALSE;
12964
12965 r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r;
12966 r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r;
12967
12968 return r;
12969 }
12970
12971 #endif /* GLX_SGIX_swap_barrier */
12972
12973 #ifdef GLX_SGIX_swap_group
12974
12975 static GLboolean _glewInit_GLX_SGIX_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT)
12976 {
12977 GLboolean r = GL_FALSE;
12978
12979 r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r;
12980
12981 return r;
12982 }
12983
12984 #endif /* GLX_SGIX_swap_group */
12985
12986 #ifdef GLX_SGIX_video_resize
12987
12988 static GLboolean _glewInit_GLX_SGIX_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT)
12989 {
12990 GLboolean r = GL_FALSE;
12991
12992 r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r;
12993 r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r;
12994 r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r;
12995 r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r;
12996 r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r;
12997
12998 return r;
12999 }
13000
13001 #endif /* GLX_SGIX_video_resize */
13002
13003 #ifdef GLX_SGI_cushion
13004
13005 static GLboolean _glewInit_GLX_SGI_cushion (GLXEW_CONTEXT_ARG_DEF_INIT)
13006 {
13007 GLboolean r = GL_FALSE;
13008
13009 r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r;
13010
13011 return r;
13012 }
13013
13014 #endif /* GLX_SGI_cushion */
13015
13016 #ifdef GLX_SGI_make_current_read
13017
13018 static GLboolean _glewInit_GLX_SGI_make_current_read (GLXEW_CONTEXT_ARG_DEF_INIT)
13019 {
13020 GLboolean r = GL_FALSE;
13021
13022 r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r;
13023 r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r;
13024
13025 return r;
13026 }
13027
13028 #endif /* GLX_SGI_make_current_read */
13029
13030 #ifdef GLX_SGI_swap_control
13031
13032 static GLboolean _glewInit_GLX_SGI_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT)
13033 {
13034 GLboolean r = GL_FALSE;
13035
13036 r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r;
13037
13038 return r;
13039 }
13040
13041 #endif /* GLX_SGI_swap_control */
13042
13043 #ifdef GLX_SGI_video_sync
13044
13045 static GLboolean _glewInit_GLX_SGI_video_sync (GLXEW_CONTEXT_ARG_DEF_INIT)
13046 {
13047 GLboolean r = GL_FALSE;
13048
13049 r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r;
13050 r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r;
13051
13052 return r;
13053 }
13054
13055 #endif /* GLX_SGI_video_sync */
13056
13057 #ifdef GLX_SUN_get_transparent_index
13058
13059 static GLboolean _glewInit_GLX_SUN_get_transparent_index (GLXEW_CONTEXT_ARG_DEF_INIT)
13060 {
13061 GLboolean r = GL_FALSE;
13062
13063 r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r;
13064
13065 return r;
13066 }
13067
13068 #endif /* GLX_SUN_get_transparent_index */
13069
13070 #ifdef GLX_SUN_video_resize
13071
13072 static GLboolean _glewInit_GLX_SUN_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT)
13073 {
13074 GLboolean r = GL_FALSE;
13075
13076 r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r;
13077 r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r;
13078
13079 return r;
13080 }
13081
13082 #endif /* GLX_SUN_video_resize */
13083
13084 /* ------------------------------------------------------------------------ */
13085
13086 GLboolean glxewGetExtension (const char* name)
13087 {
13088 const GLubyte* start;
13089 const GLubyte* end;
13090
13091 if (glXGetCurrentDisplay == NULL) return GL_FALSE;
13092 start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS);
13093 if (0 == start) return GL_FALSE;
13094 end = start + _glewStrLen(start);
13095 return _glewSearchExtension(name, start, end);
13096 }
13097
13098 #ifdef GLEW_MX
13099 GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
13100 #else
13101 GLenum glxewInit (GLXEW_CONTEXT_ARG_DEF_LIST)
13102 #endif
13103 {
13104 int major, minor;
13105 const GLubyte* extStart;
13106 const GLubyte* extEnd;
13107 /* initialize core GLX 1.2 */
13108 if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY;
13109 /* initialize flags */
13110 GLXEW_VERSION_1_0 = GL_TRUE;
13111 GLXEW_VERSION_1_1 = GL_TRUE;
13112 GLXEW_VERSION_1_2 = GL_TRUE;
13113 GLXEW_VERSION_1_3 = GL_TRUE;
13114 GLXEW_VERSION_1_4 = GL_TRUE;
13115 /* query GLX version */
13116 glXQueryVersion(glXGetCurrentDisplay(), &major, &minor);
13117 if (major == 1 && minor <= 3)
13118 {
13119 switch (minor)
13120 {
13121 case 3:
13122 GLXEW_VERSION_1_4 = GL_FALSE;
13123 break;
13124 case 2:
13125 GLXEW_VERSION_1_4 = GL_FALSE;
13126 GLXEW_VERSION_1_3 = GL_FALSE;
13127 break;
13128 default:
13129 return GLEW_ERROR_GLX_VERSION_11_ONLY;
13130 break;
13131 }
13132 }
13133 /* query GLX extension string */
13134 extStart = 0;
13135 if (glXGetCurrentDisplay != NULL)
13136 extStart = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS);
13137 if (extStart == 0)
13138 extStart = (const GLubyte *)"";
13139 extEnd = extStart + _glewStrLen(extStart);
13140 /* initialize extensions */
13141 #ifdef GLX_VERSION_1_3
13142 if (glewExperimental || GLXEW_VERSION_1_3) GLXEW_VERSION_1_3 = !_glewInit_GLX_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT);
13143 #endif /* GLX_VERSION_1_3 */
13144 #ifdef GLX_3DFX_multisample
13145 GLXEW_3DFX_multisample = _glewSearchExtension("GLX_3DFX_multisample", extStart, extEnd);
13146 #endif /* GLX_3DFX_multisample */
13147 #ifdef GLX_AMD_gpu_association
13148 GLXEW_AMD_gpu_association = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd);
13149 if (glewExperimental || GLXEW_AMD_gpu_association) GLXEW_AMD_gpu_association = !_glewInit_GLX_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT);
13150 #endif /* GLX_AMD_gpu_association */
13151 #ifdef GLX_ARB_context_flush_control
13152 GLXEW_ARB_context_flush_control = _glewSearchExtension("GLX_ARB_context_flush_control", extStart, extEnd);
13153 #endif /* GLX_ARB_context_flush_control */
13154 #ifdef GLX_ARB_create_context
13155 GLXEW_ARB_create_context = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd);
13156 if (glewExperimental || GLXEW_ARB_create_context) GLXEW_ARB_create_context = !_glewInit_GLX_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT);
13157 #endif /* GLX_ARB_create_context */
13158 #ifdef GLX_ARB_create_context_profile
13159 GLXEW_ARB_create_context_profile = _glewSearchExtension("GLX_ARB_create_context_profile", extStart, extEnd);
13160 #endif /* GLX_ARB_create_context_profile */
13161 #ifdef GLX_ARB_create_context_robustness
13162 GLXEW_ARB_create_context_robustness = _glewSearchExtension("GLX_ARB_create_context_robustness", extStart, extEnd);
13163 #endif /* GLX_ARB_create_context_robustness */
13164 #ifdef GLX_ARB_fbconfig_float
13165 GLXEW_ARB_fbconfig_float = _glewSearchExtension("GLX_ARB_fbconfig_float", extStart, extEnd);
13166 #endif /* GLX_ARB_fbconfig_float */
13167 #ifdef GLX_ARB_framebuffer_sRGB
13168 GLXEW_ARB_framebuffer_sRGB = _glewSearchExtension("GLX_ARB_framebuffer_sRGB", extStart, extEnd);
13169 #endif /* GLX_ARB_framebuffer_sRGB */
13170 #ifdef GLX_ARB_get_proc_address
13171 GLXEW_ARB_get_proc_address = _glewSearchExtension("GLX_ARB_get_proc_address", extStart, extEnd);
13172 #endif /* GLX_ARB_get_proc_address */
13173 #ifdef GLX_ARB_multisample
13174 GLXEW_ARB_multisample = _glewSearchExtension("GLX_ARB_multisample", extStart, extEnd);
13175 #endif /* GLX_ARB_multisample */
13176 #ifdef GLX_ARB_robustness_application_isolation
13177 GLXEW_ARB_robustness_application_isolation = _glewSearchExtension("GLX_ARB_robustness_application_isolation", extStart, extEnd);
13178 #endif /* GLX_ARB_robustness_application_isolation */
13179 #ifdef GLX_ARB_robustness_share_group_isolation
13180 GLXEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GLX_ARB_robustness_share_group_isolation", extStart, extEnd);
13181 #endif /* GLX_ARB_robustness_share_group_isolation */
13182 #ifdef GLX_ARB_vertex_buffer_object
13183 GLXEW_ARB_vertex_buffer_object = _glewSearchExtension("GLX_ARB_vertex_buffer_object", extStart, extEnd);
13184 #endif /* GLX_ARB_vertex_buffer_object */
13185 #ifdef GLX_ATI_pixel_format_float
13186 GLXEW_ATI_pixel_format_float = _glewSearchExtension("GLX_ATI_pixel_format_float", extStart, extEnd);
13187 #endif /* GLX_ATI_pixel_format_float */
13188 #ifdef GLX_ATI_render_texture
13189 GLXEW_ATI_render_texture = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd);
13190 if (glewExperimental || GLXEW_ATI_render_texture) GLXEW_ATI_render_texture = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT);
13191 #endif /* GLX_ATI_render_texture */
13192 #ifdef GLX_EXT_buffer_age
13193 GLXEW_EXT_buffer_age = _glewSearchExtension("GLX_EXT_buffer_age", extStart, extEnd);
13194 #endif /* GLX_EXT_buffer_age */
13195 #ifdef GLX_EXT_create_context_es2_profile
13196 GLXEW_EXT_create_context_es2_profile = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd);
13197 #endif /* GLX_EXT_create_context_es2_profile */
13198 #ifdef GLX_EXT_create_context_es_profile
13199 GLXEW_EXT_create_context_es_profile = _glewSearchExtension("GLX_EXT_create_context_es_profile", extStart, extEnd);
13200 #endif /* GLX_EXT_create_context_es_profile */
13201 #ifdef GLX_EXT_fbconfig_packed_float
13202 GLXEW_EXT_fbconfig_packed_float = _glewSearchExtension("GLX_EXT_fbconfig_packed_float", extStart, extEnd);
13203 #endif /* GLX_EXT_fbconfig_packed_float */
13204 #ifdef GLX_EXT_framebuffer_sRGB
13205 GLXEW_EXT_framebuffer_sRGB = _glewSearchExtension("GLX_EXT_framebuffer_sRGB", extStart, extEnd);
13206 #endif /* GLX_EXT_framebuffer_sRGB */
13207 #ifdef GLX_EXT_import_context
13208 GLXEW_EXT_import_context = _glewSearchExtension("GLX_EXT_import_context", extStart, extEnd);
13209 if (glewExperimental || GLXEW_EXT_import_context) GLXEW_EXT_import_context = !_glewInit_GLX_EXT_import_context(GLEW_CONTEXT_ARG_VAR_INIT);
13210 #endif /* GLX_EXT_import_context */
13211 #ifdef GLX_EXT_scene_marker
13212 GLXEW_EXT_scene_marker = _glewSearchExtension("GLX_EXT_scene_marker", extStart, extEnd);
13213 #endif /* GLX_EXT_scene_marker */
13214 #ifdef GLX_EXT_stereo_tree
13215 GLXEW_EXT_stereo_tree = _glewSearchExtension("GLX_EXT_stereo_tree", extStart, extEnd);
13216 #endif /* GLX_EXT_stereo_tree */
13217 #ifdef GLX_EXT_swap_control
13218 GLXEW_EXT_swap_control = _glewSearchExtension("GLX_EXT_swap_control", extStart, extEnd);
13219 if (glewExperimental || GLXEW_EXT_swap_control) GLXEW_EXT_swap_control = !_glewInit_GLX_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT);
13220 #endif /* GLX_EXT_swap_control */
13221 #ifdef GLX_EXT_swap_control_tear
13222 GLXEW_EXT_swap_control_tear = _glewSearchExtension("GLX_EXT_swap_control_tear", extStart, extEnd);
13223 #endif /* GLX_EXT_swap_control_tear */
13224 #ifdef GLX_EXT_texture_from_pixmap
13225 GLXEW_EXT_texture_from_pixmap = _glewSearchExtension("GLX_EXT_texture_from_pixmap", extStart, extEnd);
13226 if (glewExperimental || GLXEW_EXT_texture_from_pixmap) GLXEW_EXT_texture_from_pixmap = !_glewInit_GLX_EXT_texture_from_pixmap(GLEW_CONTEXT_ARG_VAR_INIT);
13227 #endif /* GLX_EXT_texture_from_pixmap */
13228 #ifdef GLX_EXT_visual_info
13229 GLXEW_EXT_visual_info = _glewSearchExtension("GLX_EXT_visual_info", extStart, extEnd);
13230 #endif /* GLX_EXT_visual_info */
13231 #ifdef GLX_EXT_visual_rating
13232 GLXEW_EXT_visual_rating = _glewSearchExtension("GLX_EXT_visual_rating", extStart, extEnd);
13233 #endif /* GLX_EXT_visual_rating */
13234 #ifdef GLX_INTEL_swap_event
13235 GLXEW_INTEL_swap_event = _glewSearchExtension("GLX_INTEL_swap_event", extStart, extEnd);
13236 #endif /* GLX_INTEL_swap_event */
13237 #ifdef GLX_MESA_agp_offset
13238 GLXEW_MESA_agp_offset = _glewSearchExtension("GLX_MESA_agp_offset", extStart, extEnd);
13239 if (glewExperimental || GLXEW_MESA_agp_offset) GLXEW_MESA_agp_offset = !_glewInit_GLX_MESA_agp_offset(GLEW_CONTEXT_ARG_VAR_INIT);
13240 #endif /* GLX_MESA_agp_offset */
13241 #ifdef GLX_MESA_copy_sub_buffer
13242 GLXEW_MESA_copy_sub_buffer = _glewSearchExtension("GLX_MESA_copy_sub_buffer", extStart, extEnd);
13243 if (glewExperimental || GLXEW_MESA_copy_sub_buffer) GLXEW_MESA_copy_sub_buffer = !_glewInit_GLX_MESA_copy_sub_buffer(GLEW_CONTEXT_ARG_VAR_INIT);
13244 #endif /* GLX_MESA_copy_sub_buffer */
13245 #ifdef GLX_MESA_pixmap_colormap
13246 GLXEW_MESA_pixmap_colormap = _glewSearchExtension("GLX_MESA_pixmap_colormap", extStart, extEnd);
13247 if (glewExperimental || GLXEW_MESA_pixmap_colormap) GLXEW_MESA_pixmap_colormap = !_glewInit_GLX_MESA_pixmap_colormap(GLEW_CONTEXT_ARG_VAR_INIT);
13248 #endif /* GLX_MESA_pixmap_colormap */
13249 #ifdef GLX_MESA_query_renderer
13250 GLXEW_MESA_query_renderer = _glewSearchExtension("GLX_MESA_query_renderer", extStart, extEnd);
13251 if (glewExperimental || GLXEW_MESA_query_renderer) GLXEW_MESA_query_renderer = !_glewInit_GLX_MESA_query_renderer(GLEW_CONTEXT_ARG_VAR_INIT);
13252 #endif /* GLX_MESA_query_renderer */
13253 #ifdef GLX_MESA_release_buffers
13254 GLXEW_MESA_release_buffers = _glewSearchExtension("GLX_MESA_release_buffers", extStart, extEnd);
13255 if (glewExperimental || GLXEW_MESA_release_buffers) GLXEW_MESA_release_buffers = !_glewInit_GLX_MESA_release_buffers(GLEW_CONTEXT_ARG_VAR_INIT);
13256 #endif /* GLX_MESA_release_buffers */
13257 #ifdef GLX_MESA_set_3dfx_mode
13258 GLXEW_MESA_set_3dfx_mode = _glewSearchExtension("GLX_MESA_set_3dfx_mode", extStart, extEnd);
13259 if (glewExperimental || GLXEW_MESA_set_3dfx_mode) GLXEW_MESA_set_3dfx_mode = !_glewInit_GLX_MESA_set_3dfx_mode(GLEW_CONTEXT_ARG_VAR_INIT);
13260 #endif /* GLX_MESA_set_3dfx_mode */
13261 #ifdef GLX_MESA_swap_control
13262 GLXEW_MESA_swap_control = _glewSearchExtension("GLX_MESA_swap_control", extStart, extEnd);
13263 if (glewExperimental || GLXEW_MESA_swap_control) GLXEW_MESA_swap_control = !_glewInit_GLX_MESA_swap_control(GLEW_CONTEXT_ARG_VAR_INIT);
13264 #endif /* GLX_MESA_swap_control */
13265 #ifdef GLX_NV_copy_buffer
13266 GLXEW_NV_copy_buffer = _glewSearchExtension("GLX_NV_copy_buffer", extStart, extEnd);
13267 if (glewExperimental || GLXEW_NV_copy_buffer) GLXEW_NV_copy_buffer = !_glewInit_GLX_NV_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT);
13268 #endif /* GLX_NV_copy_buffer */
13269 #ifdef GLX_NV_copy_image
13270 GLXEW_NV_copy_image = _glewSearchExtension("GLX_NV_copy_image", extStart, extEnd);
13271 if (glewExperimental || GLXEW_NV_copy_image) GLXEW_NV_copy_image = !_glewInit_GLX_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT);
13272 #endif /* GLX_NV_copy_image */
13273 #ifdef GLX_NV_delay_before_swap
13274 GLXEW_NV_delay_before_swap = _glewSearchExtension("GLX_NV_delay_before_swap", extStart, extEnd);
13275 if (glewExperimental || GLXEW_NV_delay_before_swap) GLXEW_NV_delay_before_swap = !_glewInit_GLX_NV_delay_before_swap(GLEW_CONTEXT_ARG_VAR_INIT);
13276 #endif /* GLX_NV_delay_before_swap */
13277 #ifdef GLX_NV_float_buffer
13278 GLXEW_NV_float_buffer = _glewSearchExtension("GLX_NV_float_buffer", extStart, extEnd);
13279 #endif /* GLX_NV_float_buffer */
13280 #ifdef GLX_NV_multisample_coverage
13281 GLXEW_NV_multisample_coverage = _glewSearchExtension("GLX_NV_multisample_coverage", extStart, extEnd);
13282 #endif /* GLX_NV_multisample_coverage */
13283 #ifdef GLX_NV_present_video
13284 GLXEW_NV_present_video = _glewSearchExtension("GLX_NV_present_video", extStart, extEnd);
13285 if (glewExperimental || GLXEW_NV_present_video) GLXEW_NV_present_video = !_glewInit_GLX_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT);
13286 #endif /* GLX_NV_present_video */
13287 #ifdef GLX_NV_swap_group
13288 GLXEW_NV_swap_group = _glewSearchExtension("GLX_NV_swap_group", extStart, extEnd);
13289 if (glewExperimental || GLXEW_NV_swap_group) GLXEW_NV_swap_group = !_glewInit_GLX_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT);
13290 #endif /* GLX_NV_swap_group */
13291 #ifdef GLX_NV_vertex_array_range
13292 GLXEW_NV_vertex_array_range = _glewSearchExtension("GLX_NV_vertex_array_range", extStart, extEnd);
13293 if (glewExperimental || GLXEW_NV_vertex_array_range) GLXEW_NV_vertex_array_range = !_glewInit_GLX_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT);
13294 #endif /* GLX_NV_vertex_array_range */
13295 #ifdef GLX_NV_video_capture
13296 GLXEW_NV_video_capture = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd);
13297 if (glewExperimental || GLXEW_NV_video_capture) GLXEW_NV_video_capture = !_glewInit_GLX_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT);
13298 #endif /* GLX_NV_video_capture */
13299 #ifdef GLX_NV_video_out
13300 GLXEW_NV_video_out = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd);
13301 if (glewExperimental || GLXEW_NV_video_out) GLXEW_NV_video_out = !_glewInit_GLX_NV_video_out(GLEW_CONTEXT_ARG_VAR_INIT);
13302 #endif /* GLX_NV_video_out */
13303 #ifdef GLX_OML_swap_method
13304 GLXEW_OML_swap_method = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd);
13305 #endif /* GLX_OML_swap_method */
13306 #ifdef GLX_OML_sync_control
13307 GLXEW_OML_sync_control = _glewSearchExtension("GLX_OML_sync_control", extStart, extEnd);
13308 if (glewExperimental || GLXEW_OML_sync_control) GLXEW_OML_sync_control = !_glewInit_GLX_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT);
13309 #endif /* GLX_OML_sync_control */
13310 #ifdef GLX_SGIS_blended_overlay
13311 GLXEW_SGIS_blended_overlay = _glewSearchExtension("GLX_SGIS_blended_overlay", extStart, extEnd);
13312 #endif /* GLX_SGIS_blended_overlay */
13313 #ifdef GLX_SGIS_color_range
13314 GLXEW_SGIS_color_range = _glewSearchExtension("GLX_SGIS_color_range", extStart, extEnd);
13315 #endif /* GLX_SGIS_color_range */
13316 #ifdef GLX_SGIS_multisample
13317 GLXEW_SGIS_multisample = _glewSearchExtension("GLX_SGIS_multisample", extStart, extEnd);
13318 #endif /* GLX_SGIS_multisample */
13319 #ifdef GLX_SGIS_shared_multisample
13320 GLXEW_SGIS_shared_multisample = _glewSearchExtension("GLX_SGIS_shared_multisample", extStart, extEnd);
13321 #endif /* GLX_SGIS_shared_multisample */
13322 #ifdef GLX_SGIX_fbconfig
13323 GLXEW_SGIX_fbconfig = _glewSearchExtension("GLX_SGIX_fbconfig", extStart, extEnd);
13324 if (glewExperimental || GLXEW_SGIX_fbconfig) GLXEW_SGIX_fbconfig = !_glewInit_GLX_SGIX_fbconfig(GLEW_CONTEXT_ARG_VAR_INIT);
13325 #endif /* GLX_SGIX_fbconfig */
13326 #ifdef GLX_SGIX_hyperpipe
13327 GLXEW_SGIX_hyperpipe = _glewSearchExtension("GLX_SGIX_hyperpipe", extStart, extEnd);
13328 if (glewExperimental || GLXEW_SGIX_hyperpipe) GLXEW_SGIX_hyperpipe = !_glewInit_GLX_SGIX_hyperpipe(GLEW_CONTEXT_ARG_VAR_INIT);
13329 #endif /* GLX_SGIX_hyperpipe */
13330 #ifdef GLX_SGIX_pbuffer
13331 GLXEW_SGIX_pbuffer = _glewSearchExtension("GLX_SGIX_pbuffer", extStart, extEnd);
13332 if (glewExperimental || GLXEW_SGIX_pbuffer) GLXEW_SGIX_pbuffer = !_glewInit_GLX_SGIX_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT);
13333 #endif /* GLX_SGIX_pbuffer */
13334 #ifdef GLX_SGIX_swap_barrier
13335 GLXEW_SGIX_swap_barrier = _glewSearchExtension("GLX_SGIX_swap_barrier", extStart, extEnd);
13336 if (glewExperimental || GLXEW_SGIX_swap_barrier) GLXEW_SGIX_swap_barrier = !_glewInit_GLX_SGIX_swap_barrier(GLEW_CONTEXT_ARG_VAR_INIT);
13337 #endif /* GLX_SGIX_swap_barrier */
13338 #ifdef GLX_SGIX_swap_group
13339 GLXEW_SGIX_swap_group = _glewSearchExtension("GLX_SGIX_swap_group", extStart, extEnd);
13340 if (glewExperimental || GLXEW_SGIX_swap_group) GLXEW_SGIX_swap_group = !_glewInit_GLX_SGIX_swap_group(GLEW_CONTEXT_ARG_VAR_INIT);
13341 #endif /* GLX_SGIX_swap_group */
13342 #ifdef GLX_SGIX_video_resize
13343 GLXEW_SGIX_video_resize = _glewSearchExtension("GLX_SGIX_video_resize", extStart, extEnd);
13344 if (glewExperimental || GLXEW_SGIX_video_resize) GLXEW_SGIX_video_resize = !_glewInit_GLX_SGIX_video_resize(GLEW_CONTEXT_ARG_VAR_INIT);
13345 #endif /* GLX_SGIX_video_resize */
13346 #ifdef GLX_SGIX_visual_select_group
13347 GLXEW_SGIX_visual_select_group = _glewSearchExtension("GLX_SGIX_visual_select_group", extStart, extEnd);
13348 #endif /* GLX_SGIX_visual_select_group */
13349 #ifdef GLX_SGI_cushion
13350 GLXEW_SGI_cushion = _glewSearchExtension("GLX_SGI_cushion", extStart, extEnd);
13351 if (glewExperimental || GLXEW_SGI_cushion) GLXEW_SGI_cushion = !_glewInit_GLX_SGI_cushion(GLEW_CONTEXT_ARG_VAR_INIT);
13352 #endif /* GLX_SGI_cushion */
13353 #ifdef GLX_SGI_make_current_read
13354 GLXEW_SGI_make_current_read = _glewSearchExtension("GLX_SGI_make_current_read", extStart, extEnd);
13355 if (glewExperimental || GLXEW_SGI_make_current_read) GLXEW_SGI_make_current_read = !_glewInit_GLX_SGI_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT);
13356 #endif /* GLX_SGI_make_current_read */
13357 #ifdef GLX_SGI_swap_control
13358 GLXEW_SGI_swap_control = _glewSearchExtension("GLX_SGI_swap_control", extStart, extEnd);
13359 if (glewExperimental || GLXEW_SGI_swap_control) GLXEW_SGI_swap_control = !_glewInit_GLX_SGI_swap_control(GLEW_CONTEXT_ARG_VAR_INIT);
13360 #endif /* GLX_SGI_swap_control */
13361 #ifdef GLX_SGI_video_sync
13362 GLXEW_SGI_video_sync = _glewSearchExtension("GLX_SGI_video_sync", extStart, extEnd);
13363 if (glewExperimental || GLXEW_SGI_video_sync) GLXEW_SGI_video_sync = !_glewInit_GLX_SGI_video_sync(GLEW_CONTEXT_ARG_VAR_INIT);
13364 #endif /* GLX_SGI_video_sync */
13365 #ifdef GLX_SUN_get_transparent_index
13366 GLXEW_SUN_get_transparent_index = _glewSearchExtension("GLX_SUN_get_transparent_index", extStart, extEnd);
13367 if (glewExperimental || GLXEW_SUN_get_transparent_index) GLXEW_SUN_get_transparent_index = !_glewInit_GLX_SUN_get_transparent_index(GLEW_CONTEXT_ARG_VAR_INIT);
13368 #endif /* GLX_SUN_get_transparent_index */
13369 #ifdef GLX_SUN_video_resize
13370 GLXEW_SUN_video_resize = _glewSearchExtension("GLX_SUN_video_resize", extStart, extEnd);
13371 if (glewExperimental || GLXEW_SUN_video_resize) GLXEW_SUN_video_resize = !_glewInit_GLX_SUN_video_resize(GLEW_CONTEXT_ARG_VAR_INIT);
13372 #endif /* GLX_SUN_video_resize */
13373
13374 return GLEW_OK;
13375 }
13376
13377 #endif /* !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */
13378
13379 /* ------------------------------------------------------------------------ */
13380
13381 const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error)
13382 {
13383 static const GLubyte* _glewErrorString[] =
13384 {
13385 (const GLubyte*)"No error",
13386 (const GLubyte*)"Missing GL version",
13387 (const GLubyte*)"GL 1.1 and up are not supported",
13388 (const GLubyte*)"GLX 1.2 and up are not supported",
13389 (const GLubyte*)"Unknown error"
13390 };
13391 const size_t max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1;
13392 return _glewErrorString[(size_t)error > max_error ? max_error : (size_t)error];
13393 }
13394
13395 const GLubyte * GLEWAPIENTRY glewGetString (GLenum name)
13396 {
13397 static const GLubyte* _glewString[] =
13398 {
13399 (const GLubyte*)NULL,
13400 (const GLubyte*)"1.13.0",
13401 (const GLubyte*)"1",
13402 (const GLubyte*)"13",
13403 (const GLubyte*)"0"
13404 };
13405 const size_t max_string = sizeof(_glewString)/sizeof(*_glewString) - 1;
13406 return _glewString[(size_t)name > max_string ? 0 : (size_t)name];
13407 }
13408
13409 /* ------------------------------------------------------------------------ */
13410
13411 GLboolean glewExperimental = GL_FALSE;
13412
13413 #if !defined(GLEW_MX)
13414
13415 GLenum GLEWAPIENTRY glewInit (void)
13416 {
13417 GLenum r;
13418 r = glewContextInit();
13419 if ( r != 0 ) return r;
13420 #if defined(_WIN32)
13421 return wglewInit();
13422 #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */
13423 return glxewInit();
13424 #else
13425 return r;
13426 #endif /* _WIN32 */
13427 }
13428
13429 #endif /* !GLEW_MX */
13430 #ifdef GLEW_MX
13431 GLboolean GLEWAPIENTRY glewContextIsSupported (const GLEWContext* ctx, const char* name)
13432 #else
13433 GLboolean GLEWAPIENTRY glewIsSupported (const char* name)
13434 #endif
13435 {
13436 const GLubyte* pos = (const GLubyte*)name;
13437 GLuint len = _glewStrLen(pos);
13438 GLboolean ret = GL_TRUE;
13439 while (ret && len > 0)
13440 {
13441 if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3))
13442 {
13443 if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8))
13444 {
13445 #ifdef GL_VERSION_1_2
13446 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3))
13447 {
13448 ret = GLEW_VERSION_1_2;
13449 continue;
13450 }
13451 #endif
13452 #ifdef GL_VERSION_1_2_1
13453 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2_1", 5))
13454 {
13455 ret = GLEW_VERSION_1_2_1;
13456 continue;
13457 }
13458 #endif
13459 #ifdef GL_VERSION_1_3
13460 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3))
13461 {
13462 ret = GLEW_VERSION_1_3;
13463 continue;
13464 }
13465 #endif
13466 #ifdef GL_VERSION_1_4
13467 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3))
13468 {
13469 ret = GLEW_VERSION_1_4;
13470 continue;
13471 }
13472 #endif
13473 #ifdef GL_VERSION_1_5
13474 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3))
13475 {
13476 ret = GLEW_VERSION_1_5;
13477 continue;
13478 }
13479 #endif
13480 #ifdef GL_VERSION_2_0
13481 if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3))
13482 {
13483 ret = GLEW_VERSION_2_0;
13484 continue;
13485 }
13486 #endif
13487 #ifdef GL_VERSION_2_1
13488 if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_1", 3))
13489 {
13490 ret = GLEW_VERSION_2_1;
13491 continue;
13492 }
13493 #endif
13494 #ifdef GL_VERSION_3_0
13495 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_0", 3))
13496 {
13497 ret = GLEW_VERSION_3_0;
13498 continue;
13499 }
13500 #endif
13501 #ifdef GL_VERSION_3_1
13502 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_1", 3))
13503 {
13504 ret = GLEW_VERSION_3_1;
13505 continue;
13506 }
13507 #endif
13508 #ifdef GL_VERSION_3_2
13509 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_2", 3))
13510 {
13511 ret = GLEW_VERSION_3_2;
13512 continue;
13513 }
13514 #endif
13515 #ifdef GL_VERSION_3_3
13516 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_3", 3))
13517 {
13518 ret = GLEW_VERSION_3_3;
13519 continue;
13520 }
13521 #endif
13522 #ifdef GL_VERSION_4_0
13523 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_0", 3))
13524 {
13525 ret = GLEW_VERSION_4_0;
13526 continue;
13527 }
13528 #endif
13529 #ifdef GL_VERSION_4_1
13530 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_1", 3))
13531 {
13532 ret = GLEW_VERSION_4_1;
13533 continue;
13534 }
13535 #endif
13536 #ifdef GL_VERSION_4_2
13537 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_2", 3))
13538 {
13539 ret = GLEW_VERSION_4_2;
13540 continue;
13541 }
13542 #endif
13543 #ifdef GL_VERSION_4_3
13544 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_3", 3))
13545 {
13546 ret = GLEW_VERSION_4_3;
13547 continue;
13548 }
13549 #endif
13550 #ifdef GL_VERSION_4_4
13551 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_4", 3))
13552 {
13553 ret = GLEW_VERSION_4_4;
13554 continue;
13555 }
13556 #endif
13557 #ifdef GL_VERSION_4_5
13558 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_5", 3))
13559 {
13560 ret = GLEW_VERSION_4_5;
13561 continue;
13562 }
13563 #endif
13564 }
13565 if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5))
13566 {
13567 #ifdef GL_3DFX_multisample
13568 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11))
13569 {
13570 ret = GLEW_3DFX_multisample;
13571 continue;
13572 }
13573 #endif
13574 #ifdef GL_3DFX_tbuffer
13575 if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7))
13576 {
13577 ret = GLEW_3DFX_tbuffer;
13578 continue;
13579 }
13580 #endif
13581 #ifdef GL_3DFX_texture_compression_FXT1
13582 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24))
13583 {
13584 ret = GLEW_3DFX_texture_compression_FXT1;
13585 continue;
13586 }
13587 #endif
13588 }
13589 if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4))
13590 {
13591 #ifdef GL_AMD_blend_minmax_factor
13592 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19))
13593 {
13594 ret = GLEW_AMD_blend_minmax_factor;
13595 continue;
13596 }
13597 #endif
13598 #ifdef GL_AMD_conservative_depth
13599 if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18))
13600 {
13601 ret = GLEW_AMD_conservative_depth;
13602 continue;
13603 }
13604 #endif
13605 #ifdef GL_AMD_debug_output
13606 if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12))
13607 {
13608 ret = GLEW_AMD_debug_output;
13609 continue;
13610 }
13611 #endif
13612 #ifdef GL_AMD_depth_clamp_separate
13613 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp_separate", 20))
13614 {
13615 ret = GLEW_AMD_depth_clamp_separate;
13616 continue;
13617 }
13618 #endif
13619 #ifdef GL_AMD_draw_buffers_blend
13620 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18))
13621 {
13622 ret = GLEW_AMD_draw_buffers_blend;
13623 continue;
13624 }
13625 #endif
13626 #ifdef GL_AMD_gcn_shader
13627 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gcn_shader", 10))
13628 {
13629 ret = GLEW_AMD_gcn_shader;
13630 continue;
13631 }
13632 #endif
13633 #ifdef GL_AMD_gpu_shader_int64
13634 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16))
13635 {
13636 ret = GLEW_AMD_gpu_shader_int64;
13637 continue;
13638 }
13639 #endif
13640 #ifdef GL_AMD_interleaved_elements
13641 if (_glewStrSame3(&pos, &len, (const GLubyte*)"interleaved_elements", 20))
13642 {
13643 ret = GLEW_AMD_interleaved_elements;
13644 continue;
13645 }
13646 #endif
13647 #ifdef GL_AMD_multi_draw_indirect
13648 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19))
13649 {
13650 ret = GLEW_AMD_multi_draw_indirect;
13651 continue;
13652 }
13653 #endif
13654 #ifdef GL_AMD_name_gen_delete
13655 if (_glewStrSame3(&pos, &len, (const GLubyte*)"name_gen_delete", 15))
13656 {
13657 ret = GLEW_AMD_name_gen_delete;
13658 continue;
13659 }
13660 #endif
13661 #ifdef GL_AMD_occlusion_query_event
13662 if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query_event", 21))
13663 {
13664 ret = GLEW_AMD_occlusion_query_event;
13665 continue;
13666 }
13667 #endif
13668 #ifdef GL_AMD_performance_monitor
13669 if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_monitor", 19))
13670 {
13671 ret = GLEW_AMD_performance_monitor;
13672 continue;
13673 }
13674 #endif
13675 #ifdef GL_AMD_pinned_memory
13676 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pinned_memory", 13))
13677 {
13678 ret = GLEW_AMD_pinned_memory;
13679 continue;
13680 }
13681 #endif
13682 #ifdef GL_AMD_query_buffer_object
13683 if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19))
13684 {
13685 ret = GLEW_AMD_query_buffer_object;
13686 continue;
13687 }
13688 #endif
13689 #ifdef GL_AMD_sample_positions
13690 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_positions", 16))
13691 {
13692 ret = GLEW_AMD_sample_positions;
13693 continue;
13694 }
13695 #endif
13696 #ifdef GL_AMD_seamless_cubemap_per_texture
13697 if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28))
13698 {
13699 ret = GLEW_AMD_seamless_cubemap_per_texture;
13700 continue;
13701 }
13702 #endif
13703 #ifdef GL_AMD_shader_atomic_counter_ops
13704 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25))
13705 {
13706 ret = GLEW_AMD_shader_atomic_counter_ops;
13707 continue;
13708 }
13709 #endif
13710 #ifdef GL_AMD_shader_stencil_export
13711 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21))
13712 {
13713 ret = GLEW_AMD_shader_stencil_export;
13714 continue;
13715 }
13716 #endif
13717 #ifdef GL_AMD_shader_stencil_value_export
13718 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_value_export", 27))
13719 {
13720 ret = GLEW_AMD_shader_stencil_value_export;
13721 continue;
13722 }
13723 #endif
13724 #ifdef GL_AMD_shader_trinary_minmax
13725 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_trinary_minmax", 21))
13726 {
13727 ret = GLEW_AMD_shader_trinary_minmax;
13728 continue;
13729 }
13730 #endif
13731 #ifdef GL_AMD_sparse_texture
13732 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14))
13733 {
13734 ret = GLEW_AMD_sparse_texture;
13735 continue;
13736 }
13737 #endif
13738 #ifdef GL_AMD_stencil_operation_extended
13739 if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26))
13740 {
13741 ret = GLEW_AMD_stencil_operation_extended;
13742 continue;
13743 }
13744 #endif
13745 #ifdef GL_AMD_texture_texture4
13746 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_texture4", 16))
13747 {
13748 ret = GLEW_AMD_texture_texture4;
13749 continue;
13750 }
13751 #endif
13752 #ifdef GL_AMD_transform_feedback3_lines_triangles
13753 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3_lines_triangles", 35))
13754 {
13755 ret = GLEW_AMD_transform_feedback3_lines_triangles;
13756 continue;
13757 }
13758 #endif
13759 #ifdef GL_AMD_transform_feedback4
13760 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback4", 19))
13761 {
13762 ret = GLEW_AMD_transform_feedback4;
13763 continue;
13764 }
13765 #endif
13766 #ifdef GL_AMD_vertex_shader_layer
13767 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_layer", 19))
13768 {
13769 ret = GLEW_AMD_vertex_shader_layer;
13770 continue;
13771 }
13772 #endif
13773 #ifdef GL_AMD_vertex_shader_tessellator
13774 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_tessellator", 25))
13775 {
13776 ret = GLEW_AMD_vertex_shader_tessellator;
13777 continue;
13778 }
13779 #endif
13780 #ifdef GL_AMD_vertex_shader_viewport_index
13781 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_viewport_index", 28))
13782 {
13783 ret = GLEW_AMD_vertex_shader_viewport_index;
13784 continue;
13785 }
13786 #endif
13787 }
13788 if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6))
13789 {
13790 #ifdef GL_ANGLE_depth_texture
13791 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13))
13792 {
13793 ret = GLEW_ANGLE_depth_texture;
13794 continue;
13795 }
13796 #endif
13797 #ifdef GL_ANGLE_framebuffer_blit
13798 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16))
13799 {
13800 ret = GLEW_ANGLE_framebuffer_blit;
13801 continue;
13802 }
13803 #endif
13804 #ifdef GL_ANGLE_framebuffer_multisample
13805 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23))
13806 {
13807 ret = GLEW_ANGLE_framebuffer_multisample;
13808 continue;
13809 }
13810 #endif
13811 #ifdef GL_ANGLE_instanced_arrays
13812 if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16))
13813 {
13814 ret = GLEW_ANGLE_instanced_arrays;
13815 continue;
13816 }
13817 #endif
13818 #ifdef GL_ANGLE_pack_reverse_row_order
13819 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_reverse_row_order", 22))
13820 {
13821 ret = GLEW_ANGLE_pack_reverse_row_order;
13822 continue;
13823 }
13824 #endif
13825 #ifdef GL_ANGLE_program_binary
13826 if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14))
13827 {
13828 ret = GLEW_ANGLE_program_binary;
13829 continue;
13830 }
13831 #endif
13832 #ifdef GL_ANGLE_texture_compression_dxt1
13833 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24))
13834 {
13835 ret = GLEW_ANGLE_texture_compression_dxt1;
13836 continue;
13837 }
13838 #endif
13839 #ifdef GL_ANGLE_texture_compression_dxt3
13840 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt3", 24))
13841 {
13842 ret = GLEW_ANGLE_texture_compression_dxt3;
13843 continue;
13844 }
13845 #endif
13846 #ifdef GL_ANGLE_texture_compression_dxt5
13847 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt5", 24))
13848 {
13849 ret = GLEW_ANGLE_texture_compression_dxt5;
13850 continue;
13851 }
13852 #endif
13853 #ifdef GL_ANGLE_texture_usage
13854 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_usage", 13))
13855 {
13856 ret = GLEW_ANGLE_texture_usage;
13857 continue;
13858 }
13859 #endif
13860 #ifdef GL_ANGLE_timer_query
13861 if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11))
13862 {
13863 ret = GLEW_ANGLE_timer_query;
13864 continue;
13865 }
13866 #endif
13867 #ifdef GL_ANGLE_translated_shader_source
13868 if (_glewStrSame3(&pos, &len, (const GLubyte*)"translated_shader_source", 24))
13869 {
13870 ret = GLEW_ANGLE_translated_shader_source;
13871 continue;
13872 }
13873 #endif
13874 }
13875 if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6))
13876 {
13877 #ifdef GL_APPLE_aux_depth_stencil
13878 if (_glewStrSame3(&pos, &len, (const GLubyte*)"aux_depth_stencil", 17))
13879 {
13880 ret = GLEW_APPLE_aux_depth_stencil;
13881 continue;
13882 }
13883 #endif
13884 #ifdef GL_APPLE_client_storage
13885 if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14))
13886 {
13887 ret = GLEW_APPLE_client_storage;
13888 continue;
13889 }
13890 #endif
13891 #ifdef GL_APPLE_element_array
13892 if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13))
13893 {
13894 ret = GLEW_APPLE_element_array;
13895 continue;
13896 }
13897 #endif
13898 #ifdef GL_APPLE_fence
13899 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5))
13900 {
13901 ret = GLEW_APPLE_fence;
13902 continue;
13903 }
13904 #endif
13905 #ifdef GL_APPLE_float_pixels
13906 if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12))
13907 {
13908 ret = GLEW_APPLE_float_pixels;
13909 continue;
13910 }
13911 #endif
13912 #ifdef GL_APPLE_flush_buffer_range
13913 if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_buffer_range", 18))
13914 {
13915 ret = GLEW_APPLE_flush_buffer_range;
13916 continue;
13917 }
13918 #endif
13919 #ifdef GL_APPLE_object_purgeable
13920 if (_glewStrSame3(&pos, &len, (const GLubyte*)"object_purgeable", 16))
13921 {
13922 ret = GLEW_APPLE_object_purgeable;
13923 continue;
13924 }
13925 #endif
13926 #ifdef GL_APPLE_pixel_buffer
13927 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12))
13928 {
13929 ret = GLEW_APPLE_pixel_buffer;
13930 continue;
13931 }
13932 #endif
13933 #ifdef GL_APPLE_rgb_422
13934 if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb_422", 7))
13935 {
13936 ret = GLEW_APPLE_rgb_422;
13937 continue;
13938 }
13939 #endif
13940 #ifdef GL_APPLE_row_bytes
13941 if (_glewStrSame3(&pos, &len, (const GLubyte*)"row_bytes", 9))
13942 {
13943 ret = GLEW_APPLE_row_bytes;
13944 continue;
13945 }
13946 #endif
13947 #ifdef GL_APPLE_specular_vector
13948 if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15))
13949 {
13950 ret = GLEW_APPLE_specular_vector;
13951 continue;
13952 }
13953 #endif
13954 #ifdef GL_APPLE_texture_range
13955 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13))
13956 {
13957 ret = GLEW_APPLE_texture_range;
13958 continue;
13959 }
13960 #endif
13961 #ifdef GL_APPLE_transform_hint
13962 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14))
13963 {
13964 ret = GLEW_APPLE_transform_hint;
13965 continue;
13966 }
13967 #endif
13968 #ifdef GL_APPLE_vertex_array_object
13969 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19))
13970 {
13971 ret = GLEW_APPLE_vertex_array_object;
13972 continue;
13973 }
13974 #endif
13975 #ifdef GL_APPLE_vertex_array_range
13976 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18))
13977 {
13978 ret = GLEW_APPLE_vertex_array_range;
13979 continue;
13980 }
13981 #endif
13982 #ifdef GL_APPLE_vertex_program_evaluators
13983 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program_evaluators", 25))
13984 {
13985 ret = GLEW_APPLE_vertex_program_evaluators;
13986 continue;
13987 }
13988 #endif
13989 #ifdef GL_APPLE_ycbcr_422
13990 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9))
13991 {
13992 ret = GLEW_APPLE_ycbcr_422;
13993 continue;
13994 }
13995 #endif
13996 }
13997 if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4))
13998 {
13999 #ifdef GL_ARB_ES2_compatibility
14000 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES2_compatibility", 17))
14001 {
14002 ret = GLEW_ARB_ES2_compatibility;
14003 continue;
14004 }
14005 #endif
14006 #ifdef GL_ARB_ES3_1_compatibility
14007 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_1_compatibility", 19))
14008 {
14009 ret = GLEW_ARB_ES3_1_compatibility;
14010 continue;
14011 }
14012 #endif
14013 #ifdef GL_ARB_ES3_2_compatibility
14014 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_2_compatibility", 19))
14015 {
14016 ret = GLEW_ARB_ES3_2_compatibility;
14017 continue;
14018 }
14019 #endif
14020 #ifdef GL_ARB_ES3_compatibility
14021 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_compatibility", 17))
14022 {
14023 ret = GLEW_ARB_ES3_compatibility;
14024 continue;
14025 }
14026 #endif
14027 #ifdef GL_ARB_arrays_of_arrays
14028 if (_glewStrSame3(&pos, &len, (const GLubyte*)"arrays_of_arrays", 16))
14029 {
14030 ret = GLEW_ARB_arrays_of_arrays;
14031 continue;
14032 }
14033 #endif
14034 #ifdef GL_ARB_base_instance
14035 if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13))
14036 {
14037 ret = GLEW_ARB_base_instance;
14038 continue;
14039 }
14040 #endif
14041 #ifdef GL_ARB_bindless_texture
14042 if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16))
14043 {
14044 ret = GLEW_ARB_bindless_texture;
14045 continue;
14046 }
14047 #endif
14048 #ifdef GL_ARB_blend_func_extended
14049 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19))
14050 {
14051 ret = GLEW_ARB_blend_func_extended;
14052 continue;
14053 }
14054 #endif
14055 #ifdef GL_ARB_buffer_storage
14056 if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14))
14057 {
14058 ret = GLEW_ARB_buffer_storage;
14059 continue;
14060 }
14061 #endif
14062 #ifdef GL_ARB_cl_event
14063 if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8))
14064 {
14065 ret = GLEW_ARB_cl_event;
14066 continue;
14067 }
14068 #endif
14069 #ifdef GL_ARB_clear_buffer_object
14070 if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_buffer_object", 19))
14071 {
14072 ret = GLEW_ARB_clear_buffer_object;
14073 continue;
14074 }
14075 #endif
14076 #ifdef GL_ARB_clear_texture
14077 if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13))
14078 {
14079 ret = GLEW_ARB_clear_texture;
14080 continue;
14081 }
14082 #endif
14083 #ifdef GL_ARB_clip_control
14084 if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_control", 12))
14085 {
14086 ret = GLEW_ARB_clip_control;
14087 continue;
14088 }
14089 #endif
14090 #ifdef GL_ARB_color_buffer_float
14091 if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18))
14092 {
14093 ret = GLEW_ARB_color_buffer_float;
14094 continue;
14095 }
14096 #endif
14097 #ifdef GL_ARB_compatibility
14098 if (_glewStrSame3(&pos, &len, (const GLubyte*)"compatibility", 13))
14099 {
14100 ret = GLEW_ARB_compatibility;
14101 continue;
14102 }
14103 #endif
14104 #ifdef GL_ARB_compressed_texture_pixel_storage
14105 if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_texture_pixel_storage", 32))
14106 {
14107 ret = GLEW_ARB_compressed_texture_pixel_storage;
14108 continue;
14109 }
14110 #endif
14111 #ifdef GL_ARB_compute_shader
14112 if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_shader", 14))
14113 {
14114 ret = GLEW_ARB_compute_shader;
14115 continue;
14116 }
14117 #endif
14118 #ifdef GL_ARB_compute_variable_group_size
14119 if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_variable_group_size", 27))
14120 {
14121 ret = GLEW_ARB_compute_variable_group_size;
14122 continue;
14123 }
14124 #endif
14125 #ifdef GL_ARB_conditional_render_inverted
14126 if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render_inverted", 27))
14127 {
14128 ret = GLEW_ARB_conditional_render_inverted;
14129 continue;
14130 }
14131 #endif
14132 #ifdef GL_ARB_conservative_depth
14133 if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18))
14134 {
14135 ret = GLEW_ARB_conservative_depth;
14136 continue;
14137 }
14138 #endif
14139 #ifdef GL_ARB_copy_buffer
14140 if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11))
14141 {
14142 ret = GLEW_ARB_copy_buffer;
14143 continue;
14144 }
14145 #endif
14146 #ifdef GL_ARB_copy_image
14147 if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10))
14148 {
14149 ret = GLEW_ARB_copy_image;
14150 continue;
14151 }
14152 #endif
14153 #ifdef GL_ARB_cull_distance
14154 if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_distance", 13))
14155 {
14156 ret = GLEW_ARB_cull_distance;
14157 continue;
14158 }
14159 #endif
14160 #ifdef GL_ARB_debug_output
14161 if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12))
14162 {
14163 ret = GLEW_ARB_debug_output;
14164 continue;
14165 }
14166 #endif
14167 #ifdef GL_ARB_depth_buffer_float
14168 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18))
14169 {
14170 ret = GLEW_ARB_depth_buffer_float;
14171 continue;
14172 }
14173 #endif
14174 #ifdef GL_ARB_depth_clamp
14175 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11))
14176 {
14177 ret = GLEW_ARB_depth_clamp;
14178 continue;
14179 }
14180 #endif
14181 #ifdef GL_ARB_depth_texture
14182 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13))
14183 {
14184 ret = GLEW_ARB_depth_texture;
14185 continue;
14186 }
14187 #endif
14188 #ifdef GL_ARB_derivative_control
14189 if (_glewStrSame3(&pos, &len, (const GLubyte*)"derivative_control", 18))
14190 {
14191 ret = GLEW_ARB_derivative_control;
14192 continue;
14193 }
14194 #endif
14195 #ifdef GL_ARB_direct_state_access
14196 if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19))
14197 {
14198 ret = GLEW_ARB_direct_state_access;
14199 continue;
14200 }
14201 #endif
14202 #ifdef GL_ARB_draw_buffers
14203 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12))
14204 {
14205 ret = GLEW_ARB_draw_buffers;
14206 continue;
14207 }
14208 #endif
14209 #ifdef GL_ARB_draw_buffers_blend
14210 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18))
14211 {
14212 ret = GLEW_ARB_draw_buffers_blend;
14213 continue;
14214 }
14215 #endif
14216 #ifdef GL_ARB_draw_elements_base_vertex
14217 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25))
14218 {
14219 ret = GLEW_ARB_draw_elements_base_vertex;
14220 continue;
14221 }
14222 #endif
14223 #ifdef GL_ARB_draw_indirect
14224 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_indirect", 13))
14225 {
14226 ret = GLEW_ARB_draw_indirect;
14227 continue;
14228 }
14229 #endif
14230 #ifdef GL_ARB_draw_instanced
14231 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14))
14232 {
14233 ret = GLEW_ARB_draw_instanced;
14234 continue;
14235 }
14236 #endif
14237 #ifdef GL_ARB_enhanced_layouts
14238 if (_glewStrSame3(&pos, &len, (const GLubyte*)"enhanced_layouts", 16))
14239 {
14240 ret = GLEW_ARB_enhanced_layouts;
14241 continue;
14242 }
14243 #endif
14244 #ifdef GL_ARB_explicit_attrib_location
14245 if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24))
14246 {
14247 ret = GLEW_ARB_explicit_attrib_location;
14248 continue;
14249 }
14250 #endif
14251 #ifdef GL_ARB_explicit_uniform_location
14252 if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_uniform_location", 25))
14253 {
14254 ret = GLEW_ARB_explicit_uniform_location;
14255 continue;
14256 }
14257 #endif
14258 #ifdef GL_ARB_fragment_coord_conventions
14259 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coord_conventions", 26))
14260 {
14261 ret = GLEW_ARB_fragment_coord_conventions;
14262 continue;
14263 }
14264 #endif
14265 #ifdef GL_ARB_fragment_layer_viewport
14266 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_layer_viewport", 23))
14267 {
14268 ret = GLEW_ARB_fragment_layer_viewport;
14269 continue;
14270 }
14271 #endif
14272 #ifdef GL_ARB_fragment_program
14273 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16))
14274 {
14275 ret = GLEW_ARB_fragment_program;
14276 continue;
14277 }
14278 #endif
14279 #ifdef GL_ARB_fragment_program_shadow
14280 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23))
14281 {
14282 ret = GLEW_ARB_fragment_program_shadow;
14283 continue;
14284 }
14285 #endif
14286 #ifdef GL_ARB_fragment_shader
14287 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15))
14288 {
14289 ret = GLEW_ARB_fragment_shader;
14290 continue;
14291 }
14292 #endif
14293 #ifdef GL_ARB_fragment_shader_interlock
14294 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25))
14295 {
14296 ret = GLEW_ARB_fragment_shader_interlock;
14297 continue;
14298 }
14299 #endif
14300 #ifdef GL_ARB_framebuffer_no_attachments
14301 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_no_attachments", 26))
14302 {
14303 ret = GLEW_ARB_framebuffer_no_attachments;
14304 continue;
14305 }
14306 #endif
14307 #ifdef GL_ARB_framebuffer_object
14308 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18))
14309 {
14310 ret = GLEW_ARB_framebuffer_object;
14311 continue;
14312 }
14313 #endif
14314 #ifdef GL_ARB_framebuffer_sRGB
14315 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16))
14316 {
14317 ret = GLEW_ARB_framebuffer_sRGB;
14318 continue;
14319 }
14320 #endif
14321 #ifdef GL_ARB_geometry_shader4
14322 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16))
14323 {
14324 ret = GLEW_ARB_geometry_shader4;
14325 continue;
14326 }
14327 #endif
14328 #ifdef GL_ARB_get_program_binary
14329 if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18))
14330 {
14331 ret = GLEW_ARB_get_program_binary;
14332 continue;
14333 }
14334 #endif
14335 #ifdef GL_ARB_get_texture_sub_image
14336 if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_texture_sub_image", 21))
14337 {
14338 ret = GLEW_ARB_get_texture_sub_image;
14339 continue;
14340 }
14341 #endif
14342 #ifdef GL_ARB_gpu_shader5
14343 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11))
14344 {
14345 ret = GLEW_ARB_gpu_shader5;
14346 continue;
14347 }
14348 #endif
14349 #ifdef GL_ARB_gpu_shader_fp64
14350 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_fp64", 15))
14351 {
14352 ret = GLEW_ARB_gpu_shader_fp64;
14353 continue;
14354 }
14355 #endif
14356 #ifdef GL_ARB_gpu_shader_int64
14357 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16))
14358 {
14359 ret = GLEW_ARB_gpu_shader_int64;
14360 continue;
14361 }
14362 #endif
14363 #ifdef GL_ARB_half_float_pixel
14364 if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16))
14365 {
14366 ret = GLEW_ARB_half_float_pixel;
14367 continue;
14368 }
14369 #endif
14370 #ifdef GL_ARB_half_float_vertex
14371 if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_vertex", 17))
14372 {
14373 ret = GLEW_ARB_half_float_vertex;
14374 continue;
14375 }
14376 #endif
14377 #ifdef GL_ARB_imaging
14378 if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7))
14379 {
14380 ret = GLEW_ARB_imaging;
14381 continue;
14382 }
14383 #endif
14384 #ifdef GL_ARB_indirect_parameters
14385 if (_glewStrSame3(&pos, &len, (const GLubyte*)"indirect_parameters", 19))
14386 {
14387 ret = GLEW_ARB_indirect_parameters;
14388 continue;
14389 }
14390 #endif
14391 #ifdef GL_ARB_instanced_arrays
14392 if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16))
14393 {
14394 ret = GLEW_ARB_instanced_arrays;
14395 continue;
14396 }
14397 #endif
14398 #ifdef GL_ARB_internalformat_query
14399 if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query", 20))
14400 {
14401 ret = GLEW_ARB_internalformat_query;
14402 continue;
14403 }
14404 #endif
14405 #ifdef GL_ARB_internalformat_query2
14406 if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query2", 21))
14407 {
14408 ret = GLEW_ARB_internalformat_query2;
14409 continue;
14410 }
14411 #endif
14412 #ifdef GL_ARB_invalidate_subdata
14413 if (_glewStrSame3(&pos, &len, (const GLubyte*)"invalidate_subdata", 18))
14414 {
14415 ret = GLEW_ARB_invalidate_subdata;
14416 continue;
14417 }
14418 #endif
14419 #ifdef GL_ARB_map_buffer_alignment
14420 if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_alignment", 20))
14421 {
14422 ret = GLEW_ARB_map_buffer_alignment;
14423 continue;
14424 }
14425 #endif
14426 #ifdef GL_ARB_map_buffer_range
14427 if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16))
14428 {
14429 ret = GLEW_ARB_map_buffer_range;
14430 continue;
14431 }
14432 #endif
14433 #ifdef GL_ARB_matrix_palette
14434 if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14))
14435 {
14436 ret = GLEW_ARB_matrix_palette;
14437 continue;
14438 }
14439 #endif
14440 #ifdef GL_ARB_multi_bind
14441 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_bind", 10))
14442 {
14443 ret = GLEW_ARB_multi_bind;
14444 continue;
14445 }
14446 #endif
14447 #ifdef GL_ARB_multi_draw_indirect
14448 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19))
14449 {
14450 ret = GLEW_ARB_multi_draw_indirect;
14451 continue;
14452 }
14453 #endif
14454 #ifdef GL_ARB_multisample
14455 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11))
14456 {
14457 ret = GLEW_ARB_multisample;
14458 continue;
14459 }
14460 #endif
14461 #ifdef GL_ARB_multitexture
14462 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12))
14463 {
14464 ret = GLEW_ARB_multitexture;
14465 continue;
14466 }
14467 #endif
14468 #ifdef GL_ARB_occlusion_query
14469 if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15))
14470 {
14471 ret = GLEW_ARB_occlusion_query;
14472 continue;
14473 }
14474 #endif
14475 #ifdef GL_ARB_occlusion_query2
14476 if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query2", 16))
14477 {
14478 ret = GLEW_ARB_occlusion_query2;
14479 continue;
14480 }
14481 #endif
14482 #ifdef GL_ARB_parallel_shader_compile
14483 if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23))
14484 {
14485 ret = GLEW_ARB_parallel_shader_compile;
14486 continue;
14487 }
14488 #endif
14489 #ifdef GL_ARB_pipeline_statistics_query
14490 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pipeline_statistics_query", 25))
14491 {
14492 ret = GLEW_ARB_pipeline_statistics_query;
14493 continue;
14494 }
14495 #endif
14496 #ifdef GL_ARB_pixel_buffer_object
14497 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19))
14498 {
14499 ret = GLEW_ARB_pixel_buffer_object;
14500 continue;
14501 }
14502 #endif
14503 #ifdef GL_ARB_point_parameters
14504 if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16))
14505 {
14506 ret = GLEW_ARB_point_parameters;
14507 continue;
14508 }
14509 #endif
14510 #ifdef GL_ARB_point_sprite
14511 if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12))
14512 {
14513 ret = GLEW_ARB_point_sprite;
14514 continue;
14515 }
14516 #endif
14517 #ifdef GL_ARB_post_depth_coverage
14518 if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19))
14519 {
14520 ret = GLEW_ARB_post_depth_coverage;
14521 continue;
14522 }
14523 #endif
14524 #ifdef GL_ARB_program_interface_query
14525 if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_interface_query", 23))
14526 {
14527 ret = GLEW_ARB_program_interface_query;
14528 continue;
14529 }
14530 #endif
14531 #ifdef GL_ARB_provoking_vertex
14532 if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16))
14533 {
14534 ret = GLEW_ARB_provoking_vertex;
14535 continue;
14536 }
14537 #endif
14538 #ifdef GL_ARB_query_buffer_object
14539 if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19))
14540 {
14541 ret = GLEW_ARB_query_buffer_object;
14542 continue;
14543 }
14544 #endif
14545 #ifdef GL_ARB_robust_buffer_access_behavior
14546 if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29))
14547 {
14548 ret = GLEW_ARB_robust_buffer_access_behavior;
14549 continue;
14550 }
14551 #endif
14552 #ifdef GL_ARB_robustness
14553 if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10))
14554 {
14555 ret = GLEW_ARB_robustness;
14556 continue;
14557 }
14558 #endif
14559 #ifdef GL_ARB_robustness_application_isolation
14560 if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32))
14561 {
14562 ret = GLEW_ARB_robustness_application_isolation;
14563 continue;
14564 }
14565 #endif
14566 #ifdef GL_ARB_robustness_share_group_isolation
14567 if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32))
14568 {
14569 ret = GLEW_ARB_robustness_share_group_isolation;
14570 continue;
14571 }
14572 #endif
14573 #ifdef GL_ARB_sample_locations
14574 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16))
14575 {
14576 ret = GLEW_ARB_sample_locations;
14577 continue;
14578 }
14579 #endif
14580 #ifdef GL_ARB_sample_shading
14581 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14))
14582 {
14583 ret = GLEW_ARB_sample_shading;
14584 continue;
14585 }
14586 #endif
14587 #ifdef GL_ARB_sampler_objects
14588 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sampler_objects", 15))
14589 {
14590 ret = GLEW_ARB_sampler_objects;
14591 continue;
14592 }
14593 #endif
14594 #ifdef GL_ARB_seamless_cube_map
14595 if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cube_map", 17))
14596 {
14597 ret = GLEW_ARB_seamless_cube_map;
14598 continue;
14599 }
14600 #endif
14601 #ifdef GL_ARB_seamless_cubemap_per_texture
14602 if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28))
14603 {
14604 ret = GLEW_ARB_seamless_cubemap_per_texture;
14605 continue;
14606 }
14607 #endif
14608 #ifdef GL_ARB_separate_shader_objects
14609 if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23))
14610 {
14611 ret = GLEW_ARB_separate_shader_objects;
14612 continue;
14613 }
14614 #endif
14615 #ifdef GL_ARB_shader_atomic_counter_ops
14616 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25))
14617 {
14618 ret = GLEW_ARB_shader_atomic_counter_ops;
14619 continue;
14620 }
14621 #endif
14622 #ifdef GL_ARB_shader_atomic_counters
14623 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22))
14624 {
14625 ret = GLEW_ARB_shader_atomic_counters;
14626 continue;
14627 }
14628 #endif
14629 #ifdef GL_ARB_shader_ballot
14630 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13))
14631 {
14632 ret = GLEW_ARB_shader_ballot;
14633 continue;
14634 }
14635 #endif
14636 #ifdef GL_ARB_shader_bit_encoding
14637 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_bit_encoding", 19))
14638 {
14639 ret = GLEW_ARB_shader_bit_encoding;
14640 continue;
14641 }
14642 #endif
14643 #ifdef GL_ARB_shader_clock
14644 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_clock", 12))
14645 {
14646 ret = GLEW_ARB_shader_clock;
14647 continue;
14648 }
14649 #endif
14650 #ifdef GL_ARB_shader_draw_parameters
14651 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_draw_parameters", 22))
14652 {
14653 ret = GLEW_ARB_shader_draw_parameters;
14654 continue;
14655 }
14656 #endif
14657 #ifdef GL_ARB_shader_group_vote
14658 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17))
14659 {
14660 ret = GLEW_ARB_shader_group_vote;
14661 continue;
14662 }
14663 #endif
14664 #ifdef GL_ARB_shader_image_load_store
14665 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23))
14666 {
14667 ret = GLEW_ARB_shader_image_load_store;
14668 continue;
14669 }
14670 #endif
14671 #ifdef GL_ARB_shader_image_size
14672 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_size", 17))
14673 {
14674 ret = GLEW_ARB_shader_image_size;
14675 continue;
14676 }
14677 #endif
14678 #ifdef GL_ARB_shader_objects
14679 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14))
14680 {
14681 ret = GLEW_ARB_shader_objects;
14682 continue;
14683 }
14684 #endif
14685 #ifdef GL_ARB_shader_precision
14686 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_precision", 16))
14687 {
14688 ret = GLEW_ARB_shader_precision;
14689 continue;
14690 }
14691 #endif
14692 #ifdef GL_ARB_shader_stencil_export
14693 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21))
14694 {
14695 ret = GLEW_ARB_shader_stencil_export;
14696 continue;
14697 }
14698 #endif
14699 #ifdef GL_ARB_shader_storage_buffer_object
14700 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28))
14701 {
14702 ret = GLEW_ARB_shader_storage_buffer_object;
14703 continue;
14704 }
14705 #endif
14706 #ifdef GL_ARB_shader_subroutine
14707 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subroutine", 17))
14708 {
14709 ret = GLEW_ARB_shader_subroutine;
14710 continue;
14711 }
14712 #endif
14713 #ifdef GL_ARB_shader_texture_image_samples
14714 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_image_samples", 28))
14715 {
14716 ret = GLEW_ARB_shader_texture_image_samples;
14717 continue;
14718 }
14719 #endif
14720 #ifdef GL_ARB_shader_texture_lod
14721 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18))
14722 {
14723 ret = GLEW_ARB_shader_texture_lod;
14724 continue;
14725 }
14726 #endif
14727 #ifdef GL_ARB_shader_viewport_layer_array
14728 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_viewport_layer_array", 27))
14729 {
14730 ret = GLEW_ARB_shader_viewport_layer_array;
14731 continue;
14732 }
14733 #endif
14734 #ifdef GL_ARB_shading_language_100
14735 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20))
14736 {
14737 ret = GLEW_ARB_shading_language_100;
14738 continue;
14739 }
14740 #endif
14741 #ifdef GL_ARB_shading_language_420pack
14742 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_420pack", 24))
14743 {
14744 ret = GLEW_ARB_shading_language_420pack;
14745 continue;
14746 }
14747 #endif
14748 #ifdef GL_ARB_shading_language_include
14749 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_include", 24))
14750 {
14751 ret = GLEW_ARB_shading_language_include;
14752 continue;
14753 }
14754 #endif
14755 #ifdef GL_ARB_shading_language_packing
14756 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_packing", 24))
14757 {
14758 ret = GLEW_ARB_shading_language_packing;
14759 continue;
14760 }
14761 #endif
14762 #ifdef GL_ARB_shadow
14763 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6))
14764 {
14765 ret = GLEW_ARB_shadow;
14766 continue;
14767 }
14768 #endif
14769 #ifdef GL_ARB_shadow_ambient
14770 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14))
14771 {
14772 ret = GLEW_ARB_shadow_ambient;
14773 continue;
14774 }
14775 #endif
14776 #ifdef GL_ARB_sparse_buffer
14777 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_buffer", 13))
14778 {
14779 ret = GLEW_ARB_sparse_buffer;
14780 continue;
14781 }
14782 #endif
14783 #ifdef GL_ARB_sparse_texture
14784 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14))
14785 {
14786 ret = GLEW_ARB_sparse_texture;
14787 continue;
14788 }
14789 #endif
14790 #ifdef GL_ARB_sparse_texture2
14791 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15))
14792 {
14793 ret = GLEW_ARB_sparse_texture2;
14794 continue;
14795 }
14796 #endif
14797 #ifdef GL_ARB_sparse_texture_clamp
14798 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture_clamp", 20))
14799 {
14800 ret = GLEW_ARB_sparse_texture_clamp;
14801 continue;
14802 }
14803 #endif
14804 #ifdef GL_ARB_stencil_texturing
14805 if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17))
14806 {
14807 ret = GLEW_ARB_stencil_texturing;
14808 continue;
14809 }
14810 #endif
14811 #ifdef GL_ARB_sync
14812 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4))
14813 {
14814 ret = GLEW_ARB_sync;
14815 continue;
14816 }
14817 #endif
14818 #ifdef GL_ARB_tessellation_shader
14819 if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19))
14820 {
14821 ret = GLEW_ARB_tessellation_shader;
14822 continue;
14823 }
14824 #endif
14825 #ifdef GL_ARB_texture_barrier
14826 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15))
14827 {
14828 ret = GLEW_ARB_texture_barrier;
14829 continue;
14830 }
14831 #endif
14832 #ifdef GL_ARB_texture_border_clamp
14833 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20))
14834 {
14835 ret = GLEW_ARB_texture_border_clamp;
14836 continue;
14837 }
14838 #endif
14839 #ifdef GL_ARB_texture_buffer_object
14840 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21))
14841 {
14842 ret = GLEW_ARB_texture_buffer_object;
14843 continue;
14844 }
14845 #endif
14846 #ifdef GL_ARB_texture_buffer_object_rgb32
14847 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object_rgb32", 27))
14848 {
14849 ret = GLEW_ARB_texture_buffer_object_rgb32;
14850 continue;
14851 }
14852 #endif
14853 #ifdef GL_ARB_texture_buffer_range
14854 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_range", 20))
14855 {
14856 ret = GLEW_ARB_texture_buffer_range;
14857 continue;
14858 }
14859 #endif
14860 #ifdef GL_ARB_texture_compression
14861 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19))
14862 {
14863 ret = GLEW_ARB_texture_compression;
14864 continue;
14865 }
14866 #endif
14867 #ifdef GL_ARB_texture_compression_bptc
14868 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24))
14869 {
14870 ret = GLEW_ARB_texture_compression_bptc;
14871 continue;
14872 }
14873 #endif
14874 #ifdef GL_ARB_texture_compression_rgtc
14875 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24))
14876 {
14877 ret = GLEW_ARB_texture_compression_rgtc;
14878 continue;
14879 }
14880 #endif
14881 #ifdef GL_ARB_texture_cube_map
14882 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16))
14883 {
14884 ret = GLEW_ARB_texture_cube_map;
14885 continue;
14886 }
14887 #endif
14888 #ifdef GL_ARB_texture_cube_map_array
14889 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22))
14890 {
14891 ret = GLEW_ARB_texture_cube_map_array;
14892 continue;
14893 }
14894 #endif
14895 #ifdef GL_ARB_texture_env_add
14896 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15))
14897 {
14898 ret = GLEW_ARB_texture_env_add;
14899 continue;
14900 }
14901 #endif
14902 #ifdef GL_ARB_texture_env_combine
14903 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19))
14904 {
14905 ret = GLEW_ARB_texture_env_combine;
14906 continue;
14907 }
14908 #endif
14909 #ifdef GL_ARB_texture_env_crossbar
14910 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20))
14911 {
14912 ret = GLEW_ARB_texture_env_crossbar;
14913 continue;
14914 }
14915 #endif
14916 #ifdef GL_ARB_texture_env_dot3
14917 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16))
14918 {
14919 ret = GLEW_ARB_texture_env_dot3;
14920 continue;
14921 }
14922 #endif
14923 #ifdef GL_ARB_texture_filter_minmax
14924 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21))
14925 {
14926 ret = GLEW_ARB_texture_filter_minmax;
14927 continue;
14928 }
14929 #endif
14930 #ifdef GL_ARB_texture_float
14931 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13))
14932 {
14933 ret = GLEW_ARB_texture_float;
14934 continue;
14935 }
14936 #endif
14937 #ifdef GL_ARB_texture_gather
14938 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather", 14))
14939 {
14940 ret = GLEW_ARB_texture_gather;
14941 continue;
14942 }
14943 #endif
14944 #ifdef GL_ARB_texture_mirror_clamp_to_edge
14945 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28))
14946 {
14947 ret = GLEW_ARB_texture_mirror_clamp_to_edge;
14948 continue;
14949 }
14950 #endif
14951 #ifdef GL_ARB_texture_mirrored_repeat
14952 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23))
14953 {
14954 ret = GLEW_ARB_texture_mirrored_repeat;
14955 continue;
14956 }
14957 #endif
14958 #ifdef GL_ARB_texture_multisample
14959 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19))
14960 {
14961 ret = GLEW_ARB_texture_multisample;
14962 continue;
14963 }
14964 #endif
14965 #ifdef GL_ARB_texture_non_power_of_two
14966 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24))
14967 {
14968 ret = GLEW_ARB_texture_non_power_of_two;
14969 continue;
14970 }
14971 #endif
14972 #ifdef GL_ARB_texture_query_levels
14973 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_levels", 20))
14974 {
14975 ret = GLEW_ARB_texture_query_levels;
14976 continue;
14977 }
14978 #endif
14979 #ifdef GL_ARB_texture_query_lod
14980 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17))
14981 {
14982 ret = GLEW_ARB_texture_query_lod;
14983 continue;
14984 }
14985 #endif
14986 #ifdef GL_ARB_texture_rectangle
14987 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17))
14988 {
14989 ret = GLEW_ARB_texture_rectangle;
14990 continue;
14991 }
14992 #endif
14993 #ifdef GL_ARB_texture_rg
14994 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10))
14995 {
14996 ret = GLEW_ARB_texture_rg;
14997 continue;
14998 }
14999 #endif
15000 #ifdef GL_ARB_texture_rgb10_a2ui
15001 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rgb10_a2ui", 18))
15002 {
15003 ret = GLEW_ARB_texture_rgb10_a2ui;
15004 continue;
15005 }
15006 #endif
15007 #ifdef GL_ARB_texture_stencil8
15008 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16))
15009 {
15010 ret = GLEW_ARB_texture_stencil8;
15011 continue;
15012 }
15013 #endif
15014 #ifdef GL_ARB_texture_storage
15015 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15))
15016 {
15017 ret = GLEW_ARB_texture_storage;
15018 continue;
15019 }
15020 #endif
15021 #ifdef GL_ARB_texture_storage_multisample
15022 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage_multisample", 27))
15023 {
15024 ret = GLEW_ARB_texture_storage_multisample;
15025 continue;
15026 }
15027 #endif
15028 #ifdef GL_ARB_texture_swizzle
15029 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15))
15030 {
15031 ret = GLEW_ARB_texture_swizzle;
15032 continue;
15033 }
15034 #endif
15035 #ifdef GL_ARB_texture_view
15036 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12))
15037 {
15038 ret = GLEW_ARB_texture_view;
15039 continue;
15040 }
15041 #endif
15042 #ifdef GL_ARB_timer_query
15043 if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11))
15044 {
15045 ret = GLEW_ARB_timer_query;
15046 continue;
15047 }
15048 #endif
15049 #ifdef GL_ARB_transform_feedback2
15050 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19))
15051 {
15052 ret = GLEW_ARB_transform_feedback2;
15053 continue;
15054 }
15055 #endif
15056 #ifdef GL_ARB_transform_feedback3
15057 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3", 19))
15058 {
15059 ret = GLEW_ARB_transform_feedback3;
15060 continue;
15061 }
15062 #endif
15063 #ifdef GL_ARB_transform_feedback_instanced
15064 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_instanced", 28))
15065 {
15066 ret = GLEW_ARB_transform_feedback_instanced;
15067 continue;
15068 }
15069 #endif
15070 #ifdef GL_ARB_transform_feedback_overflow_query
15071 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_overflow_query", 33))
15072 {
15073 ret = GLEW_ARB_transform_feedback_overflow_query;
15074 continue;
15075 }
15076 #endif
15077 #ifdef GL_ARB_transpose_matrix
15078 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16))
15079 {
15080 ret = GLEW_ARB_transpose_matrix;
15081 continue;
15082 }
15083 #endif
15084 #ifdef GL_ARB_uniform_buffer_object
15085 if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_object", 21))
15086 {
15087 ret = GLEW_ARB_uniform_buffer_object;
15088 continue;
15089 }
15090 #endif
15091 #ifdef GL_ARB_vertex_array_bgra
15092 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17))
15093 {
15094 ret = GLEW_ARB_vertex_array_bgra;
15095 continue;
15096 }
15097 #endif
15098 #ifdef GL_ARB_vertex_array_object
15099 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19))
15100 {
15101 ret = GLEW_ARB_vertex_array_object;
15102 continue;
15103 }
15104 #endif
15105 #ifdef GL_ARB_vertex_attrib_64bit
15106 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19))
15107 {
15108 ret = GLEW_ARB_vertex_attrib_64bit;
15109 continue;
15110 }
15111 #endif
15112 #ifdef GL_ARB_vertex_attrib_binding
15113 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_binding", 21))
15114 {
15115 ret = GLEW_ARB_vertex_attrib_binding;
15116 continue;
15117 }
15118 #endif
15119 #ifdef GL_ARB_vertex_blend
15120 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12))
15121 {
15122 ret = GLEW_ARB_vertex_blend;
15123 continue;
15124 }
15125 #endif
15126 #ifdef GL_ARB_vertex_buffer_object
15127 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20))
15128 {
15129 ret = GLEW_ARB_vertex_buffer_object;
15130 continue;
15131 }
15132 #endif
15133 #ifdef GL_ARB_vertex_program
15134 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14))
15135 {
15136 ret = GLEW_ARB_vertex_program;
15137 continue;
15138 }
15139 #endif
15140 #ifdef GL_ARB_vertex_shader
15141 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13))
15142 {
15143 ret = GLEW_ARB_vertex_shader;
15144 continue;
15145 }
15146 #endif
15147 #ifdef GL_ARB_vertex_type_10f_11f_11f_rev
15148 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10f_11f_11f_rev", 27))
15149 {
15150 ret = GLEW_ARB_vertex_type_10f_11f_11f_rev;
15151 continue;
15152 }
15153 #endif
15154 #ifdef GL_ARB_vertex_type_2_10_10_10_rev
15155 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26))
15156 {
15157 ret = GLEW_ARB_vertex_type_2_10_10_10_rev;
15158 continue;
15159 }
15160 #endif
15161 #ifdef GL_ARB_viewport_array
15162 if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14))
15163 {
15164 ret = GLEW_ARB_viewport_array;
15165 continue;
15166 }
15167 #endif
15168 #ifdef GL_ARB_window_pos
15169 if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10))
15170 {
15171 ret = GLEW_ARB_window_pos;
15172 continue;
15173 }
15174 #endif
15175 }
15176 if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5))
15177 {
15178 #ifdef GL_ATIX_point_sprites
15179 if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13))
15180 {
15181 ret = GLEW_ATIX_point_sprites;
15182 continue;
15183 }
15184 #endif
15185 #ifdef GL_ATIX_texture_env_combine3
15186 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20))
15187 {
15188 ret = GLEW_ATIX_texture_env_combine3;
15189 continue;
15190 }
15191 #endif
15192 #ifdef GL_ATIX_texture_env_route
15193 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17))
15194 {
15195 ret = GLEW_ATIX_texture_env_route;
15196 continue;
15197 }
15198 #endif
15199 #ifdef GL_ATIX_vertex_shader_output_point_size
15200 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31))
15201 {
15202 ret = GLEW_ATIX_vertex_shader_output_point_size;
15203 continue;
15204 }
15205 #endif
15206 }
15207 if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4))
15208 {
15209 #ifdef GL_ATI_draw_buffers
15210 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12))
15211 {
15212 ret = GLEW_ATI_draw_buffers;
15213 continue;
15214 }
15215 #endif
15216 #ifdef GL_ATI_element_array
15217 if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13))
15218 {
15219 ret = GLEW_ATI_element_array;
15220 continue;
15221 }
15222 #endif
15223 #ifdef GL_ATI_envmap_bumpmap
15224 if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14))
15225 {
15226 ret = GLEW_ATI_envmap_bumpmap;
15227 continue;
15228 }
15229 #endif
15230 #ifdef GL_ATI_fragment_shader
15231 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15))
15232 {
15233 ret = GLEW_ATI_fragment_shader;
15234 continue;
15235 }
15236 #endif
15237 #ifdef GL_ATI_map_object_buffer
15238 if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17))
15239 {
15240 ret = GLEW_ATI_map_object_buffer;
15241 continue;
15242 }
15243 #endif
15244 #ifdef GL_ATI_meminfo
15245 if (_glewStrSame3(&pos, &len, (const GLubyte*)"meminfo", 7))
15246 {
15247 ret = GLEW_ATI_meminfo;
15248 continue;
15249 }
15250 #endif
15251 #ifdef GL_ATI_pn_triangles
15252 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12))
15253 {
15254 ret = GLEW_ATI_pn_triangles;
15255 continue;
15256 }
15257 #endif
15258 #ifdef GL_ATI_separate_stencil
15259 if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16))
15260 {
15261 ret = GLEW_ATI_separate_stencil;
15262 continue;
15263 }
15264 #endif
15265 #ifdef GL_ATI_shader_texture_lod
15266 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18))
15267 {
15268 ret = GLEW_ATI_shader_texture_lod;
15269 continue;
15270 }
15271 #endif
15272 #ifdef GL_ATI_text_fragment_shader
15273 if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20))
15274 {
15275 ret = GLEW_ATI_text_fragment_shader;
15276 continue;
15277 }
15278 #endif
15279 #ifdef GL_ATI_texture_compression_3dc
15280 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23))
15281 {
15282 ret = GLEW_ATI_texture_compression_3dc;
15283 continue;
15284 }
15285 #endif
15286 #ifdef GL_ATI_texture_env_combine3
15287 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20))
15288 {
15289 ret = GLEW_ATI_texture_env_combine3;
15290 continue;
15291 }
15292 #endif
15293 #ifdef GL_ATI_texture_float
15294 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13))
15295 {
15296 ret = GLEW_ATI_texture_float;
15297 continue;
15298 }
15299 #endif
15300 #ifdef GL_ATI_texture_mirror_once
15301 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19))
15302 {
15303 ret = GLEW_ATI_texture_mirror_once;
15304 continue;
15305 }
15306 #endif
15307 #ifdef GL_ATI_vertex_array_object
15308 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19))
15309 {
15310 ret = GLEW_ATI_vertex_array_object;
15311 continue;
15312 }
15313 #endif
15314 #ifdef GL_ATI_vertex_attrib_array_object
15315 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26))
15316 {
15317 ret = GLEW_ATI_vertex_attrib_array_object;
15318 continue;
15319 }
15320 #endif
15321 #ifdef GL_ATI_vertex_streams
15322 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14))
15323 {
15324 ret = GLEW_ATI_vertex_streams;
15325 continue;
15326 }
15327 #endif
15328 }
15329 if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4))
15330 {
15331 #ifdef GL_EXT_422_pixels
15332 if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10))
15333 {
15334 ret = GLEW_EXT_422_pixels;
15335 continue;
15336 }
15337 #endif
15338 #ifdef GL_EXT_Cg_shader
15339 if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9))
15340 {
15341 ret = GLEW_EXT_Cg_shader;
15342 continue;
15343 }
15344 #endif
15345 #ifdef GL_EXT_abgr
15346 if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4))
15347 {
15348 ret = GLEW_EXT_abgr;
15349 continue;
15350 }
15351 #endif
15352 #ifdef GL_EXT_bgra
15353 if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4))
15354 {
15355 ret = GLEW_EXT_bgra;
15356 continue;
15357 }
15358 #endif
15359 #ifdef GL_EXT_bindable_uniform
15360 if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindable_uniform", 16))
15361 {
15362 ret = GLEW_EXT_bindable_uniform;
15363 continue;
15364 }
15365 #endif
15366 #ifdef GL_EXT_blend_color
15367 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11))
15368 {
15369 ret = GLEW_EXT_blend_color;
15370 continue;
15371 }
15372 #endif
15373 #ifdef GL_EXT_blend_equation_separate
15374 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23))
15375 {
15376 ret = GLEW_EXT_blend_equation_separate;
15377 continue;
15378 }
15379 #endif
15380 #ifdef GL_EXT_blend_func_separate
15381 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19))
15382 {
15383 ret = GLEW_EXT_blend_func_separate;
15384 continue;
15385 }
15386 #endif
15387 #ifdef GL_EXT_blend_logic_op
15388 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14))
15389 {
15390 ret = GLEW_EXT_blend_logic_op;
15391 continue;
15392 }
15393 #endif
15394 #ifdef GL_EXT_blend_minmax
15395 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12))
15396 {
15397 ret = GLEW_EXT_blend_minmax;
15398 continue;
15399 }
15400 #endif
15401 #ifdef GL_EXT_blend_subtract
15402 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14))
15403 {
15404 ret = GLEW_EXT_blend_subtract;
15405 continue;
15406 }
15407 #endif
15408 #ifdef GL_EXT_clip_volume_hint
15409 if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16))
15410 {
15411 ret = GLEW_EXT_clip_volume_hint;
15412 continue;
15413 }
15414 #endif
15415 #ifdef GL_EXT_cmyka
15416 if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5))
15417 {
15418 ret = GLEW_EXT_cmyka;
15419 continue;
15420 }
15421 #endif
15422 #ifdef GL_EXT_color_subtable
15423 if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14))
15424 {
15425 ret = GLEW_EXT_color_subtable;
15426 continue;
15427 }
15428 #endif
15429 #ifdef GL_EXT_compiled_vertex_array
15430 if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21))
15431 {
15432 ret = GLEW_EXT_compiled_vertex_array;
15433 continue;
15434 }
15435 #endif
15436 #ifdef GL_EXT_convolution
15437 if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11))
15438 {
15439 ret = GLEW_EXT_convolution;
15440 continue;
15441 }
15442 #endif
15443 #ifdef GL_EXT_coordinate_frame
15444 if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16))
15445 {
15446 ret = GLEW_EXT_coordinate_frame;
15447 continue;
15448 }
15449 #endif
15450 #ifdef GL_EXT_copy_texture
15451 if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12))
15452 {
15453 ret = GLEW_EXT_copy_texture;
15454 continue;
15455 }
15456 #endif
15457 #ifdef GL_EXT_cull_vertex
15458 if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11))
15459 {
15460 ret = GLEW_EXT_cull_vertex;
15461 continue;
15462 }
15463 #endif
15464 #ifdef GL_EXT_debug_label
15465 if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_label", 11))
15466 {
15467 ret = GLEW_EXT_debug_label;
15468 continue;
15469 }
15470 #endif
15471 #ifdef GL_EXT_debug_marker
15472 if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_marker", 12))
15473 {
15474 ret = GLEW_EXT_debug_marker;
15475 continue;
15476 }
15477 #endif
15478 #ifdef GL_EXT_depth_bounds_test
15479 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17))
15480 {
15481 ret = GLEW_EXT_depth_bounds_test;
15482 continue;
15483 }
15484 #endif
15485 #ifdef GL_EXT_direct_state_access
15486 if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19))
15487 {
15488 ret = GLEW_EXT_direct_state_access;
15489 continue;
15490 }
15491 #endif
15492 #ifdef GL_EXT_draw_buffers2
15493 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers2", 13))
15494 {
15495 ret = GLEW_EXT_draw_buffers2;
15496 continue;
15497 }
15498 #endif
15499 #ifdef GL_EXT_draw_instanced
15500 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14))
15501 {
15502 ret = GLEW_EXT_draw_instanced;
15503 continue;
15504 }
15505 #endif
15506 #ifdef GL_EXT_draw_range_elements
15507 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19))
15508 {
15509 ret = GLEW_EXT_draw_range_elements;
15510 continue;
15511 }
15512 #endif
15513 #ifdef GL_EXT_fog_coord
15514 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9))
15515 {
15516 ret = GLEW_EXT_fog_coord;
15517 continue;
15518 }
15519 #endif
15520 #ifdef GL_EXT_fragment_lighting
15521 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17))
15522 {
15523 ret = GLEW_EXT_fragment_lighting;
15524 continue;
15525 }
15526 #endif
15527 #ifdef GL_EXT_framebuffer_blit
15528 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16))
15529 {
15530 ret = GLEW_EXT_framebuffer_blit;
15531 continue;
15532 }
15533 #endif
15534 #ifdef GL_EXT_framebuffer_multisample
15535 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23))
15536 {
15537 ret = GLEW_EXT_framebuffer_multisample;
15538 continue;
15539 }
15540 #endif
15541 #ifdef GL_EXT_framebuffer_multisample_blit_scaled
15542 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_blit_scaled", 35))
15543 {
15544 ret = GLEW_EXT_framebuffer_multisample_blit_scaled;
15545 continue;
15546 }
15547 #endif
15548 #ifdef GL_EXT_framebuffer_object
15549 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18))
15550 {
15551 ret = GLEW_EXT_framebuffer_object;
15552 continue;
15553 }
15554 #endif
15555 #ifdef GL_EXT_framebuffer_sRGB
15556 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16))
15557 {
15558 ret = GLEW_EXT_framebuffer_sRGB;
15559 continue;
15560 }
15561 #endif
15562 #ifdef GL_EXT_geometry_shader4
15563 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16))
15564 {
15565 ret = GLEW_EXT_geometry_shader4;
15566 continue;
15567 }
15568 #endif
15569 #ifdef GL_EXT_gpu_program_parameters
15570 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_parameters", 22))
15571 {
15572 ret = GLEW_EXT_gpu_program_parameters;
15573 continue;
15574 }
15575 #endif
15576 #ifdef GL_EXT_gpu_shader4
15577 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader4", 11))
15578 {
15579 ret = GLEW_EXT_gpu_shader4;
15580 continue;
15581 }
15582 #endif
15583 #ifdef GL_EXT_histogram
15584 if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9))
15585 {
15586 ret = GLEW_EXT_histogram;
15587 continue;
15588 }
15589 #endif
15590 #ifdef GL_EXT_index_array_formats
15591 if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19))
15592 {
15593 ret = GLEW_EXT_index_array_formats;
15594 continue;
15595 }
15596 #endif
15597 #ifdef GL_EXT_index_func
15598 if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10))
15599 {
15600 ret = GLEW_EXT_index_func;
15601 continue;
15602 }
15603 #endif
15604 #ifdef GL_EXT_index_material
15605 if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14))
15606 {
15607 ret = GLEW_EXT_index_material;
15608 continue;
15609 }
15610 #endif
15611 #ifdef GL_EXT_index_texture
15612 if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13))
15613 {
15614 ret = GLEW_EXT_index_texture;
15615 continue;
15616 }
15617 #endif
15618 #ifdef GL_EXT_light_texture
15619 if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13))
15620 {
15621 ret = GLEW_EXT_light_texture;
15622 continue;
15623 }
15624 #endif
15625 #ifdef GL_EXT_misc_attribute
15626 if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14))
15627 {
15628 ret = GLEW_EXT_misc_attribute;
15629 continue;
15630 }
15631 #endif
15632 #ifdef GL_EXT_multi_draw_arrays
15633 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17))
15634 {
15635 ret = GLEW_EXT_multi_draw_arrays;
15636 continue;
15637 }
15638 #endif
15639 #ifdef GL_EXT_multisample
15640 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11))
15641 {
15642 ret = GLEW_EXT_multisample;
15643 continue;
15644 }
15645 #endif
15646 #ifdef GL_EXT_packed_depth_stencil
15647 if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20))
15648 {
15649 ret = GLEW_EXT_packed_depth_stencil;
15650 continue;
15651 }
15652 #endif
15653 #ifdef GL_EXT_packed_float
15654 if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12))
15655 {
15656 ret = GLEW_EXT_packed_float;
15657 continue;
15658 }
15659 #endif
15660 #ifdef GL_EXT_packed_pixels
15661 if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13))
15662 {
15663 ret = GLEW_EXT_packed_pixels;
15664 continue;
15665 }
15666 #endif
15667 #ifdef GL_EXT_paletted_texture
15668 if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16))
15669 {
15670 ret = GLEW_EXT_paletted_texture;
15671 continue;
15672 }
15673 #endif
15674 #ifdef GL_EXT_pixel_buffer_object
15675 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19))
15676 {
15677 ret = GLEW_EXT_pixel_buffer_object;
15678 continue;
15679 }
15680 #endif
15681 #ifdef GL_EXT_pixel_transform
15682 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15))
15683 {
15684 ret = GLEW_EXT_pixel_transform;
15685 continue;
15686 }
15687 #endif
15688 #ifdef GL_EXT_pixel_transform_color_table
15689 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27))
15690 {
15691 ret = GLEW_EXT_pixel_transform_color_table;
15692 continue;
15693 }
15694 #endif
15695 #ifdef GL_EXT_point_parameters
15696 if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16))
15697 {
15698 ret = GLEW_EXT_point_parameters;
15699 continue;
15700 }
15701 #endif
15702 #ifdef GL_EXT_polygon_offset
15703 if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14))
15704 {
15705 ret = GLEW_EXT_polygon_offset;
15706 continue;
15707 }
15708 #endif
15709 #ifdef GL_EXT_polygon_offset_clamp
15710 if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20))
15711 {
15712 ret = GLEW_EXT_polygon_offset_clamp;
15713 continue;
15714 }
15715 #endif
15716 #ifdef GL_EXT_post_depth_coverage
15717 if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19))
15718 {
15719 ret = GLEW_EXT_post_depth_coverage;
15720 continue;
15721 }
15722 #endif
15723 #ifdef GL_EXT_provoking_vertex
15724 if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16))
15725 {
15726 ret = GLEW_EXT_provoking_vertex;
15727 continue;
15728 }
15729 #endif
15730 #ifdef GL_EXT_raster_multisample
15731 if (_glewStrSame3(&pos, &len, (const GLubyte*)"raster_multisample", 18))
15732 {
15733 ret = GLEW_EXT_raster_multisample;
15734 continue;
15735 }
15736 #endif
15737 #ifdef GL_EXT_rescale_normal
15738 if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14))
15739 {
15740 ret = GLEW_EXT_rescale_normal;
15741 continue;
15742 }
15743 #endif
15744 #ifdef GL_EXT_scene_marker
15745 if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12))
15746 {
15747 ret = GLEW_EXT_scene_marker;
15748 continue;
15749 }
15750 #endif
15751 #ifdef GL_EXT_secondary_color
15752 if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15))
15753 {
15754 ret = GLEW_EXT_secondary_color;
15755 continue;
15756 }
15757 #endif
15758 #ifdef GL_EXT_separate_shader_objects
15759 if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23))
15760 {
15761 ret = GLEW_EXT_separate_shader_objects;
15762 continue;
15763 }
15764 #endif
15765 #ifdef GL_EXT_separate_specular_color
15766 if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23))
15767 {
15768 ret = GLEW_EXT_separate_specular_color;
15769 continue;
15770 }
15771 #endif
15772 #ifdef GL_EXT_shader_image_load_formatted
15773 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_formatted", 27))
15774 {
15775 ret = GLEW_EXT_shader_image_load_formatted;
15776 continue;
15777 }
15778 #endif
15779 #ifdef GL_EXT_shader_image_load_store
15780 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23))
15781 {
15782 ret = GLEW_EXT_shader_image_load_store;
15783 continue;
15784 }
15785 #endif
15786 #ifdef GL_EXT_shader_integer_mix
15787 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_mix", 18))
15788 {
15789 ret = GLEW_EXT_shader_integer_mix;
15790 continue;
15791 }
15792 #endif
15793 #ifdef GL_EXT_shadow_funcs
15794 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12))
15795 {
15796 ret = GLEW_EXT_shadow_funcs;
15797 continue;
15798 }
15799 #endif
15800 #ifdef GL_EXT_shared_texture_palette
15801 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22))
15802 {
15803 ret = GLEW_EXT_shared_texture_palette;
15804 continue;
15805 }
15806 #endif
15807 #ifdef GL_EXT_sparse_texture2
15808 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15))
15809 {
15810 ret = GLEW_EXT_sparse_texture2;
15811 continue;
15812 }
15813 #endif
15814 #ifdef GL_EXT_stencil_clear_tag
15815 if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17))
15816 {
15817 ret = GLEW_EXT_stencil_clear_tag;
15818 continue;
15819 }
15820 #endif
15821 #ifdef GL_EXT_stencil_two_side
15822 if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16))
15823 {
15824 ret = GLEW_EXT_stencil_two_side;
15825 continue;
15826 }
15827 #endif
15828 #ifdef GL_EXT_stencil_wrap
15829 if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12))
15830 {
15831 ret = GLEW_EXT_stencil_wrap;
15832 continue;
15833 }
15834 #endif
15835 #ifdef GL_EXT_subtexture
15836 if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10))
15837 {
15838 ret = GLEW_EXT_subtexture;
15839 continue;
15840 }
15841 #endif
15842 #ifdef GL_EXT_texture
15843 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7))
15844 {
15845 ret = GLEW_EXT_texture;
15846 continue;
15847 }
15848 #endif
15849 #ifdef GL_EXT_texture3D
15850 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9))
15851 {
15852 ret = GLEW_EXT_texture3D;
15853 continue;
15854 }
15855 #endif
15856 #ifdef GL_EXT_texture_array
15857 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13))
15858 {
15859 ret = GLEW_EXT_texture_array;
15860 continue;
15861 }
15862 #endif
15863 #ifdef GL_EXT_texture_buffer_object
15864 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21))
15865 {
15866 ret = GLEW_EXT_texture_buffer_object;
15867 continue;
15868 }
15869 #endif
15870 #ifdef GL_EXT_texture_compression_dxt1
15871 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24))
15872 {
15873 ret = GLEW_EXT_texture_compression_dxt1;
15874 continue;
15875 }
15876 #endif
15877 #ifdef GL_EXT_texture_compression_latc
15878 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24))
15879 {
15880 ret = GLEW_EXT_texture_compression_latc;
15881 continue;
15882 }
15883 #endif
15884 #ifdef GL_EXT_texture_compression_rgtc
15885 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24))
15886 {
15887 ret = GLEW_EXT_texture_compression_rgtc;
15888 continue;
15889 }
15890 #endif
15891 #ifdef GL_EXT_texture_compression_s3tc
15892 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24))
15893 {
15894 ret = GLEW_EXT_texture_compression_s3tc;
15895 continue;
15896 }
15897 #endif
15898 #ifdef GL_EXT_texture_cube_map
15899 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16))
15900 {
15901 ret = GLEW_EXT_texture_cube_map;
15902 continue;
15903 }
15904 #endif
15905 #ifdef GL_EXT_texture_edge_clamp
15906 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18))
15907 {
15908 ret = GLEW_EXT_texture_edge_clamp;
15909 continue;
15910 }
15911 #endif
15912 #ifdef GL_EXT_texture_env
15913 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11))
15914 {
15915 ret = GLEW_EXT_texture_env;
15916 continue;
15917 }
15918 #endif
15919 #ifdef GL_EXT_texture_env_add
15920 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15))
15921 {
15922 ret = GLEW_EXT_texture_env_add;
15923 continue;
15924 }
15925 #endif
15926 #ifdef GL_EXT_texture_env_combine
15927 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19))
15928 {
15929 ret = GLEW_EXT_texture_env_combine;
15930 continue;
15931 }
15932 #endif
15933 #ifdef GL_EXT_texture_env_dot3
15934 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16))
15935 {
15936 ret = GLEW_EXT_texture_env_dot3;
15937 continue;
15938 }
15939 #endif
15940 #ifdef GL_EXT_texture_filter_anisotropic
15941 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26))
15942 {
15943 ret = GLEW_EXT_texture_filter_anisotropic;
15944 continue;
15945 }
15946 #endif
15947 #ifdef GL_EXT_texture_filter_minmax
15948 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21))
15949 {
15950 ret = GLEW_EXT_texture_filter_minmax;
15951 continue;
15952 }
15953 #endif
15954 #ifdef GL_EXT_texture_integer
15955 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_integer", 15))
15956 {
15957 ret = GLEW_EXT_texture_integer;
15958 continue;
15959 }
15960 #endif
15961 #ifdef GL_EXT_texture_lod_bias
15962 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16))
15963 {
15964 ret = GLEW_EXT_texture_lod_bias;
15965 continue;
15966 }
15967 #endif
15968 #ifdef GL_EXT_texture_mirror_clamp
15969 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20))
15970 {
15971 ret = GLEW_EXT_texture_mirror_clamp;
15972 continue;
15973 }
15974 #endif
15975 #ifdef GL_EXT_texture_object
15976 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14))
15977 {
15978 ret = GLEW_EXT_texture_object;
15979 continue;
15980 }
15981 #endif
15982 #ifdef GL_EXT_texture_perturb_normal
15983 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22))
15984 {
15985 ret = GLEW_EXT_texture_perturb_normal;
15986 continue;
15987 }
15988 #endif
15989 #ifdef GL_EXT_texture_rectangle
15990 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17))
15991 {
15992 ret = GLEW_EXT_texture_rectangle;
15993 continue;
15994 }
15995 #endif
15996 #ifdef GL_EXT_texture_sRGB
15997 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12))
15998 {
15999 ret = GLEW_EXT_texture_sRGB;
16000 continue;
16001 }
16002 #endif
16003 #ifdef GL_EXT_texture_sRGB_decode
16004 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_decode", 19))
16005 {
16006 ret = GLEW_EXT_texture_sRGB_decode;
16007 continue;
16008 }
16009 #endif
16010 #ifdef GL_EXT_texture_shared_exponent
16011 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23))
16012 {
16013 ret = GLEW_EXT_texture_shared_exponent;
16014 continue;
16015 }
16016 #endif
16017 #ifdef GL_EXT_texture_snorm
16018 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_snorm", 13))
16019 {
16020 ret = GLEW_EXT_texture_snorm;
16021 continue;
16022 }
16023 #endif
16024 #ifdef GL_EXT_texture_swizzle
16025 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15))
16026 {
16027 ret = GLEW_EXT_texture_swizzle;
16028 continue;
16029 }
16030 #endif
16031 #ifdef GL_EXT_timer_query
16032 if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11))
16033 {
16034 ret = GLEW_EXT_timer_query;
16035 continue;
16036 }
16037 #endif
16038 #ifdef GL_EXT_transform_feedback
16039 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18))
16040 {
16041 ret = GLEW_EXT_transform_feedback;
16042 continue;
16043 }
16044 #endif
16045 #ifdef GL_EXT_vertex_array
16046 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12))
16047 {
16048 ret = GLEW_EXT_vertex_array;
16049 continue;
16050 }
16051 #endif
16052 #ifdef GL_EXT_vertex_array_bgra
16053 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17))
16054 {
16055 ret = GLEW_EXT_vertex_array_bgra;
16056 continue;
16057 }
16058 #endif
16059 #ifdef GL_EXT_vertex_attrib_64bit
16060 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19))
16061 {
16062 ret = GLEW_EXT_vertex_attrib_64bit;
16063 continue;
16064 }
16065 #endif
16066 #ifdef GL_EXT_vertex_shader
16067 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13))
16068 {
16069 ret = GLEW_EXT_vertex_shader;
16070 continue;
16071 }
16072 #endif
16073 #ifdef GL_EXT_vertex_weighting
16074 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16))
16075 {
16076 ret = GLEW_EXT_vertex_weighting;
16077 continue;
16078 }
16079 #endif
16080 #ifdef GL_EXT_x11_sync_object
16081 if (_glewStrSame3(&pos, &len, (const GLubyte*)"x11_sync_object", 15))
16082 {
16083 ret = GLEW_EXT_x11_sync_object;
16084 continue;
16085 }
16086 #endif
16087 }
16088 if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8))
16089 {
16090 #ifdef GL_GREMEDY_frame_terminator
16091 if (_glewStrSame3(&pos, &len, (const GLubyte*)"frame_terminator", 16))
16092 {
16093 ret = GLEW_GREMEDY_frame_terminator;
16094 continue;
16095 }
16096 #endif
16097 #ifdef GL_GREMEDY_string_marker
16098 if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13))
16099 {
16100 ret = GLEW_GREMEDY_string_marker;
16101 continue;
16102 }
16103 #endif
16104 }
16105 if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3))
16106 {
16107 #ifdef GL_HP_convolution_border_modes
16108 if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24))
16109 {
16110 ret = GLEW_HP_convolution_border_modes;
16111 continue;
16112 }
16113 #endif
16114 #ifdef GL_HP_image_transform
16115 if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15))
16116 {
16117 ret = GLEW_HP_image_transform;
16118 continue;
16119 }
16120 #endif
16121 #ifdef GL_HP_occlusion_test
16122 if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14))
16123 {
16124 ret = GLEW_HP_occlusion_test;
16125 continue;
16126 }
16127 #endif
16128 #ifdef GL_HP_texture_lighting
16129 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16))
16130 {
16131 ret = GLEW_HP_texture_lighting;
16132 continue;
16133 }
16134 #endif
16135 }
16136 if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4))
16137 {
16138 #ifdef GL_IBM_cull_vertex
16139 if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11))
16140 {
16141 ret = GLEW_IBM_cull_vertex;
16142 continue;
16143 }
16144 #endif
16145 #ifdef GL_IBM_multimode_draw_arrays
16146 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21))
16147 {
16148 ret = GLEW_IBM_multimode_draw_arrays;
16149 continue;
16150 }
16151 #endif
16152 #ifdef GL_IBM_rasterpos_clip
16153 if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14))
16154 {
16155 ret = GLEW_IBM_rasterpos_clip;
16156 continue;
16157 }
16158 #endif
16159 #ifdef GL_IBM_static_data
16160 if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11))
16161 {
16162 ret = GLEW_IBM_static_data;
16163 continue;
16164 }
16165 #endif
16166 #ifdef GL_IBM_texture_mirrored_repeat
16167 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23))
16168 {
16169 ret = GLEW_IBM_texture_mirrored_repeat;
16170 continue;
16171 }
16172 #endif
16173 #ifdef GL_IBM_vertex_array_lists
16174 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18))
16175 {
16176 ret = GLEW_IBM_vertex_array_lists;
16177 continue;
16178 }
16179 #endif
16180 }
16181 if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5))
16182 {
16183 #ifdef GL_INGR_color_clamp
16184 if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11))
16185 {
16186 ret = GLEW_INGR_color_clamp;
16187 continue;
16188 }
16189 #endif
16190 #ifdef GL_INGR_interlace_read
16191 if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14))
16192 {
16193 ret = GLEW_INGR_interlace_read;
16194 continue;
16195 }
16196 #endif
16197 }
16198 if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6))
16199 {
16200 #ifdef GL_INTEL_fragment_shader_ordering
16201 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_ordering", 24))
16202 {
16203 ret = GLEW_INTEL_fragment_shader_ordering;
16204 continue;
16205 }
16206 #endif
16207 #ifdef GL_INTEL_framebuffer_CMAA
16208 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_CMAA", 16))
16209 {
16210 ret = GLEW_INTEL_framebuffer_CMAA;
16211 continue;
16212 }
16213 #endif
16214 #ifdef GL_INTEL_map_texture
16215 if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_texture", 11))
16216 {
16217 ret = GLEW_INTEL_map_texture;
16218 continue;
16219 }
16220 #endif
16221 #ifdef GL_INTEL_parallel_arrays
16222 if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15))
16223 {
16224 ret = GLEW_INTEL_parallel_arrays;
16225 continue;
16226 }
16227 #endif
16228 #ifdef GL_INTEL_performance_query
16229 if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_query", 17))
16230 {
16231 ret = GLEW_INTEL_performance_query;
16232 continue;
16233 }
16234 #endif
16235 #ifdef GL_INTEL_texture_scissor
16236 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15))
16237 {
16238 ret = GLEW_INTEL_texture_scissor;
16239 continue;
16240 }
16241 #endif
16242 }
16243 if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4))
16244 {
16245 #ifdef GL_KHR_blend_equation_advanced
16246 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23))
16247 {
16248 ret = GLEW_KHR_blend_equation_advanced;
16249 continue;
16250 }
16251 #endif
16252 #ifdef GL_KHR_blend_equation_advanced_coherent
16253 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32))
16254 {
16255 ret = GLEW_KHR_blend_equation_advanced_coherent;
16256 continue;
16257 }
16258 #endif
16259 #ifdef GL_KHR_context_flush_control
16260 if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21))
16261 {
16262 ret = GLEW_KHR_context_flush_control;
16263 continue;
16264 }
16265 #endif
16266 #ifdef GL_KHR_debug
16267 if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5))
16268 {
16269 ret = GLEW_KHR_debug;
16270 continue;
16271 }
16272 #endif
16273 #ifdef GL_KHR_no_error
16274 if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_error", 8))
16275 {
16276 ret = GLEW_KHR_no_error;
16277 continue;
16278 }
16279 #endif
16280 #ifdef GL_KHR_robust_buffer_access_behavior
16281 if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29))
16282 {
16283 ret = GLEW_KHR_robust_buffer_access_behavior;
16284 continue;
16285 }
16286 #endif
16287 #ifdef GL_KHR_robustness
16288 if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10))
16289 {
16290 ret = GLEW_KHR_robustness;
16291 continue;
16292 }
16293 #endif
16294 #ifdef GL_KHR_texture_compression_astc_hdr
16295 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_hdr", 28))
16296 {
16297 ret = GLEW_KHR_texture_compression_astc_hdr;
16298 continue;
16299 }
16300 #endif
16301 #ifdef GL_KHR_texture_compression_astc_ldr
16302 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_ldr", 28))
16303 {
16304 ret = GLEW_KHR_texture_compression_astc_ldr;
16305 continue;
16306 }
16307 #endif
16308 }
16309 if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4))
16310 {
16311 #ifdef GL_KTX_buffer_region
16312 if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13))
16313 {
16314 ret = GLEW_KTX_buffer_region;
16315 continue;
16316 }
16317 #endif
16318 }
16319 if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6))
16320 {
16321 #ifdef GL_MESAX_texture_stack
16322 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13))
16323 {
16324 ret = GLEW_MESAX_texture_stack;
16325 continue;
16326 }
16327 #endif
16328 }
16329 if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5))
16330 {
16331 #ifdef GL_MESA_pack_invert
16332 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11))
16333 {
16334 ret = GLEW_MESA_pack_invert;
16335 continue;
16336 }
16337 #endif
16338 #ifdef GL_MESA_resize_buffers
16339 if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14))
16340 {
16341 ret = GLEW_MESA_resize_buffers;
16342 continue;
16343 }
16344 #endif
16345 #ifdef GL_MESA_window_pos
16346 if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10))
16347 {
16348 ret = GLEW_MESA_window_pos;
16349 continue;
16350 }
16351 #endif
16352 #ifdef GL_MESA_ycbcr_texture
16353 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13))
16354 {
16355 ret = GLEW_MESA_ycbcr_texture;
16356 continue;
16357 }
16358 #endif
16359 }
16360 if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4))
16361 {
16362 #ifdef GL_NVX_conditional_render
16363 if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18))
16364 {
16365 ret = GLEW_NVX_conditional_render;
16366 continue;
16367 }
16368 #endif
16369 #ifdef GL_NVX_gpu_memory_info
16370 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15))
16371 {
16372 ret = GLEW_NVX_gpu_memory_info;
16373 continue;
16374 }
16375 #endif
16376 }
16377 if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3))
16378 {
16379 #ifdef GL_NV_bindless_multi_draw_indirect
16380 if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect", 28))
16381 {
16382 ret = GLEW_NV_bindless_multi_draw_indirect;
16383 continue;
16384 }
16385 #endif
16386 #ifdef GL_NV_bindless_multi_draw_indirect_count
16387 if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect_count", 34))
16388 {
16389 ret = GLEW_NV_bindless_multi_draw_indirect_count;
16390 continue;
16391 }
16392 #endif
16393 #ifdef GL_NV_bindless_texture
16394 if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16))
16395 {
16396 ret = GLEW_NV_bindless_texture;
16397 continue;
16398 }
16399 #endif
16400 #ifdef GL_NV_blend_equation_advanced
16401 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23))
16402 {
16403 ret = GLEW_NV_blend_equation_advanced;
16404 continue;
16405 }
16406 #endif
16407 #ifdef GL_NV_blend_equation_advanced_coherent
16408 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32))
16409 {
16410 ret = GLEW_NV_blend_equation_advanced_coherent;
16411 continue;
16412 }
16413 #endif
16414 #ifdef GL_NV_blend_square
16415 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12))
16416 {
16417 ret = GLEW_NV_blend_square;
16418 continue;
16419 }
16420 #endif
16421 #ifdef GL_NV_compute_program5
16422 if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_program5", 16))
16423 {
16424 ret = GLEW_NV_compute_program5;
16425 continue;
16426 }
16427 #endif
16428 #ifdef GL_NV_conditional_render
16429 if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18))
16430 {
16431 ret = GLEW_NV_conditional_render;
16432 continue;
16433 }
16434 #endif
16435 #ifdef GL_NV_conservative_raster
16436 if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster", 19))
16437 {
16438 ret = GLEW_NV_conservative_raster;
16439 continue;
16440 }
16441 #endif
16442 #ifdef GL_NV_conservative_raster_dilate
16443 if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_dilate", 26))
16444 {
16445 ret = GLEW_NV_conservative_raster_dilate;
16446 continue;
16447 }
16448 #endif
16449 #ifdef GL_NV_copy_depth_to_color
16450 if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19))
16451 {
16452 ret = GLEW_NV_copy_depth_to_color;
16453 continue;
16454 }
16455 #endif
16456 #ifdef GL_NV_copy_image
16457 if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10))
16458 {
16459 ret = GLEW_NV_copy_image;
16460 continue;
16461 }
16462 #endif
16463 #ifdef GL_NV_deep_texture3D
16464 if (_glewStrSame3(&pos, &len, (const GLubyte*)"deep_texture3D", 14))
16465 {
16466 ret = GLEW_NV_deep_texture3D;
16467 continue;
16468 }
16469 #endif
16470 #ifdef GL_NV_depth_buffer_float
16471 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18))
16472 {
16473 ret = GLEW_NV_depth_buffer_float;
16474 continue;
16475 }
16476 #endif
16477 #ifdef GL_NV_depth_clamp
16478 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11))
16479 {
16480 ret = GLEW_NV_depth_clamp;
16481 continue;
16482 }
16483 #endif
16484 #ifdef GL_NV_depth_range_unclamped
16485 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_range_unclamped", 21))
16486 {
16487 ret = GLEW_NV_depth_range_unclamped;
16488 continue;
16489 }
16490 #endif
16491 #ifdef GL_NV_draw_texture
16492 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12))
16493 {
16494 ret = GLEW_NV_draw_texture;
16495 continue;
16496 }
16497 #endif
16498 #ifdef GL_NV_evaluators
16499 if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10))
16500 {
16501 ret = GLEW_NV_evaluators;
16502 continue;
16503 }
16504 #endif
16505 #ifdef GL_NV_explicit_multisample
16506 if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_multisample", 20))
16507 {
16508 ret = GLEW_NV_explicit_multisample;
16509 continue;
16510 }
16511 #endif
16512 #ifdef GL_NV_fence
16513 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5))
16514 {
16515 ret = GLEW_NV_fence;
16516 continue;
16517 }
16518 #endif
16519 #ifdef GL_NV_fill_rectangle
16520 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fill_rectangle", 14))
16521 {
16522 ret = GLEW_NV_fill_rectangle;
16523 continue;
16524 }
16525 #endif
16526 #ifdef GL_NV_float_buffer
16527 if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12))
16528 {
16529 ret = GLEW_NV_float_buffer;
16530 continue;
16531 }
16532 #endif
16533 #ifdef GL_NV_fog_distance
16534 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12))
16535 {
16536 ret = GLEW_NV_fog_distance;
16537 continue;
16538 }
16539 #endif
16540 #ifdef GL_NV_fragment_coverage_to_color
16541 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coverage_to_color", 26))
16542 {
16543 ret = GLEW_NV_fragment_coverage_to_color;
16544 continue;
16545 }
16546 #endif
16547 #ifdef GL_NV_fragment_program
16548 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16))
16549 {
16550 ret = GLEW_NV_fragment_program;
16551 continue;
16552 }
16553 #endif
16554 #ifdef GL_NV_fragment_program2
16555 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17))
16556 {
16557 ret = GLEW_NV_fragment_program2;
16558 continue;
16559 }
16560 #endif
16561 #ifdef GL_NV_fragment_program4
16562 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program4", 17))
16563 {
16564 ret = GLEW_NV_fragment_program4;
16565 continue;
16566 }
16567 #endif
16568 #ifdef GL_NV_fragment_program_option
16569 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23))
16570 {
16571 ret = GLEW_NV_fragment_program_option;
16572 continue;
16573 }
16574 #endif
16575 #ifdef GL_NV_fragment_shader_interlock
16576 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25))
16577 {
16578 ret = GLEW_NV_fragment_shader_interlock;
16579 continue;
16580 }
16581 #endif
16582 #ifdef GL_NV_framebuffer_mixed_samples
16583 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_mixed_samples", 25))
16584 {
16585 ret = GLEW_NV_framebuffer_mixed_samples;
16586 continue;
16587 }
16588 #endif
16589 #ifdef GL_NV_framebuffer_multisample_coverage
16590 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_coverage", 32))
16591 {
16592 ret = GLEW_NV_framebuffer_multisample_coverage;
16593 continue;
16594 }
16595 #endif
16596 #ifdef GL_NV_geometry_program4
16597 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_program4", 17))
16598 {
16599 ret = GLEW_NV_geometry_program4;
16600 continue;
16601 }
16602 #endif
16603 #ifdef GL_NV_geometry_shader4
16604 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16))
16605 {
16606 ret = GLEW_NV_geometry_shader4;
16607 continue;
16608 }
16609 #endif
16610 #ifdef GL_NV_geometry_shader_passthrough
16611 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader_passthrough", 27))
16612 {
16613 ret = GLEW_NV_geometry_shader_passthrough;
16614 continue;
16615 }
16616 #endif
16617 #ifdef GL_NV_gpu_program4
16618 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program4", 12))
16619 {
16620 ret = GLEW_NV_gpu_program4;
16621 continue;
16622 }
16623 #endif
16624 #ifdef GL_NV_gpu_program5
16625 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5", 12))
16626 {
16627 ret = GLEW_NV_gpu_program5;
16628 continue;
16629 }
16630 #endif
16631 #ifdef GL_NV_gpu_program5_mem_extended
16632 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5_mem_extended", 25))
16633 {
16634 ret = GLEW_NV_gpu_program5_mem_extended;
16635 continue;
16636 }
16637 #endif
16638 #ifdef GL_NV_gpu_program_fp64
16639 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16))
16640 {
16641 ret = GLEW_NV_gpu_program_fp64;
16642 continue;
16643 }
16644 #endif
16645 #ifdef GL_NV_gpu_shader5
16646 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11))
16647 {
16648 ret = GLEW_NV_gpu_shader5;
16649 continue;
16650 }
16651 #endif
16652 #ifdef GL_NV_half_float
16653 if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10))
16654 {
16655 ret = GLEW_NV_half_float;
16656 continue;
16657 }
16658 #endif
16659 #ifdef GL_NV_internalformat_sample_query
16660 if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_sample_query", 27))
16661 {
16662 ret = GLEW_NV_internalformat_sample_query;
16663 continue;
16664 }
16665 #endif
16666 #ifdef GL_NV_light_max_exponent
16667 if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18))
16668 {
16669 ret = GLEW_NV_light_max_exponent;
16670 continue;
16671 }
16672 #endif
16673 #ifdef GL_NV_multisample_coverage
16674 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20))
16675 {
16676 ret = GLEW_NV_multisample_coverage;
16677 continue;
16678 }
16679 #endif
16680 #ifdef GL_NV_multisample_filter_hint
16681 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23))
16682 {
16683 ret = GLEW_NV_multisample_filter_hint;
16684 continue;
16685 }
16686 #endif
16687 #ifdef GL_NV_occlusion_query
16688 if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15))
16689 {
16690 ret = GLEW_NV_occlusion_query;
16691 continue;
16692 }
16693 #endif
16694 #ifdef GL_NV_packed_depth_stencil
16695 if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20))
16696 {
16697 ret = GLEW_NV_packed_depth_stencil;
16698 continue;
16699 }
16700 #endif
16701 #ifdef GL_NV_parameter_buffer_object
16702 if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object", 23))
16703 {
16704 ret = GLEW_NV_parameter_buffer_object;
16705 continue;
16706 }
16707 #endif
16708 #ifdef GL_NV_parameter_buffer_object2
16709 if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object2", 24))
16710 {
16711 ret = GLEW_NV_parameter_buffer_object2;
16712 continue;
16713 }
16714 #endif
16715 #ifdef GL_NV_path_rendering
16716 if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering", 14))
16717 {
16718 ret = GLEW_NV_path_rendering;
16719 continue;
16720 }
16721 #endif
16722 #ifdef GL_NV_path_rendering_shared_edge
16723 if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering_shared_edge", 26))
16724 {
16725 ret = GLEW_NV_path_rendering_shared_edge;
16726 continue;
16727 }
16728 #endif
16729 #ifdef GL_NV_pixel_data_range
16730 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16))
16731 {
16732 ret = GLEW_NV_pixel_data_range;
16733 continue;
16734 }
16735 #endif
16736 #ifdef GL_NV_point_sprite
16737 if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12))
16738 {
16739 ret = GLEW_NV_point_sprite;
16740 continue;
16741 }
16742 #endif
16743 #ifdef GL_NV_present_video
16744 if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13))
16745 {
16746 ret = GLEW_NV_present_video;
16747 continue;
16748 }
16749 #endif
16750 #ifdef GL_NV_primitive_restart
16751 if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17))
16752 {
16753 ret = GLEW_NV_primitive_restart;
16754 continue;
16755 }
16756 #endif
16757 #ifdef GL_NV_register_combiners
16758 if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18))
16759 {
16760 ret = GLEW_NV_register_combiners;
16761 continue;
16762 }
16763 #endif
16764 #ifdef GL_NV_register_combiners2
16765 if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19))
16766 {
16767 ret = GLEW_NV_register_combiners2;
16768 continue;
16769 }
16770 #endif
16771 #ifdef GL_NV_sample_locations
16772 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16))
16773 {
16774 ret = GLEW_NV_sample_locations;
16775 continue;
16776 }
16777 #endif
16778 #ifdef GL_NV_sample_mask_override_coverage
16779 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_mask_override_coverage", 29))
16780 {
16781 ret = GLEW_NV_sample_mask_override_coverage;
16782 continue;
16783 }
16784 #endif
16785 #ifdef GL_NV_shader_atomic_counters
16786 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22))
16787 {
16788 ret = GLEW_NV_shader_atomic_counters;
16789 continue;
16790 }
16791 #endif
16792 #ifdef GL_NV_shader_atomic_float
16793 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19))
16794 {
16795 ret = GLEW_NV_shader_atomic_float;
16796 continue;
16797 }
16798 #endif
16799 #ifdef GL_NV_shader_atomic_fp16_vector
16800 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_fp16_vector", 25))
16801 {
16802 ret = GLEW_NV_shader_atomic_fp16_vector;
16803 continue;
16804 }
16805 #endif
16806 #ifdef GL_NV_shader_atomic_int64
16807 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_int64", 19))
16808 {
16809 ret = GLEW_NV_shader_atomic_int64;
16810 continue;
16811 }
16812 #endif
16813 #ifdef GL_NV_shader_buffer_load
16814 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_buffer_load", 18))
16815 {
16816 ret = GLEW_NV_shader_buffer_load;
16817 continue;
16818 }
16819 #endif
16820 #ifdef GL_NV_shader_storage_buffer_object
16821 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28))
16822 {
16823 ret = GLEW_NV_shader_storage_buffer_object;
16824 continue;
16825 }
16826 #endif
16827 #ifdef GL_NV_shader_thread_group
16828 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_group", 19))
16829 {
16830 ret = GLEW_NV_shader_thread_group;
16831 continue;
16832 }
16833 #endif
16834 #ifdef GL_NV_shader_thread_shuffle
16835 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_shuffle", 21))
16836 {
16837 ret = GLEW_NV_shader_thread_shuffle;
16838 continue;
16839 }
16840 #endif
16841 #ifdef GL_NV_tessellation_program5
16842 if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21))
16843 {
16844 ret = GLEW_NV_tessellation_program5;
16845 continue;
16846 }
16847 #endif
16848 #ifdef GL_NV_texgen_emboss
16849 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13))
16850 {
16851 ret = GLEW_NV_texgen_emboss;
16852 continue;
16853 }
16854 #endif
16855 #ifdef GL_NV_texgen_reflection
16856 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17))
16857 {
16858 ret = GLEW_NV_texgen_reflection;
16859 continue;
16860 }
16861 #endif
16862 #ifdef GL_NV_texture_barrier
16863 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15))
16864 {
16865 ret = GLEW_NV_texture_barrier;
16866 continue;
16867 }
16868 #endif
16869 #ifdef GL_NV_texture_compression_vtc
16870 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23))
16871 {
16872 ret = GLEW_NV_texture_compression_vtc;
16873 continue;
16874 }
16875 #endif
16876 #ifdef GL_NV_texture_env_combine4
16877 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20))
16878 {
16879 ret = GLEW_NV_texture_env_combine4;
16880 continue;
16881 }
16882 #endif
16883 #ifdef GL_NV_texture_expand_normal
16884 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21))
16885 {
16886 ret = GLEW_NV_texture_expand_normal;
16887 continue;
16888 }
16889 #endif
16890 #ifdef GL_NV_texture_multisample
16891 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19))
16892 {
16893 ret = GLEW_NV_texture_multisample;
16894 continue;
16895 }
16896 #endif
16897 #ifdef GL_NV_texture_rectangle
16898 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17))
16899 {
16900 ret = GLEW_NV_texture_rectangle;
16901 continue;
16902 }
16903 #endif
16904 #ifdef GL_NV_texture_shader
16905 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14))
16906 {
16907 ret = GLEW_NV_texture_shader;
16908 continue;
16909 }
16910 #endif
16911 #ifdef GL_NV_texture_shader2
16912 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15))
16913 {
16914 ret = GLEW_NV_texture_shader2;
16915 continue;
16916 }
16917 #endif
16918 #ifdef GL_NV_texture_shader3
16919 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15))
16920 {
16921 ret = GLEW_NV_texture_shader3;
16922 continue;
16923 }
16924 #endif
16925 #ifdef GL_NV_transform_feedback
16926 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18))
16927 {
16928 ret = GLEW_NV_transform_feedback;
16929 continue;
16930 }
16931 #endif
16932 #ifdef GL_NV_transform_feedback2
16933 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19))
16934 {
16935 ret = GLEW_NV_transform_feedback2;
16936 continue;
16937 }
16938 #endif
16939 #ifdef GL_NV_uniform_buffer_unified_memory
16940 if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_unified_memory", 29))
16941 {
16942 ret = GLEW_NV_uniform_buffer_unified_memory;
16943 continue;
16944 }
16945 #endif
16946 #ifdef GL_NV_vdpau_interop
16947 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop", 13))
16948 {
16949 ret = GLEW_NV_vdpau_interop;
16950 continue;
16951 }
16952 #endif
16953 #ifdef GL_NV_vertex_array_range
16954 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18))
16955 {
16956 ret = GLEW_NV_vertex_array_range;
16957 continue;
16958 }
16959 #endif
16960 #ifdef GL_NV_vertex_array_range2
16961 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19))
16962 {
16963 ret = GLEW_NV_vertex_array_range2;
16964 continue;
16965 }
16966 #endif
16967 #ifdef GL_NV_vertex_attrib_integer_64bit
16968 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_integer_64bit", 27))
16969 {
16970 ret = GLEW_NV_vertex_attrib_integer_64bit;
16971 continue;
16972 }
16973 #endif
16974 #ifdef GL_NV_vertex_buffer_unified_memory
16975 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_unified_memory", 28))
16976 {
16977 ret = GLEW_NV_vertex_buffer_unified_memory;
16978 continue;
16979 }
16980 #endif
16981 #ifdef GL_NV_vertex_program
16982 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14))
16983 {
16984 ret = GLEW_NV_vertex_program;
16985 continue;
16986 }
16987 #endif
16988 #ifdef GL_NV_vertex_program1_1
16989 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17))
16990 {
16991 ret = GLEW_NV_vertex_program1_1;
16992 continue;
16993 }
16994 #endif
16995 #ifdef GL_NV_vertex_program2
16996 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15))
16997 {
16998 ret = GLEW_NV_vertex_program2;
16999 continue;
17000 }
17001 #endif
17002 #ifdef GL_NV_vertex_program2_option
17003 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22))
17004 {
17005 ret = GLEW_NV_vertex_program2_option;
17006 continue;
17007 }
17008 #endif
17009 #ifdef GL_NV_vertex_program3
17010 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15))
17011 {
17012 ret = GLEW_NV_vertex_program3;
17013 continue;
17014 }
17015 #endif
17016 #ifdef GL_NV_vertex_program4
17017 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program4", 15))
17018 {
17019 ret = GLEW_NV_vertex_program4;
17020 continue;
17021 }
17022 #endif
17023 #ifdef GL_NV_video_capture
17024 if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13))
17025 {
17026 ret = GLEW_NV_video_capture;
17027 continue;
17028 }
17029 #endif
17030 #ifdef GL_NV_viewport_array2
17031 if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array2", 15))
17032 {
17033 ret = GLEW_NV_viewport_array2;
17034 continue;
17035 }
17036 #endif
17037 }
17038 if (_glewStrSame2(&pos, &len, (const GLubyte*)"OES_", 4))
17039 {
17040 #ifdef GL_OES_byte_coordinates
17041 if (_glewStrSame3(&pos, &len, (const GLubyte*)"byte_coordinates", 16))
17042 {
17043 ret = GLEW_OES_byte_coordinates;
17044 continue;
17045 }
17046 #endif
17047 #ifdef GL_OES_compressed_paletted_texture
17048 if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_paletted_texture", 27))
17049 {
17050 ret = GLEW_OES_compressed_paletted_texture;
17051 continue;
17052 }
17053 #endif
17054 #ifdef GL_OES_read_format
17055 if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format", 11))
17056 {
17057 ret = GLEW_OES_read_format;
17058 continue;
17059 }
17060 #endif
17061 #ifdef GL_OES_single_precision
17062 if (_glewStrSame3(&pos, &len, (const GLubyte*)"single_precision", 16))
17063 {
17064 ret = GLEW_OES_single_precision;
17065 continue;
17066 }
17067 #endif
17068 }
17069 if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4))
17070 {
17071 #ifdef GL_OML_interlace
17072 if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9))
17073 {
17074 ret = GLEW_OML_interlace;
17075 continue;
17076 }
17077 #endif
17078 #ifdef GL_OML_resample
17079 if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8))
17080 {
17081 ret = GLEW_OML_resample;
17082 continue;
17083 }
17084 #endif
17085 #ifdef GL_OML_subsample
17086 if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9))
17087 {
17088 ret = GLEW_OML_subsample;
17089 continue;
17090 }
17091 #endif
17092 }
17093 if (_glewStrSame2(&pos, &len, (const GLubyte*)"OVR_", 4))
17094 {
17095 #ifdef GL_OVR_multiview
17096 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview", 9))
17097 {
17098 ret = GLEW_OVR_multiview;
17099 continue;
17100 }
17101 #endif
17102 #ifdef GL_OVR_multiview2
17103 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview2", 10))
17104 {
17105 ret = GLEW_OVR_multiview2;
17106 continue;
17107 }
17108 #endif
17109 }
17110 if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4))
17111 {
17112 #ifdef GL_PGI_misc_hints
17113 if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10))
17114 {
17115 ret = GLEW_PGI_misc_hints;
17116 continue;
17117 }
17118 #endif
17119 #ifdef GL_PGI_vertex_hints
17120 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12))
17121 {
17122 ret = GLEW_PGI_vertex_hints;
17123 continue;
17124 }
17125 #endif
17126 }
17127 if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6))
17128 {
17129 #ifdef GL_REGAL_ES1_0_compatibility
17130 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_0_compatibility", 19))
17131 {
17132 ret = GLEW_REGAL_ES1_0_compatibility;
17133 continue;
17134 }
17135 #endif
17136 #ifdef GL_REGAL_ES1_1_compatibility
17137 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_1_compatibility", 19))
17138 {
17139 ret = GLEW_REGAL_ES1_1_compatibility;
17140 continue;
17141 }
17142 #endif
17143 #ifdef GL_REGAL_enable
17144 if (_glewStrSame3(&pos, &len, (const GLubyte*)"enable", 6))
17145 {
17146 ret = GLEW_REGAL_enable;
17147 continue;
17148 }
17149 #endif
17150 #ifdef GL_REGAL_error_string
17151 if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12))
17152 {
17153 ret = GLEW_REGAL_error_string;
17154 continue;
17155 }
17156 #endif
17157 #ifdef GL_REGAL_extension_query
17158 if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_query", 15))
17159 {
17160 ret = GLEW_REGAL_extension_query;
17161 continue;
17162 }
17163 #endif
17164 #ifdef GL_REGAL_log
17165 if (_glewStrSame3(&pos, &len, (const GLubyte*)"log", 3))
17166 {
17167 ret = GLEW_REGAL_log;
17168 continue;
17169 }
17170 #endif
17171 #ifdef GL_REGAL_proc_address
17172 if (_glewStrSame3(&pos, &len, (const GLubyte*)"proc_address", 12))
17173 {
17174 ret = GLEW_REGAL_proc_address;
17175 continue;
17176 }
17177 #endif
17178 }
17179 if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5))
17180 {
17181 #ifdef GL_REND_screen_coordinates
17182 if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18))
17183 {
17184 ret = GLEW_REND_screen_coordinates;
17185 continue;
17186 }
17187 #endif
17188 }
17189 if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3))
17190 {
17191 #ifdef GL_S3_s3tc
17192 if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4))
17193 {
17194 ret = GLEW_S3_s3tc;
17195 continue;
17196 }
17197 #endif
17198 }
17199 if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5))
17200 {
17201 #ifdef GL_SGIS_color_range
17202 if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11))
17203 {
17204 ret = GLEW_SGIS_color_range;
17205 continue;
17206 }
17207 #endif
17208 #ifdef GL_SGIS_detail_texture
17209 if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14))
17210 {
17211 ret = GLEW_SGIS_detail_texture;
17212 continue;
17213 }
17214 #endif
17215 #ifdef GL_SGIS_fog_function
17216 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12))
17217 {
17218 ret = GLEW_SGIS_fog_function;
17219 continue;
17220 }
17221 #endif
17222 #ifdef GL_SGIS_generate_mipmap
17223 if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15))
17224 {
17225 ret = GLEW_SGIS_generate_mipmap;
17226 continue;
17227 }
17228 #endif
17229 #ifdef GL_SGIS_multisample
17230 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11))
17231 {
17232 ret = GLEW_SGIS_multisample;
17233 continue;
17234 }
17235 #endif
17236 #ifdef GL_SGIS_pixel_texture
17237 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13))
17238 {
17239 ret = GLEW_SGIS_pixel_texture;
17240 continue;
17241 }
17242 #endif
17243 #ifdef GL_SGIS_point_line_texgen
17244 if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_line_texgen", 17))
17245 {
17246 ret = GLEW_SGIS_point_line_texgen;
17247 continue;
17248 }
17249 #endif
17250 #ifdef GL_SGIS_sharpen_texture
17251 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15))
17252 {
17253 ret = GLEW_SGIS_sharpen_texture;
17254 continue;
17255 }
17256 #endif
17257 #ifdef GL_SGIS_texture4D
17258 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9))
17259 {
17260 ret = GLEW_SGIS_texture4D;
17261 continue;
17262 }
17263 #endif
17264 #ifdef GL_SGIS_texture_border_clamp
17265 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20))
17266 {
17267 ret = GLEW_SGIS_texture_border_clamp;
17268 continue;
17269 }
17270 #endif
17271 #ifdef GL_SGIS_texture_edge_clamp
17272 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18))
17273 {
17274 ret = GLEW_SGIS_texture_edge_clamp;
17275 continue;
17276 }
17277 #endif
17278 #ifdef GL_SGIS_texture_filter4
17279 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15))
17280 {
17281 ret = GLEW_SGIS_texture_filter4;
17282 continue;
17283 }
17284 #endif
17285 #ifdef GL_SGIS_texture_lod
17286 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11))
17287 {
17288 ret = GLEW_SGIS_texture_lod;
17289 continue;
17290 }
17291 #endif
17292 #ifdef GL_SGIS_texture_select
17293 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14))
17294 {
17295 ret = GLEW_SGIS_texture_select;
17296 continue;
17297 }
17298 #endif
17299 }
17300 if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5))
17301 {
17302 #ifdef GL_SGIX_async
17303 if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5))
17304 {
17305 ret = GLEW_SGIX_async;
17306 continue;
17307 }
17308 #endif
17309 #ifdef GL_SGIX_async_histogram
17310 if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15))
17311 {
17312 ret = GLEW_SGIX_async_histogram;
17313 continue;
17314 }
17315 #endif
17316 #ifdef GL_SGIX_async_pixel
17317 if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11))
17318 {
17319 ret = GLEW_SGIX_async_pixel;
17320 continue;
17321 }
17322 #endif
17323 #ifdef GL_SGIX_blend_alpha_minmax
17324 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18))
17325 {
17326 ret = GLEW_SGIX_blend_alpha_minmax;
17327 continue;
17328 }
17329 #endif
17330 #ifdef GL_SGIX_clipmap
17331 if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7))
17332 {
17333 ret = GLEW_SGIX_clipmap;
17334 continue;
17335 }
17336 #endif
17337 #ifdef GL_SGIX_convolution_accuracy
17338 if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_accuracy", 20))
17339 {
17340 ret = GLEW_SGIX_convolution_accuracy;
17341 continue;
17342 }
17343 #endif
17344 #ifdef GL_SGIX_depth_texture
17345 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13))
17346 {
17347 ret = GLEW_SGIX_depth_texture;
17348 continue;
17349 }
17350 #endif
17351 #ifdef GL_SGIX_flush_raster
17352 if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12))
17353 {
17354 ret = GLEW_SGIX_flush_raster;
17355 continue;
17356 }
17357 #endif
17358 #ifdef GL_SGIX_fog_offset
17359 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10))
17360 {
17361 ret = GLEW_SGIX_fog_offset;
17362 continue;
17363 }
17364 #endif
17365 #ifdef GL_SGIX_fog_texture
17366 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11))
17367 {
17368 ret = GLEW_SGIX_fog_texture;
17369 continue;
17370 }
17371 #endif
17372 #ifdef GL_SGIX_fragment_specular_lighting
17373 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26))
17374 {
17375 ret = GLEW_SGIX_fragment_specular_lighting;
17376 continue;
17377 }
17378 #endif
17379 #ifdef GL_SGIX_framezoom
17380 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9))
17381 {
17382 ret = GLEW_SGIX_framezoom;
17383 continue;
17384 }
17385 #endif
17386 #ifdef GL_SGIX_interlace
17387 if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9))
17388 {
17389 ret = GLEW_SGIX_interlace;
17390 continue;
17391 }
17392 #endif
17393 #ifdef GL_SGIX_ir_instrument1
17394 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14))
17395 {
17396 ret = GLEW_SGIX_ir_instrument1;
17397 continue;
17398 }
17399 #endif
17400 #ifdef GL_SGIX_list_priority
17401 if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13))
17402 {
17403 ret = GLEW_SGIX_list_priority;
17404 continue;
17405 }
17406 #endif
17407 #ifdef GL_SGIX_pixel_texture
17408 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13))
17409 {
17410 ret = GLEW_SGIX_pixel_texture;
17411 continue;
17412 }
17413 #endif
17414 #ifdef GL_SGIX_pixel_texture_bits
17415 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18))
17416 {
17417 ret = GLEW_SGIX_pixel_texture_bits;
17418 continue;
17419 }
17420 #endif
17421 #ifdef GL_SGIX_reference_plane
17422 if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15))
17423 {
17424 ret = GLEW_SGIX_reference_plane;
17425 continue;
17426 }
17427 #endif
17428 #ifdef GL_SGIX_resample
17429 if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8))
17430 {
17431 ret = GLEW_SGIX_resample;
17432 continue;
17433 }
17434 #endif
17435 #ifdef GL_SGIX_shadow
17436 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6))
17437 {
17438 ret = GLEW_SGIX_shadow;
17439 continue;
17440 }
17441 #endif
17442 #ifdef GL_SGIX_shadow_ambient
17443 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14))
17444 {
17445 ret = GLEW_SGIX_shadow_ambient;
17446 continue;
17447 }
17448 #endif
17449 #ifdef GL_SGIX_sprite
17450 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6))
17451 {
17452 ret = GLEW_SGIX_sprite;
17453 continue;
17454 }
17455 #endif
17456 #ifdef GL_SGIX_tag_sample_buffer
17457 if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17))
17458 {
17459 ret = GLEW_SGIX_tag_sample_buffer;
17460 continue;
17461 }
17462 #endif
17463 #ifdef GL_SGIX_texture_add_env
17464 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15))
17465 {
17466 ret = GLEW_SGIX_texture_add_env;
17467 continue;
17468 }
17469 #endif
17470 #ifdef GL_SGIX_texture_coordinate_clamp
17471 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24))
17472 {
17473 ret = GLEW_SGIX_texture_coordinate_clamp;
17474 continue;
17475 }
17476 #endif
17477 #ifdef GL_SGIX_texture_lod_bias
17478 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16))
17479 {
17480 ret = GLEW_SGIX_texture_lod_bias;
17481 continue;
17482 }
17483 #endif
17484 #ifdef GL_SGIX_texture_multi_buffer
17485 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20))
17486 {
17487 ret = GLEW_SGIX_texture_multi_buffer;
17488 continue;
17489 }
17490 #endif
17491 #ifdef GL_SGIX_texture_range
17492 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13))
17493 {
17494 ret = GLEW_SGIX_texture_range;
17495 continue;
17496 }
17497 #endif
17498 #ifdef GL_SGIX_texture_scale_bias
17499 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18))
17500 {
17501 ret = GLEW_SGIX_texture_scale_bias;
17502 continue;
17503 }
17504 #endif
17505 #ifdef GL_SGIX_vertex_preclip
17506 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14))
17507 {
17508 ret = GLEW_SGIX_vertex_preclip;
17509 continue;
17510 }
17511 #endif
17512 #ifdef GL_SGIX_vertex_preclip_hint
17513 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19))
17514 {
17515 ret = GLEW_SGIX_vertex_preclip_hint;
17516 continue;
17517 }
17518 #endif
17519 #ifdef GL_SGIX_ycrcb
17520 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5))
17521 {
17522 ret = GLEW_SGIX_ycrcb;
17523 continue;
17524 }
17525 #endif
17526 }
17527 if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4))
17528 {
17529 #ifdef GL_SGI_color_matrix
17530 if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12))
17531 {
17532 ret = GLEW_SGI_color_matrix;
17533 continue;
17534 }
17535 #endif
17536 #ifdef GL_SGI_color_table
17537 if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11))
17538 {
17539 ret = GLEW_SGI_color_table;
17540 continue;
17541 }
17542 #endif
17543 #ifdef GL_SGI_texture_color_table
17544 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19))
17545 {
17546 ret = GLEW_SGI_texture_color_table;
17547 continue;
17548 }
17549 #endif
17550 }
17551 if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5))
17552 {
17553 #ifdef GL_SUNX_constant_data
17554 if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13))
17555 {
17556 ret = GLEW_SUNX_constant_data;
17557 continue;
17558 }
17559 #endif
17560 }
17561 if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4))
17562 {
17563 #ifdef GL_SUN_convolution_border_modes
17564 if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24))
17565 {
17566 ret = GLEW_SUN_convolution_border_modes;
17567 continue;
17568 }
17569 #endif
17570 #ifdef GL_SUN_global_alpha
17571 if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12))
17572 {
17573 ret = GLEW_SUN_global_alpha;
17574 continue;
17575 }
17576 #endif
17577 #ifdef GL_SUN_mesh_array
17578 if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10))
17579 {
17580 ret = GLEW_SUN_mesh_array;
17581 continue;
17582 }
17583 #endif
17584 #ifdef GL_SUN_read_video_pixels
17585 if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17))
17586 {
17587 ret = GLEW_SUN_read_video_pixels;
17588 continue;
17589 }
17590 #endif
17591 #ifdef GL_SUN_slice_accum
17592 if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11))
17593 {
17594 ret = GLEW_SUN_slice_accum;
17595 continue;
17596 }
17597 #endif
17598 #ifdef GL_SUN_triangle_list
17599 if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13))
17600 {
17601 ret = GLEW_SUN_triangle_list;
17602 continue;
17603 }
17604 #endif
17605 #ifdef GL_SUN_vertex
17606 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6))
17607 {
17608 ret = GLEW_SUN_vertex;
17609 continue;
17610 }
17611 #endif
17612 }
17613 if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4))
17614 {
17615 #ifdef GL_WIN_phong_shading
17616 if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13))
17617 {
17618 ret = GLEW_WIN_phong_shading;
17619 continue;
17620 }
17621 #endif
17622 #ifdef GL_WIN_specular_fog
17623 if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12))
17624 {
17625 ret = GLEW_WIN_specular_fog;
17626 continue;
17627 }
17628 #endif
17629 #ifdef GL_WIN_swap_hint
17630 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9))
17631 {
17632 ret = GLEW_WIN_swap_hint;
17633 continue;
17634 }
17635 #endif
17636 }
17637 }
17638 ret = (len == 0);
17639 }
17640 return ret;
17641 }
17642
17643 #if defined(_WIN32)
17644
17645 #if defined(GLEW_MX)
17646 GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext* ctx, const char* name)
17647 #else
17648 GLboolean GLEWAPIENTRY wglewIsSupported (const char* name)
17649 #endif
17650 {
17651 const GLubyte* pos = (const GLubyte*)name;
17652 GLuint len = _glewStrLen(pos);
17653 GLboolean ret = GL_TRUE;
17654 while (ret && len > 0)
17655 {
17656 if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4))
17657 {
17658 if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5))
17659 {
17660 #ifdef WGL_3DFX_multisample
17661 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11))
17662 {
17663 ret = WGLEW_3DFX_multisample;
17664 continue;
17665 }
17666 #endif
17667 }
17668 if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4))
17669 {
17670 #ifdef WGL_3DL_stereo_control
17671 if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14))
17672 {
17673 ret = WGLEW_3DL_stereo_control;
17674 continue;
17675 }
17676 #endif
17677 }
17678 if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4))
17679 {
17680 #ifdef WGL_AMD_gpu_association
17681 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15))
17682 {
17683 ret = WGLEW_AMD_gpu_association;
17684 continue;
17685 }
17686 #endif
17687 }
17688 if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4))
17689 {
17690 #ifdef WGL_ARB_buffer_region
17691 if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13))
17692 {
17693 ret = WGLEW_ARB_buffer_region;
17694 continue;
17695 }
17696 #endif
17697 #ifdef WGL_ARB_context_flush_control
17698 if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21))
17699 {
17700 ret = WGLEW_ARB_context_flush_control;
17701 continue;
17702 }
17703 #endif
17704 #ifdef WGL_ARB_create_context
17705 if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14))
17706 {
17707 ret = WGLEW_ARB_create_context;
17708 continue;
17709 }
17710 #endif
17711 #ifdef WGL_ARB_create_context_profile
17712 if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22))
17713 {
17714 ret = WGLEW_ARB_create_context_profile;
17715 continue;
17716 }
17717 #endif
17718 #ifdef WGL_ARB_create_context_robustness
17719 if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25))
17720 {
17721 ret = WGLEW_ARB_create_context_robustness;
17722 continue;
17723 }
17724 #endif
17725 #ifdef WGL_ARB_extensions_string
17726 if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17))
17727 {
17728 ret = WGLEW_ARB_extensions_string;
17729 continue;
17730 }
17731 #endif
17732 #ifdef WGL_ARB_framebuffer_sRGB
17733 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16))
17734 {
17735 ret = WGLEW_ARB_framebuffer_sRGB;
17736 continue;
17737 }
17738 #endif
17739 #ifdef WGL_ARB_make_current_read
17740 if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17))
17741 {
17742 ret = WGLEW_ARB_make_current_read;
17743 continue;
17744 }
17745 #endif
17746 #ifdef WGL_ARB_multisample
17747 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11))
17748 {
17749 ret = WGLEW_ARB_multisample;
17750 continue;
17751 }
17752 #endif
17753 #ifdef WGL_ARB_pbuffer
17754 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7))
17755 {
17756 ret = WGLEW_ARB_pbuffer;
17757 continue;
17758 }
17759 #endif
17760 #ifdef WGL_ARB_pixel_format
17761 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12))
17762 {
17763 ret = WGLEW_ARB_pixel_format;
17764 continue;
17765 }
17766 #endif
17767 #ifdef WGL_ARB_pixel_format_float
17768 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18))
17769 {
17770 ret = WGLEW_ARB_pixel_format_float;
17771 continue;
17772 }
17773 #endif
17774 #ifdef WGL_ARB_render_texture
17775 if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14))
17776 {
17777 ret = WGLEW_ARB_render_texture;
17778 continue;
17779 }
17780 #endif
17781 #ifdef WGL_ARB_robustness_application_isolation
17782 if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32))
17783 {
17784 ret = WGLEW_ARB_robustness_application_isolation;
17785 continue;
17786 }
17787 #endif
17788 #ifdef WGL_ARB_robustness_share_group_isolation
17789 if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32))
17790 {
17791 ret = WGLEW_ARB_robustness_share_group_isolation;
17792 continue;
17793 }
17794 #endif
17795 }
17796 if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4))
17797 {
17798 #ifdef WGL_ATI_pixel_format_float
17799 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18))
17800 {
17801 ret = WGLEW_ATI_pixel_format_float;
17802 continue;
17803 }
17804 #endif
17805 #ifdef WGL_ATI_render_texture_rectangle
17806 if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24))
17807 {
17808 ret = WGLEW_ATI_render_texture_rectangle;
17809 continue;
17810 }
17811 #endif
17812 }
17813 if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4))
17814 {
17815 #ifdef WGL_EXT_create_context_es2_profile
17816 if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26))
17817 {
17818 ret = WGLEW_EXT_create_context_es2_profile;
17819 continue;
17820 }
17821 #endif
17822 #ifdef WGL_EXT_create_context_es_profile
17823 if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25))
17824 {
17825 ret = WGLEW_EXT_create_context_es_profile;
17826 continue;
17827 }
17828 #endif
17829 #ifdef WGL_EXT_depth_float
17830 if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11))
17831 {
17832 ret = WGLEW_EXT_depth_float;
17833 continue;
17834 }
17835 #endif
17836 #ifdef WGL_EXT_display_color_table
17837 if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19))
17838 {
17839 ret = WGLEW_EXT_display_color_table;
17840 continue;
17841 }
17842 #endif
17843 #ifdef WGL_EXT_extensions_string
17844 if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17))
17845 {
17846 ret = WGLEW_EXT_extensions_string;
17847 continue;
17848 }
17849 #endif
17850 #ifdef WGL_EXT_framebuffer_sRGB
17851 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16))
17852 {
17853 ret = WGLEW_EXT_framebuffer_sRGB;
17854 continue;
17855 }
17856 #endif
17857 #ifdef WGL_EXT_make_current_read
17858 if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17))
17859 {
17860 ret = WGLEW_EXT_make_current_read;
17861 continue;
17862 }
17863 #endif
17864 #ifdef WGL_EXT_multisample
17865 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11))
17866 {
17867 ret = WGLEW_EXT_multisample;
17868 continue;
17869 }
17870 #endif
17871 #ifdef WGL_EXT_pbuffer
17872 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7))
17873 {
17874 ret = WGLEW_EXT_pbuffer;
17875 continue;
17876 }
17877 #endif
17878 #ifdef WGL_EXT_pixel_format
17879 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12))
17880 {
17881 ret = WGLEW_EXT_pixel_format;
17882 continue;
17883 }
17884 #endif
17885 #ifdef WGL_EXT_pixel_format_packed_float
17886 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_packed_float", 25))
17887 {
17888 ret = WGLEW_EXT_pixel_format_packed_float;
17889 continue;
17890 }
17891 #endif
17892 #ifdef WGL_EXT_swap_control
17893 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12))
17894 {
17895 ret = WGLEW_EXT_swap_control;
17896 continue;
17897 }
17898 #endif
17899 #ifdef WGL_EXT_swap_control_tear
17900 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17))
17901 {
17902 ret = WGLEW_EXT_swap_control_tear;
17903 continue;
17904 }
17905 #endif
17906 }
17907 if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4))
17908 {
17909 #ifdef WGL_I3D_digital_video_control
17910 if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21))
17911 {
17912 ret = WGLEW_I3D_digital_video_control;
17913 continue;
17914 }
17915 #endif
17916 #ifdef WGL_I3D_gamma
17917 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5))
17918 {
17919 ret = WGLEW_I3D_gamma;
17920 continue;
17921 }
17922 #endif
17923 #ifdef WGL_I3D_genlock
17924 if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7))
17925 {
17926 ret = WGLEW_I3D_genlock;
17927 continue;
17928 }
17929 #endif
17930 #ifdef WGL_I3D_image_buffer
17931 if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12))
17932 {
17933 ret = WGLEW_I3D_image_buffer;
17934 continue;
17935 }
17936 #endif
17937 #ifdef WGL_I3D_swap_frame_lock
17938 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15))
17939 {
17940 ret = WGLEW_I3D_swap_frame_lock;
17941 continue;
17942 }
17943 #endif
17944 #ifdef WGL_I3D_swap_frame_usage
17945 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16))
17946 {
17947 ret = WGLEW_I3D_swap_frame_usage;
17948 continue;
17949 }
17950 #endif
17951 }
17952 if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3))
17953 {
17954 #ifdef WGL_NV_DX_interop
17955 if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop", 10))
17956 {
17957 ret = WGLEW_NV_DX_interop;
17958 continue;
17959 }
17960 #endif
17961 #ifdef WGL_NV_DX_interop2
17962 if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop2", 11))
17963 {
17964 ret = WGLEW_NV_DX_interop2;
17965 continue;
17966 }
17967 #endif
17968 #ifdef WGL_NV_copy_image
17969 if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10))
17970 {
17971 ret = WGLEW_NV_copy_image;
17972 continue;
17973 }
17974 #endif
17975 #ifdef WGL_NV_delay_before_swap
17976 if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17))
17977 {
17978 ret = WGLEW_NV_delay_before_swap;
17979 continue;
17980 }
17981 #endif
17982 #ifdef WGL_NV_float_buffer
17983 if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12))
17984 {
17985 ret = WGLEW_NV_float_buffer;
17986 continue;
17987 }
17988 #endif
17989 #ifdef WGL_NV_gpu_affinity
17990 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_affinity", 12))
17991 {
17992 ret = WGLEW_NV_gpu_affinity;
17993 continue;
17994 }
17995 #endif
17996 #ifdef WGL_NV_multisample_coverage
17997 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20))
17998 {
17999 ret = WGLEW_NV_multisample_coverage;
18000 continue;
18001 }
18002 #endif
18003 #ifdef WGL_NV_present_video
18004 if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13))
18005 {
18006 ret = WGLEW_NV_present_video;
18007 continue;
18008 }
18009 #endif
18010 #ifdef WGL_NV_render_depth_texture
18011 if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20))
18012 {
18013 ret = WGLEW_NV_render_depth_texture;
18014 continue;
18015 }
18016 #endif
18017 #ifdef WGL_NV_render_texture_rectangle
18018 if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24))
18019 {
18020 ret = WGLEW_NV_render_texture_rectangle;
18021 continue;
18022 }
18023 #endif
18024 #ifdef WGL_NV_swap_group
18025 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10))
18026 {
18027 ret = WGLEW_NV_swap_group;
18028 continue;
18029 }
18030 #endif
18031 #ifdef WGL_NV_vertex_array_range
18032 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18))
18033 {
18034 ret = WGLEW_NV_vertex_array_range;
18035 continue;
18036 }
18037 #endif
18038 #ifdef WGL_NV_video_capture
18039 if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13))
18040 {
18041 ret = WGLEW_NV_video_capture;
18042 continue;
18043 }
18044 #endif
18045 #ifdef WGL_NV_video_output
18046 if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12))
18047 {
18048 ret = WGLEW_NV_video_output;
18049 continue;
18050 }
18051 #endif
18052 }
18053 if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4))
18054 {
18055 #ifdef WGL_OML_sync_control
18056 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12))
18057 {
18058 ret = WGLEW_OML_sync_control;
18059 continue;
18060 }
18061 #endif
18062 }
18063 }
18064 ret = (len == 0);
18065 }
18066 return ret;
18067 }
18068
18069 #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX)
18070
18071 #if defined(GLEW_MX)
18072 GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name)
18073 #else
18074 GLboolean glxewIsSupported (const char* name)
18075 #endif
18076 {
18077 const GLubyte* pos = (const GLubyte*)name;
18078 GLuint len = _glewStrLen(pos);
18079 GLboolean ret = GL_TRUE;
18080 while (ret && len > 0)
18081 {
18082 if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4))
18083 {
18084 if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8))
18085 {
18086 #ifdef GLX_VERSION_1_2
18087 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3))
18088 {
18089 ret = GLXEW_VERSION_1_2;
18090 continue;
18091 }
18092 #endif
18093 #ifdef GLX_VERSION_1_3
18094 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3))
18095 {
18096 ret = GLXEW_VERSION_1_3;
18097 continue;
18098 }
18099 #endif
18100 #ifdef GLX_VERSION_1_4
18101 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3))
18102 {
18103 ret = GLXEW_VERSION_1_4;
18104 continue;
18105 }
18106 #endif
18107 }
18108 if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5))
18109 {
18110 #ifdef GLX_3DFX_multisample
18111 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11))
18112 {
18113 ret = GLXEW_3DFX_multisample;
18114 continue;
18115 }
18116 #endif
18117 }
18118 if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4))
18119 {
18120 #ifdef GLX_AMD_gpu_association
18121 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15))
18122 {
18123 ret = GLXEW_AMD_gpu_association;
18124 continue;
18125 }
18126 #endif
18127 }
18128 if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4))
18129 {
18130 #ifdef GLX_ARB_context_flush_control
18131 if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21))
18132 {
18133 ret = GLXEW_ARB_context_flush_control;
18134 continue;
18135 }
18136 #endif
18137 #ifdef GLX_ARB_create_context
18138 if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14))
18139 {
18140 ret = GLXEW_ARB_create_context;
18141 continue;
18142 }
18143 #endif
18144 #ifdef GLX_ARB_create_context_profile
18145 if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22))
18146 {
18147 ret = GLXEW_ARB_create_context_profile;
18148 continue;
18149 }
18150 #endif
18151 #ifdef GLX_ARB_create_context_robustness
18152 if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25))
18153 {
18154 ret = GLXEW_ARB_create_context_robustness;
18155 continue;
18156 }
18157 #endif
18158 #ifdef GLX_ARB_fbconfig_float
18159 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14))
18160 {
18161 ret = GLXEW_ARB_fbconfig_float;
18162 continue;
18163 }
18164 #endif
18165 #ifdef GLX_ARB_framebuffer_sRGB
18166 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16))
18167 {
18168 ret = GLXEW_ARB_framebuffer_sRGB;
18169 continue;
18170 }
18171 #endif
18172 #ifdef GLX_ARB_get_proc_address
18173 if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16))
18174 {
18175 ret = GLXEW_ARB_get_proc_address;
18176 continue;
18177 }
18178 #endif
18179 #ifdef GLX_ARB_multisample
18180 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11))
18181 {
18182 ret = GLXEW_ARB_multisample;
18183 continue;
18184 }
18185 #endif
18186 #ifdef GLX_ARB_robustness_application_isolation
18187 if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32))
18188 {
18189 ret = GLXEW_ARB_robustness_application_isolation;
18190 continue;
18191 }
18192 #endif
18193 #ifdef GLX_ARB_robustness_share_group_isolation
18194 if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32))
18195 {
18196 ret = GLXEW_ARB_robustness_share_group_isolation;
18197 continue;
18198 }
18199 #endif
18200 #ifdef GLX_ARB_vertex_buffer_object
18201 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20))
18202 {
18203 ret = GLXEW_ARB_vertex_buffer_object;
18204 continue;
18205 }
18206 #endif
18207 }
18208 if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4))
18209 {
18210 #ifdef GLX_ATI_pixel_format_float
18211 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18))
18212 {
18213 ret = GLXEW_ATI_pixel_format_float;
18214 continue;
18215 }
18216 #endif
18217 #ifdef GLX_ATI_render_texture
18218 if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14))
18219 {
18220 ret = GLXEW_ATI_render_texture;
18221 continue;
18222 }
18223 #endif
18224 }
18225 if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4))
18226 {
18227 #ifdef GLX_EXT_buffer_age
18228 if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10))
18229 {
18230 ret = GLXEW_EXT_buffer_age;
18231 continue;
18232 }
18233 #endif
18234 #ifdef GLX_EXT_create_context_es2_profile
18235 if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26))
18236 {
18237 ret = GLXEW_EXT_create_context_es2_profile;
18238 continue;
18239 }
18240 #endif
18241 #ifdef GLX_EXT_create_context_es_profile
18242 if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25))
18243 {
18244 ret = GLXEW_EXT_create_context_es_profile;
18245 continue;
18246 }
18247 #endif
18248 #ifdef GLX_EXT_fbconfig_packed_float
18249 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21))
18250 {
18251 ret = GLXEW_EXT_fbconfig_packed_float;
18252 continue;
18253 }
18254 #endif
18255 #ifdef GLX_EXT_framebuffer_sRGB
18256 if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16))
18257 {
18258 ret = GLXEW_EXT_framebuffer_sRGB;
18259 continue;
18260 }
18261 #endif
18262 #ifdef GLX_EXT_import_context
18263 if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14))
18264 {
18265 ret = GLXEW_EXT_import_context;
18266 continue;
18267 }
18268 #endif
18269 #ifdef GLX_EXT_scene_marker
18270 if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12))
18271 {
18272 ret = GLXEW_EXT_scene_marker;
18273 continue;
18274 }
18275 #endif
18276 #ifdef GLX_EXT_stereo_tree
18277 if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_tree", 11))
18278 {
18279 ret = GLXEW_EXT_stereo_tree;
18280 continue;
18281 }
18282 #endif
18283 #ifdef GLX_EXT_swap_control
18284 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12))
18285 {
18286 ret = GLXEW_EXT_swap_control;
18287 continue;
18288 }
18289 #endif
18290 #ifdef GLX_EXT_swap_control_tear
18291 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17))
18292 {
18293 ret = GLXEW_EXT_swap_control_tear;
18294 continue;
18295 }
18296 #endif
18297 #ifdef GLX_EXT_texture_from_pixmap
18298 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19))
18299 {
18300 ret = GLXEW_EXT_texture_from_pixmap;
18301 continue;
18302 }
18303 #endif
18304 #ifdef GLX_EXT_visual_info
18305 if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11))
18306 {
18307 ret = GLXEW_EXT_visual_info;
18308 continue;
18309 }
18310 #endif
18311 #ifdef GLX_EXT_visual_rating
18312 if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13))
18313 {
18314 ret = GLXEW_EXT_visual_rating;
18315 continue;
18316 }
18317 #endif
18318 }
18319 if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6))
18320 {
18321 #ifdef GLX_INTEL_swap_event
18322 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_event", 10))
18323 {
18324 ret = GLXEW_INTEL_swap_event;
18325 continue;
18326 }
18327 #endif
18328 }
18329 if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5))
18330 {
18331 #ifdef GLX_MESA_agp_offset
18332 if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10))
18333 {
18334 ret = GLXEW_MESA_agp_offset;
18335 continue;
18336 }
18337 #endif
18338 #ifdef GLX_MESA_copy_sub_buffer
18339 if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15))
18340 {
18341 ret = GLXEW_MESA_copy_sub_buffer;
18342 continue;
18343 }
18344 #endif
18345 #ifdef GLX_MESA_pixmap_colormap
18346 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15))
18347 {
18348 ret = GLXEW_MESA_pixmap_colormap;
18349 continue;
18350 }
18351 #endif
18352 #ifdef GLX_MESA_query_renderer
18353 if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_renderer", 14))
18354 {
18355 ret = GLXEW_MESA_query_renderer;
18356 continue;
18357 }
18358 #endif
18359 #ifdef GLX_MESA_release_buffers
18360 if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15))
18361 {
18362 ret = GLXEW_MESA_release_buffers;
18363 continue;
18364 }
18365 #endif
18366 #ifdef GLX_MESA_set_3dfx_mode
18367 if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13))
18368 {
18369 ret = GLXEW_MESA_set_3dfx_mode;
18370 continue;
18371 }
18372 #endif
18373 #ifdef GLX_MESA_swap_control
18374 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12))
18375 {
18376 ret = GLXEW_MESA_swap_control;
18377 continue;
18378 }
18379 #endif
18380 }
18381 if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3))
18382 {
18383 #ifdef GLX_NV_copy_buffer
18384 if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11))
18385 {
18386 ret = GLXEW_NV_copy_buffer;
18387 continue;
18388 }
18389 #endif
18390 #ifdef GLX_NV_copy_image
18391 if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10))
18392 {
18393 ret = GLXEW_NV_copy_image;
18394 continue;
18395 }
18396 #endif
18397 #ifdef GLX_NV_delay_before_swap
18398 if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17))
18399 {
18400 ret = GLXEW_NV_delay_before_swap;
18401 continue;
18402 }
18403 #endif
18404 #ifdef GLX_NV_float_buffer
18405 if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12))
18406 {
18407 ret = GLXEW_NV_float_buffer;
18408 continue;
18409 }
18410 #endif
18411 #ifdef GLX_NV_multisample_coverage
18412 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20))
18413 {
18414 ret = GLXEW_NV_multisample_coverage;
18415 continue;
18416 }
18417 #endif
18418 #ifdef GLX_NV_present_video
18419 if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13))
18420 {
18421 ret = GLXEW_NV_present_video;
18422 continue;
18423 }
18424 #endif
18425 #ifdef GLX_NV_swap_group
18426 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10))
18427 {
18428 ret = GLXEW_NV_swap_group;
18429 continue;
18430 }
18431 #endif
18432 #ifdef GLX_NV_vertex_array_range
18433 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18))
18434 {
18435 ret = GLXEW_NV_vertex_array_range;
18436 continue;
18437 }
18438 #endif
18439 #ifdef GLX_NV_video_capture
18440 if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13))
18441 {
18442 ret = GLXEW_NV_video_capture;
18443 continue;
18444 }
18445 #endif
18446 #ifdef GLX_NV_video_out
18447 if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9))
18448 {
18449 ret = GLXEW_NV_video_out;
18450 continue;
18451 }
18452 #endif
18453 }
18454 if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4))
18455 {
18456 #ifdef GLX_OML_swap_method
18457 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11))
18458 {
18459 ret = GLXEW_OML_swap_method;
18460 continue;
18461 }
18462 #endif
18463 #ifdef GLX_OML_sync_control
18464 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12))
18465 {
18466 ret = GLXEW_OML_sync_control;
18467 continue;
18468 }
18469 #endif
18470 }
18471 if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5))
18472 {
18473 #ifdef GLX_SGIS_blended_overlay
18474 if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15))
18475 {
18476 ret = GLXEW_SGIS_blended_overlay;
18477 continue;
18478 }
18479 #endif
18480 #ifdef GLX_SGIS_color_range
18481 if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11))
18482 {
18483 ret = GLXEW_SGIS_color_range;
18484 continue;
18485 }
18486 #endif
18487 #ifdef GLX_SGIS_multisample
18488 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11))
18489 {
18490 ret = GLXEW_SGIS_multisample;
18491 continue;
18492 }
18493 #endif
18494 #ifdef GLX_SGIS_shared_multisample
18495 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18))
18496 {
18497 ret = GLXEW_SGIS_shared_multisample;
18498 continue;
18499 }
18500 #endif
18501 }
18502 if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5))
18503 {
18504 #ifdef GLX_SGIX_fbconfig
18505 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8))
18506 {
18507 ret = GLXEW_SGIX_fbconfig;
18508 continue;
18509 }
18510 #endif
18511 #ifdef GLX_SGIX_hyperpipe
18512 if (_glewStrSame3(&pos, &len, (const GLubyte*)"hyperpipe", 9))
18513 {
18514 ret = GLXEW_SGIX_hyperpipe;
18515 continue;
18516 }
18517 #endif
18518 #ifdef GLX_SGIX_pbuffer
18519 if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7))
18520 {
18521 ret = GLXEW_SGIX_pbuffer;
18522 continue;
18523 }
18524 #endif
18525 #ifdef GLX_SGIX_swap_barrier
18526 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12))
18527 {
18528 ret = GLXEW_SGIX_swap_barrier;
18529 continue;
18530 }
18531 #endif
18532 #ifdef GLX_SGIX_swap_group
18533 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10))
18534 {
18535 ret = GLXEW_SGIX_swap_group;
18536 continue;
18537 }
18538 #endif
18539 #ifdef GLX_SGIX_video_resize
18540 if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12))
18541 {
18542 ret = GLXEW_SGIX_video_resize;
18543 continue;
18544 }
18545 #endif
18546 #ifdef GLX_SGIX_visual_select_group
18547 if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19))
18548 {
18549 ret = GLXEW_SGIX_visual_select_group;
18550 continue;
18551 }
18552 #endif
18553 }
18554 if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4))
18555 {
18556 #ifdef GLX_SGI_cushion
18557 if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7))
18558 {
18559 ret = GLXEW_SGI_cushion;
18560 continue;
18561 }
18562 #endif
18563 #ifdef GLX_SGI_make_current_read
18564 if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17))
18565 {
18566 ret = GLXEW_SGI_make_current_read;
18567 continue;
18568 }
18569 #endif
18570 #ifdef GLX_SGI_swap_control
18571 if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12))
18572 {
18573 ret = GLXEW_SGI_swap_control;
18574 continue;
18575 }
18576 #endif
18577 #ifdef GLX_SGI_video_sync
18578 if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10))
18579 {
18580 ret = GLXEW_SGI_video_sync;
18581 continue;
18582 }
18583 #endif
18584 }
18585 if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4))
18586 {
18587 #ifdef GLX_SUN_get_transparent_index
18588 if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21))
18589 {
18590 ret = GLXEW_SUN_get_transparent_index;
18591 continue;
18592 }
18593 #endif
18594 #ifdef GLX_SUN_video_resize
18595 if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12))
18596 {
18597 ret = GLXEW_SUN_video_resize;
18598 continue;
18599 }
18600 #endif
18601 }
18602 }
18603 ret = (len == 0);
18604 }
18605 return ret;
18606 }
18607
18608 #endif /* _WIN32 */
18609
18610 #endif /* SLIC3R_GUI */
0 #include "BoundingBox.hpp"
1 #include <algorithm>
2
3 namespace Slic3r {
4
5 template <class PointClass>
6 BoundingBoxBase<PointClass>::BoundingBoxBase(const std::vector<PointClass> &points)
7 {
8 if (points.empty()) CONFESS("Empty point set supplied to BoundingBoxBase constructor");
9 typename std::vector<PointClass>::const_iterator it = points.begin();
10 this->min.x = this->max.x = it->x;
11 this->min.y = this->max.y = it->y;
12 for (++it; it != points.end(); ++it) {
13 this->min.x = std::min(it->x, this->min.x);
14 this->min.y = std::min(it->y, this->min.y);
15 this->max.x = std::max(it->x, this->max.x);
16 this->max.y = std::max(it->y, this->max.y);
17 }
18 this->defined = true;
19 }
20 template BoundingBoxBase<Point>::BoundingBoxBase(const std::vector<Point> &points);
21 template BoundingBoxBase<Pointf>::BoundingBoxBase(const std::vector<Pointf> &points);
22
23 template <class PointClass>
24 BoundingBox3Base<PointClass>::BoundingBox3Base(const std::vector<PointClass> &points)
25 : BoundingBoxBase<PointClass>(points)
26 {
27 if (points.empty()) CONFESS("Empty point set supplied to BoundingBox3Base constructor");
28 typename std::vector<PointClass>::const_iterator it = points.begin();
29 this->min.z = this->max.z = it->z;
30 for (++it; it != points.end(); ++it) {
31 this->min.z = std::min(it->z, this->min.z);
32 this->max.z = std::max(it->z, this->max.z);
33 }
34 }
35 template BoundingBox3Base<Pointf3>::BoundingBox3Base(const std::vector<Pointf3> &points);
36
37 BoundingBox::BoundingBox(const Lines &lines)
38 {
39 Points points;
40 for (Lines::const_iterator line = lines.begin(); line != lines.end(); ++line) {
41 points.push_back(line->a);
42 points.push_back(line->b);
43 }
44 *this = BoundingBox(points);
45 }
46
47 void
48 BoundingBox::polygon(Polygon* polygon) const
49 {
50 polygon->points.clear();
51 polygon->points.resize(4);
52 polygon->points[0].x = this->min.x;
53 polygon->points[0].y = this->min.y;
54 polygon->points[1].x = this->max.x;
55 polygon->points[1].y = this->min.y;
56 polygon->points[2].x = this->max.x;
57 polygon->points[2].y = this->max.y;
58 polygon->points[3].x = this->min.x;
59 polygon->points[3].y = this->max.y;
60 }
61
62 Polygon
63 BoundingBox::polygon() const
64 {
65 Polygon p;
66 this->polygon(&p);
67 return p;
68 }
69
70 BoundingBox BoundingBox::rotated(double angle) const
71 {
72 BoundingBox out;
73 out.merge(this->min.rotated(angle));
74 out.merge(this->max.rotated(angle));
75 out.merge(Point(this->min.x, this->max.y).rotated(angle));
76 out.merge(Point(this->max.x, this->min.y).rotated(angle));
77 return out;
78 }
79
80 BoundingBox BoundingBox::rotated(double angle, const Point &center) const
81 {
82 BoundingBox out;
83 out.merge(this->min.rotated(angle, center));
84 out.merge(this->max.rotated(angle, center));
85 out.merge(Point(this->min.x, this->max.y).rotated(angle, center));
86 out.merge(Point(this->max.x, this->min.y).rotated(angle, center));
87 return out;
88 }
89
90 template <class PointClass> void
91 BoundingBoxBase<PointClass>::scale(double factor)
92 {
93 this->min.scale(factor);
94 this->max.scale(factor);
95 }
96 template void BoundingBoxBase<Point>::scale(double factor);
97 template void BoundingBoxBase<Pointf>::scale(double factor);
98 template void BoundingBoxBase<Pointf3>::scale(double factor);
99
100 template <class PointClass> void
101 BoundingBoxBase<PointClass>::merge(const PointClass &point)
102 {
103 if (this->defined) {
104 this->min.x = std::min(point.x, this->min.x);
105 this->min.y = std::min(point.y, this->min.y);
106 this->max.x = std::max(point.x, this->max.x);
107 this->max.y = std::max(point.y, this->max.y);
108 } else {
109 this->min = this->max = point;
110 this->defined = true;
111 }
112 }
113 template void BoundingBoxBase<Point>::merge(const Point &point);
114 template void BoundingBoxBase<Pointf>::merge(const Pointf &point);
115
116 template <class PointClass> void
117 BoundingBoxBase<PointClass>::merge(const std::vector<PointClass> &points)
118 {
119 this->merge(BoundingBoxBase(points));
120 }
121 template void BoundingBoxBase<Point>::merge(const Points &points);
122 template void BoundingBoxBase<Pointf>::merge(const Pointfs &points);
123
124 template <class PointClass> void
125 BoundingBoxBase<PointClass>::merge(const BoundingBoxBase<PointClass> &bb)
126 {
127 if (this->defined) {
128 this->min.x = std::min(bb.min.x, this->min.x);
129 this->min.y = std::min(bb.min.y, this->min.y);
130 this->max.x = std::max(bb.max.x, this->max.x);
131 this->max.y = std::max(bb.max.y, this->max.y);
132 } else {
133 this->min = bb.min;
134 this->max = bb.max;
135 this->defined = true;
136 }
137 }
138 template void BoundingBoxBase<Point>::merge(const BoundingBoxBase<Point> &bb);
139 template void BoundingBoxBase<Pointf>::merge(const BoundingBoxBase<Pointf> &bb);
140
141 template <class PointClass> void
142 BoundingBox3Base<PointClass>::merge(const PointClass &point)
143 {
144 if (this->defined) {
145 this->min.z = std::min(point.z, this->min.z);
146 this->max.z = std::max(point.z, this->max.z);
147 }
148 BoundingBoxBase<PointClass>::merge(point);
149 }
150 template void BoundingBox3Base<Pointf3>::merge(const Pointf3 &point);
151
152 template <class PointClass> void
153 BoundingBox3Base<PointClass>::merge(const std::vector<PointClass> &points)
154 {
155 this->merge(BoundingBox3Base(points));
156 }
157 template void BoundingBox3Base<Pointf3>::merge(const Pointf3s &points);
158
159 template <class PointClass> void
160 BoundingBox3Base<PointClass>::merge(const BoundingBox3Base<PointClass> &bb)
161 {
162 if (this->defined) {
163 this->min.z = std::min(bb.min.z, this->min.z);
164 this->max.z = std::max(bb.max.z, this->max.z);
165 }
166 BoundingBoxBase<PointClass>::merge(bb);
167 }
168 template void BoundingBox3Base<Pointf3>::merge(const BoundingBox3Base<Pointf3> &bb);
169
170 template <class PointClass> PointClass
171 BoundingBoxBase<PointClass>::size() const
172 {
173 return PointClass(this->max.x - this->min.x, this->max.y - this->min.y);
174 }
175 template Point BoundingBoxBase<Point>::size() const;
176 template Pointf BoundingBoxBase<Pointf>::size() const;
177
178 template <class PointClass> PointClass
179 BoundingBox3Base<PointClass>::size() const
180 {
181 return PointClass(this->max.x - this->min.x, this->max.y - this->min.y, this->max.z - this->min.z);
182 }
183 template Pointf3 BoundingBox3Base<Pointf3>::size() const;
184
185 template <class PointClass> double
186 BoundingBoxBase<PointClass>::radius() const
187 {
188 double x = this->max.x - this->min.x;
189 double y = this->max.y - this->min.y;
190 return 0.5 * sqrt(x*x+y*y);
191 }
192 template double BoundingBoxBase<Point>::radius() const;
193 template double BoundingBoxBase<Pointf>::radius() const;
194
195 template <class PointClass> double
196 BoundingBox3Base<PointClass>::radius() const
197 {
198 double x = this->max.x - this->min.x;
199 double y = this->max.y - this->min.y;
200 double z = this->max.z - this->min.z;
201 return 0.5 * sqrt(x*x+y*y+z*z);
202 }
203 template double BoundingBox3Base<Pointf3>::radius() const;
204
205 template <class PointClass> void
206 BoundingBoxBase<PointClass>::translate(coordf_t x, coordf_t y)
207 {
208 this->min.translate(x, y);
209 this->max.translate(x, y);
210 }
211 template void BoundingBoxBase<Point>::translate(coordf_t x, coordf_t y);
212 template void BoundingBoxBase<Pointf>::translate(coordf_t x, coordf_t y);
213
214 template <class PointClass> void
215 BoundingBox3Base<PointClass>::translate(coordf_t x, coordf_t y, coordf_t z)
216 {
217 this->min.translate(x, y, z);
218 this->max.translate(x, y, z);
219 }
220 template void BoundingBox3Base<Pointf3>::translate(coordf_t x, coordf_t y, coordf_t z);
221
222 template <class PointClass> void
223 BoundingBoxBase<PointClass>::offset(coordf_t delta)
224 {
225 this->min.translate(-delta, -delta);
226 this->max.translate(delta, delta);
227 }
228 template void BoundingBoxBase<Point>::offset(coordf_t delta);
229 template void BoundingBoxBase<Pointf>::offset(coordf_t delta);
230
231 template <class PointClass> void
232 BoundingBox3Base<PointClass>::offset(coordf_t delta)
233 {
234 this->min.translate(-delta, -delta, -delta);
235 this->max.translate(delta, delta, delta);
236 }
237 template void BoundingBox3Base<Pointf3>::offset(coordf_t delta);
238
239 template <class PointClass> PointClass
240 BoundingBoxBase<PointClass>::center() const
241 {
242 return PointClass(
243 (this->max.x + this->min.x)/2,
244 (this->max.y + this->min.y)/2
245 );
246 }
247 template Point BoundingBoxBase<Point>::center() const;
248 template Pointf BoundingBoxBase<Pointf>::center() const;
249
250 template <class PointClass> PointClass
251 BoundingBox3Base<PointClass>::center() const
252 {
253 return PointClass(
254 (this->max.x + this->min.x)/2,
255 (this->max.y + this->min.y)/2,
256 (this->max.z + this->min.z)/2
257 );
258 }
259 template Pointf3 BoundingBox3Base<Pointf3>::center() const;
260
261 template <class PointClass> bool
262 BoundingBoxBase<PointClass>::contains(const PointClass &point) const
263 {
264 return point.x >= this->min.x && point.x <= this->max.x
265 && point.y >= this->min.y && point.y <= this->max.y;
266 }
267 template bool BoundingBoxBase<Point>::contains(const Point &point) const;
268 template bool BoundingBoxBase<Pointf>::contains(const Pointf &point) const;
269
270 template <class PointClass> bool
271 BoundingBoxBase<PointClass>::overlap(const BoundingBoxBase<PointClass> &other) const
272 {
273 return ! (this->max.x < other.min.x || this->min.x > other.max.x ||
274 this->max.y < other.min.y || this->min.y > other.max.y);
275 }
276 template bool BoundingBoxBase<Point>::overlap(const BoundingBoxBase<Point> &point) const;
277 template bool BoundingBoxBase<Pointf>::overlap(const BoundingBoxBase<Pointf> &point) const;
278
279 }
0 #ifndef slic3r_BoundingBox_hpp_
1 #define slic3r_BoundingBox_hpp_
2
3 #include "libslic3r.h"
4 #include "Point.hpp"
5 #include "Polygon.hpp"
6
7 namespace Slic3r {
8
9 typedef Point Size;
10 typedef Point3 Size3;
11 typedef Pointf Sizef;
12 typedef Pointf3 Sizef3;
13
14 template <class PointClass>
15 class BoundingBoxBase
16 {
17 public:
18 PointClass min;
19 PointClass max;
20 bool defined;
21
22 BoundingBoxBase() : defined(false) {};
23 BoundingBoxBase(const PointClass &pmin, const PointClass &pmax) :
24 min(pmin), max(pmax), defined(pmin.x < pmax.x && pmin.y < pmax.y) {}
25 BoundingBoxBase(const std::vector<PointClass> &points);
26 void merge(const PointClass &point);
27 void merge(const std::vector<PointClass> &points);
28 void merge(const BoundingBoxBase<PointClass> &bb);
29 void scale(double factor);
30 PointClass size() const;
31 double radius() const;
32 void translate(coordf_t x, coordf_t y);
33 void offset(coordf_t delta);
34 PointClass center() const;
35 bool contains(const PointClass &point) const;
36 bool overlap(const BoundingBoxBase<PointClass> &other) const;
37 };
38
39 template <class PointClass>
40 class BoundingBox3Base : public BoundingBoxBase<PointClass>
41 {
42 public:
43 BoundingBox3Base() : BoundingBoxBase<PointClass>() {};
44 BoundingBox3Base(const PointClass &pmin, const PointClass &pmax) :
45 BoundingBoxBase<PointClass>(pmin, pmax)
46 { if (pmin.z >= pmax.z) BoundingBoxBase<PointClass>::defined = false; }
47 BoundingBox3Base(const std::vector<PointClass> &points);
48 void merge(const PointClass &point);
49 void merge(const std::vector<PointClass> &points);
50 void merge(const BoundingBox3Base<PointClass> &bb);
51 PointClass size() const;
52 double radius() const;
53 void translate(coordf_t x, coordf_t y, coordf_t z);
54 void offset(coordf_t delta);
55 PointClass center() const;
56 };
57
58 class BoundingBox : public BoundingBoxBase<Point>
59 {
60 public:
61 void polygon(Polygon* polygon) const;
62 Polygon polygon() const;
63 BoundingBox rotated(double angle) const;
64 BoundingBox rotated(double angle, const Point &center) const;
65 void rotate(double angle) { (*this) = this->rotated(angle); }
66 void rotate(double angle, const Point &center) { (*this) = this->rotated(angle, center); }
67
68 BoundingBox() : BoundingBoxBase<Point>() {};
69 BoundingBox(const Point &pmin, const Point &pmax) : BoundingBoxBase<Point>(pmin, pmax) {};
70 BoundingBox(const Points &points) : BoundingBoxBase<Point>(points) {};
71 BoundingBox(const Lines &lines);
72
73 friend BoundingBox get_extents_rotated(const Points &points, double angle);
74 };
75
76 /*
77 class BoundingBox3 : public BoundingBox3Base<Point3> {};
78 */
79
80 class BoundingBoxf : public BoundingBoxBase<Pointf> {
81 public:
82 BoundingBoxf() : BoundingBoxBase<Pointf>() {};
83 BoundingBoxf(const Pointf &pmin, const Pointf &pmax) : BoundingBoxBase<Pointf>(pmin, pmax) {};
84 BoundingBoxf(const std::vector<Pointf> &points) : BoundingBoxBase<Pointf>(points) {};
85 };
86
87 class BoundingBoxf3 : public BoundingBox3Base<Pointf3> {
88 public:
89 BoundingBoxf3() : BoundingBox3Base<Pointf3>() {};
90 BoundingBoxf3(const Pointf3 &pmin, const Pointf3 &pmax) : BoundingBox3Base<Pointf3>(pmin, pmax) {};
91 BoundingBoxf3(const std::vector<Pointf3> &points) : BoundingBox3Base<Pointf3>(points) {};
92 };
93
94 template<typename VT>
95 inline bool operator==(const BoundingBoxBase<VT> &bb1, const BoundingBoxBase<VT> &bb2)
96 {
97 return bb1.min == bb2.min && bb1.max == bb2.max;
98 }
99
100 template<typename VT>
101 inline bool operator!=(const BoundingBoxBase<VT> &bb1, const BoundingBoxBase<VT> &bb2)
102 {
103 return !(bb1 == bb2);
104 }
105
106 template<typename VT>
107 inline bool empty(const BoundingBoxBase<VT> &bb)
108 {
109 return ! bb.defined || bb.min.x >= bb.max.x || bb.min.y >= bb.max.y;
110 }
111
112 template<typename VT>
113 inline bool empty(const BoundingBox3Base<VT> &bb)
114 {
115 return ! bb.defined || bb.min.x >= bb.max.x || bb.min.y >= bb.max.y || bb.min.z >= bb.max.z;
116 }
117
118 } // namespace Slic3r
119
120 #endif
0 #include "BridgeDetector.hpp"
1 #include "ClipperUtils.hpp"
2 #include "Geometry.hpp"
3 #include <algorithm>
4
5 namespace Slic3r {
6
7 BridgeDetector::BridgeDetector(
8 ExPolygon _expolygon,
9 const ExPolygonCollection &_lower_slices,
10 coord_t _spacing) :
11 // The original infill polygon, not inflated.
12 expolygons(expolygons_owned),
13 // All surfaces of the object supporting this region.
14 lower_slices(_lower_slices),
15 spacing(_spacing)
16 {
17 this->expolygons_owned.push_back(STDMOVE(_expolygon));
18 initialize();
19 }
20
21 BridgeDetector::BridgeDetector(
22 const ExPolygons &_expolygons,
23 const ExPolygonCollection &_lower_slices,
24 coord_t _spacing) :
25 // The original infill polygon, not inflated.
26 expolygons(_expolygons),
27 // All surfaces of the object supporting this region.
28 lower_slices(_lower_slices),
29 spacing(_spacing)
30 {
31 initialize();
32 }
33
34 void BridgeDetector::initialize()
35 {
36 // 5 degrees stepping
37 this->resolution = PI/36.0;
38 // output angle not known
39 this->angle = -1.;
40
41 // Outset our bridge by an arbitrary amout; we'll use this outer margin for detecting anchors.
42 Polygons grown = offset(this->expolygons, float(this->spacing));
43
44 // Detect possible anchoring edges of this bridging region.
45 // Detect what edges lie on lower slices by turning bridge contour and holes
46 // into polylines and then clipping them with each lower slice's contour.
47 // Currently _edges are only used to set a candidate direction of the bridge (see bridge_direction_candidates()).
48 intersection(to_polylines(grown), this->lower_slices.contours(), &this->_edges);
49
50 #ifdef SLIC3R_DEBUG
51 printf(" bridge has " PRINTF_ZU " support(s)\n", this->_edges.size());
52 #endif
53
54 // detect anchors as intersection between our bridge expolygon and the lower slices
55 // safety offset required to avoid Clipper from detecting empty intersection while Boost actually found some edges
56 this->_anchor_regions = intersection_ex(grown, to_polygons(this->lower_slices.expolygons), true);
57
58 /*
59 if (0) {
60 require "Slic3r/SVG.pm";
61 Slic3r::SVG::output("bridge.svg",
62 expolygons => [ $self->expolygon ],
63 red_expolygons => $self->lower_slices,
64 polylines => $self->_edges,
65 );
66 }
67 */
68 }
69
70 bool
71 BridgeDetector::detect_angle()
72 {
73 if (this->_edges.empty() || this->_anchor_regions.empty())
74 // The bridging region is completely in the air, there are no anchors available at the layer below.
75 return false;
76
77 std::vector<BridgeDirection> candidates;
78 {
79 std::vector<double> angles = bridge_direction_candidates();
80 candidates.reserve(angles.size());
81 for (size_t i = 0; i < angles.size(); ++ i)
82 candidates.push_back(BridgeDirection(angles[i]));
83 }
84
85 /* Outset the bridge expolygon by half the amount we used for detecting anchors;
86 we'll use this one to clip our test lines and be sure that their endpoints
87 are inside the anchors and not on their contours leading to false negatives. */
88 Polygons clip_area = offset(this->expolygons, 0.5f * float(this->spacing));
89
90 /* we'll now try several directions using a rudimentary visibility check:
91 bridge in several directions and then sum the length of lines having both
92 endpoints within anchors */
93
94 bool have_coverage = false;
95 for (size_t i_angle = 0; i_angle < candidates.size(); ++ i_angle)
96 {
97 const double angle = candidates[i_angle].angle;
98
99 Lines lines;
100 {
101 // Get an oriented bounding box around _anchor_regions.
102 BoundingBox bbox = get_extents_rotated(this->_anchor_regions, - angle);
103 // Cover the region with line segments.
104 lines.reserve((bbox.max.y - bbox.min.y + this->spacing) / this->spacing);
105 double s = sin(angle);
106 double c = cos(angle);
107 //FIXME Vojtech: The lines shall be spaced half the line width from the edge, but then
108 // some of the test cases fail. Need to adjust the test cases then?
109 // for (coord_t y = bbox.min.y + this->spacing / 2; y <= bbox.max.y; y += this->spacing)
110 for (coord_t y = bbox.min.y; y <= bbox.max.y; y += this->spacing)
111 lines.push_back(Line(
112 Point((coord_t)round(c * bbox.min.x - s * y), (coord_t)round(c * y + s * bbox.min.x)),
113 Point((coord_t)round(c * bbox.max.x - s * y), (coord_t)round(c * y + s * bbox.max.x))));
114 }
115
116 double total_length = 0;
117 double max_length = 0;
118 {
119 Lines clipped_lines = intersection(lines, clip_area);
120 for (size_t i = 0; i < clipped_lines.size(); ++i) {
121 const Line &line = clipped_lines[i];
122 if (expolygons_contain(this->_anchor_regions, line.a) && expolygons_contain(this->_anchor_regions, line.b)) {
123 // This line could be anchored.
124 double len = line.length();
125 total_length += len;
126 max_length = std::max(max_length, len);
127 }
128 }
129 }
130 if (total_length == 0.)
131 continue;
132
133 have_coverage = true;
134 // Sum length of bridged lines.
135 candidates[i_angle].coverage = total_length;
136 /* The following produces more correct results in some cases and more broken in others.
137 TODO: investigate, as it looks more reliable than line clipping. */
138 // $directions_coverage{$angle} = sum(map $_->area, @{$self->coverage($angle)}) // 0;
139 // max length of bridged lines
140 candidates[i_angle].max_length = max_length;
141 }
142
143 // if no direction produced coverage, then there's no bridge direction
144 if (! have_coverage)
145 return false;
146
147 // sort directions by coverage - most coverage first
148 std::sort(candidates.begin(), candidates.end());
149
150 // if any other direction is within extrusion width of coverage, prefer it if shorter
151 // TODO: There are two options here - within width of the angle with most coverage, or within width of the currently perferred?
152 size_t i_best = 0;
153 for (size_t i = 1; i < candidates.size() && candidates[i_best].coverage - candidates[i].coverage < this->spacing; ++ i)
154 if (candidates[i].max_length < candidates[i_best].max_length)
155 i_best = i;
156
157 this->angle = candidates[i_best].angle;
158 if (this->angle >= PI)
159 this->angle -= PI;
160
161 #ifdef SLIC3R_DEBUG
162 printf(" Optimal infill angle is %d degrees\n", (int)Slic3r::Geometry::rad2deg(this->angle));
163 #endif
164
165 return true;
166 }
167
168 std::vector<double> BridgeDetector::bridge_direction_candidates() const
169 {
170 // we test angles according to configured resolution
171 std::vector<double> angles;
172 for (int i = 0; i <= PI/this->resolution; ++i)
173 angles.push_back(i * this->resolution);
174
175 // we also test angles of each bridge contour
176 {
177 Lines lines = to_lines(this->expolygons);
178 for (Lines::const_iterator line = lines.begin(); line != lines.end(); ++line)
179 angles.push_back(line->direction());
180 }
181
182 /* we also test angles of each open supporting edge
183 (this finds the optimal angle for C-shaped supports) */
184 for (Polylines::const_iterator edge = this->_edges.begin(); edge != this->_edges.end(); ++edge)
185 if (! edge->first_point().coincides_with(edge->last_point()))
186 angles.push_back(Line(edge->first_point(), edge->last_point()).direction());
187
188 // remove duplicates
189 double min_resolution = PI/180.0; // 1 degree
190 std::sort(angles.begin(), angles.end());
191 for (size_t i = 1; i < angles.size(); ++i) {
192 if (Slic3r::Geometry::directions_parallel(angles[i], angles[i-1], min_resolution)) {
193 angles.erase(angles.begin() + i);
194 --i;
195 }
196 }
197 /* compare first value with last one and remove the greatest one (PI)
198 in case they are parallel (PI, 0) */
199 if (Slic3r::Geometry::directions_parallel(angles.front(), angles.back(), min_resolution))
200 angles.pop_back();
201
202 return angles;
203 }
204
205 void
206 BridgeDetector::coverage(double angle, Polygons* coverage) const
207 {
208 if (angle == -1) angle = this->angle;
209 if (angle == -1) return;
210
211 // Get anchors, convert them to Polygons and rotate them.
212 Polygons anchors = to_polygons(this->_anchor_regions);
213 polygons_rotate(anchors, PI/2.0 - angle);
214
215 Polygons covered;
216 for (ExPolygons::const_iterator it_expoly = this->expolygons.begin(); it_expoly != this->expolygons.end(); ++ it_expoly)
217 {
218 // Clone our expolygon and rotate it so that we work with vertical lines.
219 ExPolygon expolygon = *it_expoly;
220 expolygon.rotate(PI/2.0 - angle);
221
222 /* Outset the bridge expolygon by half the amount we used for detecting anchors;
223 we'll use this one to generate our trapezoids and be sure that their vertices
224 are inside the anchors and not on their contours leading to false negatives. */
225 ExPolygons grown = offset_ex(expolygon, 0.5f * float(this->spacing));
226
227 // Compute trapezoids according to a vertical orientation
228 Polygons trapezoids;
229 for (ExPolygons::const_iterator it = grown.begin(); it != grown.end(); ++it)
230 it->get_trapezoids2(&trapezoids, PI/2.0);
231
232 for (Polygons::iterator trapezoid = trapezoids.begin(); trapezoid != trapezoids.end(); ++trapezoid) {
233 Lines supported = intersection(trapezoid->lines(), anchors);
234 size_t n_supported = 0;
235 // not nice, we need a more robust non-numeric check
236 for (size_t i = 0; i < supported.size(); ++i)
237 if (supported[i].length() >= this->spacing)
238 ++ n_supported;
239 if (n_supported >= 2)
240 covered.push_back(STDMOVE(*trapezoid));
241 }
242 }
243
244 // Unite the trapezoids before rotation, as the rotation creates tiny gaps and intersections between the trapezoids
245 // instead of exact overlaps.
246 covered = union_(covered);
247
248 // Intersect trapezoids with actual bridge area to remove extra margins and append it to result.
249 polygons_rotate(covered, -(PI/2.0 - angle));
250 intersection(covered, to_polygons(this->expolygons), coverage);
251
252 /*
253 if (0) {
254 my @lines = map @{$_->lines}, @$trapezoids;
255 $_->rotate(-(PI/2 - $angle), [0,0]) for @lines;
256
257 require "Slic3r/SVG.pm";
258 Slic3r::SVG::output(
259 "coverage_" . rad2deg($angle) . ".svg",
260 expolygons => [$self->expolygon],
261 green_expolygons => $self->_anchor_regions,
262 red_expolygons => $coverage,
263 lines => \@lines,
264 );
265 }
266 */
267 }
268
269 Polygons
270 BridgeDetector::coverage(double angle) const
271 {
272 Polygons pp;
273 this->coverage(angle, &pp);
274 return pp;
275 }
276
277 /* This method returns the bridge edges (as polylines) that are not supported
278 but would allow the entire bridge area to be bridged with detected angle
279 if supported too */
280 void
281 BridgeDetector::unsupported_edges(double angle, Polylines* unsupported) const
282 {
283 if (angle == -1) angle = this->angle;
284 if (angle == -1) return;
285
286 Polygons grown_lower = offset(this->lower_slices.expolygons, float(this->spacing));
287
288 for (ExPolygons::const_iterator it_expoly = this->expolygons.begin(); it_expoly != this->expolygons.end(); ++ it_expoly) {
289 // get unsupported bridge edges (both contour and holes)
290 Polylines unuspported_polylines;
291 diff(to_polylines(*it_expoly), grown_lower, &unuspported_polylines);
292 Lines unsupported_lines = to_lines(unuspported_polylines);
293 /* Split into individual segments and filter out edges parallel to the bridging angle
294 TODO: angle tolerance should probably be based on segment length and flow width,
295 so that we build supports whenever there's a chance that at least one or two bridge
296 extrusions would be anchored within such length (i.e. a slightly non-parallel bridging
297 direction might still benefit from anchors if long enough)
298 double angle_tolerance = PI / 180.0 * 5.0; */
299 for (Lines::const_iterator line = unsupported_lines.begin(); line != unsupported_lines.end(); ++line) {
300 if (!Slic3r::Geometry::directions_parallel(line->direction(), angle))
301 unsupported->push_back(*line);
302 }
303 }
304
305 /*
306 if (0) {
307 require "Slic3r/SVG.pm";
308 Slic3r::SVG::output(
309 "unsupported_" . rad2deg($angle) . ".svg",
310 expolygons => [$self->expolygon],
311 green_expolygons => $self->_anchor_regions,
312 red_expolygons => union_ex($grown_lower),
313 no_arrows => 1,
314 polylines => \@bridge_edges,
315 red_polylines => $unsupported,
316 );
317 }
318 */
319 }
320
321 Polylines
322 BridgeDetector::unsupported_edges(double angle) const
323 {
324 Polylines pp;
325 this->unsupported_edges(angle, &pp);
326 return pp;
327 }
328
329 }
0 #ifndef slic3r_BridgeDetector_hpp_
1 #define slic3r_BridgeDetector_hpp_
2
3 #include "libslic3r.h"
4 #include "ExPolygon.hpp"
5 #include "ExPolygonCollection.hpp"
6 #include <string>
7
8 namespace Slic3r {
9
10 // The bridge detector optimizes a direction of bridges over a region or a set of regions.
11 // A bridge direction is considered optimal, if the length of the lines strang over the region is maximal.
12 // This is optimal if the bridge is supported in a single direction only, but
13 // it may not likely be optimal, if the bridge region is supported from all sides. Then an optimal
14 // solution would find a direction with shortest bridges.
15 // The bridge orientation is measured CCW from the X axis.
16 class BridgeDetector {
17 public:
18 // The non-grown holes.
19 const ExPolygons &expolygons;
20 // In case the caller gaves us the input polygons by a value, make a copy.
21 ExPolygons expolygons_owned;
22 // Lower slices, all regions.
23 const ExPolygonCollection &lower_slices;
24 // Scaled extrusion width of the infill.
25 coord_t spacing;
26 // Angle resolution for the brute force search of the best bridging angle.
27 double resolution;
28 // The final optimal angle.
29 double angle;
30
31 BridgeDetector(ExPolygon _expolygon, const ExPolygonCollection &_lower_slices, coord_t _extrusion_width);
32 BridgeDetector(const ExPolygons &_expolygons, const ExPolygonCollection &_lower_slices, coord_t _extrusion_width);
33 bool detect_angle();
34 void coverage(double angle, Polygons* coverage) const;
35 Polygons coverage(double angle = -1) const;
36 void unsupported_edges(double angle, Polylines* unsupported) const;
37 Polylines unsupported_edges(double angle = -1) const;
38
39 private:
40 void initialize();
41
42 struct BridgeDirection {
43 BridgeDirection(double a = -1.) : angle(a), coverage(0.), max_length(0.) {}
44 // the best direction is the one causing most lines to be bridged (thus most coverage)
45 bool operator<(const BridgeDirection &other) const {
46 // Initial sort by coverage only - comparator must obey strict weak ordering
47 return this->coverage > other.coverage;
48 };
49 double angle;
50 double coverage;
51 double max_length;
52 };
53
54 // Get possible briging direction candidates.
55 std::vector<double> bridge_direction_candidates() const;
56
57 // Open lines representing the supporting edges.
58 Polylines _edges;
59 // Closed polygons representing the supporting areas.
60 ExPolygons _anchor_regions;
61 };
62
63 }
64
65 #endif
0 #include "ClipperUtils.hpp"
1 #include "Geometry.hpp"
2
3 // #define CLIPPER_UTILS_DEBUG
4
5 #ifdef CLIPPER_UTILS_DEBUG
6 #include "SVG.hpp"
7 #endif /* CLIPPER_UTILS_DEBUG */
8
9 namespace Slic3r {
10
11 //-----------------------------------------------------------
12 // legacy code from Clipper documentation
13 void AddOuterPolyNodeToExPolygons(ClipperLib::PolyNode& polynode, Slic3r::ExPolygons* expolygons)
14 {
15 size_t cnt = expolygons->size();
16 expolygons->resize(cnt + 1);
17 ClipperPath_to_Slic3rMultiPoint(polynode.Contour, &(*expolygons)[cnt].contour);
18 (*expolygons)[cnt].holes.resize(polynode.ChildCount());
19 for (int i = 0; i < polynode.ChildCount(); ++i)
20 {
21 ClipperPath_to_Slic3rMultiPoint(polynode.Childs[i]->Contour, &(*expolygons)[cnt].holes[i]);
22 //Add outer polygons contained by (nested within) holes ...
23 for (int j = 0; j < polynode.Childs[i]->ChildCount(); ++j)
24 AddOuterPolyNodeToExPolygons(*polynode.Childs[i]->Childs[j], expolygons);
25 }
26 }
27
28 void PolyTreeToExPolygons(ClipperLib::PolyTree& polytree, Slic3r::ExPolygons* expolygons)
29 {
30 expolygons->clear();
31 for (int i = 0; i < polytree.ChildCount(); ++i)
32 AddOuterPolyNodeToExPolygons(*polytree.Childs[i], expolygons);
33 }
34 //-----------------------------------------------------------
35
36 template <class T>
37 void
38 ClipperPath_to_Slic3rMultiPoint(const ClipperLib::Path &input, T* output)
39 {
40 output->points.clear();
41 output->points.reserve(input.size());
42 for (ClipperLib::Path::const_iterator pit = input.begin(); pit != input.end(); ++pit)
43 output->points.push_back(Slic3r::Point( (*pit).X, (*pit).Y ));
44 }
45 template void ClipperPath_to_Slic3rMultiPoint<Slic3r::Polygon>(const ClipperLib::Path &input, Slic3r::Polygon* output);
46
47 template <class T>
48 void
49 ClipperPaths_to_Slic3rMultiPoints(const ClipperLib::Paths &input, T* output)
50 {
51 output->clear();
52 output->reserve(input.size());
53 for (ClipperLib::Paths::const_iterator it = input.begin(); it != input.end(); ++it) {
54 typename T::value_type p;
55 ClipperPath_to_Slic3rMultiPoint(*it, &p);
56 output->push_back(p);
57 }
58 }
59
60 void
61 ClipperPaths_to_Slic3rExPolygons(const ClipperLib::Paths &input, Slic3r::ExPolygons* output)
62 {
63 // init Clipper
64 ClipperLib::Clipper clipper;
65 clipper.Clear();
66
67 // perform union
68 clipper.AddPaths(input, ClipperLib::ptSubject, true);
69 ClipperLib::PolyTree polytree;
70 clipper.Execute(ClipperLib::ctUnion, polytree, ClipperLib::pftEvenOdd, ClipperLib::pftEvenOdd); // offset results work with both EvenOdd and NonZero
71
72 // write to ExPolygons object
73 output->clear();
74 PolyTreeToExPolygons(polytree, output);
75 }
76
77 void
78 Slic3rMultiPoint_to_ClipperPath(const Slic3r::MultiPoint &input, ClipperLib::Path* output)
79 {
80 output->clear();
81 output->reserve(input.points.size());
82 for (Slic3r::Points::const_iterator pit = input.points.begin(); pit != input.points.end(); ++pit)
83 output->push_back(ClipperLib::IntPoint( (*pit).x, (*pit).y ));
84 }
85
86 void
87 Slic3rMultiPoint_to_ClipperPath_reversed(const Slic3r::MultiPoint &input, ClipperLib::Path* output)
88 {
89 output->clear();
90 output->reserve(input.points.size());
91 for (Slic3r::Points::const_reverse_iterator pit = input.points.rbegin(); pit != input.points.rend(); ++pit)
92 output->push_back(ClipperLib::IntPoint( (*pit).x, (*pit).y ));
93 }
94
95 template <class T>
96 void
97 Slic3rMultiPoints_to_ClipperPaths(const T &input, ClipperLib::Paths* output)
98 {
99 output->clear();
100 output->reserve(input.size());
101 for (typename T::const_iterator it = input.begin(); it != input.end(); ++it) {
102 // std::vector< IntPoint >, IntPoint is a pair of int64_t
103 ClipperLib::Path p;
104 Slic3rMultiPoint_to_ClipperPath(*it, &p);
105 output->push_back(p);
106 }
107 }
108
109 void
110 scaleClipperPolygon(ClipperLib::Path &polygon, const double scale)
111 {
112 for (ClipperLib::Path::iterator pit = polygon.begin(); pit != polygon.end(); ++pit) {
113 //FIXME multiplication of int64_t by double!
114 // Replace by bit shifts?
115 (*pit).X *= scale;
116 (*pit).Y *= scale;
117 }
118 }
119
120 void
121 scaleClipperPolygons(ClipperLib::Paths &polygons, const double scale)
122 {
123 for (ClipperLib::Paths::iterator it = polygons.begin(); it != polygons.end(); ++it) {
124 for (ClipperLib::Path::iterator pit = (*it).begin(); pit != (*it).end(); ++pit) {
125 //FIXME multiplication of int64_t by double!
126 // Replace by bit shifts?
127 (*pit).X *= scale;
128 (*pit).Y *= scale;
129 }
130 }
131 }
132
133 void
134 offset(const Slic3r::Polygons &polygons, ClipperLib::Paths* retval, const float delta,
135 double scale, ClipperLib::JoinType joinType, double miterLimit)
136 {
137 // read input
138 ClipperLib::Paths input;
139 Slic3rMultiPoints_to_ClipperPaths(polygons, &input);
140
141 // scale input
142 scaleClipperPolygons(input, scale);
143
144 // perform offset
145 ClipperLib::ClipperOffset co;
146 if (joinType == jtRound) {
147 co.ArcTolerance = miterLimit;
148 } else {
149 co.MiterLimit = miterLimit;
150 }
151 co.AddPaths(input, joinType, ClipperLib::etClosedPolygon);
152 co.Execute(*retval, (delta*scale));
153
154 // unscale output
155 scaleClipperPolygons(*retval, 1/scale);
156 }
157
158 void
159 offset(const Slic3r::Polygons &polygons, Slic3r::Polygons* retval, const float delta,
160 double scale, ClipperLib::JoinType joinType, double miterLimit)
161 {
162 // perform offset
163 ClipperLib::Paths output;
164 offset(polygons, &output, delta, scale, joinType, miterLimit);
165
166 // convert into ExPolygons
167 ClipperPaths_to_Slic3rMultiPoints(output, retval);
168 }
169
170 Slic3r::Polygons
171 offset(const Slic3r::Polygons &polygons, const float delta,
172 double scale, ClipperLib::JoinType joinType, double miterLimit)
173 {
174 Slic3r::Polygons pp;
175 offset(polygons, &pp, delta, scale, joinType, miterLimit);
176 return pp;
177 }
178
179 void
180 offset(const Slic3r::Polylines &polylines, ClipperLib::Paths* retval, const float delta,
181 double scale, ClipperLib::JoinType joinType, double miterLimit)
182 {
183 // read input
184 ClipperLib::Paths input;
185 Slic3rMultiPoints_to_ClipperPaths(polylines, &input);
186
187 // scale input
188 scaleClipperPolygons(input, scale);
189
190 // perform offset
191 ClipperLib::ClipperOffset co;
192 if (joinType == jtRound) {
193 co.ArcTolerance = miterLimit;
194 } else {
195 co.MiterLimit = miterLimit;
196 }
197 co.AddPaths(input, joinType, ClipperLib::etOpenButt);
198 co.Execute(*retval, (delta*scale));
199
200 // unscale output
201 scaleClipperPolygons(*retval, 1/scale);
202 }
203
204 void
205 offset(const Slic3r::Polylines &polylines, Slic3r::Polygons* retval, const float delta,
206 double scale, ClipperLib::JoinType joinType, double miterLimit)
207 {
208 // perform offset
209 ClipperLib::Paths output;
210 offset(polylines, &output, delta, scale, joinType, miterLimit);
211
212 // convert into ExPolygons
213 ClipperPaths_to_Slic3rMultiPoints(output, retval);
214 }
215
216 void
217 offset(const Slic3r::Surface &surface, Slic3r::Surfaces* retval, const float delta,
218 double scale, ClipperLib::JoinType joinType, double miterLimit)
219 {
220 // perform offset
221 Slic3r::ExPolygons expp;
222 offset(surface.expolygon, &expp, delta, scale, joinType, miterLimit);
223
224 // clone the input surface for each expolygon we got
225 retval->clear();
226 retval->reserve(expp.size());
227 for (ExPolygons::iterator it = expp.begin(); it != expp.end(); ++it) {
228 Surface s = surface; // clone
229 s.expolygon = *it;
230 retval->push_back(s);
231 }
232 }
233
234 void
235 offset(const Slic3r::Polygons &polygons, Slic3r::ExPolygons* retval, const float delta,
236 double scale, ClipperLib::JoinType joinType, double miterLimit)
237 {
238 // perform offset
239 ClipperLib::Paths output;
240 offset(polygons, &output, delta, scale, joinType, miterLimit);
241
242 // convert into ExPolygons
243 ClipperPaths_to_Slic3rExPolygons(output, retval);
244 }
245
246 // This is a safe variant of the polygon offset, tailored for a single ExPolygon:
247 // a single polygon with multiple non-overlapping holes.
248 // Each contour and hole is offsetted separately, then the holes are subtracted from the outer contours.
249 void offset(const Slic3r::ExPolygon &expolygon, ClipperLib::Paths* retval, const float delta,
250 double scale, ClipperLib::JoinType joinType, double miterLimit)
251 {
252 // printf("new ExPolygon offset\n");
253 // 1) Offset the outer contour.
254 const float delta_scaled = float(delta * scale);
255 ClipperLib::Paths contours;
256 {
257 ClipperLib::Path input;
258 Slic3rMultiPoint_to_ClipperPath(expolygon.contour, &input);
259 scaleClipperPolygon(input, scale);
260 ClipperLib::ClipperOffset co;
261 if (joinType == jtRound)
262 co.ArcTolerance = miterLimit;
263 else
264 co.MiterLimit = miterLimit;
265 co.AddPath(input, joinType, ClipperLib::etClosedPolygon);
266 co.Execute(contours, delta_scaled);
267 }
268
269 // 2) Offset the holes one by one, collect the results.
270 ClipperLib::Paths holes;
271 {
272 holes.reserve(expolygon.holes.size());
273 for (Polygons::const_iterator it_hole = expolygon.holes.begin(); it_hole != expolygon.holes.end(); ++ it_hole) {
274 ClipperLib::Path input;
275 Slic3rMultiPoint_to_ClipperPath_reversed(*it_hole, &input);
276 scaleClipperPolygon(input, scale);
277 ClipperLib::ClipperOffset co;
278 if (joinType == jtRound)
279 co.ArcTolerance = miterLimit;
280 else
281 co.MiterLimit = miterLimit;
282 co.AddPath(input, joinType, ClipperLib::etClosedPolygon);
283 ClipperLib::Paths out;
284 co.Execute(out, - delta_scaled);
285 holes.insert(holes.end(), out.begin(), out.end());
286 }
287 }
288
289 // 3) Subtract holes from the contours.
290 ClipperLib::Paths output;
291 {
292 ClipperLib::Clipper clipper;
293 clipper.Clear();
294 clipper.AddPaths(contours, ClipperLib::ptSubject, true);
295 clipper.AddPaths(holes, ClipperLib::ptClip, true);
296 clipper.Execute(ClipperLib::ctDifference, *retval, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
297 }
298
299 // 4) Unscale the output.
300 scaleClipperPolygons(*retval, 1/scale);
301 }
302
303 Slic3r::Polygons offset(const Slic3r::ExPolygon &expolygon, const float delta,
304 double scale, ClipperLib::JoinType joinType, double miterLimit)
305 {
306 // perform offset
307 ClipperLib::Paths output;
308 offset(expolygon, &output, delta, scale, joinType, miterLimit);
309
310 // convert into ExPolygons
311 Slic3r::Polygons retval;
312 ClipperPaths_to_Slic3rMultiPoints(output, &retval);
313 return retval;
314 }
315
316 Slic3r::ExPolygons offset_ex(const Slic3r::ExPolygon &expolygon, const float delta,
317 double scale, ClipperLib::JoinType joinType, double miterLimit)
318 {
319 // perform offset
320 ClipperLib::Paths output;
321 offset(expolygon, &output, delta, scale, joinType, miterLimit);
322
323 // convert into ExPolygons
324 Slic3r::ExPolygons retval;
325 ClipperPaths_to_Slic3rExPolygons(output, &retval);
326 return retval;
327 }
328
329 // This is a safe variant of the polygon offset, tailored for a single ExPolygon:
330 // a single polygon with multiple non-overlapping holes.
331 // Each contour and hole is offsetted separately, then the holes are subtracted from the outer contours.
332 void offset(const Slic3r::ExPolygons &expolygons, ClipperLib::Paths* retval, const float delta,
333 double scale, ClipperLib::JoinType joinType, double miterLimit)
334 {
335 // printf("new ExPolygon offset\n");
336 const float delta_scaled = float(delta * scale);
337 ClipperLib::Paths contours;
338 ClipperLib::Paths holes;
339 contours.reserve(expolygons.size());
340 {
341 size_t n_holes = 0;
342 for (size_t i = 0; i < expolygons.size(); ++ i)
343 n_holes += expolygons[i].holes.size();
344 holes.reserve(n_holes);
345 }
346
347 for (Slic3r::ExPolygons::const_iterator it_expoly = expolygons.begin(); it_expoly != expolygons.end(); ++ it_expoly) {
348 // 1) Offset the outer contour.
349 {
350 ClipperLib::Path input;
351 Slic3rMultiPoint_to_ClipperPath(it_expoly->contour, &input);
352 scaleClipperPolygon(input, scale);
353 ClipperLib::ClipperOffset co;
354 if (joinType == jtRound)
355 co.ArcTolerance = miterLimit;
356 else
357 co.MiterLimit = miterLimit;
358 co.AddPath(input, joinType, ClipperLib::etClosedPolygon);
359 ClipperLib::Paths out;
360 co.Execute(out, delta_scaled);
361 contours.insert(contours.end(), out.begin(), out.end());
362 }
363
364 // 2) Offset the holes one by one, collect the results.
365 {
366 for (Polygons::const_iterator it_hole = it_expoly->holes.begin(); it_hole != it_expoly->holes.end(); ++ it_hole) {
367 ClipperLib::Path input;
368 Slic3rMultiPoint_to_ClipperPath_reversed(*it_hole, &input);
369 scaleClipperPolygon(input, scale);
370 ClipperLib::ClipperOffset co;
371 if (joinType == jtRound)
372 co.ArcTolerance = miterLimit;
373 else
374 co.MiterLimit = miterLimit;
375 co.AddPath(input, joinType, ClipperLib::etClosedPolygon);
376 ClipperLib::Paths out;
377 co.Execute(out, - delta_scaled);
378 holes.insert(holes.end(), out.begin(), out.end());
379 }
380 }
381 }
382
383 // 3) Subtract holes from the contours.
384 ClipperLib::Paths output;
385 {
386 ClipperLib::Clipper clipper;
387 clipper.Clear();
388 clipper.AddPaths(contours, ClipperLib::ptSubject, true);
389 clipper.AddPaths(holes, ClipperLib::ptClip, true);
390 clipper.Execute(ClipperLib::ctDifference, *retval, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
391 }
392
393 // 4) Unscale the output.
394 scaleClipperPolygons(*retval, 1/scale);
395 }
396
397 Slic3r::Polygons offset(const Slic3r::ExPolygons &expolygons, const float delta,
398 double scale, ClipperLib::JoinType joinType, double miterLimit)
399 {
400 // perform offset
401 ClipperLib::Paths output;
402 offset(expolygons, &output, delta, scale, joinType, miterLimit);
403
404 // convert into ExPolygons
405 Slic3r::Polygons retval;
406 ClipperPaths_to_Slic3rMultiPoints(output, &retval);
407 return retval;
408 }
409
410 Slic3r::ExPolygons offset_ex(const Slic3r::ExPolygons &expolygons, const float delta,
411 double scale, ClipperLib::JoinType joinType, double miterLimit)
412 {
413 // perform offset
414 ClipperLib::Paths output;
415 offset(expolygons, &output, delta, scale, joinType, miterLimit);
416
417 // convert into ExPolygons
418 Slic3r::ExPolygons retval;
419 ClipperPaths_to_Slic3rExPolygons(output, &retval);
420 return retval;
421 }
422
423 Slic3r::ExPolygons
424 offset_ex(const Slic3r::Polygons &polygons, const float delta,
425 double scale, ClipperLib::JoinType joinType, double miterLimit)
426 {
427 Slic3r::ExPolygons expp;
428 offset(polygons, &expp, delta, scale, joinType, miterLimit);
429 return expp;
430 }
431
432 void
433 offset2(const Slic3r::Polygons &polygons, ClipperLib::Paths* retval, const float delta1,
434 const float delta2, const double scale, const ClipperLib::JoinType joinType, const double miterLimit)
435 {
436 #ifdef CLIPPER_UTILS_DEBUG
437 BoundingBox bbox = get_extents(polygons);
438 coordf_t stroke_width = scale_(0.005);
439 static int iRun = 0;
440 ++ iRun;
441 bool flipY = false;
442 SVG svg(debug_out_path("offset2-%d.svg", iRun), bbox, scale_(1.), flipY);
443 for (Slic3r::Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++ it)
444 svg.draw(it->lines(), "gray", stroke_width);
445 #endif /* CLIPPER_UTILS_DEBUG */
446
447 // read input
448 ClipperLib::Paths input;
449 Slic3rMultiPoints_to_ClipperPaths(polygons, &input);
450
451 // scale input
452 scaleClipperPolygons(input, scale);
453
454 // prepare ClipperOffset object
455 ClipperLib::ClipperOffset co;
456 if (joinType == jtRound) {
457 co.ArcTolerance = miterLimit;
458 } else {
459 co.MiterLimit = miterLimit;
460 }
461
462 // perform first offset
463 ClipperLib::Paths output1;
464 co.AddPaths(input, joinType, ClipperLib::etClosedPolygon);
465 co.Execute(output1, (delta1*scale));
466 #ifdef CLIPPER_UTILS_DEBUG
467 svg.draw(output1, 1./CLIPPER_OFFSET_SCALE, "red", stroke_width);
468 #endif /* CLIPPER_UTILS_DEBUG */
469
470 // perform second offset
471 co.Clear();
472 co.AddPaths(output1, joinType, ClipperLib::etClosedPolygon);
473 co.Execute(*retval, (delta2*scale));
474 #ifdef CLIPPER_UTILS_DEBUG
475 svg.draw(*retval, 1./CLIPPER_OFFSET_SCALE, "green", stroke_width);
476 #endif /* CLIPPER_UTILS_DEBUG */
477
478 // unscale output
479 scaleClipperPolygons(*retval, 1/scale);
480 }
481
482 void
483 offset2(const Slic3r::Polygons &polygons, Slic3r::Polygons* retval, const float delta1,
484 const float delta2, const double scale, const ClipperLib::JoinType joinType, const double miterLimit)
485 {
486 // perform offset
487 ClipperLib::Paths output;
488 offset2(polygons, &output, delta1, delta2, scale, joinType, miterLimit);
489
490 // convert into ExPolygons
491 ClipperPaths_to_Slic3rMultiPoints(output, retval);
492 }
493
494 Slic3r::Polygons
495 offset2(const Slic3r::Polygons &polygons, const float delta1,
496 const float delta2, const double scale, const ClipperLib::JoinType joinType, const double miterLimit)
497 {
498 Slic3r::Polygons pp;
499 offset2(polygons, &pp, delta1, delta2, scale, joinType, miterLimit);
500 return pp;
501 }
502
503 void
504 offset2(const Slic3r::Polygons &polygons, Slic3r::ExPolygons* retval, const float delta1,
505 const float delta2, const double scale, const ClipperLib::JoinType joinType, const double miterLimit)
506 {
507 // perform offset
508 ClipperLib::Paths output;
509 offset2(polygons, &output, delta1, delta2, scale, joinType, miterLimit);
510
511 // convert into ExPolygons
512 ClipperPaths_to_Slic3rExPolygons(output, retval);
513 }
514
515 Slic3r::ExPolygons
516 offset2_ex(const Slic3r::Polygons &polygons, const float delta1,
517 const float delta2, const double scale, const ClipperLib::JoinType joinType, const double miterLimit)
518 {
519 Slic3r::ExPolygons expp;
520 offset2(polygons, &expp, delta1, delta2, scale, joinType, miterLimit);
521 return expp;
522 }
523
524 template <class T>
525 void _clipper_do(const ClipperLib::ClipType clipType, const Slic3r::Polygons &subject,
526 const Slic3r::Polygons &clip, T* retval, const ClipperLib::PolyFillType fillType, const bool safety_offset_)
527 {
528 // read input
529 ClipperLib::Paths input_subject, input_clip;
530 Slic3rMultiPoints_to_ClipperPaths(subject, &input_subject);
531 Slic3rMultiPoints_to_ClipperPaths(clip, &input_clip);
532
533 // perform safety offset
534 if (safety_offset_) {
535 if (clipType == ClipperLib::ctUnion) {
536 safety_offset(&input_subject);
537 } else {
538 safety_offset(&input_clip);
539 }
540 }
541
542 // init Clipper
543 ClipperLib::Clipper clipper;
544 clipper.Clear();
545
546 // add polygons
547 clipper.AddPaths(input_subject, ClipperLib::ptSubject, true);
548 clipper.AddPaths(input_clip, ClipperLib::ptClip, true);
549
550 // perform operation
551 clipper.Execute(clipType, *retval, fillType, fillType);
552 }
553
554 void _clipper_do(const ClipperLib::ClipType clipType, const Slic3r::Polylines &subject,
555 const Slic3r::Polygons &clip, ClipperLib::PolyTree* retval, const ClipperLib::PolyFillType fillType,
556 const bool safety_offset_)
557 {
558 // read input
559 ClipperLib::Paths input_subject, input_clip;
560 Slic3rMultiPoints_to_ClipperPaths(subject, &input_subject);
561 Slic3rMultiPoints_to_ClipperPaths(clip, &input_clip);
562
563 // perform safety offset
564 if (safety_offset_) safety_offset(&input_clip);
565
566 // init Clipper
567 ClipperLib::Clipper clipper;
568 clipper.Clear();
569
570 // add polygons
571 clipper.AddPaths(input_subject, ClipperLib::ptSubject, false);
572 clipper.AddPaths(input_clip, ClipperLib::ptClip, true);
573
574 // perform operation
575 clipper.Execute(clipType, *retval, fillType, fillType);
576 }
577
578 void _clipper(ClipperLib::ClipType clipType, const Slic3r::Polygons &subject,
579 const Slic3r::Polygons &clip, Slic3r::Polygons* retval, bool safety_offset_)
580 {
581 // perform operation
582 ClipperLib::Paths output;
583 _clipper_do<ClipperLib::Paths>(clipType, subject, clip, &output, ClipperLib::pftNonZero, safety_offset_);
584
585 // convert into Polygons
586 ClipperPaths_to_Slic3rMultiPoints(output, retval);
587 }
588
589 void _clipper(ClipperLib::ClipType clipType, const Slic3r::Polygons &subject,
590 const Slic3r::Polygons &clip, Slic3r::ExPolygons* retval, bool safety_offset_)
591 {
592 // perform operation
593 ClipperLib::PolyTree polytree;
594 _clipper_do<ClipperLib::PolyTree>(clipType, subject, clip, &polytree, ClipperLib::pftNonZero, safety_offset_);
595
596 // convert into ExPolygons
597 PolyTreeToExPolygons(polytree, retval);
598 }
599
600 void _clipper(ClipperLib::ClipType clipType, const Slic3r::Polylines &subject,
601 const Slic3r::Polygons &clip, Slic3r::Polylines* retval, bool safety_offset_)
602 {
603 // perform operation
604 ClipperLib::PolyTree polytree;
605 _clipper_do(clipType, subject, clip, &polytree, ClipperLib::pftNonZero, safety_offset_);
606
607 // convert into Polylines
608 ClipperLib::Paths output;
609 ClipperLib::PolyTreeToPaths(polytree, output);
610 ClipperPaths_to_Slic3rMultiPoints(output, retval);
611 }
612
613 void _clipper(ClipperLib::ClipType clipType, const Slic3r::Lines &subject,
614 const Slic3r::Polygons &clip, Slic3r::Lines* retval, bool safety_offset_)
615 {
616 // convert Lines to Polylines
617 Slic3r::Polylines polylines;
618 polylines.reserve(subject.size());
619 for (Slic3r::Lines::const_iterator line = subject.begin(); line != subject.end(); ++line)
620 polylines.push_back(*line);
621
622 // perform operation
623 _clipper(clipType, polylines, clip, &polylines, safety_offset_);
624
625 // convert Polylines to Lines
626 for (Slic3r::Polylines::const_iterator polyline = polylines.begin(); polyline != polylines.end(); ++polyline)
627 retval->push_back(*polyline);
628 }
629
630 void _clipper(ClipperLib::ClipType clipType, const Slic3r::Polygons &subject,
631 const Slic3r::Polygons &clip, Slic3r::Polylines* retval, bool safety_offset_)
632 {
633 // transform input polygons into polylines
634 Slic3r::Polylines polylines;
635 polylines.reserve(subject.size());
636 for (Slic3r::Polygons::const_iterator polygon = subject.begin(); polygon != subject.end(); ++polygon)
637 polylines.push_back(*polygon); // implicit call to split_at_first_point()
638
639 // perform clipping
640 _clipper(clipType, polylines, clip, retval, safety_offset_);
641
642 /* If the split_at_first_point() call above happens to split the polygon inside the clipping area
643 we would get two consecutive polylines instead of a single one, so we go through them in order
644 to recombine continuous polylines. */
645 for (size_t i = 0; i < retval->size(); ++i) {
646 for (size_t j = i+1; j < retval->size(); ++j) {
647 if ((*retval)[i].points.back().coincides_with((*retval)[j].points.front())) {
648 /* If last point of i coincides with first point of j,
649 append points of j to i and delete j */
650 (*retval)[i].points.insert((*retval)[i].points.end(), (*retval)[j].points.begin()+1, (*retval)[j].points.end());
651 retval->erase(retval->begin() + j);
652 --j;
653 } else if ((*retval)[i].points.front().coincides_with((*retval)[j].points.back())) {
654 /* If first point of i coincides with last point of j,
655 prepend points of j to i and delete j */
656 (*retval)[i].points.insert((*retval)[i].points.begin(), (*retval)[j].points.begin(), (*retval)[j].points.end()-1);
657 retval->erase(retval->begin() + j);
658 --j;
659 } else if ((*retval)[i].points.front().coincides_with((*retval)[j].points.front())) {
660 /* Since Clipper does not preserve orientation of polylines,
661 also check the case when first point of i coincides with first point of j. */
662 (*retval)[j].reverse();
663 (*retval)[i].points.insert((*retval)[i].points.begin(), (*retval)[j].points.begin(), (*retval)[j].points.end()-1);
664 retval->erase(retval->begin() + j);
665 --j;
666 } else if ((*retval)[i].points.back().coincides_with((*retval)[j].points.back())) {
667 /* Since Clipper does not preserve orientation of polylines,
668 also check the case when last point of i coincides with last point of j. */
669 (*retval)[j].reverse();
670 (*retval)[i].points.insert((*retval)[i].points.end(), (*retval)[j].points.begin()+1, (*retval)[j].points.end());
671 retval->erase(retval->begin() + j);
672 --j;
673 }
674 }
675 }
676 }
677
678 template <class SubjectType, class ResultType>
679 void diff(const SubjectType &subject, const Slic3r::Polygons &clip, ResultType* retval, bool safety_offset_)
680 {
681 _clipper(ClipperLib::ctDifference, subject, clip, retval, safety_offset_);
682 }
683 template void diff<Slic3r::Polygons, Slic3r::ExPolygons>(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, Slic3r::ExPolygons* retval, bool safety_offset_);
684 template void diff<Slic3r::Polygons, Slic3r::Polygons>(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, Slic3r::Polygons* retval, bool safety_offset_);
685 template void diff<Slic3r::Polygons, Slic3r::Polylines>(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, Slic3r::Polylines* retval, bool safety_offset_);
686 template void diff<Slic3r::Polylines, Slic3r::Polylines>(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip, Slic3r::Polylines* retval, bool safety_offset_);
687 template void diff<Slic3r::Lines, Slic3r::Lines>(const Slic3r::Lines &subject, const Slic3r::Polygons &clip, Slic3r::Lines* retval, bool safety_offset_);
688
689 template <class SubjectType, class ResultType>
690 void diff(const SubjectType &subject, const Slic3r::ExPolygons &clip, ResultType* retval, bool safety_offset_)
691 {
692 Slic3r::Polygons pp;
693 for (Slic3r::ExPolygons::const_iterator ex = clip.begin(); ex != clip.end(); ++ex) {
694 Slic3r::Polygons ppp = *ex;
695 pp.insert(pp.end(), ppp.begin(), ppp.end());
696 }
697 diff(subject, pp, retval, safety_offset_);
698 }
699 template void diff<Slic3r::Polygons, Slic3r::ExPolygons>(const Slic3r::Polygons &subject, const Slic3r::ExPolygons &clip, Slic3r::ExPolygons* retval, bool safety_offset_);
700
701 template <class ResultType>
702 void diff(const Slic3r::ExPolygons &subject, const Slic3r::ExPolygons &clip, ResultType* retval, bool safety_offset_)
703 {
704 Slic3r::Polygons pp;
705 for (Slic3r::ExPolygons::const_iterator ex = subject.begin(); ex != subject.end(); ++ex) {
706 Slic3r::Polygons ppp = *ex;
707 pp.insert(pp.end(), ppp.begin(), ppp.end());
708 }
709 diff(pp, clip, retval, safety_offset_);
710 }
711
712 Slic3r::Polygons
713 diff(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, bool safety_offset_)
714 {
715 Slic3r::Polygons pp;
716 diff(subject, clip, &pp, safety_offset_);
717 return pp;
718 }
719
720 template <class SubjectType, class ClipType>
721 Slic3r::ExPolygons
722 diff_ex(const SubjectType &subject, const ClipType &clip, bool safety_offset_)
723 {
724 Slic3r::ExPolygons expp;
725 diff(subject, clip, &expp, safety_offset_);
726 return expp;
727 }
728 template Slic3r::ExPolygons diff_ex<Slic3r::Polygons, Slic3r::Polygons>(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, bool safety_offset_);
729 template Slic3r::ExPolygons diff_ex<Slic3r::Polygons, Slic3r::ExPolygons>(const Slic3r::Polygons &subject, const Slic3r::ExPolygons &clip, bool safety_offset_);
730 template Slic3r::ExPolygons diff_ex<Slic3r::ExPolygons, Slic3r::ExPolygons>(const Slic3r::ExPolygons &subject, const Slic3r::ExPolygons &clip, bool safety_offset_);
731
732 template <class SubjectType, class ResultType>
733 void intersection(const SubjectType &subject, const Slic3r::Polygons &clip, ResultType* retval, bool safety_offset_)
734 {
735 _clipper(ClipperLib::ctIntersection, subject, clip, retval, safety_offset_);
736 }
737 template void intersection<Slic3r::Polygons, Slic3r::ExPolygons>(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, Slic3r::ExPolygons* retval, bool safety_offset_);
738 template void intersection<Slic3r::Polygons, Slic3r::Polygons>(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, Slic3r::Polygons* retval, bool safety_offset_);
739 template void intersection<Slic3r::Polygons, Slic3r::Polylines>(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, Slic3r::Polylines* retval, bool safety_offset_);
740 template void intersection<Slic3r::Polylines, Slic3r::Polylines>(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip, Slic3r::Polylines* retval, bool safety_offset_);
741 template void intersection<Slic3r::Lines, Slic3r::Lines>(const Slic3r::Lines &subject, const Slic3r::Polygons &clip, Slic3r::Lines* retval, bool safety_offset_);
742
743 template <class SubjectType>
744 SubjectType intersection(const SubjectType &subject, const Slic3r::Polygons &clip, bool safety_offset_)
745 {
746 SubjectType pp;
747 intersection(subject, clip, &pp, safety_offset_);
748 return pp;
749 }
750
751 template Slic3r::Polygons intersection<Slic3r::Polygons>(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, bool safety_offset_);
752 template Slic3r::Polylines intersection<Slic3r::Polylines>(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip, bool safety_offset_);
753 template Slic3r::Lines intersection<Slic3r::Lines>(const Slic3r::Lines &subject, const Slic3r::Polygons &clip, bool safety_offset_);
754
755 Slic3r::ExPolygons
756 intersection_ex(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, bool safety_offset_)
757 {
758 Slic3r::ExPolygons expp;
759 intersection(subject, clip, &expp, safety_offset_);
760 return expp;
761 }
762
763 template <class SubjectType>
764 bool intersects(const SubjectType &subject, const Slic3r::Polygons &clip, bool safety_offset_)
765 {
766 SubjectType retval;
767 intersection(subject, clip, &retval, safety_offset_);
768 return !retval.empty();
769 }
770 template bool intersects<Slic3r::Polygons>(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, bool safety_offset_);
771 template bool intersects<Slic3r::Polylines>(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip, bool safety_offset_);
772 template bool intersects<Slic3r::Lines>(const Slic3r::Lines &subject, const Slic3r::Polygons &clip, bool safety_offset_);
773
774 void xor_(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, Slic3r::ExPolygons* retval,
775 bool safety_offset_)
776 {
777 _clipper(ClipperLib::ctXor, subject, clip, retval, safety_offset_);
778 }
779
780 template <class T>
781 void union_(const Slic3r::Polygons &subject, T* retval, bool safety_offset_)
782 {
783 Slic3r::Polygons p;
784 _clipper(ClipperLib::ctUnion, subject, p, retval, safety_offset_);
785 }
786 template void union_<Slic3r::ExPolygons>(const Slic3r::Polygons &subject, Slic3r::ExPolygons* retval, bool safety_offset_);
787 template void union_<Slic3r::Polygons>(const Slic3r::Polygons &subject, Slic3r::Polygons* retval, bool safety_offset_);
788
789 Slic3r::Polygons
790 union_(const Slic3r::Polygons &subject, bool safety_offset)
791 {
792 Polygons pp;
793 union_(subject, &pp, safety_offset);
794 return pp;
795 }
796
797 Slic3r::ExPolygons
798 union_ex(const Slic3r::Polygons &subject, bool safety_offset)
799 {
800 ExPolygons expp;
801 union_(subject, &expp, safety_offset);
802 return expp;
803 }
804
805 Slic3r::ExPolygons
806 union_ex(const Slic3r::Surfaces &subject, bool safety_offset)
807 {
808 Polygons pp;
809 for (Slic3r::Surfaces::const_iterator s = subject.begin(); s != subject.end(); ++s) {
810 Polygons spp = *s;
811 pp.insert(pp.end(), spp.begin(), spp.end());
812 }
813 return union_ex(pp, safety_offset);
814 }
815
816 void union_(const Slic3r::Polygons &subject1, const Slic3r::Polygons &subject2, Slic3r::Polygons* retval, bool safety_offset)
817 {
818 Polygons pp = subject1;
819 pp.insert(pp.end(), subject2.begin(), subject2.end());
820 union_(pp, retval, safety_offset);
821 }
822
823 Slic3r::Polygons
824 union_(const Slic3r::ExPolygons &subject1, const Slic3r::ExPolygons &subject2, bool safety_offset)
825 {
826 Polygons pp;
827 for (Slic3r::ExPolygons::const_iterator it = subject1.begin(); it != subject1.end(); ++it) {
828 Polygons spp = *it;
829 pp.insert(pp.end(), spp.begin(), spp.end());
830 }
831 for (Slic3r::ExPolygons::const_iterator it = subject2.begin(); it != subject2.end(); ++it) {
832 Polygons spp = *it;
833 pp.insert(pp.end(), spp.begin(), spp.end());
834 }
835 Polygons retval;
836 union_(pp, &retval, safety_offset);
837 return retval;
838 }
839
840 void union_pt(const Slic3r::Polygons &subject, ClipperLib::PolyTree* retval, bool safety_offset_)
841 {
842 Slic3r::Polygons clip;
843 _clipper_do<ClipperLib::PolyTree>(ClipperLib::ctUnion, subject, clip, retval, ClipperLib::pftEvenOdd, safety_offset_);
844 }
845
846 void union_pt_chained(const Slic3r::Polygons &subject, Slic3r::Polygons* retval, bool safety_offset_)
847 {
848 ClipperLib::PolyTree pt;
849 union_pt(subject, &pt, safety_offset_);
850 if (&subject == retval)
851 // It is safe to use the same variable for input and output, because this function makes
852 // a temporary copy of the results.
853 retval->clear();
854 traverse_pt(pt.Childs, retval);
855 }
856
857 static void traverse_pt(ClipperLib::PolyNodes &nodes, Slic3r::Polygons* retval)
858 {
859 /* use a nearest neighbor search to order these children
860 TODO: supply start_near to chained_path() too? */
861
862 // collect ordering points
863 Points ordering_points;
864 ordering_points.reserve(nodes.size());
865 for (ClipperLib::PolyNodes::const_iterator it = nodes.begin(); it != nodes.end(); ++it) {
866 Point p((*it)->Contour.front().X, (*it)->Contour.front().Y);
867 ordering_points.push_back(p);
868 }
869
870 // perform the ordering
871 ClipperLib::PolyNodes ordered_nodes;
872 Slic3r::Geometry::chained_path_items(ordering_points, nodes, ordered_nodes);
873
874 // push results recursively
875 for (ClipperLib::PolyNodes::iterator it = ordered_nodes.begin(); it != ordered_nodes.end(); ++it) {
876 // traverse the next depth
877 traverse_pt((*it)->Childs, retval);
878
879 Polygon p;
880 ClipperPath_to_Slic3rMultiPoint((*it)->Contour, &p);
881 retval->push_back(p);
882 if ((*it)->IsHole()) retval->back().reverse(); // ccw
883 }
884 }
885
886 void simplify_polygons(const Slic3r::Polygons &subject, Slic3r::Polygons* retval, bool preserve_collinear)
887 {
888 // convert into Clipper polygons
889 ClipperLib::Paths input_subject, output;
890 Slic3rMultiPoints_to_ClipperPaths(subject, &input_subject);
891
892 if (preserve_collinear) {
893 ClipperLib::Clipper c;
894 c.PreserveCollinear(true);
895 c.StrictlySimple(true);
896 c.AddPaths(input_subject, ClipperLib::ptSubject, true);
897 c.Execute(ClipperLib::ctUnion, output, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
898 } else {
899 ClipperLib::SimplifyPolygons(input_subject, output, ClipperLib::pftNonZero);
900 }
901
902 // convert into Slic3r polygons
903 ClipperPaths_to_Slic3rMultiPoints(output, retval);
904 }
905
906 void simplify_polygons(const Slic3r::Polygons &subject, Slic3r::ExPolygons* retval, bool preserve_collinear)
907 {
908 if (!preserve_collinear) {
909 Polygons polygons;
910 simplify_polygons(subject, &polygons, preserve_collinear);
911 union_(polygons, retval);
912 return;
913 }
914
915 // convert into Clipper polygons
916 ClipperLib::Paths input_subject;
917 Slic3rMultiPoints_to_ClipperPaths(subject, &input_subject);
918
919 ClipperLib::PolyTree polytree;
920
921 ClipperLib::Clipper c;
922 c.PreserveCollinear(true);
923 c.StrictlySimple(true);
924 c.AddPaths(input_subject, ClipperLib::ptSubject, true);
925 c.Execute(ClipperLib::ctUnion, polytree, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
926
927 // convert into ExPolygons
928 PolyTreeToExPolygons(polytree, retval);
929 }
930
931 void safety_offset(ClipperLib::Paths* paths)
932 {
933 // scale input
934 scaleClipperPolygons(*paths, CLIPPER_OFFSET_SCALE);
935
936 // perform offset (delta = scale 1e-05)
937 ClipperLib::ClipperOffset co;
938 co.MiterLimit = 2;
939 co.AddPaths(*paths, ClipperLib::jtMiter, ClipperLib::etClosedPolygon);
940 co.Execute(*paths, 10.0 * CLIPPER_OFFSET_SCALE);
941
942 // unscale output
943 scaleClipperPolygons(*paths, 1.0/CLIPPER_OFFSET_SCALE);
944 }
945
946 }
0 #ifndef slic3r_ClipperUtils_hpp_
1 #define slic3r_ClipperUtils_hpp_
2
3 #include <libslic3r.h>
4 #include "clipper.hpp"
5 #include "ExPolygon.hpp"
6 #include "Polygon.hpp"
7 #include "Surface.hpp"
8
9 // import these wherever we're included
10 using ClipperLib::jtMiter;
11 using ClipperLib::jtRound;
12 using ClipperLib::jtSquare;
13
14 namespace Slic3r {
15
16 // Factor to convert from coord_t (which is int32) to an int64 type used by the Clipper library.
17 //FIXME Vojtech: Better to use a power of 2 coefficient and to use bit shifts for scaling.
18 // How about 2^17=131072?
19 // By the way, is the scalling needed at all? Cura runs all the computation with a fixed point precision of 1um, while Slic3r scales to 1nm,
20 // further scaling by 10e5 brings us to
21 #define CLIPPER_OFFSET_SCALE 100000.0
22
23 //-----------------------------------------------------------
24 // legacy code from Clipper documentation
25 void AddOuterPolyNodeToExPolygons(ClipperLib::PolyNode& polynode, Slic3r::ExPolygons& expolygons);
26 void PolyTreeToExPolygons(ClipperLib::PolyTree& polytree, Slic3r::ExPolygons& expolygons);
27 //-----------------------------------------------------------
28
29 void Slic3rMultiPoint_to_ClipperPath(const Slic3r::MultiPoint &input, ClipperLib::Path* output);
30 template <class T>
31 void Slic3rMultiPoints_to_ClipperPaths(const T &input, ClipperLib::Paths* output);
32 template <class T>
33 void ClipperPath_to_Slic3rMultiPoint(const ClipperLib::Path &input, T* output);
34 template <class T>
35 void ClipperPaths_to_Slic3rMultiPoints(const ClipperLib::Paths &input, T* output);
36 void ClipperPaths_to_Slic3rExPolygons(const ClipperLib::Paths &input, Slic3r::ExPolygons* output);
37
38 void scaleClipperPolygons(ClipperLib::Paths &polygons, const double scale);
39
40 // offset Polygons
41 void offset(const Slic3r::Polygons &polygons, ClipperLib::Paths* retval, const float delta,
42 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
43 double miterLimit = 3);
44 void offset(const Slic3r::Polygons &polygons, Slic3r::Polygons* retval, const float delta,
45 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
46 double miterLimit = 3);
47 Slic3r::Polygons offset(const Slic3r::Polygons &polygons, const float delta,
48 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
49 double miterLimit = 3);
50
51 // This is a safe variant of the polygon offset, tailored for a single ExPolygon:
52 // a single polygon with multiple non-overlapping holes.
53 // Each contour and hole is offsetted separately, then the holes are subtracted from the outer contours.
54 void offset(const Slic3r::ExPolygon &expolygon, ClipperLib::Paths* retval, const float delta,
55 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
56 double miterLimit = 3);
57 void offset(const Slic3r::ExPolygons &expolygons, ClipperLib::Paths* retval, const float delta,
58 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
59 double miterLimit = 3);
60 Slic3r::Polygons offset(const Slic3r::ExPolygon &expolygon, const float delta,
61 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
62 double miterLimit = 3);
63 Slic3r::Polygons offset(const Slic3r::ExPolygons &expolygons, const float delta,
64 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
65 double miterLimit = 3);
66 Slic3r::ExPolygons offset_ex(const Slic3r::ExPolygon &expolygon, const float delta,
67 double scale, ClipperLib::JoinType joinType, double miterLimit);
68 Slic3r::ExPolygons offset_ex(const Slic3r::ExPolygons &expolygons, const float delta,
69 double scale, ClipperLib::JoinType joinType, double miterLimit);
70
71 // offset Polylines
72 void offset(const Slic3r::Polylines &polylines, ClipperLib::Paths* retval, const float delta,
73 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtSquare,
74 double miterLimit = 3);
75 void offset(const Slic3r::Polylines &polylines, Slic3r::Polygons* retval, const float delta,
76 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtSquare,
77 double miterLimit = 3);
78 void offset(const Slic3r::Surface &surface, Slic3r::Surfaces* retval, const float delta,
79 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtSquare,
80 double miterLimit = 3);
81
82 void offset(const Slic3r::Polygons &polygons, Slic3r::ExPolygons* retval, const float delta,
83 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
84 double miterLimit = 3);
85 Slic3r::ExPolygons offset_ex(const Slic3r::Polygons &polygons, const float delta,
86 double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
87 double miterLimit = 3);
88
89 void offset2(const Slic3r::Polygons &polygons, ClipperLib::Paths* retval, const float delta1,
90 const float delta2, double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
91 double miterLimit = 3);
92 void offset2(const Slic3r::Polygons &polygons, Slic3r::Polygons* retval, const float delta1,
93 const float delta2, double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
94 double miterLimit = 3);
95 Slic3r::Polygons offset2(const Slic3r::Polygons &polygons, const float delta1,
96 const float delta2, double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
97 double miterLimit = 3);
98 void offset2(const Slic3r::Polygons &polygons, Slic3r::ExPolygons* retval, const float delta1,
99 const float delta2, double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
100 double miterLimit = 3);
101 Slic3r::ExPolygons offset2_ex(const Slic3r::Polygons &polygons, const float delta1,
102 const float delta2, double scale = CLIPPER_OFFSET_SCALE, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
103 double miterLimit = 3);
104
105 template <class T>
106 void _clipper_do(ClipperLib::ClipType clipType, const Slic3r::Polygons &subject,
107 const Slic3r::Polygons &clip, T* retval, bool safety_offset_);
108 void _clipper_do(ClipperLib::ClipType clipType, const Slic3r::Polylines &subject,
109 const Slic3r::Polygons &clip, ClipperLib::Paths* retval, bool safety_offset_);
110 void _clipper(ClipperLib::ClipType clipType, const Slic3r::Polygons &subject,
111 const Slic3r::Polygons &clip, Slic3r::Polygons* retval, bool safety_offset_);
112 void _clipper(ClipperLib::ClipType clipType, const Slic3r::Polygons &subject,
113 const Slic3r::Polygons &clip, Slic3r::ExPolygons* retval, bool safety_offset_);
114 void _clipper(ClipperLib::ClipType clipType, const Slic3r::Polylines &subject,
115 const Slic3r::Polygons &clip, Slic3r::Polylines* retval);
116 void _clipper(ClipperLib::ClipType clipType, const Slic3r::Lines &subject,
117 const Slic3r::Polygons &clip, Slic3r::Lines* retval);
118
119 template <class SubjectType, class ResultType>
120 void diff(const SubjectType &subject, const Slic3r::Polygons &clip, ResultType* retval, bool safety_offset_ = false);
121
122 template <class SubjectType, class ResultType>
123 void diff(const SubjectType &subject, const Slic3r::ExPolygons &clip, ResultType* retval, bool safety_offset_ = false);
124
125 Slic3r::Polygons diff(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, bool safety_offset_ = false);
126
127 template <class SubjectType, class ClipType>
128 Slic3r::ExPolygons diff_ex(const SubjectType &subject, const ClipType &clip, bool safety_offset_ = false);
129
130 template <class SubjectType, class ResultType>
131 void intersection(const SubjectType &subject, const Slic3r::Polygons &clip, ResultType* retval, bool safety_offset_ = false);
132
133 template <class SubjectType>
134 SubjectType intersection(const SubjectType &subject, const Slic3r::Polygons &clip, bool safety_offset_ = false);
135
136 Slic3r::ExPolygons
137 intersection_ex(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, bool safety_offset_ = false);
138
139 template <class SubjectType>
140 bool intersects(const SubjectType &subject, const Slic3r::Polygons &clip, bool safety_offset_ = false);
141
142 void xor_(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, Slic3r::ExPolygons* retval,
143 bool safety_offset_ = false);
144
145 template <class T>
146 void union_(const Slic3r::Polygons &subject, T* retval, bool safety_offset_ = false);
147
148 Slic3r::Polygons union_(const Slic3r::Polygons &subject, bool safety_offset = false);
149 Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, bool safety_offset = false);
150 Slic3r::ExPolygons union_ex(const Slic3r::Surfaces &subject, bool safety_offset = false);
151
152 void union_(const Slic3r::Polygons &subject1, const Slic3r::Polygons &subject2, Slic3r::Polygons* retval, bool safety_offset = false);
153 Slic3r::Polygons union_(const Slic3r::ExPolygons &subject1, const Slic3r::ExPolygons &subject2, bool safety_offset = false);
154
155 void union_pt(const Slic3r::Polygons &subject, ClipperLib::PolyTree* retval, bool safety_offset_ = false);
156 void union_pt_chained(const Slic3r::Polygons &subject, Slic3r::Polygons* retval, bool safety_offset_ = false);
157 static void traverse_pt(ClipperLib::PolyNodes &nodes, Slic3r::Polygons* retval);
158
159 void simplify_polygons(const Slic3r::Polygons &subject, Slic3r::Polygons* retval, bool preserve_collinear = false);
160 void simplify_polygons(const Slic3r::Polygons &subject, Slic3r::ExPolygons* retval, bool preserve_collinear = false);
161
162 void safety_offset(ClipperLib::Paths* paths);
163
164 }
165
166 #endif
0 #include "Config.hpp"
1 #include <stdlib.h> // for setenv()
2 #include <assert.h>
3 #include <string.h>
4
5 #if defined(_WIN32) && !defined(setenv) && defined(_putenv_s)
6 #define setenv(k, v, o) _putenv_s(k, v)
7 #endif
8
9 namespace Slic3r {
10
11 std::string escape_string_cstyle(const std::string &str)
12 {
13 // Allocate a buffer twice the input string length,
14 // so the output will fit even if all input characters get escaped.
15 std::vector<char> out(str.size() * 2, 0);
16 char *outptr = out.data();
17 for (size_t i = 0; i < str.size(); ++ i) {
18 char c = str[i];
19 if (c == '\n' || c == '\r') {
20 (*outptr ++) = '\\';
21 (*outptr ++) = 'n';
22 } else
23 (*outptr ++) = c;
24 }
25 return std::string(out.data(), outptr - out.data());
26 }
27
28 std::string escape_strings_cstyle(const std::vector<std::string> &strs)
29 {
30 // 1) Estimate the output buffer size to avoid buffer reallocation.
31 size_t outbuflen = 0;
32 for (size_t i = 0; i < strs.size(); ++ i)
33 // Reserve space for every character escaped + quotes + semicolon.
34 outbuflen += strs[i].size() * 2 + 3;
35 // 2) Fill in the buffer.
36 std::vector<char> out(outbuflen, 0);
37 char *outptr = out.data();
38 for (size_t j = 0; j < strs.size(); ++ j) {
39 if (j > 0)
40 // Separate the strings.
41 (*outptr ++) = ';';
42 const std::string &str = strs[j];
43 // Is the string simple or complex? Complex string contains spaces, tabs, new lines and other
44 // escapable characters. Empty string shall be quoted as well, if it is the only string in strs.
45 bool should_quote = strs.size() == 1 && str.empty();
46 for (size_t i = 0; i < str.size(); ++ i) {
47 char c = str[i];
48 if (c == ' ' || c == '\t' || c == '\\' || c == '"' || c == '\r' || c == '\n') {
49 should_quote = true;
50 break;
51 }
52 }
53 if (should_quote) {
54 (*outptr ++) = '"';
55 for (size_t i = 0; i < str.size(); ++ i) {
56 char c = str[i];
57 if (c == '\\' || c == '"') {
58 (*outptr ++) = '\\';
59 (*outptr ++) = c;
60 } else if (c == '\n' || c == '\r') {
61 (*outptr ++) = '\\';
62 (*outptr ++) = 'n';
63 } else
64 (*outptr ++) = c;
65 }
66 (*outptr ++) = '"';
67 } else {
68 memcpy(outptr, str.data(), str.size());
69 outptr += str.size();
70 }
71 }
72 return std::string(out.data(), outptr - out.data());
73 }
74
75 bool unescape_string_cstyle(const std::string &str, std::string &str_out)
76 {
77 std::vector<char> out(str.size(), 0);
78 char *outptr = out.data();
79 for (size_t i = 0; i < str.size(); ++ i) {
80 char c = str[i];
81 if (c == '\\') {
82 if (++ i == str.size())
83 return false;
84 c = str[i];
85 if (c == 'n')
86 (*outptr ++) = '\n';
87 } else
88 (*outptr ++) = c;
89 }
90 str_out.assign(out.data(), outptr - out.data());
91 return true;
92 }
93
94 bool unescape_strings_cstyle(const std::string &str, std::vector<std::string> &out)
95 {
96 out.clear();
97 if (str.empty())
98 return true;
99
100 size_t i = 0;
101 for (;;) {
102 // Skip white spaces.
103 char c = str[i];
104 while (c == ' ' || c == '\t') {
105 if (++ i == str.size())
106 return true;
107 c = str[i];
108 }
109 // Start of a word.
110 std::vector<char> buf;
111 buf.reserve(16);
112 // Is it enclosed in quotes?
113 c = str[i];
114 if (c == '"') {
115 // Complex case, string is enclosed in quotes.
116 for (++ i; i < str.size(); ++ i) {
117 c = str[i];
118 if (c == '"') {
119 // End of string.
120 break;
121 }
122 if (c == '\\') {
123 if (++ i == str.size())
124 return false;
125 c = str[i];
126 if (c == 'n')
127 c = '\n';
128 }
129 buf.push_back(c);
130 }
131 if (i == str.size())
132 return false;
133 ++ i;
134 } else {
135 for (; i < str.size(); ++ i) {
136 c = str[i];
137 if (c == ';')
138 break;
139 buf.push_back(c);
140 }
141 }
142 // Store the string into the output vector.
143 out.push_back(std::string(buf.data(), buf.size()));
144 if (i == str.size())
145 return true;
146 // Skip white spaces.
147 c = str[i];
148 while (c == ' ' || c == '\t') {
149 if (++ i == str.size())
150 // End of string. This is correct.
151 return true;
152 c = str[i];
153 }
154 if (c != ';')
155 return false;
156 if (++ i == str.size()) {
157 // Emit one additional empty string.
158 out.push_back(std::string());
159 return true;
160 }
161 }
162 }
163
164 bool
165 operator== (const ConfigOption &a, const ConfigOption &b)
166 {
167 return a.serialize().compare(b.serialize()) == 0;
168 }
169
170 bool
171 operator!= (const ConfigOption &a, const ConfigOption &b)
172 {
173 return !(a == b);
174 }
175
176 ConfigDef::~ConfigDef()
177 {
178 for (t_optiondef_map::iterator it = this->options.begin(); it != this->options.end(); ++it) {
179 if (it->second.default_value != NULL)
180 delete it->second.default_value;
181 }
182 }
183
184 ConfigOptionDef*
185 ConfigDef::add(const t_config_option_key &opt_key, ConfigOptionType type)
186 {
187 ConfigOptionDef* opt = &this->options[opt_key];
188 opt->type = type;
189 return opt;
190 }
191
192 const ConfigOptionDef*
193 ConfigDef::get(const t_config_option_key &opt_key) const
194 {
195 t_optiondef_map::iterator it = const_cast<ConfigDef*>(this)->options.find(opt_key);
196 return (it == this->options.end()) ? NULL : &it->second;
197 }
198
199 bool
200 ConfigBase::has(const t_config_option_key &opt_key) {
201 return (this->option(opt_key, false) != NULL);
202 }
203
204 void
205 ConfigBase::apply(const ConfigBase &other, bool ignore_nonexistent) {
206 // get list of option keys to apply
207 t_config_option_keys opt_keys = other.keys();
208
209 // loop through options and apply them
210 for (t_config_option_keys::const_iterator it = opt_keys.begin(); it != opt_keys.end(); ++it) {
211 ConfigOption* my_opt = this->option(*it, true);
212 if (my_opt == NULL) {
213 if (ignore_nonexistent == false) throw "Attempt to apply non-existent option";
214 continue;
215 }
216
217 // not the most efficient way, but easier than casting pointers to subclasses
218 bool res = my_opt->deserialize( other.option(*it)->serialize() );
219 if (!res) {
220 std::string error = "Unexpected failure when deserializing serialized value for " + *it;
221 CONFESS(error.c_str());
222 }
223 }
224 }
225
226 bool
227 ConfigBase::equals(ConfigBase &other) {
228 return this->diff(other).empty();
229 }
230
231 // this will *ignore* options not present in both configs
232 t_config_option_keys
233 ConfigBase::diff(ConfigBase &other) {
234 t_config_option_keys diff;
235
236 t_config_option_keys my_keys = this->keys();
237 for (t_config_option_keys::const_iterator opt_key = my_keys.begin(); opt_key != my_keys.end(); ++opt_key) {
238 if (other.has(*opt_key) && other.serialize(*opt_key) != this->serialize(*opt_key)) {
239 diff.push_back(*opt_key);
240 }
241 }
242
243 return diff;
244 }
245
246 std::string
247 ConfigBase::serialize(const t_config_option_key &opt_key) const {
248 const ConfigOption* opt = this->option(opt_key);
249 assert(opt != NULL);
250 return opt->serialize();
251 }
252
253 bool
254 ConfigBase::set_deserialize(const t_config_option_key &opt_key, std::string str) {
255 const ConfigOptionDef* optdef = this->def->get(opt_key);
256 if (optdef == NULL) throw "Calling set_deserialize() on unknown option";
257 if (!optdef->shortcut.empty()) {
258 for (std::vector<t_config_option_key>::const_iterator it = optdef->shortcut.begin(); it != optdef->shortcut.end(); ++it) {
259 if (!this->set_deserialize(*it, str)) return false;
260 }
261 return true;
262 }
263
264 ConfigOption* opt = this->option(opt_key, true);
265 assert(opt != NULL);
266 return opt->deserialize(str);
267 }
268
269 // Return an absolute value of a possibly relative config variable.
270 // For example, return absolute infill extrusion width, either from an absolute value, or relative to the layer height.
271 double
272 ConfigBase::get_abs_value(const t_config_option_key &opt_key) const {
273 const ConfigOption* opt = this->option(opt_key);
274 if (const ConfigOptionFloatOrPercent* optv = dynamic_cast<const ConfigOptionFloatOrPercent*>(opt)) {
275 // get option definition
276 const ConfigOptionDef* def = this->def->get(opt_key);
277 assert(def != NULL);
278
279 // compute absolute value over the absolute value of the base option
280 return optv->get_abs_value(this->get_abs_value(def->ratio_over));
281 } else if (const ConfigOptionFloat* optv = dynamic_cast<const ConfigOptionFloat*>(opt)) {
282 return optv->value;
283 } else {
284 throw "Not a valid option type for get_abs_value()";
285 }
286 }
287
288 // Return an absolute value of a possibly relative config variable.
289 // For example, return absolute infill extrusion width, either from an absolute value, or relative to a provided value.
290 double
291 ConfigBase::get_abs_value(const t_config_option_key &opt_key, double ratio_over) const {
292 // get stored option value
293 const ConfigOptionFloatOrPercent* opt = dynamic_cast<const ConfigOptionFloatOrPercent*>(this->option(opt_key));
294 assert(opt != NULL);
295
296 // compute absolute value
297 return opt->get_abs_value(ratio_over);
298 }
299
300 void
301 ConfigBase::setenv_()
302 {
303 #ifdef setenv
304 t_config_option_keys opt_keys = this->keys();
305 for (t_config_option_keys::const_iterator it = opt_keys.begin(); it != opt_keys.end(); ++it) {
306 // prepend the SLIC3R_ prefix
307 std::ostringstream ss;
308 ss << "SLIC3R_";
309 ss << *it;
310 std::string envname = ss.str();
311
312 // capitalize environment variable name
313 for (size_t i = 0; i < envname.size(); ++i)
314 envname[i] = (envname[i] <= 'z' && envname[i] >= 'a') ? envname[i]-('a'-'A') : envname[i];
315
316 setenv(envname.c_str(), this->serialize(*it).c_str(), 1);
317 }
318 #endif
319 }
320
321 const ConfigOption*
322 ConfigBase::option(const t_config_option_key &opt_key) const {
323 return const_cast<ConfigBase*>(this)->option(opt_key, false);
324 }
325
326 ConfigOption*
327 ConfigBase::option(const t_config_option_key &opt_key, bool create) {
328 return this->optptr(opt_key, create);
329 }
330
331 DynamicConfig& DynamicConfig::operator= (DynamicConfig other)
332 {
333 this->swap(other);
334 return *this;
335 }
336
337 void
338 DynamicConfig::swap(DynamicConfig &other)
339 {
340 std::swap(this->def, other.def);
341 std::swap(this->options, other.options);
342 }
343
344 DynamicConfig::~DynamicConfig () {
345 for (t_options_map::iterator it = this->options.begin(); it != this->options.end(); ++it) {
346 ConfigOption* opt = it->second;
347 if (opt != NULL) delete opt;
348 }
349 }
350
351 DynamicConfig::DynamicConfig (const DynamicConfig& other) {
352 this->def = other.def;
353 this->apply(other, false);
354 }
355
356 ConfigOption*
357 DynamicConfig::optptr(const t_config_option_key &opt_key, bool create) {
358 t_options_map::iterator it = options.find(opt_key);
359 if (it == options.end()) {
360 if (create) {
361 const ConfigOptionDef* optdef = this->def->get(opt_key);
362 assert(optdef != NULL);
363 ConfigOption* opt;
364 if (optdef->type == coFloat) {
365 opt = new ConfigOptionFloat ();
366 } else if (optdef->type == coFloats) {
367 opt = new ConfigOptionFloats ();
368 } else if (optdef->type == coInt) {
369 opt = new ConfigOptionInt ();
370 } else if (optdef->type == coInts) {
371 opt = new ConfigOptionInts ();
372 } else if (optdef->type == coString) {
373 opt = new ConfigOptionString ();
374 } else if (optdef->type == coStrings) {
375 opt = new ConfigOptionStrings ();
376 } else if (optdef->type == coPercent) {
377 opt = new ConfigOptionPercent ();
378 } else if (optdef->type == coFloatOrPercent) {
379 opt = new ConfigOptionFloatOrPercent ();
380 } else if (optdef->type == coPoint) {
381 opt = new ConfigOptionPoint ();
382 } else if (optdef->type == coPoints) {
383 opt = new ConfigOptionPoints ();
384 } else if (optdef->type == coBool) {
385 opt = new ConfigOptionBool ();
386 } else if (optdef->type == coBools) {
387 opt = new ConfigOptionBools ();
388 } else if (optdef->type == coEnum) {
389 ConfigOptionEnumGeneric* optv = new ConfigOptionEnumGeneric ();
390 optv->keys_map = &optdef->enum_keys_map;
391 opt = static_cast<ConfigOption*>(optv);
392 } else {
393 throw "Unknown option type";
394 }
395 this->options[opt_key] = opt;
396 return opt;
397 } else {
398 return NULL;
399 }
400 }
401 return it->second;
402 }
403
404 template<class T>
405 T*
406 DynamicConfig::opt(const t_config_option_key &opt_key, bool create) {
407 return dynamic_cast<T*>(this->option(opt_key, create));
408 }
409 template ConfigOptionInt* DynamicConfig::opt<ConfigOptionInt>(const t_config_option_key &opt_key, bool create);
410 template ConfigOptionBool* DynamicConfig::opt<ConfigOptionBool>(const t_config_option_key &opt_key, bool create);
411 template ConfigOptionBools* DynamicConfig::opt<ConfigOptionBools>(const t_config_option_key &opt_key, bool create);
412 template ConfigOptionPercent* DynamicConfig::opt<ConfigOptionPercent>(const t_config_option_key &opt_key, bool create);
413
414 t_config_option_keys
415 DynamicConfig::keys() const {
416 t_config_option_keys keys;
417 for (t_options_map::const_iterator it = this->options.begin(); it != this->options.end(); ++it)
418 keys.push_back(it->first);
419 return keys;
420 }
421
422 void
423 DynamicConfig::erase(const t_config_option_key &opt_key) {
424 this->options.erase(opt_key);
425 }
426
427 void
428 StaticConfig::set_defaults()
429 {
430 // use defaults from definition
431 if (this->def == NULL) return;
432 t_config_option_keys keys = this->keys();
433 for (t_config_option_keys::const_iterator it = keys.begin(); it != keys.end(); ++it) {
434 const ConfigOptionDef* def = this->def->get(*it);
435 if (def->default_value != NULL)
436 this->option(*it)->set(*def->default_value);
437 }
438 }
439
440 t_config_option_keys
441 StaticConfig::keys() const {
442 t_config_option_keys keys;
443 assert(this->def != NULL);
444 for (t_optiondef_map::const_iterator it = this->def->options.begin(); it != this->def->options.end(); ++it) {
445 const ConfigOption* opt = this->option(it->first);
446 if (opt != NULL) keys.push_back(it->first);
447 }
448 return keys;
449 }
450
451 }
0 #ifndef slic3r_Config_hpp_
1 #define slic3r_Config_hpp_
2
3 #include <map>
4 #include <climits>
5 #include <cstdio>
6 #include <cstdlib>
7 #include <iostream>
8 #include <stdexcept>
9 #include <string>
10 #include <vector>
11 #include "libslic3r.h"
12 #include "Point.hpp"
13
14 namespace Slic3r {
15
16 // Name of the configuration option.
17 typedef std::string t_config_option_key;
18 typedef std::vector<std::string> t_config_option_keys;
19
20 extern std::string escape_string_cstyle(const std::string &str);
21 extern std::string escape_strings_cstyle(const std::vector<std::string> &strs);
22 extern bool unescape_string_cstyle(const std::string &str, std::string &out);
23 extern bool unescape_strings_cstyle(const std::string &str, std::vector<std::string> &out);
24
25 // A generic value of a configuration option.
26 class ConfigOption {
27 public:
28 virtual ~ConfigOption() {};
29 virtual std::string serialize() const = 0;
30 virtual bool deserialize(std::string str) = 0;
31 virtual void set(const ConfigOption &option) = 0;
32 virtual int getInt() const { return 0; };
33 virtual double getFloat() const { return 0; };
34 virtual bool getBool() const { return false; };
35 virtual void setInt(int val) {};
36 friend bool operator== (const ConfigOption &a, const ConfigOption &b);
37 friend bool operator!= (const ConfigOption &a, const ConfigOption &b);
38 };
39
40 // Value of a single valued option (bool, int, float, string, point, enum)
41 template <class T>
42 class ConfigOptionSingle : public ConfigOption {
43 public:
44 T value;
45 ConfigOptionSingle(T _value) : value(_value) {};
46 operator T() const { return this->value; };
47
48 void set(const ConfigOption &option) {
49 const ConfigOptionSingle<T>* other = dynamic_cast< const ConfigOptionSingle<T>* >(&option);
50 if (other != NULL) this->value = other->value;
51 };
52 };
53
54 // Value of a vector valued option (bools, ints, floats, strings, points)
55 class ConfigOptionVectorBase : public ConfigOption {
56 public:
57 virtual ~ConfigOptionVectorBase() {};
58 virtual std::vector<std::string> vserialize() const = 0;
59 };
60
61 // Value of a vector valued option (bools, ints, floats, strings, points), template
62 template <class T>
63 class ConfigOptionVector : public ConfigOptionVectorBase
64 {
65 public:
66 virtual ~ConfigOptionVector() {};
67 std::vector<T> values;
68
69 void set(const ConfigOption &option) {
70 const ConfigOptionVector<T>* other = dynamic_cast< const ConfigOptionVector<T>* >(&option);
71 if (other != NULL) this->values = other->values;
72 };
73
74 T get_at(size_t i) const {
75 try {
76 return this->values.at(i);
77 } catch (const std::out_of_range& oor) {
78 return this->values.front();
79 }
80 };
81 };
82
83 class ConfigOptionFloat : public ConfigOptionSingle<double>
84 {
85 public:
86 ConfigOptionFloat() : ConfigOptionSingle<double>(0) {};
87 ConfigOptionFloat(double _value) : ConfigOptionSingle<double>(_value) {};
88
89 double getFloat() const { return this->value; };
90
91 std::string serialize() const {
92 std::ostringstream ss;
93 ss << this->value;
94 return ss.str();
95 };
96
97 bool deserialize(std::string str) {
98 std::istringstream iss(str);
99 iss >> this->value;
100 return !iss.fail();
101 };
102 };
103
104 class ConfigOptionFloats : public ConfigOptionVector<double>
105 {
106 public:
107
108 std::string serialize() const {
109 std::ostringstream ss;
110 for (std::vector<double>::const_iterator it = this->values.begin(); it != this->values.end(); ++it) {
111 if (it - this->values.begin() != 0) ss << ",";
112 ss << *it;
113 }
114 return ss.str();
115 };
116
117 std::vector<std::string> vserialize() const {
118 std::vector<std::string> vv;
119 vv.reserve(this->values.size());
120 for (std::vector<double>::const_iterator it = this->values.begin(); it != this->values.end(); ++it) {
121 std::ostringstream ss;
122 ss << *it;
123 vv.push_back(ss.str());
124 }
125 return vv;
126 };
127
128 bool deserialize(std::string str) {
129 this->values.clear();
130 std::istringstream is(str);
131 std::string item_str;
132 while (std::getline(is, item_str, ',')) {
133 std::istringstream iss(item_str);
134 double value;
135 iss >> value;
136 this->values.push_back(value);
137 }
138 return true;
139 };
140 };
141
142 class ConfigOptionInt : public ConfigOptionSingle<int>
143 {
144 public:
145 ConfigOptionInt() : ConfigOptionSingle<int>(0) {};
146 ConfigOptionInt(double _value) : ConfigOptionSingle<int>(_value) {};
147
148 int getInt() const { return this->value; };
149 void setInt(int val) { this->value = val; };
150
151 std::string serialize() const {
152 std::ostringstream ss;
153 ss << this->value;
154 return ss.str();
155 };
156
157 bool deserialize(std::string str) {
158 std::istringstream iss(str);
159 iss >> this->value;
160 return !iss.fail();
161 };
162 };
163
164 class ConfigOptionInts : public ConfigOptionVector<int>
165 {
166 public:
167
168 std::string serialize() const {
169 std::ostringstream ss;
170 for (std::vector<int>::const_iterator it = this->values.begin(); it != this->values.end(); ++it) {
171 if (it - this->values.begin() != 0) ss << ",";
172 ss << *it;
173 }
174 return ss.str();
175 };
176
177 std::vector<std::string> vserialize() const {
178 std::vector<std::string> vv;
179 vv.reserve(this->values.size());
180 for (std::vector<int>::const_iterator it = this->values.begin(); it != this->values.end(); ++it) {
181 std::ostringstream ss;
182 ss << *it;
183 vv.push_back(ss.str());
184 }
185 return vv;
186 };
187
188 bool deserialize(std::string str) {
189 this->values.clear();
190 std::istringstream is(str);
191 std::string item_str;
192 while (std::getline(is, item_str, ',')) {
193 std::istringstream iss(item_str);
194 int value;
195 iss >> value;
196 this->values.push_back(value);
197 }
198 return true;
199 };
200 };
201
202 class ConfigOptionString : public ConfigOptionSingle<std::string>
203 {
204 public:
205 ConfigOptionString() : ConfigOptionSingle<std::string>("") {};
206 ConfigOptionString(std::string _value) : ConfigOptionSingle<std::string>(_value) {};
207
208 std::string serialize() const {
209 return escape_string_cstyle(this->value);
210 }
211
212 bool deserialize(std::string str) {
213 return unescape_string_cstyle(str, this->value);
214 };
215 };
216
217 // semicolon-separated strings
218 class ConfigOptionStrings : public ConfigOptionVector<std::string>
219 {
220 public:
221
222 std::string serialize() const {
223 return escape_strings_cstyle(this->values);
224 };
225
226 std::vector<std::string> vserialize() const {
227 return this->values;
228 };
229
230 bool deserialize(std::string str) {
231 return unescape_strings_cstyle(str, this->values);
232 };
233 };
234
235 class ConfigOptionPercent : public ConfigOptionFloat
236 {
237 public:
238 ConfigOptionPercent() : ConfigOptionFloat(0) {};
239 ConfigOptionPercent(double _value) : ConfigOptionFloat(_value) {};
240
241 double get_abs_value(double ratio_over) const {
242 return ratio_over * this->value / 100;
243 };
244
245 std::string serialize() const {
246 std::ostringstream ss;
247 ss << this->value;
248 std::string s(ss.str());
249 s += "%";
250 return s;
251 };
252
253 bool deserialize(std::string str) {
254 // don't try to parse the trailing % since it's optional
255 std::istringstream iss(str);
256 iss >> this->value;
257 return !iss.fail();
258 };
259 };
260
261 class ConfigOptionFloatOrPercent : public ConfigOptionPercent
262 {
263 public:
264 bool percent;
265 ConfigOptionFloatOrPercent() : ConfigOptionPercent(0), percent(false) {};
266 ConfigOptionFloatOrPercent(double _value, bool _percent)
267 : ConfigOptionPercent(_value), percent(_percent) {};
268
269 void set(const ConfigOption &option) {
270 const ConfigOptionFloatOrPercent* other = dynamic_cast< const ConfigOptionFloatOrPercent* >(&option);
271 if (other != NULL) {
272 this->value = other->value;
273 this->percent = other->percent;
274 }
275 };
276
277 double get_abs_value(double ratio_over) const {
278 if (this->percent) {
279 return ratio_over * this->value / 100;
280 } else {
281 return this->value;
282 }
283 };
284
285 std::string serialize() const {
286 std::ostringstream ss;
287 ss << this->value;
288 std::string s(ss.str());
289 if (this->percent) s += "%";
290 return s;
291 };
292
293 bool deserialize(std::string str) {
294 this->percent = str.find_first_of("%") != std::string::npos;
295 std::istringstream iss(str);
296 iss >> this->value;
297 return !iss.fail();
298 };
299 };
300
301 class ConfigOptionPoint : public ConfigOptionSingle<Pointf>
302 {
303 public:
304 ConfigOptionPoint() : ConfigOptionSingle<Pointf>(Pointf(0,0)) {};
305 ConfigOptionPoint(Pointf _value) : ConfigOptionSingle<Pointf>(_value) {};
306
307 std::string serialize() const {
308 std::ostringstream ss;
309 ss << this->value.x;
310 ss << ",";
311 ss << this->value.y;
312 return ss.str();
313 };
314
315 bool deserialize(std::string str) {
316 std::istringstream iss(str);
317 iss >> this->value.x;
318 iss.ignore(std::numeric_limits<std::streamsize>::max(), ',');
319 iss.ignore(std::numeric_limits<std::streamsize>::max(), 'x');
320 iss >> this->value.y;
321 return true;
322 };
323 };
324
325 class ConfigOptionPoints : public ConfigOptionVector<Pointf>
326 {
327 public:
328
329 std::string serialize() const {
330 std::ostringstream ss;
331 for (Pointfs::const_iterator it = this->values.begin(); it != this->values.end(); ++it) {
332 if (it - this->values.begin() != 0) ss << ",";
333 ss << it->x;
334 ss << "x";
335 ss << it->y;
336 }
337 return ss.str();
338 };
339
340 std::vector<std::string> vserialize() const {
341 std::vector<std::string> vv;
342 for (Pointfs::const_iterator it = this->values.begin(); it != this->values.end(); ++it) {
343 std::ostringstream ss;
344 ss << *it;
345 vv.push_back(ss.str());
346 }
347 return vv;
348 };
349
350 bool deserialize(std::string str) {
351 this->values.clear();
352 std::istringstream is(str);
353 std::string point_str;
354 while (std::getline(is, point_str, ',')) {
355 Pointf point;
356 std::istringstream iss(point_str);
357 std::string coord_str;
358 if (std::getline(iss, coord_str, 'x')) {
359 std::istringstream(coord_str) >> point.x;
360 if (std::getline(iss, coord_str, 'x')) {
361 std::istringstream(coord_str) >> point.y;
362 }
363 }
364 this->values.push_back(point);
365 }
366 return true;
367 };
368 };
369
370 class ConfigOptionBool : public ConfigOptionSingle<bool>
371 {
372 public:
373 ConfigOptionBool() : ConfigOptionSingle<bool>(false) {};
374 ConfigOptionBool(bool _value) : ConfigOptionSingle<bool>(_value) {};
375
376 bool getBool() const { return this->value; };
377
378 std::string serialize() const {
379 return std::string(this->value ? "1" : "0");
380 };
381
382 bool deserialize(std::string str) {
383 this->value = (str.compare("1") == 0);
384 return true;
385 };
386 };
387
388 class ConfigOptionBools : public ConfigOptionVector<bool>
389 {
390 public:
391
392 std::string serialize() const {
393 std::ostringstream ss;
394 for (std::vector<bool>::const_iterator it = this->values.begin(); it != this->values.end(); ++it) {
395 if (it - this->values.begin() != 0) ss << ",";
396 ss << (*it ? "1" : "0");
397 }
398 return ss.str();
399 };
400
401 std::vector<std::string> vserialize() const {
402 std::vector<std::string> vv;
403 for (std::vector<bool>::const_iterator it = this->values.begin(); it != this->values.end(); ++it) {
404 std::ostringstream ss;
405 ss << (*it ? "1" : "0");
406 vv.push_back(ss.str());
407 }
408 return vv;
409 };
410
411 bool deserialize(std::string str) {
412 this->values.clear();
413 std::istringstream is(str);
414 std::string item_str;
415 while (std::getline(is, item_str, ',')) {
416 this->values.push_back(item_str.compare("1") == 0);
417 }
418 return true;
419 };
420 };
421
422 // Map from an enum name to an enum integer value.
423 typedef std::map<std::string,int> t_config_enum_values;
424
425 template <class T>
426 class ConfigOptionEnum : public ConfigOptionSingle<T>
427 {
428 public:
429 // by default, use the first value (0) of the T enum type
430 ConfigOptionEnum() : ConfigOptionSingle<T>(static_cast<T>(0)) {};
431 ConfigOptionEnum(T _value) : ConfigOptionSingle<T>(_value) {};
432
433 std::string serialize() const {
434 t_config_enum_values enum_keys_map = ConfigOptionEnum<T>::get_enum_values();
435 for (t_config_enum_values::iterator it = enum_keys_map.begin(); it != enum_keys_map.end(); ++it) {
436 if (it->second == static_cast<int>(this->value)) return it->first;
437 }
438 return "";
439 };
440
441 bool deserialize(std::string str) {
442 t_config_enum_values enum_keys_map = ConfigOptionEnum<T>::get_enum_values();
443 if (enum_keys_map.count(str) == 0) return false;
444 this->value = static_cast<T>(enum_keys_map[str]);
445 return true;
446 };
447
448 // Map from an enum name to an enum integer value.
449 //FIXME The map is called often, it shall be initialized statically.
450 static t_config_enum_values get_enum_values();
451 };
452
453 // Generic enum configuration value.
454 // We use this one in DynamicConfig objects when creating a config value object for ConfigOptionType == coEnum.
455 // In the StaticConfig, it is better to use the specialized ConfigOptionEnum<T> containers.
456 class ConfigOptionEnumGeneric : public ConfigOptionInt
457 {
458 public:
459 const t_config_enum_values* keys_map;
460
461 std::string serialize() const {
462 for (t_config_enum_values::const_iterator it = this->keys_map->begin(); it != this->keys_map->end(); ++it) {
463 if (it->second == this->value) return it->first;
464 }
465 return "";
466 };
467
468 bool deserialize(std::string str) {
469 if (this->keys_map->count(str) == 0) return false;
470 this->value = (*const_cast<t_config_enum_values*>(this->keys_map))[str];
471 return true;
472 };
473 };
474
475 // Type of a configuration value.
476 enum ConfigOptionType {
477 coNone,
478 // single float
479 coFloat,
480 // vector of floats
481 coFloats,
482 // single int
483 coInt,
484 // vector of ints
485 coInts,
486 // single string
487 coString,
488 // vector of strings
489 coStrings,
490 // percent value. Currently only used for infill.
491 coPercent,
492 // a fraction or an absolute value
493 coFloatOrPercent,
494 // single 2d point. Currently not used.
495 coPoint,
496 // vector of 2d points. Currently used for the definition of the print bed and for the extruder offsets.
497 coPoints,
498 // single boolean value
499 coBool,
500 // vector of boolean values
501 coBools,
502 // a generic enum
503 coEnum,
504 };
505
506 // Definition of a configuration value for the purpose of GUI presentation, editing, value mapping and config file handling.
507 class ConfigOptionDef
508 {
509 public:
510 // What type? bool, int, string etc.
511 ConfigOptionType type;
512 // Default value of this option. The default value object is owned by ConfigDef, it is released in its destructor.
513 ConfigOption* default_value;
514
515 // Usually empty.
516 // Special values - "i_enum_open", "f_enum_open" to provide combo box for int or float selection,
517 // "select_open" - to open a selection dialog (currently only a serial port selection).
518 std::string gui_type;
519 // Usually empty. Otherwise "serialized" or "show_value"
520 // The flags may be combined.
521 // "serialized" - vector valued option is entered in a single edit field. Values are separated by a semicolon.
522 // "show_value" - even if enum_values / enum_labels are set, still display the value, not the enum label.
523 std::string gui_flags;
524 // Label of the GUI input field.
525 // In case the GUI input fields are grouped in some views, the label defines a short label of a grouped value,
526 // while full_label contains a label of a stand-alone field.
527 // The full label is shown, when adding an override parameter for an object or a modified object.
528 std::string label;
529 std::string full_label;
530 // Category of a configuration field, from the GUI perspective.
531 // One of: "Layers and Perimeters", "Infill", "Support material", "Speed", "Extruders", "Advanced", "Extrusion Width"
532 std::string category;
533 // A tooltip text shown in the GUI.
534 std::string tooltip;
535 // Text right from the input field, usually a unit of measurement.
536 std::string sidetext;
537 // Format of this parameter on a command line.
538 std::string cli;
539 // Set for type == coFloatOrPercent.
540 // It provides a link to a configuration value, of which this option provides a ratio.
541 // For example,
542 // For example external_perimeter_speed may be defined as a fraction of perimeter_speed.
543 t_config_option_key ratio_over;
544 // True for multiline strings.
545 bool multiline;
546 // For text input: If true, the GUI text box spans the complete page width.
547 bool full_width;
548 // Not editable. Currently only used for the display of the number of threads.
549 bool readonly;
550 // Height of a multiline GUI text box.
551 int height;
552 // Optional width of an input field.
553 int width;
554 // <min, max> limit of a numeric input.
555 // If not set, the <min, max> is set to <INT_MIN, INT_MAX>
556 // By setting min=0, only nonnegative input is allowed.
557 int min;
558 int max;
559 // Legacy names for this configuration option.
560 // Used when parsing legacy configuration file.
561 std::vector<t_config_option_key> aliases;
562 // Sometimes a single value may well define multiple values in a "beginner" mode.
563 // Currently used for aliasing "solid_layers" to "top_solid_layers", "bottom_solid_layers".
564 std::vector<t_config_option_key> shortcut;
565 // Definition of values / labels for a combo box.
566 // Mostly used for enums (when type == coEnum), but may be used for ints resp. floats, if gui_type is set to "i_enum_open" resp. "f_enum_open".
567 std::vector<std::string> enum_values;
568 std::vector<std::string> enum_labels;
569 // For enums (when type == coEnum). Maps enum_values to enums.
570 // Initialized by ConfigOptionEnum<xxx>::get_enum_values()
571 t_config_enum_values enum_keys_map;
572
573 ConfigOptionDef() : type(coNone), default_value(NULL),
574 multiline(false), full_width(false), readonly(false),
575 height(-1), width(-1), min(INT_MIN), max(INT_MAX) {};
576 };
577
578 // Map from a config option name to its definition.
579 // The definition does not carry an actual value of the config option, only its constant default value.
580 // t_config_option_key is std::string
581 typedef std::map<t_config_option_key,ConfigOptionDef> t_optiondef_map;
582
583 // Definition of configuration values for the purpose of GUI presentation, editing, value mapping and config file handling.
584 // The configuration definition is static: It does not carry the actual configuration values,
585 // but it carries the defaults of the configuration values.
586 class ConfigDef
587 {
588 public:
589 t_optiondef_map options;
590 ~ConfigDef();
591 ConfigOptionDef* add(const t_config_option_key &opt_key, ConfigOptionType type);
592 const ConfigOptionDef* get(const t_config_option_key &opt_key) const;
593 };
594
595 // An abstract configuration store.
596 class ConfigBase
597 {
598 public:
599 // Definition of configuration values for the purpose of GUI presentation, editing, value mapping and config file handling.
600 // The configuration definition is static: It does not carry the actual configuration values,
601 // but it carries the defaults of the configuration values.
602 // ConfigBase does not own ConfigDef, it only references it.
603 const ConfigDef* def;
604
605 ConfigBase() : def(NULL) {};
606 virtual ~ConfigBase() {};
607 bool has(const t_config_option_key &opt_key);
608 const ConfigOption* option(const t_config_option_key &opt_key) const;
609 ConfigOption* option(const t_config_option_key &opt_key, bool create = false);
610 virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) = 0;
611 virtual t_config_option_keys keys() const = 0;
612 void apply(const ConfigBase &other, bool ignore_nonexistent = false);
613 bool equals(ConfigBase &other);
614 t_config_option_keys diff(ConfigBase &other);
615 std::string serialize(const t_config_option_key &opt_key) const;
616 bool set_deserialize(const t_config_option_key &opt_key, std::string str);
617
618 double get_abs_value(const t_config_option_key &opt_key) const;
619 double get_abs_value(const t_config_option_key &opt_key, double ratio_over) const;
620 void setenv_();
621 };
622
623 // Configuration store with dynamic number of configuration values.
624 // In Slic3r, the dynamic config is mostly used at the user interface layer.
625 class DynamicConfig : public virtual ConfigBase
626 {
627 public:
628 DynamicConfig() {};
629 DynamicConfig(const DynamicConfig& other);
630 DynamicConfig& operator= (DynamicConfig other);
631 void swap(DynamicConfig &other);
632 virtual ~DynamicConfig();
633 template<class T> T* opt(const t_config_option_key &opt_key, bool create = false);
634 virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false);
635 t_config_option_keys keys() const;
636 void erase(const t_config_option_key &opt_key);
637
638 private:
639 typedef std::map<t_config_option_key,ConfigOption*> t_options_map;
640 t_options_map options;
641 };
642
643 // Configuration store with a static definition of configuration values.
644 // In Slic3r, the static configuration stores are during the slicing / g-code generation for efficiency reasons,
645 // because the configuration values could be accessed directly.
646 class StaticConfig : public virtual ConfigBase
647 {
648 public:
649 StaticConfig() : ConfigBase() {};
650 // Gets list of config option names for each config option of this->def, which has a static counter-part defined by the derived object
651 // and which could be resolved by this->optptr(key) call.
652 t_config_option_keys keys() const;
653 // Set all statically defined config options to their defaults defined by this->def.
654 void set_defaults();
655 // The derived class has to implement optptr to resolve a static configuration value.
656 // virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) = 0;
657 };
658
659 }
660
661 #endif
0 #include <algorithm>
1 #include <vector>
2 #include <float.h>
3
4 #ifdef SLIC3R_GUI
5 #include <wx/image.h>
6 #endif /* SLIC3R_GUI */
7
8 #include "libslic3r.h"
9 #include "EdgeGrid.hpp"
10
11 #if 0
12 // Enable debugging and assert in this file.
13 #define DEBUG
14 #define _DEBUG
15 #undef NDEBUG
16 #endif
17
18 #include <assert.h>
19
20 namespace Slic3r {
21
22 EdgeGrid::Grid::Grid() :
23 m_rows(0), m_cols(0)
24 {
25 }
26
27 EdgeGrid::Grid::~Grid()
28 {
29 m_contours.clear();
30 m_cell_data.clear();
31 m_cells.clear();
32 }
33
34 void EdgeGrid::Grid::create(const Polygons &polygons, coord_t resolution)
35 {
36 // Count the contours.
37 size_t ncontours = 0;
38 for (size_t j = 0; j < polygons.size(); ++ j)
39 if (! polygons[j].points.empty())
40 ++ ncontours;
41
42 // Collect the contours.
43 m_contours.assign(ncontours, NULL);
44 ncontours = 0;
45 for (size_t j = 0; j < polygons.size(); ++ j)
46 if (! polygons[j].points.empty())
47 m_contours[ncontours++] = &polygons[j].points;
48
49 create_from_m_contours(resolution);
50 }
51
52 void EdgeGrid::Grid::create(const ExPolygon &expoly, coord_t resolution)
53 {
54 // Count the contours.
55 size_t ncontours = 0;
56 if (! expoly.contour.points.empty())
57 ++ ncontours;
58 for (size_t j = 0; j < expoly.holes.size(); ++ j)
59 if (! expoly.holes[j].points.empty())
60 ++ ncontours;
61
62 // Collect the contours.
63 m_contours.assign(ncontours, NULL);
64 ncontours = 0;
65 if (! expoly.contour.points.empty())
66 m_contours[ncontours++] = &expoly.contour.points;
67 for (size_t j = 0; j < expoly.holes.size(); ++ j)
68 if (! expoly.holes[j].points.empty())
69 m_contours[ncontours++] = &expoly.holes[j].points;
70
71 create_from_m_contours(resolution);
72 }
73
74 void EdgeGrid::Grid::create(const ExPolygons &expolygons, coord_t resolution)
75 {
76 // Count the contours.
77 size_t ncontours = 0;
78 for (size_t i = 0; i < expolygons.size(); ++ i) {
79 const ExPolygon &expoly = expolygons[i];
80 if (! expoly.contour.points.empty())
81 ++ ncontours;
82 for (size_t j = 0; j < expoly.holes.size(); ++ j)
83 if (! expoly.holes[j].points.empty())
84 ++ ncontours;
85 }
86
87 // Collect the contours.
88 m_contours.assign(ncontours, NULL);
89 ncontours = 0;
90 for (size_t i = 0; i < expolygons.size(); ++ i) {
91 const ExPolygon &expoly = expolygons[i];
92 if (! expoly.contour.points.empty())
93 m_contours[ncontours++] = &expoly.contour.points;
94 for (size_t j = 0; j < expoly.holes.size(); ++ j)
95 if (! expoly.holes[j].points.empty())
96 m_contours[ncontours++] = &expoly.holes[j].points;
97 }
98
99 create_from_m_contours(resolution);
100 }
101
102 void EdgeGrid::Grid::create(const ExPolygonCollection &expolygons, coord_t resolution)
103 {
104 create(expolygons.expolygons, resolution);
105 }
106
107 // m_contours has been initialized. Now fill in the edge grid.
108 void EdgeGrid::Grid::create_from_m_contours(coord_t resolution)
109 {
110 // 1) Measure the bounding box.
111 m_bbox.defined = false;
112 for (size_t i = 0; i < m_contours.size(); ++ i) {
113 const Slic3r::Points &pts = *m_contours[i];
114 for (size_t j = 0; j < pts.size(); ++ j)
115 m_bbox.merge(pts[j]);
116 }
117 coord_t eps = 16;
118 m_bbox.min.x -= eps;
119 m_bbox.min.y -= eps;
120 m_bbox.max.x += eps;
121 m_bbox.max.y += eps;
122
123 // 2) Initialize the edge grid.
124 m_resolution = resolution;
125 m_cols = (m_bbox.max.x - m_bbox.min.x + m_resolution - 1) / m_resolution;
126 m_rows = (m_bbox.max.y - m_bbox.min.y + m_resolution - 1) / m_resolution;
127 m_cells.assign(m_rows * m_cols, Cell());
128
129 // 3) First round of contour rasterization, count the edges per grid cell.
130 for (size_t i = 0; i < m_contours.size(); ++ i) {
131 const Slic3r::Points &pts = *m_contours[i];
132 for (size_t j = 0; j < pts.size(); ++ j) {
133 // End points of the line segment.
134 Slic3r::Point p1(pts[j]);
135 Slic3r::Point p2 = pts[(j + 1 == pts.size()) ? 0 : j + 1];
136 p1.x -= m_bbox.min.x;
137 p1.y -= m_bbox.min.y;
138 p2.x -= m_bbox.min.x;
139 p2.y -= m_bbox.min.y;
140 // Get the cells of the end points.
141 coord_t ix = p1.x / m_resolution;
142 coord_t iy = p1.y / m_resolution;
143 coord_t ixb = p2.x / m_resolution;
144 coord_t iyb = p2.y / m_resolution;
145 assert(ix >= 0 && ix < m_cols);
146 assert(iy >= 0 && iy < m_rows);
147 assert(ixb >= 0 && ixb < m_cols);
148 assert(iyb >= 0 && iyb < m_rows);
149 // Account for the end points.
150 ++ m_cells[iy*m_cols+ix].end;
151 if (ix == ixb && iy == iyb)
152 // Both ends fall into the same cell.
153 continue;
154 // Raster the centeral part of the line.
155 coord_t dx = std::abs(p2.x - p1.x);
156 coord_t dy = std::abs(p2.y - p1.y);
157 if (p1.x < p2.x) {
158 int64_t ex = int64_t((ix + 1)*m_resolution - p1.x) * int64_t(dy);
159 if (p1.y < p2.y) {
160 // x positive, y positive
161 int64_t ey = int64_t((iy + 1)*m_resolution - p1.y) * int64_t(dx);
162 do {
163 assert(ix <= ixb && iy <= iyb);
164 if (ex < ey) {
165 ey -= ex;
166 ex = int64_t(dy) * m_resolution;
167 ix += 1;
168 }
169 else if (ex == ey) {
170 ex = int64_t(dy) * m_resolution;
171 ey = int64_t(dx) * m_resolution;
172 ix += 1;
173 iy += 1;
174 }
175 else {
176 assert(ex > ey);
177 ex -= ey;
178 ey = int64_t(dx) * m_resolution;
179 iy += 1;
180 }
181 ++m_cells[iy*m_cols + ix].end;
182 } while (ix != ixb || iy != iyb);
183 }
184 else {
185 // x positive, y non positive
186 int64_t ey = int64_t(p1.y - iy*m_resolution) * int64_t(dx);
187 do {
188 assert(ix <= ixb && iy >= iyb);
189 if (ex <= ey) {
190 ey -= ex;
191 ex = int64_t(dy) * m_resolution;
192 ix += 1;
193 }
194 else {
195 ex -= ey;
196 ey = int64_t(dx) * m_resolution;
197 iy -= 1;
198 }
199 ++m_cells[iy*m_cols + ix].end;
200 } while (ix != ixb || iy != iyb);
201 }
202 }
203 else {
204 int64_t ex = int64_t(p1.x - ix*m_resolution) * int64_t(dy);
205 if (p1.y < p2.y) {
206 // x non positive, y positive
207 int64_t ey = int64_t((iy + 1)*m_resolution - p1.y) * int64_t(dx);
208 do {
209 assert(ix >= ixb && iy <= iyb);
210 if (ex < ey) {
211 ey -= ex;
212 ex = int64_t(dy) * m_resolution;
213 ix -= 1;
214 }
215 else {
216 assert(ex >= ey);
217 ex -= ey;
218 ey = int64_t(dx) * m_resolution;
219 iy += 1;
220 }
221 ++m_cells[iy*m_cols + ix].end;
222 } while (ix != ixb || iy != iyb);
223 }
224 else {
225 // x non positive, y non positive
226 int64_t ey = int64_t(p1.y - iy*m_resolution) * int64_t(dx);
227 do {
228 assert(ix >= ixb && iy >= iyb);
229 if (ex < ey) {
230 ey -= ex;
231 ex = int64_t(dy) * m_resolution;
232 ix -= 1;
233 }
234 else if (ex == ey) {
235 // The lower edge of a grid cell belongs to the cell.
236 // Handle the case where the ray may cross the lower left corner of a cell in a general case,
237 // or a left or lower edge in a degenerate case (horizontal or vertical line).
238 if (dx > 0) {
239 ex = int64_t(dy) * m_resolution;
240 ix -= 1;
241 }
242 if (dy > 0) {
243 ey = int64_t(dx) * m_resolution;
244 iy -= 1;
245 }
246 }
247 else {
248 assert(ex > ey);
249 ex -= ey;
250 ey = int64_t(dx) * m_resolution;
251 iy -= 1;
252 }
253 ++m_cells[iy*m_cols + ix].end;
254 } while (ix != ixb || iy != iyb);
255 }
256 }
257 }
258 }
259
260 // 4) Prefix sum the numbers of hits per cells to get an index into m_cell_data.
261 size_t cnt = m_cells.front().end;
262 for (size_t i = 1; i < m_cells.size(); ++ i) {
263 m_cells[i].begin = cnt;
264 cnt += m_cells[i].end;
265 m_cells[i].end = cnt;
266 }
267
268 // 5) Allocate the cell data.
269 m_cell_data.assign(cnt, std::pair<size_t, size_t>(size_t(-1), size_t(-1)));
270
271 // 6) Finally fill in m_cell_data by rasterizing the lines once again.
272 for (size_t i = 0; i < m_cells.size(); ++i)
273 m_cells[i].end = m_cells[i].begin;
274 for (size_t i = 0; i < m_contours.size(); ++i) {
275 const Slic3r::Points &pts = *m_contours[i];
276 for (size_t j = 0; j < pts.size(); ++j) {
277 // End points of the line segment.
278 Slic3r::Point p1(pts[j]);
279 Slic3r::Point p2 = pts[(j + 1 == pts.size()) ? 0 : j + 1];
280 p1.x -= m_bbox.min.x;
281 p1.y -= m_bbox.min.y;
282 p2.x -= m_bbox.min.x;
283 p2.y -= m_bbox.min.y;
284 // Get the cells of the end points.
285 coord_t ix = p1.x / m_resolution;
286 coord_t iy = p1.y / m_resolution;
287 coord_t ixb = p2.x / m_resolution;
288 coord_t iyb = p2.y / m_resolution;
289 assert(ix >= 0 && ix < m_cols);
290 assert(iy >= 0 && iy < m_rows);
291 assert(ixb >= 0 && ixb < m_cols);
292 assert(iyb >= 0 && iyb < m_rows);
293 // Account for the end points.
294 m_cell_data[m_cells[iy*m_cols + ix].end++] = std::pair<size_t, size_t>(i, j);
295 if (ix == ixb && iy == iyb)
296 // Both ends fall into the same cell.
297 continue;
298 // Raster the centeral part of the line.
299 coord_t dx = std::abs(p2.x - p1.x);
300 coord_t dy = std::abs(p2.y - p1.y);
301 if (p1.x < p2.x) {
302 int64_t ex = int64_t((ix + 1)*m_resolution - p1.x) * int64_t(dy);
303 if (p1.y < p2.y) {
304 // x positive, y positive
305 int64_t ey = int64_t((iy + 1)*m_resolution - p1.y) * int64_t(dx);
306 do {
307 assert(ix <= ixb && iy <= iyb);
308 if (ex < ey) {
309 ey -= ex;
310 ex = int64_t(dy) * m_resolution;
311 ix += 1;
312 }
313 else if (ex == ey) {
314 ex = int64_t(dy) * m_resolution;
315 ey = int64_t(dx) * m_resolution;
316 ix += 1;
317 iy += 1;
318 }
319 else {
320 assert(ex > ey);
321 ex -= ey;
322 ey = int64_t(dx) * m_resolution;
323 iy += 1;
324 }
325 m_cell_data[m_cells[iy*m_cols + ix].end++] = std::pair<size_t, size_t>(i, j);
326 } while (ix != ixb || iy != iyb);
327 }
328 else {
329 // x positive, y non positive
330 int64_t ey = int64_t(p1.y - iy*m_resolution) * int64_t(dx);
331 do {
332 assert(ix <= ixb && iy >= iyb);
333 if (ex <= ey) {
334 ey -= ex;
335 ex = int64_t(dy) * m_resolution;
336 ix += 1;
337 }
338 else {
339 ex -= ey;
340 ey = int64_t(dx) * m_resolution;
341 iy -= 1;
342 }
343 m_cell_data[m_cells[iy*m_cols + ix].end++] = std::pair<size_t, size_t>(i, j);
344 } while (ix != ixb || iy != iyb);
345 }
346 }
347 else {
348 int64_t ex = int64_t(p1.x - ix*m_resolution) * int64_t(dy);
349 if (p1.y < p2.y) {
350 // x non positive, y positive
351 int64_t ey = int64_t((iy + 1)*m_resolution - p1.y) * int64_t(dx);
352 do {
353 assert(ix >= ixb && iy <= iyb);
354 if (ex < ey) {
355 ey -= ex;
356 ex = int64_t(dy) * m_resolution;
357 ix -= 1;
358 }
359 else {
360 assert(ex >= ey);
361 ex -= ey;
362 ey = int64_t(dx) * m_resolution;
363 iy += 1;
364 }
365 m_cell_data[m_cells[iy*m_cols + ix].end++] = std::pair<size_t, size_t>(i, j);
366 } while (ix != ixb || iy != iyb);
367 }
368 else {
369 // x non positive, y non positive
370 int64_t ey = int64_t(p1.y - iy*m_resolution) * int64_t(dx);
371 do {
372 assert(ix >= ixb && iy >= iyb);
373 if (ex < ey) {
374 ey -= ex;
375 ex = int64_t(dy) * m_resolution;
376 ix -= 1;
377 }
378 else if (ex == ey) {
379 // The lower edge of a grid cell belongs to the cell.
380 // Handle the case where the ray may cross the lower left corner of a cell in a general case,
381 // or a left or lower edge in a degenerate case (horizontal or vertical line).
382 if (dx > 0) {
383 ex = int64_t(dy) * m_resolution;
384 ix -= 1;
385 }
386 if (dy > 0) {
387 ey = int64_t(dx) * m_resolution;
388 iy -= 1;
389 }
390 }
391 else {
392 assert(ex > ey);
393 ex -= ey;
394 ey = int64_t(dx) * m_resolution;
395 iy -= 1;
396 }
397 m_cell_data[m_cells[iy*m_cols + ix].end++] = std::pair<size_t, size_t>(i, j);
398 } while (ix != ixb || iy != iyb);
399 }
400 }
401 }
402 }
403 }
404
405 #if 0
406 // Divide, round to a grid coordinate.
407 // Divide x/y, round down. y is expected to be positive.
408 static inline coord_t div_floor(coord_t x, coord_t y)
409 {
410 assert(y > 0);
411 return ((x < 0) ? (x - y + 1) : x) / y;
412 }
413
414 // Walk the polyline, test whether any lines of this polyline does not intersect
415 // any line stored into the grid.
416 bool EdgeGrid::Grid::intersect(const MultiPoint &polyline, bool closed)
417 {
418 size_t n = polyline.points.size();
419 if (closed)
420 ++ n;
421 for (size_t i = 0; i < n; ++ i) {
422 size_t j = i + 1;
423 if (j == polyline.points.size())
424 j = 0;
425 Point p1src = polyline.points[i];
426 Point p2src = polyline.points[j];
427 Point p1 = p1src;
428 Point p2 = p2src;
429 // Discretize the line segment p1, p2.
430 p1.x -= m_bbox.min.x;
431 p1.y -= m_bbox.min.y;
432 p2.x -= m_bbox.min.x;
433 p2.y -= m_bbox.min.y;
434 // Get the cells of the end points.
435 coord_t ix = div_floor(p1.x, m_resolution);
436 coord_t iy = div_floor(p1.y, m_resolution);
437 coord_t ixb = div_floor(p2.x, m_resolution);
438 coord_t iyb = div_floor(p2.y, m_resolution);
439 // assert(ix >= 0 && ix < m_cols);
440 // assert(iy >= 0 && iy < m_rows);
441 // assert(ixb >= 0 && ixb < m_cols);
442 // assert(iyb >= 0 && iyb < m_rows);
443 // Account for the end points.
444 if (line_cell_intersect(p1src, p2src, m_cells[iy*m_cols + ix]))
445 return true;
446 if (ix == ixb && iy == iyb)
447 // Both ends fall into the same cell.
448 continue;
449 // Raster the centeral part of the line.
450 coord_t dx = std::abs(p2.x - p1.x);
451 coord_t dy = std::abs(p2.y - p1.y);
452 if (p1.x < p2.x) {
453 int64_t ex = int64_t((ix + 1)*m_resolution - p1.x) * int64_t(dy);
454 if (p1.y < p2.y) {
455 int64_t ey = int64_t((iy + 1)*m_resolution - p1.y) * int64_t(dx);
456 do {
457 assert(ix <= ixb && iy <= iyb);
458 if (ex < ey) {
459 ey -= ex;
460 ex = int64_t(dy) * m_resolution;
461 ix += 1;
462 }
463 else if (ex == ey) {
464 ex = int64_t(dy) * m_resolution;
465 ey = int64_t(dx) * m_resolution;
466 ix += 1;
467 iy += 1;
468 }
469 else {
470 assert(ex > ey);
471 ex -= ey;
472 ey = int64_t(dx) * m_resolution;
473 iy += 1;
474 }
475 if (line_cell_intersect(p1src, p2src, m_cells[iy*m_cols + ix]))
476 return true;
477 } while (ix != ixb || iy != iyb);
478 }
479 else {
480 int64_t ey = int64_t(p1.y - iy*m_resolution) * int64_t(dx);
481 do {
482 assert(ix <= ixb && iy >= iyb);
483 if (ex <= ey) {
484 ey -= ex;
485 ex = int64_t(dy) * m_resolution;
486 ix += 1;
487 }
488 else {
489 ex -= ey;
490 ey = int64_t(dx) * m_resolution;
491 iy -= 1;
492 }
493 if (line_cell_intersect(p1src, p2src, m_cells[iy*m_cols + ix]))
494 return true;
495 } while (ix != ixb || iy != iyb);
496 }
497 }
498 else {
499 int64_t ex = int64_t(p1.x - ix*m_resolution) * int64_t(dy);
500 if (p1.y < p2.y) {
501 int64_t ey = int64_t((iy + 1)*m_resolution - p1.y) * int64_t(dx);
502 do {
503 assert(ix >= ixb && iy <= iyb);
504 if (ex < ey) {
505 ey -= ex;
506 ex = int64_t(dy) * m_resolution;
507 ix -= 1;
508 }
509 else {
510 assert(ex >= ey);
511 ex -= ey;
512 ey = int64_t(dx) * m_resolution;
513 iy += 1;
514 }
515 if (line_cell_intersect(p1src, p2src, m_cells[iy*m_cols + ix]))
516 return true;
517 } while (ix != ixb || iy != iyb);
518 }
519 else {
520 int64_t ey = int64_t(p1.y - iy*m_resolution) * int64_t(dx);
521 do {
522 assert(ix >= ixb && iy >= iyb);
523 if (ex < ey) {
524 ey -= ex;
525 ex = int64_t(dy) * m_resolution;
526 ix -= 1;
527 }
528 else if (ex == ey) {
529 if (dx > 0) {
530 ex = int64_t(dy) * m_resolution;
531 ix -= 1;
532 }
533 if (dy > 0) {
534 ey = int64_t(dx) * m_resolution;
535 iy -= 1;
536 }
537 }
538 else {
539 assert(ex > ey);
540 ex -= ey;
541 ey = int64_t(dx) * m_resolution;
542 iy -= 1;
543 }
544 if (line_cell_intersect(p1src, p2src, m_cells[iy*m_cols + ix]))
545 return true;
546 } while (ix != ixb || iy != iyb);
547 }
548 }
549 }
550 return false;
551 }
552
553 bool EdgeGrid::Grid::line_cell_intersect(const Point &p1a, const Point &p2a, const Cell &cell)
554 {
555 BoundingBox bbox(p1a, p1a);
556 bbox.merge(p2a);
557 int64_t va_x = p2a.x - p1a.x;
558 int64_t va_y = p2a.y - p1a.y;
559 for (size_t i = cell.begin; i != cell.end; ++ i) {
560 const std::pair<size_t, size_t> &cell_data = m_cell_data[i];
561 // Contour indexed by the ith line of this cell.
562 const Slic3r::Points &contour = *m_contours[cell_data.first];
563 // Point indices in contour indexed by the ith line of this cell.
564 size_t idx1 = cell_data.second;
565 size_t idx2 = idx1 + 1;
566 if (idx2 == contour.size())
567 idx2 = 0;
568 // The points of the ith line of this cell and its bounding box.
569 const Point &p1b = contour[idx1];
570 const Point &p2b = contour[idx2];
571 BoundingBox bbox2(p1b, p1b);
572 bbox2.merge(p2b);
573 // Do the bounding boxes intersect?
574 if (! bbox.overlap(bbox2))
575 continue;
576 // Now intersect the two line segments using exact arithmetics.
577 int64_t w1_x = p1b.x - p1a.x;
578 int64_t w1_y = p1b.y - p1a.y;
579 int64_t w2_x = p2b.x - p1a.x;
580 int64_t w2_y = p2b.y - p1a.y;
581 int64_t side1 = va_x * w1_y - va_y * w1_x;
582 int64_t side2 = va_x * w2_y - va_y * w2_x;
583 if (side1 == side2 && side1 != 0)
584 // The line segments don't intersect.
585 continue;
586 w1_x = p1a.x - p1b.x;
587 w1_y = p1a.y - p1b.y;
588 w2_x = p2a.x - p1b.x;
589 w2_y = p2a.y - p1b.y;
590 int64_t vb_x = p2b.x - p1b.x;
591 int64_t vb_y = p2b.y - p1b.y;
592 side1 = vb_x * w1_y - vb_y * w1_x;
593 side2 = vb_x * w2_y - vb_y * w2_x;
594 if (side1 == side2 && side1 != 0)
595 // The line segments don't intersect.
596 continue;
597 // The line segments intersect.
598 return true;
599 }
600 // The line segment (p1a, p2a) does not intersect any of the line segments inside this cell.
601 return false;
602 }
603
604 // Test, whether a point is inside a contour.
605 bool EdgeGrid::Grid::inside(const Point &pt_src)
606 {
607 Point p = pt_src;
608 p.x -= m_bbox.min.x;
609 p.y -= m_bbox.min.y;
610 // Get the cell of the point.
611 if (p.x < 0 || p.y < 0)
612 return false;
613 coord_t ix = p.x / m_resolution;
614 coord_t iy = p.y / m_resolution;
615 if (ix >= this->m_cols || iy >= this->m_rows)
616 return false;
617
618 size_t i_closest = (size_t)-1;
619 bool inside = false;
620
621 {
622 // Hit in the first cell?
623 const Cell &cell = m_cells[iy * m_cols + ix];
624 for (size_t i = cell.begin; i != cell.end; ++ i) {
625 const std::pair<size_t, size_t> &cell_data = m_cell_data[i];
626 // Contour indexed by the ith line of this cell.
627 const Slic3r::Points &contour = *m_contours[cell_data.first];
628 // Point indices in contour indexed by the ith line of this cell.
629 size_t idx1 = cell_data.second;
630 size_t idx2 = idx1 + 1;
631 if (idx2 == contour.size())
632 idx2 = 0;
633 const Point &p1 = contour[idx1];
634 const Point &p2 = contour[idx2];
635 if (p1.y < p2.y) {
636 if (p.y < p1.y || p.y > p2.y)
637 continue;
638 //FIXME finish this!
639 int64_t vx = 0;// pt_src
640 //FIXME finish this!
641 int64_t det = 0;
642 } else if (p1.y != p2.y) {
643 assert(p1.y > p2.y);
644 if (p.y < p2.y || p.y > p1.y)
645 continue;
646 } else {
647 assert(p1.y == p2.y);
648 if (p1.y == p.y) {
649 if (p.x >= p1.x && p.x <= p2.x)
650 // On the segment.
651 return true;
652 // Before or after the segment.
653 size_t idx0 = idx1 - 1;
654 size_t idx2 = idx1 + 1;
655 if (idx0 == (size_t)-1)
656 idx0 = contour.size() - 1;
657 if (idx2 == contour.size())
658 idx2 = 0;
659 }
660 }
661 }
662 }
663
664 //FIXME This code follows only a single direction. Better to follow the direction closest to the bounding box.
665 }
666 #endif
667
668 template<const int INCX, const int INCY>
669 struct PropagateDanielssonSingleStep {
670 PropagateDanielssonSingleStep(float *aL, unsigned char *asigns, size_t astride, coord_t aresolution) :
671 L(aL), signs(asigns), stride(astride), resolution(aresolution) {}
672 inline void operator()(int r, int c, int addr_delta) {
673 size_t addr = r * stride + c;
674 if ((signs[addr] & 2) == 0) {
675 float *v = &L[addr << 1];
676 float l = v[0] * v[0] + v[1] * v[1];
677 float *v2s = v + (addr_delta << 1);
678 float v2[2] = {
679 v2s[0] + INCX * resolution,
680 v2s[1] + INCY * resolution
681 };
682 float l2 = v2[0] * v2[0] + v2[1] * v2[1];
683 if (l2 < l) {
684 v[0] = v2[0];
685 v[1] = v2[1];
686 }
687 }
688 }
689 float *L;
690 unsigned char *signs;
691 size_t stride;
692 coord_t resolution;
693 };
694
695 struct PropagateDanielssonSingleVStep3 {
696 PropagateDanielssonSingleVStep3(float *aL, unsigned char *asigns, size_t astride, coord_t aresolution) :
697 L(aL), signs(asigns), stride(astride), resolution(aresolution) {}
698 inline void operator()(int r, int c, int addr_delta, bool has_l, bool has_r) {
699 size_t addr = r * stride + c;
700 if ((signs[addr] & 2) == 0) {
701 float *v = &L[addr<<1];
702 float l = v[0]*v[0]+v[1]*v[1];
703 float *v2s = v+(addr_delta<<1);
704 float v2[2] = {
705 v2s[0],
706 v2s[1] + resolution
707 };
708 float l2 = v2[0]*v2[0]+v2[1]*v2[1];
709 if (l2 < l) {
710 v[0] = v2[0];
711 v[1] = v2[1];
712 }
713 if (has_l) {
714 float *v2sl = v2s - 1;
715 v2[0] = v2sl[0] + resolution;
716 v2[1] = v2sl[1] + resolution;
717 l2 = v2[0]*v2[0]+v2[1]*v2[1];
718 if (l2 < l) {
719 v[0] = v2[0];
720 v[1] = v2[1];
721 }
722 }
723 if (has_r) {
724 float *v2sr = v2s + 1;
725 v2[0] = v2sr[0] + resolution;
726 v2[1] = v2sr[1] + resolution;
727 l2 = v2[0]*v2[0]+v2[1]*v2[1];
728 if (l2 < l) {
729 v[0] = v2[0];
730 v[1] = v2[1];
731 }
732 }
733 }
734 }
735 float *L;
736 unsigned char *signs;
737 size_t stride;
738 coord_t resolution;
739 };
740
741 void EdgeGrid::Grid::calculate_sdf()
742 {
743 // 1) Initialize a signum and an unsigned vector to a zero iso surface.
744 size_t nrows = m_rows + 1;
745 size_t ncols = m_cols + 1;
746 // Unsigned vectors towards the closest point on the surface.
747 std::vector<float> L(nrows * ncols * 2, FLT_MAX);
748 // Bit 0 set - negative.
749 // Bit 1 set - original value, the distance value shall not be changed by the Danielsson propagation.
750 // Bit 2 set - signum not propagated yet.
751 std::vector<unsigned char> signs(nrows * ncols, 4);
752 // SDF will be initially filled with unsigned DF.
753 // m_signed_distance_field.assign(nrows * ncols, FLT_MAX);
754 float search_radius = float(m_resolution<<1);
755 m_signed_distance_field.assign(nrows * ncols, search_radius);
756 // For each cell:
757 for (size_t r = 0; r < m_rows; ++ r) {
758 for (size_t c = 0; c < m_cols; ++ c) {
759 const Cell &cell = m_cells[r * m_cols + c];
760 // For each segment in the cell:
761 for (size_t i = cell.begin; i != cell.end; ++ i) {
762 const Slic3r::Points &pts = *m_contours[m_cell_data[i].first];
763 size_t ipt = m_cell_data[i].second;
764 // End points of the line segment.
765 const Slic3r::Point &p1 = pts[ipt];
766 const Slic3r::Point &p2 = pts[(ipt + 1 == pts.size()) ? 0 : ipt + 1];
767 // Segment vector
768 const Slic3r::Point v_seg = p1.vector_to(p2);
769 // l2 of v_seg
770 const int64_t l2_seg = int64_t(v_seg.x) * int64_t(v_seg.x) + int64_t(v_seg.y) * int64_t(v_seg.y);
771 // For each corner of this cell and its 1 ring neighbours:
772 for (int corner_y = -1; corner_y < 3; ++ corner_y) {
773 coord_t corner_r = r + corner_y;
774 if (corner_r < 0 || corner_r >= nrows)
775 continue;
776 for (int corner_x = -1; corner_x < 3; ++ corner_x) {
777 coord_t corner_c = c + corner_x;
778 if (corner_c < 0 || corner_c >= ncols)
779 continue;
780 float &d_min = m_signed_distance_field[corner_r * ncols + corner_c];
781 Slic3r::Point pt(m_bbox.min.x + corner_c * m_resolution, m_bbox.min.y + corner_r * m_resolution);
782 Slic3r::Point v_pt = p1.vector_to(pt);
783 // dot(p2-p1, pt-p1)
784 int64_t t_pt = int64_t(v_seg.x) * int64_t(v_pt.x) + int64_t(v_seg.y) * int64_t(v_pt.y);
785 if (t_pt < 0) {
786 // Closest to p1.
787 double dabs = sqrt(int64_t(v_pt.x) * int64_t(v_pt.x) + int64_t(v_pt.y) * int64_t(v_pt.y));
788 if (dabs < d_min) {
789 // Previous point.
790 const Slic3r::Point &p0 = pts[(ipt == 0) ? (pts.size() - 1) : ipt - 1];
791 Slic3r::Point v_seg_prev = p0.vector_to(p1);
792 int64_t t2_pt = int64_t(v_seg_prev.x) * int64_t(v_pt.x) + int64_t(v_seg_prev.y) * int64_t(v_pt.y);
793 if (t2_pt > 0) {
794 // Inside the wedge between the previous and the next segment.
795 // Set the signum depending on whether the vertex is convex or reflex.
796 int64_t det = int64_t(v_seg_prev.x) * int64_t(v_seg.y) - int64_t(v_seg_prev.y) * int64_t(v_seg.x);
797 assert(det != 0);
798 d_min = dabs;
799 // Fill in an unsigned vector towards the zero iso surface.
800 float *l = &L[(corner_r * ncols + corner_c) << 1];
801 l[0] = std::abs(v_pt.x);
802 l[1] = std::abs(v_pt.y);
803 #ifdef _DEBUG
804 double dabs2 = sqrt(l[0]*l[0]+l[1]*l[1]);
805 assert(std::abs(dabs-dabs2) < 1e-4 * std::max(dabs, dabs2));
806 #endif /* _DEBUG */
807 signs[corner_r * ncols + corner_c] = ((det < 0) ? 1 : 0) | 2;
808 }
809 }
810 }
811 else if (t_pt > l2_seg) {
812 // Closest to p2. Then p2 is the starting point of another segment, which shall be discovered in the same cell.
813 continue;
814 } else {
815 // Closest to the segment.
816 assert(t_pt >= 0 && t_pt <= l2_seg);
817 int64_t d_seg = int64_t(v_seg.y) * int64_t(v_pt.x) - int64_t(v_seg.x) * int64_t(v_pt.y);
818 double d = double(d_seg) / sqrt(double(l2_seg));
819 double dabs = std::abs(d);
820 if (dabs < d_min) {
821 d_min = dabs;
822 // Fill in an unsigned vector towards the zero iso surface.
823 float *l = &L[(corner_r * ncols + corner_c) << 1];
824 float linv = float(d_seg) / float(l2_seg);
825 l[0] = std::abs(float(v_seg.y) * linv);
826 l[1] = std::abs(float(v_seg.x) * linv);
827 #ifdef _DEBUG
828 double dabs2 = sqrt(l[0]*l[0]+l[1]*l[1]);
829 assert(std::abs(dabs-dabs2) <= 1e-4 * std::max(dabs, dabs2));
830 #endif /* _DEBUG */
831 signs[corner_r * ncols + corner_c] = ((d_seg < 0) ? 1 : 0) | 2;
832 }
833 }
834 }
835 }
836 }
837 }
838 }
839
840 #if 0
841 //#ifdef SLIC3R_GUI
842 {
843 wxImage img(ncols, nrows);
844 unsigned char *data = img.GetData();
845 memset(data, 0, ncols * nrows * 3);
846 for (coord_t r = 0; r < nrows; ++r) {
847 for (coord_t c = 0; c < ncols; ++c) {
848 unsigned char *pxl = data + (((nrows - r - 1) * ncols) + c) * 3;
849 float d = m_signed_distance_field[r * ncols + c];
850 if (d != search_radius) {
851 float s = 255 * d / search_radius;
852 int is = std::max(0, std::min(255, int(floor(s + 0.5f))));
853 pxl[0] = 255;
854 pxl[1] = 255 - is;
855 pxl[2] = 255 - is;
856 }
857 else {
858 pxl[0] = 0;
859 pxl[1] = 255;
860 pxl[2] = 0;
861 }
862 }
863 }
864 img.SaveFile(debug_out_path("unsigned_df.png"), wxBITMAP_TYPE_PNG);
865 }
866 {
867 wxImage img(ncols, nrows);
868 unsigned char *data = img.GetData();
869 memset(data, 0, ncols * nrows * 3);
870 for (coord_t r = 0; r < nrows; ++r) {
871 for (coord_t c = 0; c < ncols; ++c) {
872 unsigned char *pxl = data + (((nrows - r - 1) * ncols) + c) * 3;
873 float d = m_signed_distance_field[r * ncols + c];
874 if (d != search_radius) {
875 float s = 255 * d / search_radius;
876 int is = std::max(0, std::min(255, int(floor(s + 0.5f))));
877 if ((signs[r * ncols + c] & 1) == 0) {
878 // Positive
879 pxl[0] = 255;
880 pxl[1] = 255 - is;
881 pxl[2] = 255 - is;
882 }
883 else {
884 // Negative
885 pxl[0] = 255 - is;
886 pxl[1] = 255 - is;
887 pxl[2] = 255;
888 }
889 }
890 else {
891 pxl[0] = 0;
892 pxl[1] = 255;
893 pxl[2] = 0;
894 }
895 }
896 }
897 img.SaveFile(debug_out_path("signed_df.png"), wxBITMAP_TYPE_PNG);
898 }
899 #endif /* SLIC3R_GUI */
900
901 // 2) Propagate the signum.
902 #define PROPAGATE_SIGNUM_SINGLE_STEP(DELTA) do { \
903 size_t addr = r * ncols + c; \
904 unsigned char &cur_val = signs[addr]; \
905 if (cur_val & 4) { \
906 unsigned char old_val = signs[addr + (DELTA)]; \
907 if ((old_val & 4) == 0) \
908 cur_val = old_val & 1; \
909 } \
910 } while (0);
911 // Top to bottom propagation.
912 for (size_t r = 0; r < nrows; ++ r) {
913 if (r > 0)
914 for (size_t c = 0; c < ncols; ++ c)
915 PROPAGATE_SIGNUM_SINGLE_STEP(- int(ncols));
916 for (size_t c = 1; c < ncols; ++ c)
917 PROPAGATE_SIGNUM_SINGLE_STEP(- 1);
918 for (int c = int(ncols) - 2; c >= 0; -- c)
919 PROPAGATE_SIGNUM_SINGLE_STEP(+ 1);
920 }
921 // Bottom to top propagation.
922 for (int r = int(nrows) - 2; r >= 0; -- r) {
923 for (size_t c = 0; c < ncols; ++ c)
924 PROPAGATE_SIGNUM_SINGLE_STEP(+ ncols);
925 for (size_t c = 1; c < ncols; ++ c)
926 PROPAGATE_SIGNUM_SINGLE_STEP(- 1);
927 for (int c = int(ncols) - 2; c >= 0; -- c)
928 PROPAGATE_SIGNUM_SINGLE_STEP(+ 1);
929 }
930 #undef PROPAGATE_SIGNUM_SINGLE_STEP
931
932 // 3) Propagate the distance by the Danielsson chamfer metric.
933 // Top to bottom propagation.
934 PropagateDanielssonSingleStep<1, 0> danielsson_hstep(L.data(), signs.data(), ncols, m_resolution);
935 PropagateDanielssonSingleStep<0, 1> danielsson_vstep(L.data(), signs.data(), ncols, m_resolution);
936 PropagateDanielssonSingleVStep3 danielsson_vstep3(L.data(), signs.data(), ncols, m_resolution);
937 // Top to bottom propagation.
938 for (size_t r = 0; r < nrows; ++ r) {
939 if (r > 0)
940 for (size_t c = 0; c < ncols; ++ c)
941 danielsson_vstep(r, c, -int(ncols));
942 // PROPAGATE_DANIELSSON_SINGLE_VSTEP3(-int(ncols), c != 0, c + 1 != ncols);
943 for (size_t c = 1; c < ncols; ++ c)
944 danielsson_hstep(r, c, -1);
945 for (int c = int(ncols) - 2; c >= 0; -- c)
946 danielsson_hstep(r, c, +1);
947 }
948 // Bottom to top propagation.
949 for (int r = int(nrows) - 2; r >= 0; -- r) {
950 for (size_t c = 0; c < ncols; ++ c)
951 danielsson_vstep(r, c, +ncols);
952 // PROPAGATE_DANIELSSON_SINGLE_VSTEP3(+int(ncols), c != 0, c + 1 != ncols);
953 for (size_t c = 1; c < ncols; ++ c)
954 danielsson_hstep(r, c, -1);
955 for (int c = int(ncols) - 2; c >= 0; -- c)
956 danielsson_hstep(r, c, +1);
957 }
958
959 // Update signed distance field from absolte vectors to the iso-surface.
960 for (size_t r = 0; r < nrows; ++ r) {
961 for (size_t c = 0; c < ncols; ++ c) {
962 size_t addr = r * ncols + c;
963 float *v = &L[addr<<1];
964 float d = sqrt(v[0]*v[0]+v[1]*v[1]);
965 if (signs[addr] & 1)
966 d = -d;
967 m_signed_distance_field[addr] = d;
968 }
969 }
970
971 #if 0
972 //#ifdef SLIC3R_GUI
973 {
974 wxImage img(ncols, nrows);
975 unsigned char *data = img.GetData();
976 memset(data, 0, ncols * nrows * 3);
977 float search_radius = float(m_resolution * 5);
978 for (coord_t r = 0; r < nrows; ++r) {
979 for (coord_t c = 0; c < ncols; ++c) {
980 unsigned char *pxl = data + (((nrows - r - 1) * ncols) + c) * 3;
981 unsigned char sign = signs[r * ncols + c];
982 switch (sign) {
983 case 0:
984 // Positive, outside of a narrow band.
985 pxl[0] = 0;
986 pxl[1] = 0;
987 pxl[2] = 255;
988 break;
989 case 1:
990 // Negative, outside of a narrow band.
991 pxl[0] = 255;
992 pxl[1] = 0;
993 pxl[2] = 0;
994 break;
995 case 2:
996 // Positive, outside of a narrow band.
997 pxl[0] = 100;
998 pxl[1] = 100;
999 pxl[2] = 255;
1000 break;
1001 case 3:
1002 // Negative, outside of a narrow band.
1003 pxl[0] = 255;
1004 pxl[1] = 100;
1005 pxl[2] = 100;
1006 break;
1007 case 4:
1008 // This shall not happen. Undefined signum.
1009 pxl[0] = 0;
1010 pxl[1] = 255;
1011 pxl[2] = 0;
1012 break;
1013 default:
1014 // This shall not happen. Invalid signum value.
1015 pxl[0] = 255;
1016 pxl[1] = 255;
1017 pxl[2] = 255;
1018 break;
1019 }
1020 }
1021 }
1022 img.SaveFile(debug_out_path("signed_df-signs.png"), wxBITMAP_TYPE_PNG);
1023 }
1024 #endif /* SLIC3R_GUI */
1025
1026 #if 0
1027 //#ifdef SLIC3R_GUI
1028 {
1029 wxImage img(ncols, nrows);
1030 unsigned char *data = img.GetData();
1031 memset(data, 0, ncols * nrows * 3);
1032 float search_radius = float(m_resolution * 5);
1033 for (coord_t r = 0; r < nrows; ++r) {
1034 for (coord_t c = 0; c < ncols; ++c) {
1035 unsigned char *pxl = data + (((nrows - r - 1) * ncols) + c) * 3;
1036 float d = m_signed_distance_field[r * ncols + c];
1037 float s = 255.f * fabs(d) / search_radius;
1038 int is = std::max(0, std::min(255, int(floor(s + 0.5f))));
1039 if (d < 0.f) {
1040 pxl[0] = 255;
1041 pxl[1] = 255 - is;
1042 pxl[2] = 255 - is;
1043 }
1044 else {
1045 pxl[0] = 255 - is;
1046 pxl[1] = 255 - is;
1047 pxl[2] = 255;
1048 }
1049 }
1050 }
1051 img.SaveFile(debug_out_path("signed_df2.png"), wxBITMAP_TYPE_PNG);
1052 }
1053 #endif /* SLIC3R_GUI */
1054 }
1055
1056 float EdgeGrid::Grid::signed_distance_bilinear(const Point &pt) const
1057 {
1058 coord_t x = pt.x - m_bbox.min.x;
1059 coord_t y = pt.y - m_bbox.min.y;
1060 coord_t w = m_resolution * m_cols;
1061 coord_t h = m_resolution * m_rows;
1062 bool clamped = false;
1063 coord_t xcl = x;
1064 coord_t ycl = y;
1065 if (x < 0) {
1066 xcl = 0;
1067 clamped = true;
1068 } else if (x >= w) {
1069 xcl = w - 1;
1070 clamped = true;
1071 }
1072 if (y < 0) {
1073 ycl = 0;
1074 clamped = true;
1075 } else if (y >= h) {
1076 ycl = h - 1;
1077 clamped = true;
1078 }
1079
1080 coord_t cell_c = coord_t(floor(xcl / m_resolution));
1081 coord_t cell_r = coord_t(floor(ycl / m_resolution));
1082 float tx = float(xcl - cell_c * m_resolution) / float(m_resolution);
1083 assert(tx >= -1e-5 && tx < 1.f + 1e-5);
1084 float ty = float(ycl - cell_r * m_resolution) / float(m_resolution);
1085 assert(ty >= -1e-5 && ty < 1.f + 1e-5);
1086 size_t addr = cell_r * (m_cols + 1) + cell_c;
1087 float f00 = m_signed_distance_field[addr];
1088 float f01 = m_signed_distance_field[addr+1];
1089 addr += m_cols + 1;
1090 float f10 = m_signed_distance_field[addr];
1091 float f11 = m_signed_distance_field[addr+1];
1092 float f0 = (1.f - tx) * f00 + tx * f01;
1093 float f1 = (1.f - tx) * f10 + tx * f11;
1094 float f = (1.f - ty) * f0 + ty * f1;
1095
1096 if (clamped) {
1097 if (f > 0) {
1098 if (x < 0)
1099 f += -x;
1100 else if (x >= w)
1101 f += x - w + 1;
1102 if (y < 0)
1103 f += -y;
1104 else if (y >= h)
1105 f += y - h + 1;
1106 } else {
1107 if (x < 0)
1108 f -= -x;
1109 else if (x >= w)
1110 f -= x - w + 1;
1111 if (y < 0)
1112 f -= -y;
1113 else if (y >= h)
1114 f -= y - h + 1;
1115 }
1116 }
1117
1118 return f;
1119 }
1120
1121 bool EdgeGrid::Grid::signed_distance_edges(const Point &pt, coord_t search_radius, coordf_t &result_min_dist, bool *pon_segment) const {
1122 BoundingBox bbox;
1123 bbox.min = bbox.max = Point(pt.x - m_bbox.min.x, pt.y - m_bbox.min.y);
1124 bbox.defined = true;
1125 // Upper boundary, round to grid and test validity.
1126 bbox.max.x += search_radius;
1127 bbox.max.y += search_radius;
1128 if (bbox.max.x < 0 || bbox.max.y < 0)
1129 return false;
1130 bbox.max.x /= m_resolution;
1131 bbox.max.y /= m_resolution;
1132 if (bbox.max.x >= m_cols)
1133 bbox.max.x = m_cols - 1;
1134 if (bbox.max.y >= m_rows)
1135 bbox.max.y = m_rows - 1;
1136 // Lower boundary, round to grid and test validity.
1137 bbox.min.x -= search_radius;
1138 bbox.min.y -= search_radius;
1139 if (bbox.min.x < 0)
1140 bbox.min.x = 0;
1141 if (bbox.min.y < 0)
1142 bbox.min.y = 0;
1143 bbox.min.x /= m_resolution;
1144 bbox.min.y /= m_resolution;
1145 // Is the interval empty?
1146 if (bbox.min.x > bbox.max.x ||
1147 bbox.min.y > bbox.max.y)
1148 return false;
1149 // Traverse all cells in the bounding box.
1150 float d_min = search_radius;
1151 // Signum of the distance field at pt.
1152 int sign_min = 0;
1153 bool on_segment = false;
1154 for (int r = bbox.min.y; r <= bbox.max.y; ++ r) {
1155 for (int c = bbox.min.x; c <= bbox.max.x; ++ c) {
1156 const Cell &cell = m_cells[r * m_cols + c];
1157 for (size_t i = cell.begin; i < cell.end; ++ i) {
1158 const Slic3r::Points &pts = *m_contours[m_cell_data[i].first];
1159 size_t ipt = m_cell_data[i].second;
1160 // End points of the line segment.
1161 const Slic3r::Point &p1 = pts[ipt];
1162 const Slic3r::Point &p2 = pts[(ipt + 1 == pts.size()) ? 0 : ipt + 1];
1163 Slic3r::Point v_seg = p1.vector_to(p2);
1164 Slic3r::Point v_pt = p1.vector_to(pt);
1165 // dot(p2-p1, pt-p1)
1166 int64_t t_pt = int64_t(v_seg.x) * int64_t(v_pt.x) + int64_t(v_seg.y) * int64_t(v_pt.y);
1167 // l2 of seg
1168 int64_t l2_seg = int64_t(v_seg.x) * int64_t(v_seg.x) + int64_t(v_seg.y) * int64_t(v_seg.y);
1169 if (t_pt < 0) {
1170 // Closest to p1.
1171 double dabs = sqrt(int64_t(v_pt.x) * int64_t(v_pt.x) + int64_t(v_pt.y) * int64_t(v_pt.y));
1172 if (dabs < d_min) {
1173 // Previous point.
1174 const Slic3r::Point &p0 = pts[(ipt == 0) ? (pts.size() - 1) : ipt - 1];
1175 Slic3r::Point v_seg_prev = p0.vector_to(p1);
1176 int64_t t2_pt = int64_t(v_seg_prev.x) * int64_t(v_pt.x) + int64_t(v_seg_prev.y) * int64_t(v_pt.y);
1177 if (t2_pt > 0) {
1178 // Inside the wedge between the previous and the next segment.
1179 d_min = dabs;
1180 // Set the signum depending on whether the vertex is convex or reflex.
1181 int64_t det = int64_t(v_seg_prev.x) * int64_t(v_seg.y) - int64_t(v_seg_prev.y) * int64_t(v_seg.x);
1182 assert(det != 0);
1183 sign_min = (det > 0) ? 1 : -1;
1184 on_segment = false;
1185 }
1186 }
1187 }
1188 else if (t_pt > l2_seg) {
1189 // Closest to p2. Then p2 is the starting point of another segment, which shall be discovered in the same cell.
1190 continue;
1191 } else {
1192 // Closest to the segment.
1193 assert(t_pt >= 0 && t_pt <= l2_seg);
1194 int64_t d_seg = int64_t(v_seg.y) * int64_t(v_pt.x) - int64_t(v_seg.x) * int64_t(v_pt.y);
1195 double d = double(d_seg) / sqrt(double(l2_seg));
1196 double dabs = std::abs(d);
1197 if (dabs < d_min) {
1198 d_min = dabs;
1199 sign_min = (d_seg < 0) ? -1 : ((d_seg == 0) ? 0 : 1);
1200 on_segment = true;
1201 }
1202 }
1203 }
1204 }
1205 }
1206 if (d_min >= search_radius)
1207 return false;
1208 result_min_dist = d_min * sign_min;
1209 if (pon_segment != NULL)
1210 *pon_segment = on_segment;
1211 return true;
1212 }
1213
1214 bool EdgeGrid::Grid::signed_distance(const Point &pt, coord_t search_radius, coordf_t &result_min_dist) const
1215 {
1216 if (signed_distance_edges(pt, search_radius, result_min_dist))
1217 return true;
1218 if (m_signed_distance_field.empty())
1219 return false;
1220 result_min_dist = signed_distance_bilinear(pt);
1221 return true;
1222 }
1223
1224 #ifdef SLIC3R_GUI
1225 void EdgeGrid::save_png(const EdgeGrid::Grid &grid, const BoundingBox &bbox, coord_t resolution, const char *path)
1226 {
1227 unsigned int w = (bbox.max.x - bbox.min.x + resolution - 1) / resolution;
1228 unsigned int h = (bbox.max.y - bbox.min.y + resolution - 1) / resolution;
1229 wxImage img(w, h);
1230 unsigned char *data = img.GetData();
1231 memset(data, 0, w * h * 3);
1232
1233 static int iRun = 0;
1234 ++iRun;
1235
1236 const coord_t search_radius = grid.resolution() * 2;
1237 const coord_t display_blend_radius = grid.resolution() * 5;
1238 for (coord_t r = 0; r < h; ++r) {
1239 for (coord_t c = 0; c < w; ++ c) {
1240 unsigned char *pxl = data + (((h - r - 1) * w) + c) * 3;
1241 Point pt(c * resolution + bbox.min.x, r * resolution + bbox.min.y);
1242 coordf_t min_dist;
1243 bool on_segment;
1244 // if (grid.signed_distance_edges(pt, search_radius, min_dist, &on_segment)) {
1245 if (grid.signed_distance(pt, search_radius, min_dist)) {
1246 //FIXME
1247 on_segment = true;
1248 float s = 255 * std::abs(min_dist) / float(display_blend_radius);
1249 int is = std::max(0, std::min(255, int(floor(s + 0.5f))));
1250 if (min_dist < 0) {
1251 if (on_segment) {
1252 pxl[0] = 255;
1253 pxl[1] = 255 - is;
1254 pxl[2] = 255 - is;
1255 } else {
1256 pxl[0] = 128;
1257 pxl[1] = 128;
1258 pxl[2] = 255 - is;
1259 }
1260 }
1261 else {
1262 if (on_segment) {
1263 pxl[0] = 255 - is;
1264 pxl[1] = 255 - is;
1265 pxl[2] = 255;
1266 } else {
1267 pxl[0] = 255 - is;
1268 pxl[1] = 0;
1269 pxl[2] = 255;
1270 }
1271 }
1272 } else {
1273 pxl[0] = 0;
1274 pxl[1] = 255;
1275 pxl[2] = 0;
1276 }
1277
1278 float gridx = float(pt.x - grid.bbox().min.x) / float(grid.resolution());
1279 float gridy = float(pt.y - grid.bbox().min.y) / float(grid.resolution());
1280 if (gridx >= -0.4f && gridy >= -0.4f && gridx <= grid.cols() + 0.4f && gridy <= grid.rows() + 0.4f) {
1281 int ix = int(floor(gridx + 0.5f));
1282 int iy = int(floor(gridy + 0.5f));
1283 float dx = gridx - float(ix);
1284 float dy = gridy - float(iy);
1285 float d = sqrt(dx*dx + dy*dy) * float(grid.resolution()) / float(resolution);
1286 if (d < 1.f) {
1287 // Less than 1 pixel from the grid point.
1288 float t = 0.5f + 0.5f * d;
1289 pxl[0] = (unsigned char)(t * pxl[0]);
1290 pxl[1] = (unsigned char)(t * pxl[1]);
1291 pxl[2] = (unsigned char)(t * pxl[2]);
1292 }
1293 }
1294
1295 float dgrid = fabs(min_dist) / float(grid.resolution());
1296 float igrid = floor(dgrid + 0.5f);
1297 dgrid = std::abs(dgrid - igrid) * float(grid.resolution()) / float(resolution);
1298 if (dgrid < 1.f) {
1299 // Less than 1 pixel from the grid point.
1300 float t = 0.5f + 0.5f * dgrid;
1301 pxl[0] = (unsigned char)(t * pxl[0]);
1302 pxl[1] = (unsigned char)(t * pxl[1]);
1303 pxl[2] = (unsigned char)(t * pxl[2]);
1304 if (igrid > 0.f) {
1305 // Other than zero iso contour.
1306 int g = pxl[1] + 255.f * (1.f - t);
1307 pxl[1] = std::min(g, 255);
1308 }
1309 }
1310 }
1311 }
1312
1313 img.SaveFile(path, wxBITMAP_TYPE_PNG);
1314 }
1315 #endif /* SLIC3R_GUI */
1316
1317 } // namespace Slic3r
0 #ifndef slic3r_EdgeGrid_hpp_
1 #define slic3r_EdgeGrid_hpp_
2
3 #include <stdint.h>
4 #include <math.h>
5
6 #include "Point.hpp"
7 #include "BoundingBox.hpp"
8 #include "ExPolygon.hpp"
9 #include "ExPolygonCollection.hpp"
10
11 namespace Slic3r {
12 namespace EdgeGrid {
13
14 struct Grid
15 {
16 Grid();
17 ~Grid();
18
19 void create(const Polygons &polygons, coord_t resolution);
20 void create(const ExPolygon &expoly, coord_t resolution);
21 void create(const ExPolygons &expolygons, coord_t resolution);
22 void create(const ExPolygonCollection &expolygons, coord_t resolution);
23
24 #if 0
25 // Test, whether the edges inside the grid intersect with the polygons provided.
26 bool intersect(const MultiPoint &polyline, bool closed);
27 bool intersect(const Polygon &polygon) { return intersect(static_cast<const MultiPoint&>(polygon), true); }
28 bool intersect(const Polygons &polygons) { for (size_t i = 0; i < polygons.size(); ++ i) if (intersect(polygons[i])) return true; return false; }
29 bool intersect(const ExPolygon &expoly) { if (intersect(expoly.contour)) return true; for (size_t i = 0; i < expoly.holes.size(); ++ i) if (intersect(expoly.holes[i])) return true; return false; }
30 bool intersect(const ExPolygons &expolygons) { for (size_t i = 0; i < expolygons.size(); ++ i) if (intersect(expolygons[i])) return true; return false; }
31 bool intersect(const ExPolygonCollection &expolygons) { return intersect(expolygons.expolygons); }
32
33 // Test, whether a point is inside a contour.
34 bool inside(const Point &pt);
35 #endif
36
37 // Fill in a rough m_signed_distance_field from the edge grid.
38 // The rough SDF is used by signed_distance() for distances outside of the search_radius.
39 void calculate_sdf();
40
41 // Return an estimate of the signed distance based on m_signed_distance_field grid.
42 float signed_distance_bilinear(const Point &pt) const;
43
44 // Calculate a signed distance to the contours in search_radius from the point.
45 bool signed_distance_edges(const Point &pt, coord_t search_radius, coordf_t &result_min_dist, bool *pon_segment = NULL) const;
46
47 // Calculate a signed distance to the contours in search_radius from the point. If no edge is found in search_radius,
48 // return an interpolated value from m_signed_distance_field, if it exists.
49 bool signed_distance(const Point &pt, coord_t search_radius, coordf_t &result_min_dist) const;
50
51 const BoundingBox& bbox() const { return m_bbox; }
52 const coord_t resolution() const { return m_resolution; }
53 const size_t rows() const { return m_rows; }
54 const size_t cols() const { return m_cols; }
55
56 protected:
57 struct Cell {
58 Cell() : begin(0), end(0) {}
59 size_t begin;
60 size_t end;
61 };
62
63 void create_from_m_contours(coord_t resolution);
64 #if 0
65 bool line_cell_intersect(const Point &p1, const Point &p2, const Cell &cell);
66 #endif
67
68 // Bounding box around the contours.
69 BoundingBox m_bbox;
70 // Grid dimensions.
71 coord_t m_resolution;
72 size_t m_rows;
73 size_t m_cols;
74
75 // Referencing the source contours.
76 // This format allows one to work with any Slic3r fixed point contour format
77 // (Polygon, ExPolygon, ExPolygonCollection etc).
78 std::vector<const Slic3r::Points*> m_contours;
79
80 // Referencing a contour and a line segment of m_contours.
81 std::vector<std::pair<size_t, size_t> > m_cell_data;
82
83 // Full grid of cells.
84 std::vector<Cell> m_cells;
85
86 // Distance field derived from the edge grid, seed filled by the Danielsson chamfer metric.
87 // May be empty.
88 std::vector<float> m_signed_distance_field;
89 };
90
91 #ifdef SLIC3R_GUI
92 // Debugging utility. Save the signed distance field.
93 extern void save_png(const Grid &grid, const BoundingBox &bbox, coord_t resolution, const char *path);
94 #endif /* SLIC3R_GUI */
95
96 } // namespace EdgeGrid
97 } // namespace Slic3r
98
99 #endif /* slic3r_EdgeGrid_hpp_ */
0 #include "BoundingBox.hpp"
1 #include "ExPolygon.hpp"
2 #include "Geometry.hpp"
3 #include "Polygon.hpp"
4 #include "Line.hpp"
5 #include "ClipperUtils.hpp"
6 #include "SVG.hpp"
7 #include "polypartition.h"
8 #include "poly2tri/poly2tri.h"
9 #include <algorithm>
10 #include <cassert>
11 #include <list>
12
13 namespace Slic3r {
14
15 ExPolygon::operator Points() const
16 {
17 Points points;
18 Polygons pp = *this;
19 for (Polygons::const_iterator poly = pp.begin(); poly != pp.end(); ++poly) {
20 for (Points::const_iterator point = poly->points.begin(); point != poly->points.end(); ++point)
21 points.push_back(*point);
22 }
23 return points;
24 }
25
26 ExPolygon::operator Polygons() const
27 {
28 return to_polygons(*this);
29 }
30
31 ExPolygon::operator Polylines() const
32 {
33 return to_polylines(*this);
34 }
35
36 void
37 ExPolygon::scale(double factor)
38 {
39 contour.scale(factor);
40 for (Polygons::iterator it = holes.begin(); it != holes.end(); ++it) {
41 (*it).scale(factor);
42 }
43 }
44
45 void
46 ExPolygon::translate(double x, double y)
47 {
48 contour.translate(x, y);
49 for (Polygons::iterator it = holes.begin(); it != holes.end(); ++it) {
50 (*it).translate(x, y);
51 }
52 }
53
54 void
55 ExPolygon::rotate(double angle)
56 {
57 contour.rotate(angle);
58 for (Polygons::iterator it = holes.begin(); it != holes.end(); ++it) {
59 (*it).rotate(angle);
60 }
61 }
62
63 void
64 ExPolygon::rotate(double angle, const Point &center)
65 {
66 contour.rotate(angle, center);
67 for (Polygons::iterator it = holes.begin(); it != holes.end(); ++it) {
68 (*it).rotate(angle, center);
69 }
70 }
71
72 double
73 ExPolygon::area() const
74 {
75 double a = this->contour.area();
76 for (Polygons::const_iterator it = this->holes.begin(); it != this->holes.end(); ++it) {
77 a -= -(*it).area(); // holes have negative area
78 }
79 return a;
80 }
81
82 bool
83 ExPolygon::is_valid() const
84 {
85 if (!this->contour.is_valid() || !this->contour.is_counter_clockwise()) return false;
86 for (Polygons::const_iterator it = this->holes.begin(); it != this->holes.end(); ++it) {
87 if (!(*it).is_valid() || (*it).is_counter_clockwise()) return false;
88 }
89 return true;
90 }
91
92 bool
93 ExPolygon::contains(const Line &line) const
94 {
95 return this->contains((Polyline)line);
96 }
97
98 bool
99 ExPolygon::contains(const Polyline &polyline) const
100 {
101 Polylines pl_out;
102 diff((Polylines)polyline, *this, &pl_out);
103 return pl_out.empty();
104 }
105
106 bool
107 ExPolygon::contains(const Polylines &polylines) const
108 {
109 #if 0
110 BoundingBox bbox = get_extents(polylines);
111 bbox.merge(get_extents(*this));
112 SVG svg(debug_out_path("ExPolygon_contains.svg"), bbox);
113 svg.draw(*this);
114 svg.draw_outline(*this);
115 svg.draw(polylines, "blue");
116 #endif
117 Polylines pl_out;
118 diff(polylines, *this, &pl_out);
119 #if 0
120 svg.draw(pl_out, "red");
121 #endif
122 return pl_out.empty();
123 }
124
125 bool
126 ExPolygon::contains(const Point &point) const
127 {
128 if (!this->contour.contains(point)) return false;
129 for (Polygons::const_iterator it = this->holes.begin(); it != this->holes.end(); ++it) {
130 if (it->contains(point)) return false;
131 }
132 return true;
133 }
134
135 // inclusive version of contains() that also checks whether point is on boundaries
136 bool
137 ExPolygon::contains_b(const Point &point) const
138 {
139 return this->contains(point) || this->has_boundary_point(point);
140 }
141
142 bool
143 ExPolygon::has_boundary_point(const Point &point) const
144 {
145 if (this->contour.has_boundary_point(point)) return true;
146 for (Polygons::const_iterator h = this->holes.begin(); h != this->holes.end(); ++h) {
147 if (h->has_boundary_point(point)) return true;
148 }
149 return false;
150 }
151
152 bool
153 ExPolygon::overlaps(const ExPolygon &other) const
154 {
155 #if 0
156 BoundingBox bbox = get_extents(other);
157 bbox.merge(get_extents(*this));
158 static int iRun = 0;
159 SVG svg(debug_out_path("ExPolygon_overlaps-%d.svg", iRun ++), bbox);
160 svg.draw(*this);
161 svg.draw_outline(*this);
162 svg.draw_outline(other, "blue");
163 #endif
164 Polylines pl_out;
165 intersection((Polylines)other, *this, &pl_out);
166 #if 0
167 svg.draw(pl_out, "red");
168 #endif
169 if (! pl_out.empty())
170 return true;
171 return ! other.contour.points.empty() && this->contains_b(other.contour.points.front());
172 }
173
174 void
175 ExPolygon::simplify_p(double tolerance, Polygons* polygons) const
176 {
177 Polygons pp = this->simplify_p(tolerance);
178 polygons->insert(polygons->end(), pp.begin(), pp.end());
179 }
180
181 Polygons
182 ExPolygon::simplify_p(double tolerance) const
183 {
184 Polygons pp;
185 pp.reserve(this->holes.size() + 1);
186
187 // contour
188 {
189 Polygon p = this->contour;
190 p.points.push_back(p.points.front());
191 p.points = MultiPoint::_douglas_peucker(p.points, tolerance);
192 p.points.pop_back();
193 pp.push_back(p);
194 }
195
196 // holes
197 for (Polygons::const_iterator it = this->holes.begin(); it != this->holes.end(); ++it) {
198 Polygon p = *it;
199 p.points.push_back(p.points.front());
200 p.points = MultiPoint::_douglas_peucker(p.points, tolerance);
201 p.points.pop_back();
202 pp.push_back(p);
203 }
204 simplify_polygons(pp, &pp);
205 return pp;
206 }
207
208 ExPolygons
209 ExPolygon::simplify(double tolerance) const
210 {
211 Polygons pp = this->simplify_p(tolerance);
212 return union_ex(pp);
213 }
214
215 void
216 ExPolygon::simplify(double tolerance, ExPolygons* expolygons) const
217 {
218 ExPolygons ep = this->simplify(tolerance);
219 expolygons->insert(expolygons->end(), ep.begin(), ep.end());
220 }
221
222 void
223 ExPolygon::medial_axis(double max_width, double min_width, ThickPolylines* polylines) const
224 {
225 // init helper object
226 Slic3r::Geometry::MedialAxis ma(max_width, min_width, this);
227 ma.lines = this->lines();
228
229 // compute the Voronoi diagram and extract medial axis polylines
230 ThickPolylines pp;
231 ma.build(&pp);
232
233 /*
234 SVG svg("medial_axis.svg");
235 svg.draw(*this);
236 svg.draw(pp);
237 svg.Close();
238 */
239
240 /* Find the maximum width returned; we're going to use this for validating and
241 filtering the output segments. */
242 double max_w = 0;
243 for (ThickPolylines::const_iterator it = pp.begin(); it != pp.end(); ++it)
244 max_w = fmaxf(max_w, *std::max_element(it->width.begin(), it->width.end()));
245
246 /* Loop through all returned polylines in order to extend their endpoints to the
247 expolygon boundaries */
248 bool removed = false;
249 for (size_t i = 0; i < pp.size(); ++i) {
250 ThickPolyline& polyline = pp[i];
251
252 // extend initial and final segments of each polyline if they're actual endpoints
253 /* We assign new endpoints to temporary variables because in case of a single-line
254 polyline, after we extend the start point it will be caught by the intersection()
255 call, so we keep the inner point until we perform the second intersection() as well */
256 Point new_front = polyline.points.front();
257 Point new_back = polyline.points.back();
258 if (polyline.endpoints.first && !this->has_boundary_point(new_front)) {
259 Line line(polyline.points.front(), polyline.points[1]);
260
261 // prevent the line from touching on the other side, otherwise intersection() might return that solution
262 if (polyline.points.size() == 2) line.b = line.midpoint();
263
264 line.extend_start(max_width);
265 (void)this->contour.intersection(line, &new_front);
266 }
267 if (polyline.endpoints.second && !this->has_boundary_point(new_back)) {
268 Line line(
269 *(polyline.points.end() - 2),
270 polyline.points.back()
271 );
272
273 // prevent the line from touching on the other side, otherwise intersection() might return that solution
274 if (polyline.points.size() == 2) line.a = line.midpoint();
275 line.extend_end(max_width);
276
277 (void)this->contour.intersection(line, &new_back);
278 }
279 polyline.points.front() = new_front;
280 polyline.points.back() = new_back;
281
282 /* remove too short polylines
283 (we can't do this check before endpoints extension and clipping because we don't
284 know how long will the endpoints be extended since it depends on polygon thickness
285 which is variable - extension will be <= max_width/2 on each side) */
286 if ((polyline.endpoints.first || polyline.endpoints.second)
287 && polyline.length() < max_w*2) {
288 pp.erase(pp.begin() + i);
289 --i;
290 removed = true;
291 continue;
292 }
293 }
294
295 /* If we removed any short polylines we now try to connect consecutive polylines
296 in order to allow loop detection. Note that this algorithm is greedier than
297 MedialAxis::process_edge_neighbors() as it will connect random pairs of
298 polylines even when more than two start from the same point. This has no
299 drawbacks since we optimize later using nearest-neighbor which would do the
300 same, but should we use a more sophisticated optimization algorithm we should
301 not connect polylines when more than two meet. */
302 if (removed) {
303 for (size_t i = 0; i < pp.size(); ++i) {
304 ThickPolyline& polyline = pp[i];
305 if (polyline.endpoints.first && polyline.endpoints.second) continue; // optimization
306
307 // find another polyline starting here
308 for (size_t j = i+1; j < pp.size(); ++j) {
309 ThickPolyline& other = pp[j];
310 if (polyline.last_point().coincides_with(other.last_point())) {
311 other.reverse();
312 } else if (polyline.first_point().coincides_with(other.last_point())) {
313 polyline.reverse();
314 other.reverse();
315 } else if (polyline.first_point().coincides_with(other.first_point())) {
316 polyline.reverse();
317 } else if (!polyline.last_point().coincides_with(other.first_point())) {
318 continue;
319 }
320
321 polyline.points.insert(polyline.points.end(), other.points.begin() + 1, other.points.end());
322 polyline.width.insert(polyline.width.end(), other.width.begin(), other.width.end());
323 polyline.endpoints.second = other.endpoints.second;
324 assert(polyline.width.size() == polyline.points.size()*2 - 2);
325
326 pp.erase(pp.begin() + j);
327 j = i; // restart search from i+1
328 }
329 }
330 }
331
332 polylines->insert(polylines->end(), pp.begin(), pp.end());
333 }
334
335 void
336 ExPolygon::medial_axis(double max_width, double min_width, Polylines* polylines) const
337 {
338 ThickPolylines tp;
339 this->medial_axis(max_width, min_width, &tp);
340 polylines->insert(polylines->end(), tp.begin(), tp.end());
341 }
342
343 void
344 ExPolygon::get_trapezoids(Polygons* polygons) const
345 {
346 ExPolygons expp;
347 expp.push_back(*this);
348 boost::polygon::get_trapezoids(*polygons, expp);
349 }
350
351 void
352 ExPolygon::get_trapezoids(Polygons* polygons, double angle) const
353 {
354 ExPolygon clone = *this;
355 clone.rotate(PI/2 - angle, Point(0,0));
356 clone.get_trapezoids(polygons);
357 for (Polygons::iterator polygon = polygons->begin(); polygon != polygons->end(); ++polygon)
358 polygon->rotate(-(PI/2 - angle), Point(0,0));
359 }
360
361 // This algorithm may return more trapezoids than necessary
362 // (i.e. it may break a single trapezoid in several because
363 // other parts of the object have x coordinates in the middle)
364 void
365 ExPolygon::get_trapezoids2(Polygons* polygons) const
366 {
367 // get all points of this ExPolygon
368 Points pp = *this;
369
370 // build our bounding box
371 BoundingBox bb(pp);
372
373 // get all x coordinates
374 std::vector<coord_t> xx;
375 xx.reserve(pp.size());
376 for (Points::const_iterator p = pp.begin(); p != pp.end(); ++p)
377 xx.push_back(p->x);
378 std::sort(xx.begin(), xx.end());
379
380 // find trapezoids by looping from first to next-to-last coordinate
381 for (std::vector<coord_t>::const_iterator x = xx.begin(); x != xx.end()-1; ++x) {
382 coord_t next_x = *(x + 1);
383 if (*x == next_x) continue;
384
385 // build rectangle
386 Polygon poly;
387 poly.points.resize(4);
388 poly[0].x = *x;
389 poly[0].y = bb.min.y;
390 poly[1].x = next_x;
391 poly[1].y = bb.min.y;
392 poly[2].x = next_x;
393 poly[2].y = bb.max.y;
394 poly[3].x = *x;
395 poly[3].y = bb.max.y;
396
397 // intersect with this expolygon
398 Polygons trapezoids;
399 intersection<Polygons,Polygons>(poly, *this, &trapezoids);
400
401 // append results to return value
402 polygons->insert(polygons->end(), trapezoids.begin(), trapezoids.end());
403 }
404 }
405
406 void
407 ExPolygon::get_trapezoids2(Polygons* polygons, double angle) const
408 {
409 ExPolygon clone = *this;
410 clone.rotate(PI/2 - angle, Point(0,0));
411 clone.get_trapezoids2(polygons);
412 for (Polygons::iterator polygon = polygons->begin(); polygon != polygons->end(); ++polygon)
413 polygon->rotate(-(PI/2 - angle), Point(0,0));
414 }
415
416 // While this triangulates successfully, it's NOT a constrained triangulation
417 // as it will create more vertices on the boundaries than the ones supplied.
418 void
419 ExPolygon::triangulate(Polygons* polygons) const
420 {
421 // first make trapezoids
422 Polygons trapezoids;
423 this->get_trapezoids2(&trapezoids);
424
425 // then triangulate each trapezoid
426 for (Polygons::iterator polygon = trapezoids.begin(); polygon != trapezoids.end(); ++polygon)
427 polygon->triangulate_convex(polygons);
428 }
429
430 void
431 ExPolygon::triangulate_pp(Polygons* polygons) const
432 {
433 // convert polygons
434 std::list<TPPLPoly> input;
435
436 Polygons pp = *this;
437 simplify_polygons(pp, &pp, true);
438 ExPolygons expp;
439 union_(pp, &expp);
440
441 for (ExPolygons::const_iterator ex = expp.begin(); ex != expp.end(); ++ex) {
442 // contour
443 {
444 TPPLPoly p;
445 p.Init(ex->contour.points.size());
446 //printf(PRINTF_ZU "\n0\n", ex->contour.points.size());
447 for (Points::const_iterator point = ex->contour.points.begin(); point != ex->contour.points.end(); ++point) {
448 p[ point-ex->contour.points.begin() ].x = point->x;
449 p[ point-ex->contour.points.begin() ].y = point->y;
450 //printf("%ld %ld\n", point->x, point->y);
451 }
452 p.SetHole(false);
453 input.push_back(p);
454 }
455
456 // holes
457 for (Polygons::const_iterator hole = ex->holes.begin(); hole != ex->holes.end(); ++hole) {
458 TPPLPoly p;
459 p.Init(hole->points.size());
460 //printf(PRINTF_ZU "\n1\n", hole->points.size());
461 for (Points::const_iterator point = hole->points.begin(); point != hole->points.end(); ++point) {
462 p[ point-hole->points.begin() ].x = point->x;
463 p[ point-hole->points.begin() ].y = point->y;
464 //printf("%ld %ld\n", point->x, point->y);
465 }
466 p.SetHole(true);
467 input.push_back(p);
468 }
469 }
470
471 // perform triangulation
472 std::list<TPPLPoly> output;
473 int res = TPPLPartition().Triangulate_MONO(&input, &output);
474 if (res != 1) CONFESS("Triangulation failed");
475
476 // convert output polygons
477 for (std::list<TPPLPoly>::iterator poly = output.begin(); poly != output.end(); ++poly) {
478 long num_points = poly->GetNumPoints();
479 Polygon p;
480 p.points.resize(num_points);
481 for (long i = 0; i < num_points; ++i) {
482 p.points[i].x = (*poly)[i].x;
483 p.points[i].y = (*poly)[i].y;
484 }
485 polygons->push_back(p);
486 }
487 }
488
489 void
490 ExPolygon::triangulate_p2t(Polygons* polygons) const
491 {
492 ExPolygons expp;
493 simplify_polygons(*this, &expp, true);
494
495 for (ExPolygons::const_iterator ex = expp.begin(); ex != expp.end(); ++ex) {
496 // TODO: prevent duplicate points
497
498 // contour
499 std::vector<p2t::Point*> ContourPoints;
500 for (Points::const_iterator point = ex->contour.points.begin(); point != ex->contour.points.end(); ++point) {
501 // We should delete each p2t::Point object
502 ContourPoints.push_back(new p2t::Point(point->x, point->y));
503 }
504 p2t::CDT cdt(ContourPoints);
505
506 // holes
507 for (Polygons::const_iterator hole = ex->holes.begin(); hole != ex->holes.end(); ++hole) {
508 std::vector<p2t::Point*> points;
509 for (Points::const_iterator point = hole->points.begin(); point != hole->points.end(); ++point) {
510 // will be destructed in SweepContext::~SweepContext
511 points.push_back(new p2t::Point(point->x, point->y));
512 }
513 cdt.AddHole(points);
514 }
515
516 // perform triangulation
517 cdt.Triangulate();
518 std::vector<p2t::Triangle*> triangles = cdt.GetTriangles();
519
520 for (std::vector<p2t::Triangle*>::const_iterator triangle = triangles.begin(); triangle != triangles.end(); ++triangle) {
521 Polygon p;
522 for (int i = 0; i <= 2; ++i) {
523 p2t::Point* point = (*triangle)->GetPoint(i);
524 p.points.push_back(Point(point->x, point->y));
525 }
526 polygons->push_back(p);
527 }
528
529 for(std::vector<p2t::Point*>::iterator it = ContourPoints.begin(); it != ContourPoints.end(); ++it) {
530 delete *it;
531 }
532 }
533 }
534
535 Lines
536 ExPolygon::lines() const
537 {
538 Lines lines = this->contour.lines();
539 for (Polygons::const_iterator h = this->holes.begin(); h != this->holes.end(); ++h) {
540 Lines hole_lines = h->lines();
541 lines.insert(lines.end(), hole_lines.begin(), hole_lines.end());
542 }
543 return lines;
544 }
545
546 std::string
547 ExPolygon::dump_perl() const
548 {
549 std::ostringstream ret;
550 ret << "[" << this->contour.dump_perl();
551 for (Polygons::const_iterator h = this->holes.begin(); h != this->holes.end(); ++h)
552 ret << "," << h->dump_perl();
553 ret << "]";
554 return ret.str();
555 }
556
557 BoundingBox get_extents(const ExPolygon &expolygon)
558 {
559 return get_extents(expolygon.contour);
560 }
561
562 BoundingBox get_extents(const ExPolygons &expolygons)
563 {
564 BoundingBox bbox;
565 if (! expolygons.empty()) {
566 bbox = get_extents(expolygons.front());
567 for (size_t i = 1; i < expolygons.size(); ++ i)
568 bbox.merge(get_extents(expolygons[i]));
569 }
570 return bbox;
571 }
572
573 BoundingBox get_extents_rotated(const ExPolygon &expolygon, double angle)
574 {
575 return get_extents_rotated(expolygon.contour, angle);
576 }
577
578 BoundingBox get_extents_rotated(const ExPolygons &expolygons, double angle)
579 {
580 BoundingBox bbox;
581 if (! expolygons.empty()) {
582 bbox = get_extents_rotated(expolygons.front().contour, angle);
583 for (size_t i = 1; i < expolygons.size(); ++ i)
584 bbox.merge(get_extents_rotated(expolygons[i].contour, angle));
585 }
586 return bbox;
587 }
588
589 extern std::vector<BoundingBox> get_extents_vector(const ExPolygons &polygons)
590 {
591 std::vector<BoundingBox> out;
592 out.reserve(polygons.size());
593 for (ExPolygons::const_iterator it = polygons.begin(); it != polygons.end(); ++ it)
594 out.push_back(get_extents(*it));
595 return out;
596 }
597
598 bool remove_sticks(ExPolygon &poly)
599 {
600 return remove_sticks(poly.contour) || remove_sticks(poly.holes);
601 }
602
603 } // namespace Slic3r
0 #ifndef slic3r_ExPolygon_hpp_
1 #define slic3r_ExPolygon_hpp_
2
3 #include "libslic3r.h"
4 #include "Polygon.hpp"
5 #include "Polyline.hpp"
6 #include <vector>
7
8 namespace Slic3r {
9
10 class ExPolygon;
11 typedef std::vector<ExPolygon> ExPolygons;
12
13 class ExPolygon
14 {
15 public:
16 Polygon contour;
17 Polygons holes;
18 operator Points() const;
19 operator Polygons() const;
20 operator Polylines() const;
21 void clear() { contour.points.clear(); holes.clear(); }
22 void scale(double factor);
23 void translate(double x, double y);
24 void rotate(double angle);
25 void rotate(double angle, const Point &center);
26 double area() const;
27 bool empty() const { return contour.points.empty(); }
28 bool is_valid() const;
29
30 // Contains the line / polyline / polylines etc COMPLETELY.
31 bool contains(const Line &line) const;
32 bool contains(const Polyline &polyline) const;
33 bool contains(const Polylines &polylines) const;
34 bool contains(const Point &point) const;
35 bool contains_b(const Point &point) const;
36 bool has_boundary_point(const Point &point) const;
37
38 // Does this expolygon overlap another expolygon?
39 // Either the ExPolygons intersect, or one is fully inside the other,
40 // and it is not inside a hole of the other expolygon.
41 bool overlaps(const ExPolygon &other) const;
42
43 void simplify_p(double tolerance, Polygons* polygons) const;
44 Polygons simplify_p(double tolerance) const;
45 ExPolygons simplify(double tolerance) const;
46 void simplify(double tolerance, ExPolygons* expolygons) const;
47 void medial_axis(double max_width, double min_width, ThickPolylines* polylines) const;
48 void medial_axis(double max_width, double min_width, Polylines* polylines) const;
49 void get_trapezoids(Polygons* polygons) const;
50 void get_trapezoids(Polygons* polygons, double angle) const;
51 void get_trapezoids2(Polygons* polygons) const;
52 void get_trapezoids2(Polygons* polygons, double angle) const;
53 void triangulate(Polygons* polygons) const;
54 void triangulate_pp(Polygons* polygons) const;
55 void triangulate_p2t(Polygons* polygons) const;
56 Lines lines() const;
57 std::string dump_perl() const;
58 };
59
60 // Count a nuber of polygons stored inside the vector of expolygons.
61 // Useful for allocating space for polygons when converting expolygons to polygons.
62 inline size_t number_polygons(const ExPolygons &expolys)
63 {
64 size_t n_polygons = 0;
65 for (ExPolygons::const_iterator it = expolys.begin(); it != expolys.end(); ++ it)
66 n_polygons += it->holes.size() + 1;
67 return n_polygons;
68 }
69
70 inline Lines to_lines(const ExPolygon &src)
71 {
72 size_t n_lines = src.contour.points.size();
73 for (size_t i = 0; i < src.holes.size(); ++ i)
74 n_lines += src.holes[i].points.size();
75 Lines lines;
76 lines.reserve(n_lines);
77 for (size_t i = 0; i <= src.holes.size(); ++ i) {
78 const Polygon &poly = (i == 0) ? src.contour : src.holes[i - 1];
79 for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it)
80 lines.push_back(Line(*it, *(it + 1)));
81 lines.push_back(Line(poly.points.back(), poly.points.front()));
82 }
83 return lines;
84 }
85
86 inline Lines to_lines(const ExPolygons &src)
87 {
88 size_t n_lines = 0;
89 for (ExPolygons::const_iterator it_expoly = src.begin(); it_expoly != src.end(); ++ it_expoly) {
90 n_lines += it_expoly->contour.points.size();
91 for (size_t i = 0; i < it_expoly->holes.size(); ++ i)
92 n_lines += it_expoly->holes[i].points.size();
93 }
94 Lines lines;
95 lines.reserve(n_lines);
96 for (ExPolygons::const_iterator it_expoly = src.begin(); it_expoly != src.end(); ++ it_expoly) {
97 for (size_t i = 0; i <= it_expoly->holes.size(); ++ i) {
98 const Points &points = ((i == 0) ? it_expoly->contour : it_expoly->holes[i - 1]).points;
99 for (Points::const_iterator it = points.begin(); it != points.end()-1; ++it)
100 lines.push_back(Line(*it, *(it + 1)));
101 lines.push_back(Line(points.back(), points.front()));
102 }
103 }
104 return lines;
105 }
106
107 inline Polylines to_polylines(const ExPolygon &src)
108 {
109 Polylines polylines;
110 polylines.assign(src.holes.size() + 1, Polyline());
111 size_t idx = 0;
112 Polyline &pl = polylines[idx ++];
113 pl.points = src.contour.points;
114 pl.points.push_back(pl.points.front());
115 for (Polygons::const_iterator ith = src.holes.begin(); ith != src.holes.end(); ++ith) {
116 Polyline &pl = polylines[idx ++];
117 pl.points = ith->points;
118 pl.points.push_back(ith->points.front());
119 }
120 assert(idx == polylines.size());
121 return polylines;
122 }
123
124 inline Polylines to_polylines(const ExPolygons &src)
125 {
126 Polylines polylines;
127 polylines.assign(number_polygons(src), Polyline());
128 size_t idx = 0;
129 for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++it) {
130 Polyline &pl = polylines[idx ++];
131 pl.points = it->contour.points;
132 pl.points.push_back(pl.points.front());
133 for (Polygons::const_iterator ith = it->holes.begin(); ith != it->holes.end(); ++ith) {
134 Polyline &pl = polylines[idx ++];
135 pl.points = ith->points;
136 pl.points.push_back(ith->points.front());
137 }
138 }
139 assert(idx == polylines.size());
140 return polylines;
141 }
142
143 #if SLIC3R_CPPVER >= 11
144 inline Polylines to_polylines(ExPolygon &&src)
145 {
146 Polylines polylines;
147 polylines.assign(src.holes.size() + 1, Polyline());
148 size_t idx = 0;
149 Polyline &pl = polylines[idx ++];
150 pl.points = std::move(src.contour.points);
151 pl.points.push_back(pl.points.front());
152 for (Polygons::const_iterator ith = src.holes.begin(); ith != src.holes.end(); ++ith) {
153 Polyline &pl = polylines[idx ++];
154 pl.points = std::move(ith->points);
155 pl.points.push_back(ith->points.front());
156 }
157 assert(idx == polylines.size());
158 return polylines;
159 }
160 inline Polylines to_polylines(ExPolygons &&src)
161 {
162 Polylines polylines;
163 polylines.assign(number_polygons(src), Polyline());
164 size_t idx = 0;
165 for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++it) {
166 Polyline &pl = polylines[idx ++];
167 pl.points = std::move(it->contour.points);
168 pl.points.push_back(pl.points.front());
169 for (Polygons::const_iterator ith = it->holes.begin(); ith != it->holes.end(); ++ith) {
170 Polyline &pl = polylines[idx ++];
171 pl.points = std::move(ith->points);
172 pl.points.push_back(ith->points.front());
173 }
174 }
175 assert(idx == polylines.size());
176 return polylines;
177 }
178 #endif
179
180 inline Polygons to_polygons(const ExPolygon &src)
181 {
182 Polygons polygons;
183 polygons.reserve(src.holes.size() + 1);
184 polygons.push_back(src.contour);
185 polygons.insert(polygons.end(), src.holes.begin(), src.holes.end());
186 return polygons;
187 }
188
189 inline Polygons to_polygons(const ExPolygons &src)
190 {
191 Polygons polygons;
192 polygons.reserve(number_polygons(src));
193 for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++it) {
194 polygons.push_back(it->contour);
195 polygons.insert(polygons.end(), it->holes.begin(), it->holes.end());
196 }
197 return polygons;
198 }
199
200 #if SLIC3R_CPPVER >= 11
201 inline Polygons to_polygons(ExPolygon &&src)
202 {
203 Polygons polygons;
204 polygons.reserve(src.holes.size() + 1);
205 polygons.push_back(std::move(src.contour));
206 std::move(std::begin(src.holes), std::end(src.holes), std::back_inserter(polygons));
207 return polygons;
208 }
209 inline Polygons to_polygons(ExPolygons &&src)
210 {
211 Polygons polygons;
212 polygons.reserve(number_polygons(src));
213 for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++it) {
214 polygons.push_back(std::move(it->contour));
215 std::move(std::begin(it->holes), std::end(it->holes), std::back_inserter(polygons));
216 }
217 return polygons;
218 }
219 #endif
220
221 inline void polygons_append(Polygons &dst, const ExPolygon &src)
222 {
223 dst.reserve(dst.size() + src.holes.size() + 1);
224 dst.push_back(src.contour);
225 dst.insert(dst.end(), src.holes.begin(), src.holes.end());
226 }
227
228 inline void polygons_append(Polygons &dst, const ExPolygons &src)
229 {
230 dst.reserve(dst.size() + number_polygons(src));
231 for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++ it) {
232 dst.push_back(it->contour);
233 dst.insert(dst.end(), it->holes.begin(), it->holes.end());
234 }
235 }
236
237 #if SLIC3R_CPPVER >= 11
238 inline void polygons_append(Polygons &dst, ExPolygon &&src)
239 {
240 dst.reserve(dst.size() + src.holes.size() + 1);
241 dst.push_back(std::move(src.contour));
242 std::move(std::begin(src.holes), std::end(src.holes), std::back_inserter(dst));
243 }
244
245 inline void polygons_append(Polygons &dst, ExPolygons &&src)
246 {
247 dst.reserve(dst.size() + number_polygons(src));
248 for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++ it) {
249 dst.push_back(std::move(it->contour));
250 std::move(std::begin(it->holes), std::end(it->holes), std::back_inserter(dst));
251 }
252 }
253 #endif
254
255 inline void expolygons_rotate(ExPolygons &expolys, double angle)
256 {
257 for (ExPolygons::iterator p = expolys.begin(); p != expolys.end(); ++p)
258 p->rotate(angle);
259 }
260
261 inline bool expolygons_contain(ExPolygons &expolys, const Point &pt)
262 {
263 for (ExPolygons::iterator p = expolys.begin(); p != expolys.end(); ++p)
264 if (p->contains(pt))
265 return true;
266 return false;
267 }
268
269 extern BoundingBox get_extents(const ExPolygon &expolygon);
270 extern BoundingBox get_extents(const ExPolygons &expolygons);
271 extern BoundingBox get_extents_rotated(const ExPolygon &poly, double angle);
272 extern BoundingBox get_extents_rotated(const ExPolygons &polygons, double angle);
273 extern std::vector<BoundingBox> get_extents_vector(const ExPolygons &polygons);
274
275 extern bool remove_sticks(ExPolygon &poly);
276
277 } // namespace Slic3r
278
279 // start Boost
280 #include <boost/polygon/polygon.hpp>
281 namespace boost { namespace polygon {
282 template <>
283 struct polygon_traits<ExPolygon> {
284 typedef coord_t coordinate_type;
285 typedef Points::const_iterator iterator_type;
286 typedef Point point_type;
287
288 // Get the begin iterator
289 static inline iterator_type begin_points(const ExPolygon& t) {
290 return t.contour.points.begin();
291 }
292
293 // Get the end iterator
294 static inline iterator_type end_points(const ExPolygon& t) {
295 return t.contour.points.end();
296 }
297
298 // Get the number of sides of the polygon
299 static inline std::size_t size(const ExPolygon& t) {
300 return t.contour.points.size();
301 }
302
303 // Get the winding direction of the polygon
304 static inline winding_direction winding(const ExPolygon& t) {
305 return unknown_winding;
306 }
307 };
308
309 template <>
310 struct polygon_mutable_traits<ExPolygon> {
311 //expects stl style iterators
312 template <typename iT>
313 static inline ExPolygon& set_points(ExPolygon& expolygon, iT input_begin, iT input_end) {
314 expolygon.contour.points.assign(input_begin, input_end);
315 // skip last point since Boost will set last point = first point
316 expolygon.contour.points.pop_back();
317 return expolygon;
318 }
319 };
320
321
322 template <>
323 struct geometry_concept<ExPolygon> { typedef polygon_with_holes_concept type; };
324
325 template <>
326 struct polygon_with_holes_traits<ExPolygon> {
327 typedef Polygons::const_iterator iterator_holes_type;
328 typedef Polygon hole_type;
329 static inline iterator_holes_type begin_holes(const ExPolygon& t) {
330 return t.holes.begin();
331 }
332 static inline iterator_holes_type end_holes(const ExPolygon& t) {
333 return t.holes.end();
334 }
335 static inline unsigned int size_holes(const ExPolygon& t) {
336 return (int)t.holes.size();
337 }
338 };
339
340 template <>
341 struct polygon_with_holes_mutable_traits<ExPolygon> {
342 template <typename iT>
343 static inline ExPolygon& set_holes(ExPolygon& t, iT inputBegin, iT inputEnd) {
344 t.holes.assign(inputBegin, inputEnd);
345 return t;
346 }
347 };
348
349 //first we register CPolygonSet as a polygon set
350 template <>
351 struct geometry_concept<ExPolygons> { typedef polygon_set_concept type; };
352
353 //next we map to the concept through traits
354 template <>
355 struct polygon_set_traits<ExPolygons> {
356 typedef coord_t coordinate_type;
357 typedef ExPolygons::const_iterator iterator_type;
358 typedef ExPolygons operator_arg_type;
359
360 static inline iterator_type begin(const ExPolygons& polygon_set) {
361 return polygon_set.begin();
362 }
363
364 static inline iterator_type end(const ExPolygons& polygon_set) {
365 return polygon_set.end();
366 }
367
368 //don't worry about these, just return false from them
369 static inline bool clean(const ExPolygons& polygon_set) { return false; }
370 static inline bool sorted(const ExPolygons& polygon_set) { return false; }
371 };
372
373 template <>
374 struct polygon_set_mutable_traits<ExPolygons> {
375 template <typename input_iterator_type>
376 static inline void set(ExPolygons& expolygons, input_iterator_type input_begin, input_iterator_type input_end) {
377 expolygons.assign(input_begin, input_end);
378 }
379 };
380 } }
381 // end Boost
382
383 #endif
0 #include "ExPolygonCollection.hpp"
1 #include "Geometry.hpp"
2
3 namespace Slic3r {
4
5 ExPolygonCollection::ExPolygonCollection(const ExPolygon &expolygon)
6 {
7 this->expolygons.push_back(expolygon);
8 }
9
10 ExPolygonCollection::operator Points() const
11 {
12 Points points;
13 Polygons pp = *this;
14 for (Polygons::const_iterator poly = pp.begin(); poly != pp.end(); ++poly) {
15 for (Points::const_iterator point = poly->points.begin(); point != poly->points.end(); ++point)
16 points.push_back(*point);
17 }
18 return points;
19 }
20
21 ExPolygonCollection::operator Polygons() const
22 {
23 Polygons polygons;
24 for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) {
25 polygons.push_back(it->contour);
26 for (Polygons::const_iterator ith = it->holes.begin(); ith != it->holes.end(); ++ith) {
27 polygons.push_back(*ith);
28 }
29 }
30 return polygons;
31 }
32
33 ExPolygonCollection::operator ExPolygons&()
34 {
35 return this->expolygons;
36 }
37
38 void
39 ExPolygonCollection::scale(double factor)
40 {
41 for (ExPolygons::iterator it = expolygons.begin(); it != expolygons.end(); ++it) {
42 (*it).scale(factor);
43 }
44 }
45
46 void
47 ExPolygonCollection::translate(double x, double y)
48 {
49 for (ExPolygons::iterator it = expolygons.begin(); it != expolygons.end(); ++it) {
50 (*it).translate(x, y);
51 }
52 }
53
54 void
55 ExPolygonCollection::rotate(double angle, const Point &center)
56 {
57 for (ExPolygons::iterator it = expolygons.begin(); it != expolygons.end(); ++it) {
58 (*it).rotate(angle, center);
59 }
60 }
61
62 template <class T>
63 bool
64 ExPolygonCollection::contains(const T &item) const
65 {
66 for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) {
67 if (it->contains(item)) return true;
68 }
69 return false;
70 }
71 template bool ExPolygonCollection::contains<Point>(const Point &item) const;
72 template bool ExPolygonCollection::contains<Line>(const Line &item) const;
73 template bool ExPolygonCollection::contains<Polyline>(const Polyline &item) const;
74
75 bool
76 ExPolygonCollection::contains_b(const Point &point) const
77 {
78 for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) {
79 if (it->contains_b(point)) return true;
80 }
81 return false;
82 }
83
84 void
85 ExPolygonCollection::simplify(double tolerance)
86 {
87 ExPolygons expp;
88 for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) {
89 it->simplify(tolerance, &expp);
90 }
91 this->expolygons = expp;
92 }
93
94 Polygon
95 ExPolygonCollection::convex_hull() const
96 {
97 Points pp;
98 for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it)
99 pp.insert(pp.end(), it->contour.points.begin(), it->contour.points.end());
100 return Slic3r::Geometry::convex_hull(pp);
101 }
102
103 Lines
104 ExPolygonCollection::lines() const
105 {
106 Lines lines;
107 for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) {
108 Lines ex_lines = it->lines();
109 lines.insert(lines.end(), ex_lines.begin(), ex_lines.end());
110 }
111 return lines;
112 }
113
114 Polygons
115 ExPolygonCollection::contours() const
116 {
117 Polygons contours;
118 contours.reserve(this->expolygons.size());
119 for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it)
120 contours.push_back(it->contour);
121 return contours;
122 }
123
124 void
125 ExPolygonCollection::append(const ExPolygons &expp)
126 {
127 this->expolygons.insert(this->expolygons.end(), expp.begin(), expp.end());
128 }
129
130 BoundingBox get_extents(const ExPolygonCollection &expolygon)
131 {
132 return get_extents(expolygon.expolygons);
133 }
134
135 }
0 #ifndef slic3r_ExPolygonCollection_hpp_
1 #define slic3r_ExPolygonCollection_hpp_
2
3 #include "libslic3r.h"
4 #include "ExPolygon.hpp"
5 #include "Line.hpp"
6 #include "Polyline.hpp"
7
8 namespace Slic3r {
9
10 class ExPolygonCollection;
11 typedef std::vector<ExPolygonCollection> ExPolygonCollections;
12
13 class ExPolygonCollection
14 {
15 public:
16 ExPolygons expolygons;
17
18 ExPolygonCollection() {};
19 ExPolygonCollection(const ExPolygon &expolygon);
20 ExPolygonCollection(const ExPolygons &expolygons) : expolygons(expolygons) {};
21 operator Points() const;
22 operator Polygons() const;
23 operator ExPolygons&();
24 void scale(double factor);
25 void translate(double x, double y);
26 void rotate(double angle, const Point &center);
27 template <class T> bool contains(const T &item) const;
28 bool contains_b(const Point &point) const;
29 void simplify(double tolerance);
30 Polygon convex_hull() const;
31 Lines lines() const;
32 Polygons contours() const;
33 void append(const ExPolygons &expolygons);
34 };
35
36 extern BoundingBox get_extents(const ExPolygonCollection &expolygon);
37
38 }
39
40 #endif
0 #include "Extruder.hpp"
1
2 namespace Slic3r {
3
4 Extruder::Extruder(unsigned int id, GCodeConfig *config)
5 : id(id),
6 config(config)
7 {
8 reset();
9
10 // cache values that are going to be called often
11 if (config->use_volumetric_e) {
12 this->e_per_mm3 = this->extrusion_multiplier();
13 } else {
14 this->e_per_mm3 = this->extrusion_multiplier()
15 * (4 / ((this->filament_diameter() * this->filament_diameter()) * PI));
16 }
17 this->retract_speed_mm_min = this->retract_speed() * 60;
18 }
19
20 void
21 Extruder::reset()
22 {
23 this->E = 0;
24 this->absolute_E = 0;
25 this->retracted = 0;
26 this->restart_extra = 0;
27 }
28
29 double
30 Extruder::extrude(double dE)
31 {
32 // in case of relative E distances we always reset to 0 before any output
33 if (this->config->use_relative_e_distances)
34 this->E = 0;
35
36 this->E += dE;
37 this->absolute_E += dE;
38 return dE;
39 }
40
41 /* This method makes sure the extruder is retracted by the specified amount
42 of filament and returns the amount of filament retracted.
43 If the extruder is already retracted by the same or a greater amount,
44 this method is a no-op.
45 The restart_extra argument sets the extra length to be used for
46 unretraction. If we're actually performing a retraction, any restart_extra
47 value supplied will overwrite the previous one if any. */
48 double
49 Extruder::retract(double length, double restart_extra)
50 {
51 // in case of relative E distances we always reset to 0 before any output
52 if (this->config->use_relative_e_distances)
53 this->E = 0;
54
55 double to_retract = length - this->retracted;
56 if (to_retract > 0) {
57 this->E -= to_retract;
58 this->absolute_E -= to_retract;
59 this->retracted += to_retract;
60 this->restart_extra = restart_extra;
61 return to_retract;
62 } else {
63 return 0;
64 }
65 }
66
67 double
68 Extruder::unretract()
69 {
70 double dE = this->retracted + this->restart_extra;
71 this->extrude(dE);
72 this->retracted = 0;
73 this->restart_extra = 0;
74 return dE;
75 }
76
77 double
78 Extruder::e_per_mm(double mm3_per_mm) const
79 {
80 return mm3_per_mm * this->e_per_mm3;
81 }
82
83 double
84 Extruder::extruded_volume() const
85 {
86 if (this->config->use_volumetric_e) {
87 // Any current amount of retraction should not affect used filament, since
88 // it represents empty volume in the nozzle. We add it back to E.
89 return this->absolute_E + this->retracted;
90 }
91
92 return this->used_filament() * (this->filament_diameter() * this->filament_diameter()) * PI/4;
93 }
94
95 double
96 Extruder::used_filament() const
97 {
98 if (this->config->use_volumetric_e) {
99 return this->extruded_volume() / (this->filament_diameter() * this->filament_diameter() * PI/4);
100 }
101
102 // Any current amount of retraction should not affect used filament, since
103 // it represents empty volume in the nozzle. We add it back to E.
104 return this->absolute_E + this->retracted;
105 }
106
107 double
108 Extruder::filament_diameter() const
109 {
110 return this->config->filament_diameter.get_at(this->id);
111 }
112
113 double
114 Extruder::extrusion_multiplier() const
115 {
116 return this->config->extrusion_multiplier.get_at(this->id);
117 }
118
119 double
120 Extruder::retract_length() const
121 {
122 return this->config->retract_length.get_at(this->id);
123 }
124
125 double
126 Extruder::retract_lift() const
127 {
128 return this->config->retract_lift.get_at(this->id);
129 }
130
131 int
132 Extruder::retract_speed() const
133 {
134 return this->config->retract_speed.get_at(this->id);
135 }
136
137 double
138 Extruder::retract_restart_extra() const
139 {
140 return this->config->retract_restart_extra.get_at(this->id);
141 }
142
143 double
144 Extruder::retract_length_toolchange() const
145 {
146 return this->config->retract_length_toolchange.get_at(this->id);
147 }
148
149 double
150 Extruder::retract_restart_extra_toolchange() const
151 {
152 return this->config->retract_restart_extra_toolchange.get_at(this->id);
153 }
154
155 }
0 #ifndef slic3r_Extruder_hpp_
1 #define slic3r_Extruder_hpp_
2
3 #include "libslic3r.h"
4 #include "Point.hpp"
5 #include "PrintConfig.hpp"
6
7 namespace Slic3r {
8
9 class Extruder
10 {
11 public:
12 unsigned int id;
13 double E;
14 double absolute_E;
15 double retracted;
16 double restart_extra;
17 double e_per_mm3;
18 double retract_speed_mm_min;
19
20 Extruder(unsigned int id, GCodeConfig *config);
21 virtual ~Extruder() {}
22 void reset();
23 double extrude(double dE);
24 double retract(double length, double restart_extra);
25 double unretract();
26 double e_per_mm(double mm3_per_mm) const;
27 double extruded_volume() const;
28 double used_filament() const;
29
30 double filament_diameter() const;
31 double extrusion_multiplier() const;
32 double retract_length() const;
33 double retract_lift() const;
34 int retract_speed() const;
35 double retract_restart_extra() const;
36 double retract_length_toolchange() const;
37 double retract_restart_extra_toolchange() const;
38
39 private:
40 GCodeConfig *config;
41 };
42
43 }
44
45 #endif
0 #include "ExtrusionEntity.hpp"
1 #include "ExtrusionEntityCollection.hpp"
2 #include "ExPolygonCollection.hpp"
3 #include "ClipperUtils.hpp"
4 #include "Extruder.hpp"
5 #include "Flow.hpp"
6 #include <cmath>
7 #include <limits>
8 #include <sstream>
9
10 namespace Slic3r {
11
12 void
13 ExtrusionPath::intersect_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const
14 {
15 // perform clipping
16 Polylines clipped;
17 intersection<Polylines,Polylines>(this->polyline, collection, &clipped);
18 return this->_inflate_collection(clipped, retval);
19 }
20
21 void
22 ExtrusionPath::subtract_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const
23 {
24 // perform clipping
25 Polylines clipped;
26 diff<Polylines,Polylines>(this->polyline, collection, &clipped);
27 return this->_inflate_collection(clipped, retval);
28 }
29
30 void
31 ExtrusionPath::clip_end(double distance)
32 {
33 this->polyline.clip_end(distance);
34 }
35
36 void
37 ExtrusionPath::simplify(double tolerance)
38 {
39 this->polyline.simplify(tolerance);
40 }
41
42 double
43 ExtrusionPath::length() const
44 {
45 return this->polyline.length();
46 }
47
48 void
49 ExtrusionPath::_inflate_collection(const Polylines &polylines, ExtrusionEntityCollection* collection) const
50 {
51 for (Polylines::const_iterator it = polylines.begin(); it != polylines.end(); ++it) {
52 ExtrusionPath* path = this->clone();
53 path->polyline = *it;
54 collection->entities.push_back(path);
55 }
56 }
57
58 void ExtrusionPath::polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const
59 {
60 offset(this->polyline, &out, scale_(this->width/2) + scaled_epsilon);
61 }
62
63 void ExtrusionPath::polygons_covered_by_spacing(Polygons &out, const float scaled_epsilon) const
64 {
65 // Instantiating the Flow class to get the line spacing.
66 // Don't know the nozzle diameter, setting to zero. It shall not matter it shall be optimized out by the compiler.
67 Flow flow(this->width, this->height, 0.f, this->is_bridge());
68 offset(this->polyline, &out, 0.5f * flow.scaled_spacing() + scaled_epsilon);
69 }
70
71 bool
72 ExtrusionLoop::make_clockwise()
73 {
74 bool was_ccw = this->polygon().is_counter_clockwise();
75 if (was_ccw) this->reverse();
76 return was_ccw;
77 }
78
79 bool
80 ExtrusionLoop::make_counter_clockwise()
81 {
82 bool was_cw = this->polygon().is_clockwise();
83 if (was_cw) this->reverse();
84 return was_cw;
85 }
86
87 void
88 ExtrusionLoop::reverse()
89 {
90 for (ExtrusionPaths::iterator path = this->paths.begin(); path != this->paths.end(); ++path)
91 path->reverse();
92 std::reverse(this->paths.begin(), this->paths.end());
93 }
94
95 Polygon
96 ExtrusionLoop::polygon() const
97 {
98 Polygon polygon;
99 for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path) {
100 // for each polyline, append all points except the last one (because it coincides with the first one of the next polyline)
101 polygon.points.insert(polygon.points.end(), path->polyline.points.begin(), path->polyline.points.end()-1);
102 }
103 return polygon;
104 }
105
106 double
107 ExtrusionLoop::length() const
108 {
109 double len = 0;
110 for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path)
111 len += path->polyline.length();
112 return len;
113 }
114
115 bool
116 ExtrusionLoop::split_at_vertex(const Point &point)
117 {
118 for (ExtrusionPaths::iterator path = this->paths.begin(); path != this->paths.end(); ++path) {
119 int idx = path->polyline.find_point(point);
120 if (idx != -1) {
121 if (this->paths.size() == 1) {
122 // just change the order of points
123 path->polyline.points.insert(path->polyline.points.end(), path->polyline.points.begin() + 1, path->polyline.points.begin() + idx + 1);
124 path->polyline.points.erase(path->polyline.points.begin(), path->polyline.points.begin() + idx);
125 } else {
126 // new paths list starts with the second half of current path
127 ExtrusionPaths new_paths;
128 new_paths.reserve(this->paths.size() + 1);
129 {
130 ExtrusionPath p = *path;
131 p.polyline.points.erase(p.polyline.points.begin(), p.polyline.points.begin() + idx);
132 if (p.polyline.is_valid()) new_paths.push_back(p);
133 }
134
135 // then we add all paths until the end of current path list
136 new_paths.insert(new_paths.end(), path+1, this->paths.end()); // not including this path
137
138 // then we add all paths since the beginning of current list up to the previous one
139 new_paths.insert(new_paths.end(), this->paths.begin(), path); // not including this path
140
141 // finally we add the first half of current path
142 {
143 ExtrusionPath p = *path;
144 p.polyline.points.erase(p.polyline.points.begin() + idx + 1, p.polyline.points.end());
145 if (p.polyline.is_valid()) new_paths.push_back(p);
146 }
147 // we can now override the old path list with the new one and stop looping
148 std::swap(this->paths, new_paths);
149 }
150 return true;
151 }
152 }
153 return false;
154 }
155
156 void
157 ExtrusionLoop::split_at(const Point &point)
158 {
159 if (this->paths.empty()) return;
160
161 // find the closest path and closest point belonging to that path
162 size_t path_idx = 0;
163 Point p = this->paths.front().first_point();
164 double min = point.distance_to(p);
165 for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path) {
166 Point p_tmp = point.projection_onto(path->polyline);
167 double dist = point.distance_to(p_tmp);
168 if (dist < min) {
169 p = p_tmp;
170 min = dist;
171 path_idx = path - this->paths.begin();
172 }
173 }
174
175 // now split path_idx in two parts
176 const ExtrusionPath &path = this->paths[path_idx];
177 ExtrusionPath p1(path.role, path.mm3_per_mm, path.width, path.height);
178 ExtrusionPath p2(path.role, path.mm3_per_mm, path.width, path.height);
179 path.polyline.split_at(p, &p1.polyline, &p2.polyline);
180
181 if (this->paths.size() == 1) {
182 if (! p1.polyline.is_valid())
183 std::swap(this->paths.front().polyline.points, p2.polyline.points);
184 else if (! p2.polyline.is_valid())
185 std::swap(this->paths.front().polyline.points, p1.polyline.points);
186 else {
187 p2.polyline.points.insert(p2.polyline.points.end(), p1.polyline.points.begin() + 1, p1.polyline.points.end());
188 std::swap(this->paths.front().polyline.points, p2.polyline.points);
189 }
190 } else {
191 // install the two paths
192 this->paths.erase(this->paths.begin() + path_idx);
193 if (p2.polyline.is_valid()) this->paths.insert(this->paths.begin() + path_idx, p2);
194 if (p1.polyline.is_valid()) this->paths.insert(this->paths.begin() + path_idx, p1);
195 }
196
197 // split at the new vertex
198 this->split_at_vertex(p);
199 }
200
201 void
202 ExtrusionLoop::clip_end(double distance, ExtrusionPaths* paths) const
203 {
204 *paths = this->paths;
205
206 while (distance > 0 && !paths->empty()) {
207 ExtrusionPath &last = paths->back();
208 double len = last.length();
209 if (len <= distance) {
210 paths->pop_back();
211 distance -= len;
212 } else {
213 last.polyline.clip_end(distance);
214 break;
215 }
216 }
217 }
218
219 bool
220 ExtrusionLoop::has_overhang_point(const Point &point) const
221 {
222 for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path) {
223 int pos = path->polyline.find_point(point);
224 if (pos != -1) {
225 // point belongs to this path
226 // we consider it overhang only if it's not an endpoint
227 return (path->is_bridge() && pos > 0 && pos != (int)(path->polyline.points.size())-1);
228 }
229 }
230 return false;
231 }
232
233 void ExtrusionLoop::polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const
234 {
235 for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path)
236 path->polygons_covered_by_width(out, scaled_epsilon);
237 }
238
239 void ExtrusionLoop::polygons_covered_by_spacing(Polygons &out, const float scaled_epsilon) const
240 {
241 for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path)
242 path->polygons_covered_by_spacing(out, scaled_epsilon);
243 }
244
245 double
246 ExtrusionLoop::min_mm3_per_mm() const
247 {
248 double min_mm3_per_mm = std::numeric_limits<double>::max();
249 for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path)
250 min_mm3_per_mm = std::min(min_mm3_per_mm, path->mm3_per_mm);
251 return min_mm3_per_mm;
252 }
253
254 }
0 #ifndef slic3r_ExtrusionEntity_hpp_
1 #define slic3r_ExtrusionEntity_hpp_
2
3 #include "libslic3r.h"
4 #include "Polygon.hpp"
5 #include "Polyline.hpp"
6
7 namespace Slic3r {
8
9 class ExPolygonCollection;
10 class ExtrusionEntityCollection;
11 class Extruder;
12
13 /* Each ExtrusionRole value identifies a distinct set of { extruder, speed } */
14 enum ExtrusionRole {
15 erNone,
16 erPerimeter,
17 erExternalPerimeter,
18 erOverhangPerimeter,
19 erInternalInfill,
20 erSolidInfill,
21 erTopSolidInfill,
22 erBridgeInfill,
23 erGapFill,
24 erSkirt,
25 erSupportMaterial,
26 erSupportMaterialInterface,
27 };
28
29 /* Special flags describing loop */
30 enum ExtrusionLoopRole {
31 elrDefault,
32 elrContourInternalPerimeter,
33 elrSkirt,
34 };
35
36 class ExtrusionEntity
37 {
38 public:
39 virtual bool is_collection() const { return false; }
40 virtual bool is_loop() const { return false; }
41 virtual bool can_reverse() const { return true; }
42 virtual ExtrusionEntity* clone() const = 0;
43 virtual ~ExtrusionEntity() {};
44 virtual void reverse() = 0;
45 virtual Point first_point() const = 0;
46 virtual Point last_point() const = 0;
47 // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion width.
48 // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps.
49 virtual void polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const = 0;
50 // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion spacing.
51 // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps.
52 // Useful to calculate area of an infill, which has been really filled in by a 100% rectilinear infill.
53 virtual void polygons_covered_by_spacing(Polygons &out, const float scaled_epsilon) const = 0;
54 Polygons polygons_covered_by_width(const float scaled_epsilon = 0.f) const
55 { Polygons out; this->polygons_covered_by_width(out, scaled_epsilon); return out; }
56 Polygons polygons_covered_by_spacing(const float scaled_epsilon = 0.f) const
57 { Polygons out; this->polygons_covered_by_spacing(out, scaled_epsilon); return out; }
58 // Minimum volumetric velocity of this extrusion entity. Used by the constant nozzle pressure algorithm.
59 virtual double min_mm3_per_mm() const = 0;
60 virtual Polyline as_polyline() const = 0;
61 virtual double length() const = 0;
62 };
63
64 typedef std::vector<ExtrusionEntity*> ExtrusionEntitiesPtr;
65
66 class ExtrusionPath : public ExtrusionEntity
67 {
68 public:
69 Polyline polyline;
70 ExtrusionRole role;
71 // Volumetric velocity. mm^3 of plastic per mm of linear head motion
72 double mm3_per_mm;
73 // Width of the extrusion.
74 float width;
75 // Height of the extrusion.
76 float height;
77
78 ExtrusionPath(ExtrusionRole role) : role(role), mm3_per_mm(-1), width(-1), height(-1) {};
79 ExtrusionPath(ExtrusionRole role, double mm3_per_mm, float width, float height) : role(role), mm3_per_mm(mm3_per_mm), width(width), height(height) {};
80 // ExtrusionPath(ExtrusionRole role, const Flow &flow) : role(role), mm3_per_mm(flow.mm3_per_mm()), width(flow.width), height(flow.height) {};
81 ExtrusionPath* clone() const { return new ExtrusionPath (*this); }
82 void reverse() { this->polyline.reverse(); }
83 Point first_point() const { return this->polyline.points.front(); }
84 Point last_point() const { return this->polyline.points.back(); }
85 // Produce a list of extrusion paths into retval by clipping this path by ExPolygonCollection.
86 // Currently not used.
87 void intersect_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const;
88 // Produce a list of extrusion paths into retval by removing parts of this path by ExPolygonCollection.
89 // Currently not used.
90 void subtract_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const;
91 void clip_end(double distance);
92 void simplify(double tolerance);
93 virtual double length() const;
94 bool is_perimeter() const {
95 return this->role == erPerimeter
96 || this->role == erExternalPerimeter
97 || this->role == erOverhangPerimeter;
98 }
99 bool is_infill() const {
100 return this->role == erBridgeInfill
101 || this->role == erInternalInfill
102 || this->role == erSolidInfill
103 || this->role == erTopSolidInfill;
104 }
105 bool is_solid_infill() const {
106 return this->role == erBridgeInfill
107 || this->role == erSolidInfill
108 || this->role == erTopSolidInfill;
109 }
110 bool is_bridge() const {
111 return this->role == erBridgeInfill
112 || this->role == erOverhangPerimeter;
113 }
114 // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion width.
115 // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps.
116 void polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const;
117 // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion spacing.
118 // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps.
119 // Useful to calculate area of an infill, which has been really filled in by a 100% rectilinear infill.
120 void polygons_covered_by_spacing(Polygons &out, const float scaled_epsilon) const;
121 Polygons polygons_covered_by_width(const float scaled_epsilon = 0.f) const
122 { Polygons out; this->polygons_covered_by_width(out, scaled_epsilon); return out; }
123 Polygons polygons_covered_by_spacing(const float scaled_epsilon = 0.f) const
124 { Polygons out; this->polygons_covered_by_spacing(out, scaled_epsilon); return out; }
125 // Minimum volumetric velocity of this extrusion entity. Used by the constant nozzle pressure algorithm.
126 double min_mm3_per_mm() const { return this->mm3_per_mm; }
127 Polyline as_polyline() const { return this->polyline; }
128
129 private:
130 void _inflate_collection(const Polylines &polylines, ExtrusionEntityCollection* collection) const;
131 };
132
133 typedef std::vector<ExtrusionPath> ExtrusionPaths;
134
135 class ExtrusionLoop : public ExtrusionEntity
136 {
137 public:
138 ExtrusionPaths paths;
139 ExtrusionLoopRole role;
140
141 ExtrusionLoop(ExtrusionLoopRole role = elrDefault) : role(role) {};
142 ExtrusionLoop(const ExtrusionPaths &paths, ExtrusionLoopRole role = elrDefault)
143 : paths(paths), role(role) {};
144 ExtrusionLoop(const ExtrusionPath &path, ExtrusionLoopRole role = elrDefault)
145 : role(role) {
146 this->paths.push_back(path);
147 };
148 bool is_loop() const { return true; }
149 bool can_reverse() const { return false; }
150 ExtrusionLoop* clone() const { return new ExtrusionLoop (*this); }
151 bool make_clockwise();
152 bool make_counter_clockwise();
153 void reverse();
154 Point first_point() const { return this->paths.front().polyline.points.front(); }
155 Point last_point() const { assert(first_point() == this->paths.back().polyline.points.back()); return first_point(); }
156 Polygon polygon() const;
157 virtual double length() const;
158 bool split_at_vertex(const Point &point);
159 void split_at(const Point &point);
160 void clip_end(double distance, ExtrusionPaths* paths) const;
161 // Test, whether the point is extruded by a bridging flow.
162 // This used to be used to avoid placing seams on overhangs, but now the EdgeGrid is used instead.
163 bool has_overhang_point(const Point &point) const;
164 bool is_perimeter() const {
165 return this->paths.front().role == erPerimeter
166 || this->paths.front().role == erExternalPerimeter
167 || this->paths.front().role == erOverhangPerimeter;
168 }
169 bool is_infill() const {
170 return this->paths.front().role == erBridgeInfill
171 || this->paths.front().role == erInternalInfill
172 || this->paths.front().role == erSolidInfill
173 || this->paths.front().role == erTopSolidInfill;
174 }
175 bool is_solid_infill() const {
176 return this->paths.front().role == erBridgeInfill
177 || this->paths.front().role == erSolidInfill
178 || this->paths.front().role == erTopSolidInfill;
179 }
180 // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion width.
181 // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps.
182 void polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const;
183 // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion spacing.
184 // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps.
185 // Useful to calculate area of an infill, which has been really filled in by a 100% rectilinear infill.
186 void polygons_covered_by_spacing(Polygons &out, const float scaled_epsilon) const;
187 Polygons polygons_covered_by_width(const float scaled_epsilon = 0.f) const
188 { Polygons out; this->polygons_covered_by_width(out, scaled_epsilon); return out; }
189 Polygons polygons_covered_by_spacing(const float scaled_epsilon = 0.f) const
190 { Polygons out; this->polygons_covered_by_spacing(out, scaled_epsilon); return out; }
191 // Minimum volumetric velocity of this extrusion entity. Used by the constant nozzle pressure algorithm.
192 double min_mm3_per_mm() const;
193 Polyline as_polyline() const { return this->polygon().split_at_first_point(); }
194 };
195
196 }
197
198 #endif
0 #include "ExtrusionEntityCollection.hpp"
1 #include <algorithm>
2 #include <cmath>
3 #include <map>
4
5 namespace Slic3r {
6
7 ExtrusionEntityCollection::ExtrusionEntityCollection(const ExtrusionEntityCollection& collection)
8 : orig_indices(collection.orig_indices), no_sort(collection.no_sort)
9 {
10 this->append(collection.entities);
11 }
12
13 ExtrusionEntityCollection::ExtrusionEntityCollection(const ExtrusionPaths &paths)
14 : no_sort(false)
15 {
16 this->append(paths);
17 }
18
19 ExtrusionEntityCollection& ExtrusionEntityCollection::operator= (const ExtrusionEntityCollection &other)
20 {
21 this->entities = other.entities;
22 for (size_t i = 0; i < this->entities.size(); ++i)
23 this->entities[i] = this->entities[i]->clone();
24 this->orig_indices = other.orig_indices;
25 this->no_sort = other.no_sort;
26 return *this;
27 }
28
29 void
30 ExtrusionEntityCollection::swap (ExtrusionEntityCollection &c)
31 {
32 std::swap(this->entities, c.entities);
33 std::swap(this->orig_indices, c.orig_indices);
34 std::swap(this->no_sort, c.no_sort);
35 }
36
37 void ExtrusionEntityCollection::clear()
38 {
39 for (size_t i = 0; i < this->entities.size(); ++i)
40 delete this->entities[i];
41 this->entities.clear();
42 }
43
44 ExtrusionEntityCollection::operator ExtrusionPaths() const
45 {
46 ExtrusionPaths paths;
47 for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) {
48 if (const ExtrusionPath* path = dynamic_cast<const ExtrusionPath*>(*it))
49 paths.push_back(*path);
50 }
51 return paths;
52 }
53
54 ExtrusionEntityCollection*
55 ExtrusionEntityCollection::clone() const
56 {
57 ExtrusionEntityCollection* coll = new ExtrusionEntityCollection(*this);
58 for (size_t i = 0; i < coll->entities.size(); ++i)
59 coll->entities[i] = this->entities[i]->clone();
60 return coll;
61 }
62
63 void
64 ExtrusionEntityCollection::reverse()
65 {
66 for (ExtrusionEntitiesPtr::iterator it = this->entities.begin(); it != this->entities.end(); ++it) {
67 // Don't reverse it if it's a loop, as it doesn't change anything in terms of elements ordering
68 // and caller might rely on winding order
69 if (!(*it)->is_loop()) (*it)->reverse();
70 }
71 std::reverse(this->entities.begin(), this->entities.end());
72 }
73
74 void
75 ExtrusionEntityCollection::append(const ExtrusionEntitiesPtr &entities)
76 {
77 for (ExtrusionEntitiesPtr::const_iterator ptr = entities.begin(); ptr != entities.end(); ++ptr)
78 this->append(**ptr);
79 }
80
81 void
82 ExtrusionEntityCollection::append(const ExtrusionPaths &paths)
83 {
84 for (ExtrusionPaths::const_iterator path = paths.begin(); path != paths.end(); ++path)
85 this->append(*path);
86 }
87
88 void
89 ExtrusionEntityCollection::replace(size_t i, const ExtrusionEntity &entity)
90 {
91 delete this->entities[i];
92 this->entities[i] = entity.clone();
93 }
94
95 void
96 ExtrusionEntityCollection::remove(size_t i)
97 {
98 delete this->entities[i];
99 this->entities.erase(this->entities.begin() + i);
100 }
101
102 ExtrusionEntityCollection
103 ExtrusionEntityCollection::chained_path(bool no_reverse, std::vector<size_t>* orig_indices) const
104 {
105 ExtrusionEntityCollection coll;
106 this->chained_path(&coll, no_reverse, orig_indices);
107 return coll;
108 }
109
110 void
111 ExtrusionEntityCollection::chained_path(ExtrusionEntityCollection* retval, bool no_reverse, std::vector<size_t>* orig_indices) const
112 {
113 if (this->entities.empty()) return;
114 this->chained_path_from(this->entities.front()->first_point(), retval, no_reverse, orig_indices);
115 }
116
117 void
118 ExtrusionEntityCollection::chained_path_from(Point start_near, ExtrusionEntityCollection* retval, bool no_reverse, std::vector<size_t>* orig_indices) const
119 {
120 if (this->no_sort) {
121 *retval = *this;
122 return;
123 }
124 retval->entities.reserve(this->entities.size());
125 retval->orig_indices.reserve(this->entities.size());
126
127 // if we're asked to return the original indices, build a map
128 std::map<ExtrusionEntity*,size_t> indices_map;
129
130 ExtrusionEntitiesPtr my_paths;
131 for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) {
132 ExtrusionEntity* entity = (*it)->clone();
133 my_paths.push_back(entity);
134 if (orig_indices != NULL) indices_map[entity] = it - this->entities.begin();
135 }
136
137 Points endpoints;
138 for (ExtrusionEntitiesPtr::iterator it = my_paths.begin(); it != my_paths.end(); ++it) {
139 endpoints.push_back((*it)->first_point());
140 if (no_reverse || !(*it)->can_reverse()) {
141 endpoints.push_back((*it)->first_point());
142 } else {
143 endpoints.push_back((*it)->last_point());
144 }
145 }
146
147 while (!my_paths.empty()) {
148 // find nearest point
149 int start_index = start_near.nearest_point_index(endpoints);
150 int path_index = start_index/2;
151 ExtrusionEntity* entity = my_paths.at(path_index);
152 // never reverse loops, since it's pointless for chained path and callers might depend on orientation
153 if (start_index % 2 && !no_reverse && entity->can_reverse()) {
154 entity->reverse();
155 }
156 retval->entities.push_back(my_paths.at(path_index));
157 if (orig_indices != NULL) orig_indices->push_back(indices_map[entity]);
158 my_paths.erase(my_paths.begin() + path_index);
159 endpoints.erase(endpoints.begin() + 2*path_index, endpoints.begin() + 2*path_index + 2);
160 start_near = retval->entities.back()->last_point();
161 }
162 }
163
164 void ExtrusionEntityCollection::polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const
165 {
166 for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it)
167 (*it)->polygons_covered_by_width(out, scaled_epsilon);
168 }
169
170 void ExtrusionEntityCollection::polygons_covered_by_spacing(Polygons &out, const float scaled_epsilon) const
171 {
172 for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it)
173 (*it)->polygons_covered_by_spacing(out, scaled_epsilon);
174 }
175
176 /* Recursively count paths and loops contained in this collection */
177 size_t
178 ExtrusionEntityCollection::items_count() const
179 {
180 size_t count = 0;
181 for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) {
182 if ((*it)->is_collection()) {
183 ExtrusionEntityCollection* collection = dynamic_cast<ExtrusionEntityCollection*>(*it);
184 count += collection->items_count();
185 } else {
186 ++count;
187 }
188 }
189 return count;
190 }
191
192 /* Returns a single vector of pointers to all non-collection items contained in this one */
193 void
194 ExtrusionEntityCollection::flatten(ExtrusionEntityCollection* retval) const
195 {
196 for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) {
197 if ((*it)->is_collection()) {
198 ExtrusionEntityCollection* collection = dynamic_cast<ExtrusionEntityCollection*>(*it);
199 retval->append(collection->flatten().entities);
200 } else {
201 retval->append(**it);
202 }
203 }
204 }
205
206 ExtrusionEntityCollection
207 ExtrusionEntityCollection::flatten() const
208 {
209 ExtrusionEntityCollection coll;
210 this->flatten(&coll);
211 return coll;
212 }
213
214 double
215 ExtrusionEntityCollection::min_mm3_per_mm() const
216 {
217 double min_mm3_per_mm = std::numeric_limits<double>::max();
218 for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it)
219 min_mm3_per_mm = std::min(min_mm3_per_mm, (*it)->min_mm3_per_mm());
220 return min_mm3_per_mm;
221 }
222
223 }
0 #ifndef slic3r_ExtrusionEntityCollection_hpp_
1 #define slic3r_ExtrusionEntityCollection_hpp_
2
3 #include "libslic3r.h"
4 #include "ExtrusionEntity.hpp"
5
6 namespace Slic3r {
7
8 class ExtrusionEntityCollection : public ExtrusionEntity
9 {
10 public:
11 ExtrusionEntityCollection* clone() const;
12 ExtrusionEntitiesPtr entities; // we own these entities
13 std::vector<size_t> orig_indices; // handy for XS
14 bool no_sort;
15 ExtrusionEntityCollection(): no_sort(false) {};
16 ExtrusionEntityCollection(const ExtrusionEntityCollection &collection);
17 ExtrusionEntityCollection(const ExtrusionPaths &paths);
18 ExtrusionEntityCollection& operator= (const ExtrusionEntityCollection &other);
19 ~ExtrusionEntityCollection() { clear(); }
20 operator ExtrusionPaths() const;
21
22 bool is_collection() const { return true; };
23 bool can_reverse() const { return !this->no_sort; };
24 bool empty() const { return this->entities.empty(); };
25 void clear();
26 void swap (ExtrusionEntityCollection &c);
27 void append(const ExtrusionEntity &entity) { this->entities.push_back(entity.clone()); }
28 void append(const ExtrusionEntitiesPtr &entities);
29 void append(const ExtrusionPaths &paths);
30 void replace(size_t i, const ExtrusionEntity &entity);
31 void remove(size_t i);
32 ExtrusionEntityCollection chained_path(bool no_reverse = false, std::vector<size_t>* orig_indices = NULL) const;
33 void chained_path(ExtrusionEntityCollection* retval, bool no_reverse = false, std::vector<size_t>* orig_indices = NULL) const;
34 void chained_path_from(Point start_near, ExtrusionEntityCollection* retval, bool no_reverse = false, std::vector<size_t>* orig_indices = NULL) const;
35 void reverse();
36 Point first_point() const { return this->entities.front()->first_point(); }
37 Point last_point() const { return this->entities.back()->last_point(); }
38 // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion width.
39 // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps.
40 virtual void polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const;
41 // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion spacing.
42 // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps.
43 // Useful to calculate area of an infill, which has been really filled in by a 100% rectilinear infill.
44 virtual void polygons_covered_by_spacing(Polygons &out, const float scaled_epsilon) const;
45 Polygons polygons_covered_by_width(const float scaled_epsilon = 0.f) const
46 { Polygons out; this->polygons_covered_by_width(out, scaled_epsilon); return out; }
47 Polygons polygons_covered_by_spacing(const float scaled_epsilon = 0.f) const
48 { Polygons out; this->polygons_covered_by_spacing(out, scaled_epsilon); return out; }
49 size_t items_count() const;
50 void flatten(ExtrusionEntityCollection* retval) const;
51 ExtrusionEntityCollection flatten() const;
52 double min_mm3_per_mm() const;
53 Polyline as_polyline() const {
54 CONFESS("Calling as_polyline() on a ExtrusionEntityCollection");
55 return Polyline();
56 };
57 virtual double length() const {
58 CONFESS("Calling length() on a ExtrusionEntityCollection");
59 return 0.;
60 }
61 };
62
63 }
64
65 #endif
0 // Optimize the extrusion simulator to the bones.
1 //#pragma GCC optimize ("O3")
2 //#undef SLIC3R_DEBUG
3 //#define NDEBUG
4
5 #include <cmath>
6 #include <cassert>
7
8 #include <boost/geometry.hpp>
9 #include <boost/geometry/geometries/box.hpp>
10 #include <boost/geometry/geometries/point.hpp>
11 #include <boost/geometry/geometries/point_xy.hpp>
12
13 #include <boost/multi_array.hpp>
14
15 #include "ExtrusionSimulator.hpp"
16
17 #ifndef M_PI
18 #define M_PI 3.1415926535897932384626433832795
19 #endif
20
21 // Replacement for a template alias.
22 // Shorthand for the point_xy.
23 template<typename T>
24 struct V2
25 {
26 typedef boost::geometry::model::d2::point_xy<T> Type;
27 };
28
29 // Replacement for a template alias.
30 // Shorthand for the point with a cartesian coordinate system.
31 template<typename T>
32 struct V3
33 {
34 typedef boost::geometry::model::point<T, 3, boost::geometry::cs::cartesian> Type;
35 };
36
37 // Replacement for a template alias.
38 // Shorthand for the point with a cartesian coordinate system.
39 template<typename T>
40 struct V4
41 {
42 typedef boost::geometry::model::point<T, 4, boost::geometry::cs::cartesian> Type;
43 };
44
45 typedef V2<int >::Type V2i;
46 typedef V2<float >::Type V2f;
47 typedef V2<double>::Type V2d;
48
49 // Used for an RGB color.
50 typedef V3<unsigned char>::Type V3uc;
51 // Used for an RGBA color.
52 typedef V4<unsigned char>::Type V4uc;
53
54 typedef boost::geometry::model::box<V2i> B2i;
55 typedef boost::geometry::model::box<V2f> B2f;
56 typedef boost::geometry::model::box<V2d> B2d;
57
58 typedef boost::multi_array<unsigned char, 2> A2uc;
59 typedef boost::multi_array<int , 2> A2i;
60 typedef boost::multi_array<float , 2> A2f;
61 typedef boost::multi_array<double , 2> A2d;
62
63 template<typename T>
64 inline void operator+=(
65 boost::geometry::model::d2::point_xy<T> &v1,
66 const boost::geometry::model::d2::point_xy<T> &v2)
67 {
68 boost::geometry::add_point(v1, v2);
69 }
70
71 template<typename T>
72 inline void operator-=(
73 boost::geometry::model::d2::point_xy<T> &v1,
74 const boost::geometry::model::d2::point_xy<T> &v2)
75 {
76 boost::geometry::subtract_point(v1, v2);
77 }
78
79 template<typename T>
80 inline void operator*=(boost::geometry::model::d2::point_xy<T> &v, const T c)
81 {
82 boost::geometry::multiply_value(v, c);
83 }
84
85 template<typename T>
86 inline void operator/=(boost::geometry::model::d2::point_xy<T> &v, const T c)
87 {
88 boost::geometry::divide_value(v, c);
89 }
90
91 template<typename T>
92 inline typename boost::geometry::model::d2::point_xy<T> operator+(
93 const boost::geometry::model::d2::point_xy<T> &v1,
94 const boost::geometry::model::d2::point_xy<T> &v2)
95 {
96 boost::geometry::model::d2::point_xy<T> out(v1);
97 out += v2;
98 return out;
99 }
100
101 template<typename T>
102 inline boost::geometry::model::d2::point_xy<T> operator-(
103 const boost::geometry::model::d2::point_xy<T> &v1,
104 const boost::geometry::model::d2::point_xy<T> &v2)
105 {
106 boost::geometry::model::d2::point_xy<T> out(v1);
107 out -= v2;
108 return out;
109 }
110
111 template<typename T>
112 inline boost::geometry::model::d2::point_xy<T> operator*(
113 const boost::geometry::model::d2::point_xy<T> &v, const T c)
114 {
115 boost::geometry::model::d2::point_xy<T> out(v);
116 out *= c;
117 return out;
118 }
119
120 template<typename T>
121 inline typename boost::geometry::model::d2::point_xy<T> operator*(
122 const T c, const boost::geometry::model::d2::point_xy<T> &v)
123 {
124 boost::geometry::model::d2::point_xy<T> out(v);
125 out *= c;
126 return out;
127 }
128
129 template<typename T>
130 inline typename boost::geometry::model::d2::point_xy<T> operator/(
131 const boost::geometry::model::d2::point_xy<T> &v, const T c)
132 {
133 boost::geometry::model::d2::point_xy<T> out(v);
134 out /= c;
135 return out;
136 }
137
138 template<typename T>
139 inline T dot(
140 const boost::geometry::model::d2::point_xy<T> &v1,
141 const boost::geometry::model::d2::point_xy<T> &v2)
142 {
143 return boost::geometry::dot_product(v1, v2);
144 }
145
146 template<typename T>
147 inline T dot(const boost::geometry::model::d2::point_xy<T> &v)
148 {
149 return boost::geometry::dot_product(v, v);
150 }
151
152 template <typename T>
153 inline T cross(
154 const boost::geometry::model::d2::point_xy<T> &v1,
155 const boost::geometry::model::d2::point_xy<T> &v2)
156 {
157 return v1.x() * v2.y() - v2.x() * v1.y();
158 }
159
160 // Euclidian measure
161 template<typename T>
162 inline T l2(const boost::geometry::model::d2::point_xy<T> &v)
163 {
164 return std::sqrt(dot(v));
165 }
166
167 // Euclidian measure
168 template<typename T>
169 inline T mag(const boost::geometry::model::d2::point_xy<T> &v)
170 {
171 return l2(v);
172 }
173
174 template<typename T>
175 inline T lerp(T start, T end, T alpha)
176 {
177 return start * (T(1.) - alpha) + end * alpha;
178 }
179
180 template<typename T>
181 inline T clamp(T low, T high, T x)
182 {
183 return std::max<T>(low, std::min<T>(high, x));
184 }
185
186 template<typename T>
187 inline T sqr(T x)
188 {
189 return x * x;
190 }
191
192 template<typename T>
193 inline T dist2_to_line(
194 const boost::geometry::model::d2::point_xy<T> &p0,
195 const boost::geometry::model::d2::point_xy<T> &p1,
196 const boost::geometry::model::d2::point_xy<T> &px)
197 {
198 boost::geometry::model::d2::point_xy<T> v = p1 - p0;
199 boost::geometry::model::d2::point_xy<T> vx = px - p0;
200 T l = dot(v);
201 T t = dot(v, vx);
202 if (l != T(0) && t > T(0.)) {
203 t /= l;
204 vx = px - ((t > T(1.)) ? p1 : (p0 + t * v));
205 }
206 return dot(vx);
207 }
208
209 // Intersect a circle with a line segment.
210 // Returns number of intersection points.
211 template<typename T>
212 int line_circle_intersection(
213 const boost::geometry::model::d2::point_xy<T> &p0,
214 const boost::geometry::model::d2::point_xy<T> &p1,
215 const boost::geometry::model::d2::point_xy<T> &center,
216 const T radius,
217 boost::geometry::model::d2::point_xy<T> intersection[2])
218 {
219 typedef typename V2<T>::Type V2T;
220 V2T v = p1 - p0;
221 V2T vc = p0 - center;
222 T a = dot(v);
223 T b = T(2.) * dot(vc, v);
224 T c = dot(vc) - radius * radius;
225 T d = b * b - T(4.) * a * c;
226
227 if (d < T(0))
228 // The circle misses the ray.
229 return 0;
230
231 int n = 0;
232 if (d == T(0)) {
233 // The circle touches the ray at a single tangent point.
234 T t = - b / (T(2.) * a);
235 if (t >= T(0.) && t <= T(1.))
236 intersection[n ++] = p0 + t * v;
237 } else {
238 // The circle intersects the ray in two points.
239 d = sqrt(d);
240 T t = (- b - d) / (T(2.) * a);
241 if (t >= T(0.) && t <= T(1.))
242 intersection[n ++] = p0 + t * v;
243 t = (- b + d) / (T(2.) * a);
244 if (t >= T(0.) && t <= T(1.))
245 intersection[n ++] = p0 + t * v;
246 }
247 return n;
248 }
249
250 // Sutherland–Hodgman clipping of a rectangle against an AABB.
251 // Expects the first 4 points of rect to be filled at the beginning.
252 // The clipping may produce up to 8 points.
253 // Returns the number of resulting points.
254 template<typename T>
255 int clip_rect_by_AABB(
256 boost::geometry::model::d2::point_xy<T> rect[8],
257 const boost::geometry::model::box<boost::geometry::model::d2::point_xy<T> > &aabb)
258 {
259 typedef typename V2<T>::Type V2T;
260 V2T result[8];
261 int nin = 4;
262 int nout = 0;
263 V2T *in = rect;
264 V2T *out = result;
265 // Clip left
266 {
267 const V2T *S = in + nin - 1;
268 T left = aabb.min_corner().x();
269 for (int i = 0; i < nin; ++i) {
270 const V2T &E = in[i];
271 if (E.x() == left) {
272 out[nout++] = E;
273 }
274 else if (E.x() > left) {
275 // E is inside the AABB.
276 if (S->x() < left) {
277 // S is outside the AABB. Calculate an intersection point.
278 T t = (left - S->x()) / (E.x() - S->x());
279 out[nout++] = V2T(left, S->y() + t * (E.y() - S->y()));
280 }
281 out[nout++] = E;
282 }
283 else if (S->x() > left) {
284 // S is inside the AABB, E is outside the AABB.
285 T t = (left - S->x()) / (E.x() - S->x());
286 out[nout++] = V2T(left, S->y() + t * (E.y() - S->y()));
287 }
288 S = &E;
289 }
290 assert(nout <= 8);
291 }
292 // Clip bottom
293 {
294 std::swap(in, out);
295 nin = nout;
296 nout = 0;
297 const V2T *S = in + nin - 1;
298 T bottom = aabb.min_corner().y();
299 for (int i = 0; i < nin; ++i) {
300 const V2T &E = in[i];
301 if (E.y() == bottom) {
302 out[nout++] = E;
303 }
304 else if (E.y() > bottom) {
305 // E is inside the AABB.
306 if (S->y() < bottom) {
307 // S is outside the AABB. Calculate an intersection point.
308 T t = (bottom - S->y()) / (E.y() - S->y());
309 out[nout++] = V2T(S->x() + t * (E.x() - S->x()), bottom);
310 }
311 out[nout++] = E;
312 }
313 else if (S->y() > bottom) {
314 // S is inside the AABB, E is outside the AABB.
315 T t = (bottom - S->y()) / (E.y() - S->y());
316 out[nout++] = V2T(S->x() + t * (E.x() - S->x()), bottom);
317 }
318 S = &E;
319 }
320 assert(nout <= 8);
321 }
322 // Clip right
323 {
324 std::swap(in, out);
325 nin = nout;
326 nout = 0;
327 const V2T *S = in + nin - 1;
328 T right = aabb.max_corner().x();
329 for (int i = 0; i < nin; ++i) {
330 const V2T &E = in[i];
331 if (E.x() == right) {
332 out[nout++] = E;
333 }
334 else if (E.x() < right) {
335 // E is inside the AABB.
336 if (S->x() > right) {
337 // S is outside the AABB. Calculate an intersection point.
338 T t = (right - S->x()) / (E.x() - S->x());
339 out[nout++] = V2T(right, S->y() + t * (E.y() - S->y()));
340 }
341 out[nout++] = E;
342 }
343 else if (S->x() < right) {
344 // S is inside the AABB, E is outside the AABB.
345 T t = (right - S->x()) / (E.x() - S->x());
346 out[nout++] = V2T(right, S->y() + t * (E.y() - S->y()));
347 }
348 S = &E;
349 }
350 assert(nout <= 8);
351 }
352 // Clip top
353 {
354 std::swap(in, out);
355 nin = nout;
356 nout = 0;
357 const V2T *S = in + nin - 1;
358 T top = aabb.max_corner().y();
359 for (int i = 0; i < nin; ++i) {
360 const V2T &E = in[i];
361 if (E.y() == top) {
362 out[nout++] = E;
363 }
364 else if (E.y() < top) {
365 // E is inside the AABB.
366 if (S->y() > top) {
367 // S is outside the AABB. Calculate an intersection point.
368 T t = (top - S->y()) / (E.y() - S->y());
369 out[nout++] = V2T(S->x() + t * (E.x() - S->x()), top);
370 }
371 out[nout++] = E;
372 }
373 else if (S->y() < top) {
374 // S is inside the AABB, E is outside the AABB.
375 T t = (top - S->y()) / (E.y() - S->y());
376 out[nout++] = V2T(S->x() + t * (E.x() - S->x()), top);
377 }
378 S = &E;
379 }
380 assert(nout <= 8);
381 }
382
383 assert(nout <= 8);
384 return nout;
385 }
386
387 // Calculate area of the circle x AABB intersection.
388 // The calculation is approximate in a way, that the circular segment
389 // intersecting the cell is approximated by its chord (a linear segment).
390 template<typename T>
391 int clip_circle_by_AABB(
392 const boost::geometry::model::d2::point_xy<T> &center,
393 const T radius,
394 const boost::geometry::model::box<boost::geometry::model::d2::point_xy<T> > &aabb,
395 boost::geometry::model::d2::point_xy<T> result[8],
396 bool result_arc[8])
397 {
398 typedef typename V2<T>::Type V2T;
399
400 V2T rect[4] = {
401 aabb.min_corner(),
402 V2T(aabb.max_corner().x(), aabb.min_corner().y()),
403 aabb.max_corner(),
404 V2T(aabb.min_corner().x(), aabb.max_corner().y())
405 };
406
407 int bits_corners = 0;
408 T r2 = sqr(radius);
409 for (int i = 0; i < 4; ++ i, bits_corners <<= 1)
410 bits_corners |= dot(rect[i] - center) >= r2;
411 bits_corners >>= 1;
412
413 if (bits_corners == 0) {
414 // all inside
415 memcpy(result, rect, sizeof(rect));
416 memset(result_arc, true, 4);
417 return 4;
418 }
419
420 if (bits_corners == 0x0f)
421 // all outside
422 return 0;
423
424 // Some corners are outside, some are inside. Trim the rectangle.
425 int n = 0;
426 for (int i = 0; i < 4; ++ i) {
427 bool inside = (bits_corners & 0x08) == 0;
428 bits_corners <<= 1;
429 V2T chordal_points[2];
430 int n_chordal_points = line_circle_intersection(rect[i], rect[(i + 1)%4], center, radius, chordal_points);
431 if (n_chordal_points == 2) {
432 result_arc[n] = true;
433 result[n ++] = chordal_points[0];
434 result_arc[n] = true;
435 result[n ++] = chordal_points[1];
436 } else {
437 if (inside) {
438 result_arc[n] = false;
439 result[n ++] = rect[i];
440 }
441 if (n_chordal_points == 1) {
442 result_arc[n] = false;
443 result[n ++] = chordal_points[0];
444 }
445 }
446 }
447 return n;
448 }
449 /*
450 // Calculate area of the circle x AABB intersection.
451 // The calculation is approximate in a way, that the circular segment
452 // intersecting the cell is approximated by its chord (a linear segment).
453 template<typename T>
454 T circle_AABB_intersection_area(
455 const boost::geometry::model::d2::point_xy<T> &center,
456 const T radius,
457 const boost::geometry::model::box<boost::geometry::model::d2::point_xy<T> > &aabb)
458 {
459 typedef typename V2<T>::Type V2T;
460 typedef typename boost::geometry::model::box<V2T> B2T;
461 T radius2 = radius * radius;
462
463 bool intersectionLeft = sqr(aabb.min_corner().x() - center.x()) < radius2;
464 bool intersectionRight = sqr(aabb.max_corner().x() - center.x()) < radius2;
465 bool intersectionBottom = sqr(aabb.min_corner().y() - center.y()) < radius2;
466 bool intersectionTop = sqr(aabb.max_corner().y() - center.y()) < radius2;
467
468 if (! (intersectionLeft || intersectionRight || intersectionTop || intersectionBottom))
469 // No intersection between the aabb and the center.
470 return boost::geometry::point_in_box<V2T, B2T>()::apply(center, aabb) ? 1.f : 0.f;
471
472
473
474 V2T rect[4] = {
475 aabb.min_corner(),
476 V2T(aabb.max_corner().x(), aabb.min_corner().y()),
477 aabb.max_corner(),
478 V2T(aabb.min_corner().x(), aabb.max_corner().y())
479 };
480
481 int bits_corners = 0;
482 T r2 = sqr(radius);
483 for (int i = 0; i < 4; ++ i, bits_corners <<= 1)
484 bits_corners |= dot(rect[i] - center) >= r2;
485 bits_corners >>= 1;
486
487 if (bits_corners == 0) {
488 // all inside
489 memcpy(result, rect, sizeof(rect));
490 memset(result_arc, true, 4);
491 return 4;
492 }
493
494 if (bits_corners == 0x0f)
495 // all outside
496 return 0;
497
498 // Some corners are outside, some are inside. Trim the rectangle.
499 int n = 0;
500 for (int i = 0; i < 4; ++ i) {
501 bool inside = (bits_corners & 0x08) == 0;
502 bits_corners <<= 1;
503 V2T chordal_points[2];
504 int n_chordal_points = line_circle_intersection(rect[i], rect[(i + 1)%4], center, radius, chordal_points);
505 if (n_chordal_points == 2) {
506 result_arc[n] = true;
507 result[n ++] = chordal_points[0];
508 result_arc[n] = true;
509 result[n ++] = chordal_points[1];
510 } else {
511 if (inside) {
512 result_arc[n] = false;
513 result[n ++] = rect[i];
514 }
515 if (n_chordal_points == 1) {
516 result_arc[n] = false;
517 result[n ++] = chordal_points[0];
518 }
519 }
520 }
521 return n;
522 }
523 */
524
525 template<typename T>
526 inline T polyArea(const boost::geometry::model::d2::point_xy<T> *poly, int n)
527 {
528 T area = T(0);
529 for (int i = 1; i + 1 < n; ++i)
530 area += cross(poly[i] - poly[0], poly[i + 1] - poly[0]);
531 return T(0.5) * area;
532 }
533
534 template<typename T>
535 boost::geometry::model::d2::point_xy<T> polyCentroid(const boost::geometry::model::d2::point_xy<T> *poly, int n)
536 {
537 boost::geometry::model::d2::point_xy<T> centroid(T(0), T(0));
538 for (int i = 0; i < n; ++i)
539 centroid += poly[i];
540 return (n == 0) ? centroid : (centroid / float(n));
541 }
542
543 void gcode_paint_layer(
544 const std::vector<V2f> &polyline,
545 float width,
546 float thickness,
547 A2f &acc)
548 {
549 int nc = acc.shape()[1];
550 int nr = acc.shape()[0];
551 // printf("gcode_paint_layer %d,%d\n", nc, nr);
552 for (size_t iLine = 1; iLine != polyline.size(); ++iLine) {
553 const V2f &p1 = polyline[iLine - 1];
554 const V2f &p2 = polyline[iLine];
555 // printf("p1, p2: %f,%f %f,%f\n", p1.x(), p1.y(), p2.x(), p2.y());
556 const V2f dir = p2 - p1;
557 V2f vperp(- dir.y(), dir.x());
558 vperp = vperp * 0.5f * width / l2(vperp);
559 // Rectangle of the extrusion.
560 V2f rect[4] = { p1 + vperp, p1 - vperp, p2 - vperp, p2 + vperp };
561 // Bounding box of the extrusion.
562 B2f bboxLine(rect[0], rect[0]);
563 boost::geometry::expand(bboxLine, rect[1]);
564 boost::geometry::expand(bboxLine, rect[2]);
565 boost::geometry::expand(bboxLine, rect[3]);
566 B2i bboxLinei(
567 V2i(clamp(0, nc-1, int(floor(bboxLine.min_corner().x()))),
568 clamp(0, nr-1, int(floor(bboxLine.min_corner().y())))),
569 V2i(clamp(0, nc-1, int(ceil (bboxLine.max_corner().x()))),
570 clamp(0, nr-1, int(ceil (bboxLine.max_corner().y())))));
571 // printf("bboxLinei %d,%d %d,%d\n", bboxLinei.min_corner().x(), bboxLinei.min_corner().y(), bboxLinei.max_corner().x(), bboxLinei.max_corner().y());
572 #ifdef _DEBUG
573 float area = polyArea(rect, 4);
574 assert(area > 0.f);
575 #endif /* _DEBUG */
576 for (int j = bboxLinei.min_corner().y(); j + 1 < bboxLinei.max_corner().y(); ++ j) {
577 for (int i = bboxLinei.min_corner().x(); i + 1 < bboxLinei.max_corner().x(); ++i) {
578 V2f rect2[8];
579 memcpy(rect2, rect, sizeof(rect));
580 int n = clip_rect_by_AABB(rect2, B2f(V2f(float(i), float(j)), V2f(float(i + 1), float(j + 1))));
581 float area = polyArea(rect2, n);
582 assert(area >= 0.f && area <= 1.000001f);
583 acc[j][i] += area * thickness;
584 }
585 }
586 }
587 }
588
589 void gcode_paint_bitmap(
590 const std::vector<V2f> &polyline,
591 float width,
592 A2uc &bitmap,
593 float scale)
594 {
595 int nc = bitmap.shape()[1];
596 int nr = bitmap.shape()[0];
597 float r2 = width * width * 0.25f;
598 // printf("gcode_paint_layer %d,%d\n", nc, nr);
599 for (size_t iLine = 1; iLine != polyline.size(); ++iLine) {
600 const V2f &p1 = polyline[iLine - 1];
601 const V2f &p2 = polyline[iLine];
602 // printf("p1, p2: %f,%f %f,%f\n", p1.x(), p1.y(), p2.x(), p2.y());
603 V2f dir = p2 - p1;
604 dir = dir * 0.5f * width / l2(dir);
605 V2f vperp(- dir.y(), dir.x());
606 // Rectangle of the extrusion.
607 V2f rect[4] = { (p1 + vperp - dir) * scale, (p1 - vperp - dir) * scale, (p2 - vperp + dir) * scale, (p2 + vperp + dir) * scale };
608 // Bounding box of the extrusion.
609 B2f bboxLine(rect[0], rect[0]);
610 boost::geometry::expand(bboxLine, rect[1]);
611 boost::geometry::expand(bboxLine, rect[2]);
612 boost::geometry::expand(bboxLine, rect[3]);
613 B2i bboxLinei(
614 V2i(clamp(0, nc-1, int(floor(bboxLine.min_corner().x()))),
615 clamp(0, nr-1, int(floor(bboxLine.min_corner().y())))),
616 V2i(clamp(0, nc-1, int(ceil (bboxLine.max_corner().x()))),
617 clamp(0, nr-1, int(ceil (bboxLine.max_corner().y())))));
618 // printf("bboxLinei %d,%d %d,%d\n", bboxLinei.min_corner().x(), bboxLinei.min_corner().y(), bboxLinei.max_corner().x(), bboxLinei.max_corner().y());
619 for (int j = bboxLinei.min_corner().y(); j + 1 < bboxLinei.max_corner().y(); ++ j) {
620 for (int i = bboxLinei.min_corner().x(); i + 1 < bboxLinei.max_corner().x(); ++i) {
621 float d2 = dist2_to_line(p1, p2, V2f(float(i) + 0.5f, float(j) + 0.5f) / scale);
622 if (d2 < r2)
623 bitmap[j][i] = 1;
624 }
625 }
626 }
627 }
628
629 struct Cell
630 {
631 // Cell index in the grid.
632 V2i idx;
633 // Total volume of the material stored in this cell.
634 float volume;
635 // Area covered inside this cell, <0,1>.
636 float area;
637 // Fraction of the area covered by the print head. <0,1>
638 float fraction_covered;
639 // Height of the covered part in excess to the expected layer height.
640 float excess_height;
641
642 bool operator<(const Cell &c2) const {
643 return this->excess_height < c2.excess_height;
644 }
645 };
646
647 struct ExtrusionPoint {
648 V2f center;
649 float radius;
650 float height;
651 };
652
653 typedef std::vector<ExtrusionPoint> ExtrusionPoints;
654
655 void gcode_spread_points(
656 A2f &acc,
657 const A2f &mask,
658 const ExtrusionPoints &points,
659 Slic3r::ExtrusionSimulationType simulationType)
660 {
661 int nc = acc.shape()[1];
662 int nr = acc.shape()[0];
663
664 // Maximum radius of the spreading points, to allocate a large enough cell array.
665 float rmax = 0.f;
666 for (ExtrusionPoints::const_iterator it = points.begin(); it != points.end(); ++ it)
667 rmax = std::max(rmax, it->radius);
668 size_t n_rows_max = size_t(ceil(rmax * 2.f + 2.f));
669 size_t n_cells_max = sqr(n_rows_max);
670 std::vector<std::pair<float, float> > spans;
671 std::vector<Cell> cells(n_cells_max, Cell());
672 std::vector<float> areas_sum(n_cells_max, 0.f);
673
674 for (ExtrusionPoints::const_iterator it = points.begin(); it != points.end(); ++ it) {
675 const V2f &center = it->center;
676 const float radius = it->radius;
677 const float radius2 = radius * radius;
678 const float height_target = it->height;
679 B2f bbox(center - V2f(radius, radius), center + V2f(radius, radius));
680 B2i bboxi(
681 V2i(clamp(0, nc-1, int(floor(bbox.min_corner().x()))),
682 clamp(0, nr-1, int(floor(bbox.min_corner().y())))),
683 V2i(clamp(0, nc-1, int(ceil (bbox.max_corner().x()))),
684 clamp(0, nr-1, int(ceil (bbox.max_corner().y())))));
685 /*
686 // Fill in the spans, at which the circle intersects the rows.
687 int row_first = bboxi.min_corner().y();
688 int row_last = bboxi.max_corner().y();
689 for (; row_first <= row_last; ++ row_first) {
690 float y = float(j) - center.y();
691 float discr = radius2 - sqr(y);
692 if (discr > 0) {
693 // Circle intersects the row j at 2 points.
694 float d = sqrt(discr);
695 spans.push_back(std.pair<float, float>(center.x() - d, center.x() + d)));
696 break;
697 }
698 }
699 for (int j = row_first + 1; j <= row_last; ++ j) {
700 float y = float(j) - center.y();
701 float discr = radius2 - sqr(y);
702 if (discr > 0) {
703 // Circle intersects the row j at 2 points.
704 float d = sqrt(discr);
705 spans.push_back(std.pair<float, float>(center.x() - d, center.x() + d)));
706 } else {
707 row_last = j - 1;
708 break;
709 }
710 }
711 */
712 float area_total = 0;
713 float volume_total = 0;
714 float volume_excess = 0;
715 float volume_deficit = 0;
716 size_t n_cells = 0;
717 float area_circle_total = 0;
718 #if 0
719 // The intermediate lines.
720 for (int j = row_first; j < row_last; ++ j) {
721 const std::pair<float, float> &span1 = spans[j];
722 const std::pair<float, float> &span2 = spans[j+1];
723 float l1 = span1.first;
724 float l2 = span2.first;
725 float r1 = span1.second;
726 float r2 = span2.second;
727 if (l2 < l1)
728 std::swap(l1, l2);
729 if (r1 > r2)
730 std::swap(r1, r2);
731 int il1 = int(floor(l1));
732 int il2 = int(ceil(l2));
733 int ir1 = int(floor(r1));
734 int ir2 = int(floor(r2));
735 assert(il2 <= ir1);
736 for (int i = il1; i < il2; ++ i) {
737 Cell &cell = cells[n_cells ++];
738 cell.idx.x(i);
739 cell.idx.y(j);
740 cell.area = area;
741 }
742 for (int i = il2; i < ir1; ++ i) {
743 Cell &cell = cells[n_cells ++];
744 cell.idx.x(i);
745 cell.idx.y(j);
746 cell.area = 1.f;
747 }
748 for (int i = ir1; i < ir2; ++ i) {
749 Cell &cell = cells[n_cells ++];
750 cell.idx.x(i);
751 cell.idx.y(j);
752 cell.area = area;
753 }
754 }
755 #else
756 for (int j = bboxi.min_corner().y(); j < bboxi.max_corner().y(); ++ j) {
757 for (int i = bboxi.min_corner().x(); i < bboxi.max_corner().x(); ++i) {
758 B2f bb(V2f(float(i), float(j)), V2f(float(i + 1), float(j + 1)));
759 V2f poly[8];
760 bool poly_arc[8];
761 int n = clip_circle_by_AABB(center, radius, bb, poly, poly_arc);
762 float area = polyArea(poly, n);
763 assert(area >= 0.f && area <= 1.000001f);
764 if (area == 0.f)
765 continue;
766 Cell &cell = cells[n_cells ++];
767 cell.idx.x(i);
768 cell.idx.y(j);
769 cell.volume = acc[j][i];
770 cell.area = mask[j][i];
771 assert(cell.area >= 0.f && cell.area <= 1.000001f);
772 area_circle_total += area;
773 if (cell.area < area)
774 cell.area = area;
775 cell.fraction_covered = clamp(0.f, 1.f, (cell.area > 0) ? (area / cell.area) : 0);
776 if (cell.fraction_covered == 0) {
777 -- n_cells;
778 continue;
779 }
780 float cell_height = cell.volume / cell.area;
781 cell.excess_height = cell_height - height_target;
782 if (cell.excess_height > 0.f)
783 volume_excess += cell.excess_height * cell.area * cell.fraction_covered;
784 else
785 volume_deficit -= cell.excess_height * cell.area * cell.fraction_covered;
786 volume_total += cell.volume * cell.fraction_covered;
787 area_total += cell.area * cell.fraction_covered;
788 }
789 }
790 #endif
791 float area_circle_total2 = float(M_PI) * sqr(radius);
792 float area_err = fabs(area_circle_total2 - area_circle_total) / area_circle_total2;
793 // printf("area_circle_total: %f, %f, %f\n", area_circle_total, area_circle_total2, area_err);
794 float volume_full = float(M_PI) * sqr(radius) * height_target;
795 // if (true) {
796 // printf("volume_total: %f, volume_full: %f, fill factor: %f\n", volume_total, volume_full, 100.f - 100.f * volume_total / volume_full);
797 // printf("volume_full: %f, volume_excess+deficit: %f, volume_excess: %f, volume_deficit: %f\n", volume_full, volume_excess+volume_deficit, volume_excess, volume_deficit);
798 if (simulationType == Slic3r::ExtrusionSimulationSpreadFull || volume_total <= volume_full) {
799 // The volume under the circle is spreaded fully.
800 float height_avg = volume_total / area_total;
801 for (size_t i = 0; i < n_cells; ++ i) {
802 const Cell &cell = cells[i];
803 acc[cell.idx.y()][cell.idx.x()] = (1.f - cell.fraction_covered) * cell.volume + cell.fraction_covered * cell.area * height_avg;
804 }
805 } else if (simulationType == ExtrusionSimulationSpreadExcess) {
806 // The volume under the circle does not fit.
807 // 1) Fill the underfilled cells and remove them from the list.
808 float volume_borrowed_total = 0.;
809 for (size_t i = 0; i < n_cells;) {
810 Cell &cell = cells[i];
811 if (cell.excess_height <= 0) {
812 // Fill in the part of the cell below the circle.
813 float volume_borrowed = - cell.excess_height * cell.area * cell.fraction_covered;
814 assert(volume_borrowed >= 0.f);
815 acc[cell.idx.y()][cell.idx.x()] = cell.volume + volume_borrowed;
816 volume_borrowed_total += volume_borrowed;
817 cell = cells[-- n_cells];
818 } else
819 ++ i;
820 }
821 // 2) Sort the remaining cells by their excess height.
822 std::sort(cells.begin(), cells.begin() + n_cells);
823 // 3) Prefix sum the areas per excess height.
824 // The excess height is discrete with the number of excess cells.
825 areas_sum[n_cells-1] = cells[n_cells-1].area * cells[n_cells-1].fraction_covered;
826 for (int i = n_cells - 2; i >= 0; -- i) {
827 const Cell &cell = cells[i];
828 areas_sum[i] = areas_sum[i + 1] + cell.area * cell.fraction_covered;
829 }
830 // 4) Find the excess height, where the volume_excess is over the volume_borrowed_total.
831 float volume_current = 0.f;
832 float excess_height_prev = 0.f;
833 size_t i_top = n_cells;
834 for (size_t i = 0; i < n_cells; ++ i) {
835 const Cell &cell = cells[i];
836 volume_current += (cell.excess_height - excess_height_prev) * areas_sum[i];
837 excess_height_prev = cell.excess_height;
838 if (volume_current > volume_borrowed_total) {
839 i_top = i;
840 break;
841 }
842 }
843 // 5) Remove material from the cells with deficit.
844 // First remove all the excess material from the cells, where the deficit is low.
845 for (size_t i = 0; i < i_top; ++ i) {
846 const Cell &cell = cells[i];
847 float volume_removed = cell.excess_height * cell.area * cell.fraction_covered;
848 acc[cell.idx.y()][cell.idx.x()] = cell.volume - volume_removed;
849 volume_borrowed_total -= volume_removed;
850 }
851 // Second remove some excess material from the cells, where the deficit is high.
852 if (i_top < n_cells) {
853 float height_diff = volume_borrowed_total / areas_sum[i_top];
854 for (size_t i = i_top; i < n_cells; ++ i) {
855 const Cell &cell = cells[i];
856 acc[cell.idx.y()][cell.idx.x()] = cell.volume - height_diff * cell.area * cell.fraction_covered;
857 }
858 }
859 }
860 }
861 }
862
863 inline std::vector<V3uc> CreatePowerColorGradient24bit()
864 {
865 int i;
866 int iColor = 0;
867 std::vector<V3uc> out(6 * 255 + 1, V3uc(0, 0, 0));
868 for (i = 0; i < 256; ++i)
869 out[iColor++] = V3uc(0, 0, i);
870 for (i = 1; i < 256; ++i)
871 out[iColor++] = V3uc(0, i, 255);
872 for (i = 1; i < 256; ++i)
873 out[iColor++] = V3uc(0, 255, 256 - i);
874 for (i = 1; i < 256; ++i)
875 out[iColor++] = V3uc(i, 255, 0);
876 for (i = 1; i < 256; ++i)
877 out[iColor++] = V3uc(255, 256 - i, 0);
878 for (i = 1; i < 256; ++i)
879 out[iColor++] = V3uc(255, 0, i);
880 return out;
881 }
882
883 namespace Slic3r {
884
885 class ExtrusionSimulatorImpl {
886 public:
887 std::vector<unsigned char> image_data;
888 A2f accumulator;
889 A2uc bitmap;
890 unsigned int bitmap_oversampled;
891 ExtrusionPoints extrusion_points;
892 // RGB gradient to color map the fullness of an accumulator bucket into the output image.
893 std::vector<boost::geometry::model::point<unsigned char, 3, boost::geometry::cs::cartesian> > color_gradient;
894 };
895
896 ExtrusionSimulator::ExtrusionSimulator() :
897 pimpl(new ExtrusionSimulatorImpl)
898 {
899 pimpl->color_gradient = CreatePowerColorGradient24bit();
900 pimpl->bitmap_oversampled = 4;
901 }
902
903 ExtrusionSimulator::~ExtrusionSimulator()
904 {
905 delete pimpl;
906 pimpl = NULL;
907 }
908
909 void ExtrusionSimulator::set_image_size(const Point &image_size)
910 {
911 // printf("ExtrusionSimulator::set_image_size()\n");
912 if (this->image_size.x == image_size.x &&
913 this->image_size.y == image_size.y)
914 return;
915
916 // printf("Setting image size: %d, %d\n", image_size.x, image_size.y);
917 this->image_size = image_size;
918 // Allocate the image data in an RGBA format.
919 // printf("Allocating image data, size %d\n", image_size.x * image_size.y * 4);
920 pimpl->image_data.assign(image_size.x * image_size.y * 4, 0);
921 // printf("Allocating image data, allocated\n");
922
923 //FIXME fill the image with red vertical lines.
924 for (size_t r = 0; r < image_size.y; ++ r) {
925 for (size_t c = 0; c < image_size.x; c += 2) {
926 // Color red
927 pimpl->image_data[r * image_size.x * 4 + c * 4] = 255;
928 // Opacity full
929 pimpl->image_data[r * image_size.x * 4 + c * 4 + 3] = 255;
930 }
931 }
932 // printf("Allocating image data, set\n");
933 }
934
935 void ExtrusionSimulator::set_viewport(const BoundingBox &viewport)
936 {
937 // printf("ExtrusionSimulator::set_viewport(%d, %d, %d, %d)\n", viewport.min.x, viewport.min.y, viewport.max.x, viewport.max.y);
938 if (this->viewport != viewport) {
939 this->viewport = viewport;
940 Point sz = viewport.size();
941 pimpl->accumulator.resize(boost::extents[sz.y][sz.x]);
942 pimpl->bitmap.resize(boost::extents[sz.y*pimpl->bitmap_oversampled][sz.x*pimpl->bitmap_oversampled]);
943 // printf("Accumulator size: %d, %d\n", sz.y, sz.x);
944 }
945 }
946
947 void ExtrusionSimulator::set_bounding_box(const BoundingBox &bbox)
948 {
949 this->bbox = bbox;
950 }
951
952 const void* ExtrusionSimulator::image_ptr() const
953 {
954 return (pimpl->image_data.empty()) ? NULL : (void*)&pimpl->image_data.front();
955 }
956
957 void ExtrusionSimulator::reset_accumulator()
958 {
959 // printf("ExtrusionSimulator::reset_accumulator()\n");
960 Point sz = viewport.size();
961 // printf("Reset accumulator, Accumulator size: %d, %d\n", sz.y, sz.x);
962 memset(&pimpl->accumulator[0][0], 0, sizeof(float) * sz.x * sz.y);
963 memset(&pimpl->bitmap[0][0], 0, sz.x * sz.y * pimpl->bitmap_oversampled * pimpl->bitmap_oversampled);
964 pimpl->extrusion_points.clear();
965 // printf("Reset accumulator, done.\n");
966 }
967
968 void ExtrusionSimulator::extrude_to_accumulator(const ExtrusionPath &path, const Point &shift, ExtrusionSimulationType simulationType)
969 {
970 // printf("Extruding a path. Nr points: %d, width: %f, height: %f\r\n", path.polyline.points.size(), path.width, path.height);
971 // Convert the path to V2f points, shift and scale them to the viewport.
972 std::vector<V2f> polyline;
973 polyline.reserve(path.polyline.points.size());
974 float scalex = float(viewport.size().x) / float(bbox.size().x);
975 float scaley = float(viewport.size().y) / float(bbox.size().y);
976 float w = scale_(path.width) * scalex;
977 float h = scale_(path.height) * scalex;
978 w = scale_(path.mm3_per_mm / path.height) * scalex;
979 // printf("scalex: %f, scaley: %f\n", scalex, scaley);
980 // printf("bbox: %d,%d %d,%d\n", bbox.min.x, bbox.min.y, bbox.max.x, bbox.max.y);
981 for (Points::const_iterator it = path.polyline.points.begin(); it != path.polyline.points.end(); ++ it) {
982 // printf("point %d,%d\n", it->x+shift.x, it->y+shift.y);
983 ExtrusionPoint ept;
984 ept.center = V2f(float(it->x+shift.x-bbox.min.x) * scalex, float(it->y+shift.y-bbox.min.y) * scaley);
985 ept.radius = w/2.f;
986 ept.height = 0.5f;
987 polyline.push_back(ept.center);
988 pimpl->extrusion_points.push_back(ept);
989 }
990 // Extrude the polyline into an accumulator.
991 // printf("width scaled: %f, height scaled: %f\n", w, h);
992 gcode_paint_layer(polyline, w, 0.5f, pimpl->accumulator);
993
994 if (simulationType > ExtrusionSimulationDontSpread)
995 gcode_paint_bitmap(polyline, w, pimpl->bitmap, pimpl->bitmap_oversampled);
996 // double path.mm3_per_mm; // mm^3 of plastic per mm of linear head motion
997 // float path.width;
998 // float path.height;
999 }
1000
1001 void ExtrusionSimulator::evaluate_accumulator(ExtrusionSimulationType simulationType)
1002 {
1003 // printf("ExtrusionSimulator::evaluate_accumulator()\n");
1004 Point sz = viewport.size();
1005
1006 if (simulationType > ExtrusionSimulationDontSpread) {
1007 // Average the cells of a bitmap into a lower resolution floating point mask.
1008 A2f mask(boost::extents[sz.y][sz.x]);
1009 for (int r = 0; r < sz.y; ++r) {
1010 for (int c = 0; c < sz.x; ++c) {
1011 float p = 0;
1012 for (int j = 0; j < pimpl->bitmap_oversampled; ++ j) {
1013 for (int i = 0; i < pimpl->bitmap_oversampled; ++ i) {
1014 if (pimpl->bitmap[r * pimpl->bitmap_oversampled + j][c * pimpl->bitmap_oversampled + i])
1015 p += 1.f;
1016 }
1017 }
1018 p /= float(pimpl->bitmap_oversampled * pimpl->bitmap_oversampled * 2);
1019 mask[r][c] = p;
1020 }
1021 }
1022
1023 // Spread the excess of the material.
1024 gcode_spread_points(pimpl->accumulator, mask, pimpl->extrusion_points, simulationType);
1025 }
1026
1027 // Color map the accumulator.
1028 for (int r = 0; r < sz.y; ++r) {
1029 unsigned char *ptr = &pimpl->image_data[(image_size.x * (viewport.min.y + r) + viewport.min.x) * 4];
1030 for (int c = 0; c < sz.x; ++c) {
1031 #if 1
1032 float p = pimpl->accumulator[r][c];
1033 #else
1034 float p = mask[r][c];
1035 #endif
1036 int idx = int(floor(p * float(pimpl->color_gradient.size()) + 0.5f));
1037 V3uc clr = pimpl->color_gradient[clamp(0, int(pimpl->color_gradient.size()-1), idx)];
1038 *ptr ++ = clr.get<0>();
1039 *ptr ++ = clr.get<1>();
1040 *ptr ++ = clr.get<2>();
1041 *ptr ++ = (idx == 0) ? 0 : 255;
1042 }
1043 }
1044 }
1045
1046 } // namespace Slic3r
0 #ifndef slic3r_ExtrusionSimulator_hpp_
1 #define slic3r_ExtrusionSimulator_hpp_
2
3 #include "libslic3r.h"
4 #include "ExtrusionEntity.hpp"
5 #include "BoundingBox.hpp"
6
7 namespace Slic3r {
8
9 enum ExtrusionSimulationType
10 {
11 ExtrusionSimulationSimple,
12 ExtrusionSimulationDontSpread,
13 ExtrisopmSimulationSpreadNotOverfilled,
14 ExtrusionSimulationSpreadFull,
15 ExtrusionSimulationSpreadExcess,
16 };
17
18 // An opaque class, to keep the boost stuff away from the header.
19 class ExtrusionSimulatorImpl;
20
21 class ExtrusionSimulator
22 {
23 public:
24 ExtrusionSimulator();
25 ~ExtrusionSimulator();
26
27 // Size of the image, that will be returned by image_ptr().
28 // The image may be bigger than the viewport as many graphics drivers
29 // expect the size of a texture to be rounded to a power of two.
30 void set_image_size(const Point &image_size);
31 // Which part of the image shall be rendered to?
32 void set_viewport(const BoundingBox &viewport);
33 // Shift and scale of the rendered extrusion paths into the viewport.
34 void set_bounding_box(const BoundingBox &bbox);
35
36 // Reset the extrusion accumulator to zero for all buckets.
37 void reset_accumulator();
38 // Paint a thick path into an extrusion buffer.
39 // A simple implementation is provided now, splatting a rectangular extrusion for each linear segment.
40 // In the future, spreading and suqashing of a material will be simulated.
41 void extrude_to_accumulator(const ExtrusionPath &path, const Point &shift, ExtrusionSimulationType simulationType);
42 // Evaluate the content of the accumulator and paint it into the viewport.
43 // After this call the image_ptr() call will return a valid image.
44 void evaluate_accumulator(ExtrusionSimulationType simulationType);
45 // An RGBA image of image_size, to be loaded into a GPU texture.
46 const void* image_ptr() const;
47
48 private:
49 Point image_size;
50 BoundingBox viewport;
51 BoundingBox bbox;
52
53 ExtrusionSimulatorImpl *pimpl;
54 };
55
56 }
57
58 #endif /* slic3r_ExtrusionSimulator_hpp_ */
0 #include <assert.h>
1 #include <stdio.h>
2 #include <memory>
3
4 #include "../ClipperUtils.hpp"
5 #include "../Geometry.hpp"
6 #include "../Layer.hpp"
7 #include "../Print.hpp"
8 #include "../PrintConfig.hpp"
9 #include "../Surface.hpp"
10
11 #include "FillBase.hpp"
12
13 namespace Slic3r {
14
15 struct SurfaceGroupAttrib
16 {
17 SurfaceGroupAttrib() : is_solid(false), fw(0.f), pattern(-1) {}
18 bool operator==(const SurfaceGroupAttrib &other) const
19 { return is_solid == other.is_solid && fw == other.fw && pattern == other.pattern; }
20 bool is_solid;
21 float fw;
22 // pattern is of type InfillPattern, -1 for an unset pattern.
23 int pattern;
24 };
25
26 // Generate infills for Slic3r::Layer::Region.
27 // The Slic3r::Layer::Region at this point of time may contain
28 // surfaces of various types (internal/bridge/top/bottom/solid).
29 // The infills are generated on the groups of surfaces with a compatible type.
30 // Returns an array of Slic3r::ExtrusionPath::Collection objects containing the infills generaed now
31 // and the thin fills generated by generate_perimeters().
32 void make_fill(LayerRegion &layerm, ExtrusionEntityCollection &out)
33 {
34 // Slic3r::debugf "Filling layer %d:\n", $layerm->layer->id;
35
36 double fill_density = layerm.region()->config.fill_density;
37 Flow infill_flow = layerm.flow(frInfill);
38 Flow solid_infill_flow = layerm.flow(frSolidInfill);
39 Flow top_solid_infill_flow = layerm.flow(frTopSolidInfill);
40
41 Surfaces surfaces;
42
43 // merge adjacent surfaces
44 // in case of bridge surfaces, the ones with defined angle will be attached to the ones
45 // without any angle (shouldn't this logic be moved to process_external_surfaces()?)
46 {
47 Polygons polygons_bridged;
48 polygons_bridged.reserve(layerm.fill_surfaces.surfaces.size());
49 for (Surfaces::iterator it = layerm.fill_surfaces.surfaces.begin(); it != layerm.fill_surfaces.surfaces.end(); ++ it)
50 if (it->bridge_angle >= 0)
51 polygons_append(polygons_bridged, *it);
52
53 // group surfaces by distinct properties (equal surface_type, thickness, thickness_layers, bridge_angle)
54 // group is of type Slic3r::SurfaceCollection
55 //FIXME: Use some smart heuristics to merge similar surfaces to eliminate tiny regions.
56 std::vector<SurfacesPtr> groups;
57 layerm.fill_surfaces.group(&groups);
58
59 // merge compatible groups (we can generate continuous infill for them)
60 {
61 // cache flow widths and patterns used for all solid groups
62 // (we'll use them for comparing compatible groups)
63 std::vector<SurfaceGroupAttrib> group_attrib(groups.size());
64 for (size_t i = 0; i < groups.size(); ++ i) {
65 // we can only merge solid non-bridge surfaces, so discard
66 // non-solid surfaces
67 const Surface &surface = *groups[i].front();
68 if (surface.is_solid() && (!surface.is_bridge() || layerm.layer()->id() == 0)) {
69 group_attrib[i].is_solid = true;
70 group_attrib[i].fw = (surface.surface_type == stTop) ? top_solid_infill_flow.width : solid_infill_flow.width;
71 group_attrib[i].pattern = surface.is_external() ? layerm.region()->config.external_fill_pattern.value : ipRectilinear;
72 }
73 }
74 // Loop through solid groups, find compatible groups and append them to this one.
75 for (size_t i = 0; i < groups.size(); ++ i) {
76 if (! group_attrib[i].is_solid)
77 continue;
78 for (size_t j = i + 1; j < groups.size();) {
79 if (group_attrib[i] == group_attrib[j]) {
80 // groups are compatible, merge them
81 groups[i].insert(groups[i].end(), groups[j].begin(), groups[j].end());
82 groups.erase(groups.begin() + j);
83 group_attrib.erase(group_attrib.begin() + j);
84 } else
85 ++ j;
86 }
87 }
88 }
89
90 // Give priority to bridges. Process the bridges in the first round, the rest of the surfaces in the 2nd round.
91 for (size_t round = 0; round < 2; ++ round) {
92 for (std::vector<SurfacesPtr>::iterator it_group = groups.begin(); it_group != groups.end(); ++ it_group) {
93 const SurfacesPtr &group = *it_group;
94 bool is_bridge = group.front()->bridge_angle >= 0;
95 if (is_bridge != (round == 0))
96 continue;
97 // Make a union of polygons defining the infiill regions of a group, use a safety offset.
98 Polygons union_p = union_(to_polygons(*it_group), true);
99 // Subtract surfaces having a defined bridge_angle from any other, use a safety offset.
100 if (! polygons_bridged.empty() && ! is_bridge)
101 union_p = diff(union_p, polygons_bridged, true);
102 // subtract any other surface already processed
103 //FIXME Vojtech: Because the bridge surfaces came first, they are subtracted twice!
104 // Using group.front() as a template.
105 surfaces_append(surfaces, diff_ex(union_p, to_polygons(surfaces), true), *group.front());
106 }
107 }
108 }
109
110 // we need to detect any narrow surfaces that might collapse
111 // when adding spacing below
112 // such narrow surfaces are often generated in sloping walls
113 // by bridge_over_infill() and combine_infill() as a result of the
114 // subtraction of the combinable area from the layer infill area,
115 // which leaves small areas near the perimeters
116 // we are going to grow such regions by overlapping them with the void (if any)
117 // TODO: detect and investigate whether there could be narrow regions without
118 // any void neighbors
119 {
120 coord_t distance_between_surfaces = std::max(
121 std::max(infill_flow.scaled_spacing(), solid_infill_flow.scaled_spacing()),
122 top_solid_infill_flow.scaled_spacing());
123 Polygons surfaces_polygons = to_polygons(surfaces);
124 Polygons collapsed = diff(
125 surfaces_polygons,
126 offset2(surfaces_polygons, -distance_between_surfaces/2, +distance_between_surfaces/2),
127 true);
128 Polygons to_subtract;
129 to_subtract.reserve(collapsed.size() + number_polygons(surfaces));
130 for (Surfaces::const_iterator it_surface = surfaces.begin(); it_surface != surfaces.end(); ++ it_surface)
131 if (it_surface->surface_type == stInternalVoid)
132 polygons_append(to_subtract, *it_surface);
133 polygons_append(to_subtract, collapsed);
134 surfaces_append(
135 surfaces,
136 intersection_ex(
137 offset(collapsed, distance_between_surfaces),
138 to_subtract,
139 true),
140 stInternalSolid);
141 }
142
143 if (0) {
144 // require "Slic3r/SVG.pm";
145 // Slic3r::SVG::output("fill_" . $layerm->print_z . ".svg",
146 // expolygons => [ map $_->expolygon, grep !$_->is_solid, @surfaces ],
147 // red_expolygons => [ map $_->expolygon, grep $_->is_solid, @surfaces ],
148 // );
149 }
150
151 for (Surfaces::const_iterator surface_it = surfaces.begin(); surface_it != surfaces.end(); ++ surface_it) {
152 const Surface &surface = *surface_it;
153 if (surface.surface_type == stInternalVoid)
154 continue;
155 InfillPattern fill_pattern = layerm.region()->config.fill_pattern.value;
156 double density = fill_density;
157 FlowRole role = (surface.surface_type == stTop) ? frTopSolidInfill :
158 (surface.is_solid() ? frSolidInfill : frInfill);
159 bool is_bridge = layerm.layer()->id() > 0 && surface.is_bridge();
160
161 if (surface.is_solid()) {
162 density = 100.;
163 fill_pattern = (surface.is_external() && ! is_bridge) ?
164 layerm.region()->config.external_fill_pattern.value :
165 ipRectilinear;
166 } else if (density <= 0)
167 continue;
168
169 // get filler object
170 #if SLIC3R_CPPVER >= 11
171 std::unique_ptr<Fill> f = std::unique_ptr<Fill>(Fill::new_from_type(fill_pattern));
172 #else
173 std::auto_ptr<Fill> f = std::auto_ptr<Fill>(Fill::new_from_type(fill_pattern));
174 #endif
175 f->set_bounding_box(layerm.layer()->object()->bounding_box());
176
177 // calculate the actual flow we'll be using for this infill
178 coordf_t h = (surface.thickness == -1) ? layerm.layer()->height : surface.thickness;
179 Flow flow = layerm.region()->flow(
180 role,
181 h,
182 is_bridge || f->use_bridge_flow(), // bridge flow?
183 layerm.layer()->id() == 0, // first layer?
184 -1, // auto width
185 *layerm.layer()->object()
186 );
187
188 // calculate flow spacing for infill pattern generation
189 bool using_internal_flow = false;
190 if (! surface.is_solid() && ! is_bridge) {
191 // it's internal infill, so we can calculate a generic flow spacing
192 // for all layers, for avoiding the ugly effect of
193 // misaligned infill on first layer because of different extrusion width and
194 // layer height
195 Flow internal_flow = layerm.region()->flow(
196 frInfill,
197 layerm.layer()->object()->config.layer_height.value, // TODO: handle infill_every_layers?
198 false, // no bridge
199 false, // no first layer
200 -1, // auto width
201 *layerm.layer()->object()
202 );
203 f->spacing = internal_flow.spacing();
204 using_internal_flow = true;
205 } else {
206 f->spacing = flow.spacing();
207 }
208
209 double link_max_length = 0.;
210 if (! is_bridge) {
211 #if 0
212 link_max_length = layerm.region()->config.get_abs_value(surface.is_external() ? "external_fill_link_max_length" : "fill_link_max_length", flow.spacing());
213 // printf("flow spacing: %f, is_external: %d, link_max_length: %lf\n", flow.spacing(), int(surface.is_external()), link_max_length);
214 #else
215 if (density > 80.) // 80%
216 link_max_length = 3. * f->spacing;
217 #endif
218 }
219
220 f->layer_id = layerm.layer()->id();
221 f->z = layerm.layer()->print_z;
222 f->angle = Geometry::deg2rad(layerm.region()->config.fill_angle.value);
223 // Maximum length of the perimeter segment linking two infill lines.
224 f->link_max_length = scale_(link_max_length);
225 // Used by the concentric infill pattern to clip the loops to create extrusion paths.
226 f->loop_clipping = scale_(flow.nozzle_diameter) * LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER;
227 // f->layer_height = h;
228
229 // apply half spacing using this flow's own spacing and generate infill
230 FillParams params;
231 params.density = 0.01 * density;
232 // params.dont_adjust = true;
233 params.dont_adjust = false;
234 Polylines polylines = f->fill_surface(&surface, params);
235 if (polylines.empty())
236 continue;
237
238 // calculate actual flow from spacing (which might have been adjusted by the infill
239 // pattern generator)
240 if (using_internal_flow) {
241 // if we used the internal flow we're not doing a solid infill
242 // so we can safely ignore the slight variation that might have
243 // been applied to $f->flow_spacing
244 } else {
245 flow = Flow::new_from_spacing(f->spacing, flow.nozzle_diameter, h, is_bridge || f->use_bridge_flow());
246 }
247
248 // save into layer
249 {
250 ExtrusionRole role = is_bridge ? erBridgeInfill :
251 (surface.is_solid() ? ((surface.surface_type == stTop) ? erTopSolidInfill : erSolidInfill) : erInternalInfill);
252 ExtrusionEntityCollection &collection = *(new ExtrusionEntityCollection());
253 out.entities.push_back(&collection);
254 // Only concentric fills are not sorted.
255 collection.no_sort = f->no_sort();
256 for (Polylines::iterator it = polylines.begin(); it != polylines.end(); ++ it) {
257 ExtrusionPath *path = new ExtrusionPath(role, flow.mm3_per_mm(), flow.width, flow.height);
258 collection.entities.push_back(path);
259 path->polyline.points.swap(it->points);
260 }
261 }
262 }
263
264 // add thin fill regions
265 // thin_fills are of C++ Slic3r::ExtrusionEntityCollection, perl type Slic3r::ExtrusionPath::Collection
266 // Unpacks the collection, creates multiple collections per path.
267 // The path type could be ExtrusionPath, ExtrusionLoop or ExtrusionEntityCollection.
268 // Why the paths are unpacked?
269 for (ExtrusionEntitiesPtr::iterator thin_fill = layerm.thin_fills.entities.begin(); thin_fill != layerm.thin_fills.entities.end(); ++ thin_fill) {
270 ExtrusionEntityCollection &collection = *(new ExtrusionEntityCollection());
271 out.entities.push_back(&collection);
272 collection.entities.push_back((*thin_fill)->clone());
273 }
274 }
275
276 } // namespace Slic3r
0 #ifndef slic3r_Fill_hpp_
1 #define slic3r_Fill_hpp_
2
3 #include <memory.h>
4 #include <float.h>
5 #include <stdint.h>
6
7 #include "../libslic3r.h"
8 #include "../BoundingBox.hpp"
9 #include "../PrintConfig.hpp"
10
11 #include "FillBase.hpp"
12
13 namespace Slic3r {
14
15 class ExtrusionEntityCollection;
16 class LayerRegion;
17
18 // An interface class to Perl, aggregating an instance of a Fill and a FillData.
19 class Filler
20 {
21 public:
22 Filler() : fill(NULL) {}
23 ~Filler() {
24 delete fill;
25 fill = NULL;
26 }
27 Fill *fill;
28 FillParams params;
29 };
30
31 void make_fill(LayerRegion &layerm, ExtrusionEntityCollection &out);
32
33 } // namespace Slic3r
34
35 #endif // slic3r_Fill_hpp_
0 #include "../ClipperUtils.hpp"
1 #include "../PolylineCollection.hpp"
2 #include "../Surface.hpp"
3
4 #include "Fill3DHoneycomb.hpp"
5
6 namespace Slic3r {
7
8 /*
9 Creates a contiguous sequence of points at a specified height that make
10 up a horizontal slice of the edges of a space filling truncated
11 octahedron tesselation. The octahedrons are oriented so that the
12 square faces are in the horizontal plane with edges parallel to the X
13 and Y axes.
14
15 Credits: David Eccles (gringer).
16 */
17
18 // Generate an array of points that are in the same direction as the
19 // basic printing line (i.e. Y points for columns, X points for rows)
20 // Note: a negative offset only causes a change in the perpendicular
21 // direction
22 static std::vector<coordf_t> colinearPoints(const coordf_t offset, const size_t baseLocation, size_t gridLength)
23 {
24 const coordf_t offset2 = std::abs(offset / coordf_t(2.));
25 std::vector<coordf_t> points;
26 points.push_back(baseLocation - offset2);
27 for (size_t i = 0; i < gridLength; ++i) {
28 points.push_back(baseLocation + i + offset2);
29 points.push_back(baseLocation + i + 1 - offset2);
30 }
31 points.push_back(baseLocation + gridLength + offset2);
32 return points;
33 }
34
35 // Generate an array of points for the dimension that is perpendicular to
36 // the basic printing line (i.e. X points for columns, Y points for rows)
37 static std::vector<coordf_t> perpendPoints(const coordf_t offset, const size_t baseLocation, size_t gridLength)
38 {
39 coordf_t offset2 = offset / coordf_t(2.);
40 coord_t side = 2 * (baseLocation & 1) - 1;
41 std::vector<coordf_t> points;
42 points.push_back(baseLocation - offset2 * side);
43 for (size_t i = 0; i < gridLength; ++i) {
44 side = 2*((i+baseLocation) & 1) - 1;
45 points.push_back(baseLocation + offset2 * side);
46 points.push_back(baseLocation + offset2 * side);
47 }
48 points.push_back(baseLocation - offset2 * side);
49 return points;
50 }
51
52 template<typename T>
53 static inline T clamp(T low, T high, T x)
54 {
55 return std::max<T>(low, std::min<T>(high, x));
56 }
57
58 // Trims an array of points to specified rectangular limits. Point
59 // components that are outside these limits are set to the limits.
60 static inline void trim(Pointfs &pts, coordf_t minX, coordf_t minY, coordf_t maxX, coordf_t maxY)
61 {
62 for (Pointfs::iterator it = pts.begin(); it != pts.end(); ++ it) {
63 it->x = clamp(minX, maxX, it->x);
64 it->y = clamp(minY, maxY, it->y);
65 }
66 }
67
68 static inline Pointfs zip(const std::vector<coordf_t> &x, const std::vector<coordf_t> &y)
69 {
70 assert(x.size() == y.size());
71 Pointfs out;
72 out.reserve(x.size());
73 for (size_t i = 0; i < x.size(); ++ i)
74 out.push_back(Pointf(x[i], y[i]));
75 return out;
76 }
77
78 // Generate a set of curves (array of array of 2d points) that describe a
79 // horizontal slice of a truncated regular octahedron with edge length 1.
80 // curveType specifies which lines to print, 1 for vertical lines
81 // (columns), 2 for horizontal lines (rows), and 3 for both.
82 static std::vector<Pointfs> makeNormalisedGrid(coordf_t z, size_t gridWidth, size_t gridHeight, size_t curveType)
83 {
84 // offset required to create a regular octagram
85 coordf_t octagramGap = coordf_t(0.5);
86
87 // sawtooth wave function for range f($z) = [-$octagramGap .. $octagramGap]
88 coordf_t a = std::sqrt(coordf_t(2.)); // period
89 coordf_t wave = fabs(fmod(z, a) - a/2.)/a*4. - 1.;
90 coordf_t offset = wave * octagramGap;
91
92 std::vector<Pointfs> points;
93 if ((curveType & 1) != 0) {
94 for (size_t x = 0; x <= gridWidth; ++x) {
95 points.push_back(Pointfs());
96 Pointfs &newPoints = points.back();
97 newPoints = zip(
98 perpendPoints(offset, x, gridHeight),
99 colinearPoints(offset, 0, gridHeight));
100 // trim points to grid edges
101 trim(newPoints, coordf_t(0.), coordf_t(0.), coordf_t(gridWidth), coordf_t(gridHeight));
102 if (x & 1)
103 std::reverse(newPoints.begin(), newPoints.end());
104 }
105 }
106 if ((curveType & 2) != 0) {
107 for (size_t y = 0; y <= gridHeight; ++y) {
108 points.push_back(Pointfs());
109 Pointfs &newPoints = points.back();
110 newPoints = zip(
111 colinearPoints(offset, 0, gridWidth),
112 perpendPoints(offset, y, gridWidth));
113 // trim points to grid edges
114 trim(newPoints, coordf_t(0.), coordf_t(0.), coordf_t(gridWidth), coordf_t(gridHeight));
115 if (y & 1)
116 std::reverse(newPoints.begin(), newPoints.end());
117 }
118 }
119 return points;
120 }
121
122 // Generate a set of curves (array of array of 2d points) that describe a
123 // horizontal slice of a truncated regular octahedron with a specified
124 // grid square size.
125 static Polylines makeGrid(coord_t z, coord_t gridSize, size_t gridWidth, size_t gridHeight, size_t curveType)
126 {
127 coord_t scaleFactor = gridSize;
128 coordf_t normalisedZ = coordf_t(z) / coordf_t(scaleFactor);
129 std::vector<Pointfs> polylines = makeNormalisedGrid(normalisedZ, gridWidth, gridHeight, curveType);
130 Polylines result;
131 result.reserve(polylines.size());
132 for (std::vector<Pointfs>::const_iterator it_polylines = polylines.begin(); it_polylines != polylines.end(); ++ it_polylines) {
133 result.push_back(Polyline());
134 Polyline &polyline = result.back();
135 for (Pointfs::const_iterator it = it_polylines->begin(); it != it_polylines->end(); ++ it)
136 polyline.points.push_back(Point(coord_t(it->x * scaleFactor), coord_t(it->y * scaleFactor)));
137 }
138 return result;
139 }
140
141 void Fill3DHoneycomb::_fill_surface_single(
142 const FillParams &params,
143 unsigned int thickness_layers,
144 const std::pair<float, Point> &direction,
145 ExPolygon &expolygon,
146 Polylines &polylines_out)
147 {
148 // no rotation is supported for this infill pattern
149 BoundingBox bb = expolygon.contour.bounding_box();
150 coord_t distance = coord_t(scale_(this->spacing) / params.density);
151
152 // align bounding box to a multiple of our honeycomb grid module
153 // (a module is 2*$distance since one $distance half-module is
154 // growing while the other $distance half-module is shrinking)
155 bb.merge(_align_to_grid(bb.min, Point(2*distance, 2*distance)));
156
157 // generate pattern
158 Polylines polylines = makeGrid(
159 scale_(this->z),
160 distance,
161 ceil(bb.size().x / distance) + 1,
162 ceil(bb.size().y / distance) + 1,
163 ((this->layer_id/thickness_layers) % 2) + 1);
164
165 // move pattern in place
166 for (Polylines::iterator it = polylines.begin(); it != polylines.end(); ++ it)
167 it->translate(bb.min.x, bb.min.y);
168
169 // clip pattern to boundaries
170 intersection(polylines, (Polygons)expolygon, &polylines);
171
172 // connect lines
173 if (! params.dont_connect && ! polylines.empty()) { // prevent calling leftmost_point() on empty collections
174 ExPolygon expolygon_off;
175 {
176 ExPolygons expolygons_off = offset_ex(expolygon, SCALED_EPSILON);
177 if (! expolygons_off.empty()) {
178 // When expanding a polygon, the number of islands could only shrink. Therefore the offset_ex shall generate exactly one expanded island for one input island.
179 assert(expolygons_off.size() == 1);
180 std::swap(expolygon_off, expolygons_off.front());
181 }
182 }
183 Polylines chained = PolylineCollection::chained_path_from(
184 #if SLIC3R_CPPVER >= 11
185 std::move(polylines),
186 #else
187 polylines,
188 #endif
189 PolylineCollection::leftmost_point(polylines), false); // reverse allowed
190 bool first = true;
191 for (Polylines::iterator it_polyline = chained.begin(); it_polyline != chained.end(); ++ it_polyline) {
192 if (! first) {
193 // Try to connect the lines.
194 Points &pts_end = polylines_out.back().points;
195 const Point &first_point = it_polyline->points.front();
196 const Point &last_point = pts_end.back();
197 // TODO: we should also check that both points are on a fill_boundary to avoid
198 // connecting paths on the boundaries of internal regions
199 if (first_point.distance_to(last_point) <= 1.5 * distance &&
200 expolygon_off.contains(Line(last_point, first_point))) {
201 // Append the polyline.
202 pts_end.insert(pts_end.end(), it_polyline->points.begin(), it_polyline->points.end());
203 continue;
204 }
205 }
206 // The lines cannot be connected.
207 #if SLIC3R_CPPVER >= 11
208 polylines_out.push_back(std::move(*it_polyline));
209 #else
210 polylines_out.push_back(Polyline());
211 std::swap(polylines_out.back(), *it_polyline);
212 #endif
213 first = false;
214 }
215 }
216 }
217
218 } // namespace Slic3r
0 #ifndef slic3r_Fill3DHoneycomb_hpp_
1 #define slic3r_Fill3DHoneycomb_hpp_
2
3 #include <map>
4
5 #include "../libslic3r.h"
6
7 #include "FillBase.hpp"
8
9 namespace Slic3r {
10
11 class Fill3DHoneycomb : public Fill
12 {
13 public:
14 virtual ~Fill3DHoneycomb() {}
15
16 // require bridge flow since most of this pattern hangs in air
17 virtual bool use_bridge_flow() const { return true; }
18
19 protected:
20 virtual void _fill_surface_single(
21 const FillParams &params,
22 unsigned int thickness_layers,
23 const std::pair<float, Point> &direction,
24 ExPolygon &expolygon,
25 Polylines &polylines_out);
26 };
27
28 } // namespace Slic3r
29
30 #endif // slic3r_Fill3DHoneycomb_hpp_
0 #include <stdio.h>
1
2 #include "../ClipperUtils.hpp"
3 #include "../Surface.hpp"
4 #include "../PrintConfig.hpp"
5
6 #include "FillBase.hpp"
7 #include "FillConcentric.hpp"
8 #include "FillHoneycomb.hpp"
9 #include "Fill3DHoneycomb.hpp"
10 #include "FillPlanePath.hpp"
11 #include "FillRectilinear.hpp"
12 #include "FillRectilinear2.hpp"
13
14 namespace Slic3r {
15
16 Fill* Fill::new_from_type(const InfillPattern type)
17 {
18 switch (type) {
19 case ipConcentric: return new FillConcentric();
20 case ipHoneycomb: return new FillHoneycomb();
21 case ip3DHoneycomb: return new Fill3DHoneycomb();
22 case ipRectilinear: return new FillRectilinear2();
23 // case ipRectilinear: return new FillRectilinear();
24 case ipLine: return new FillLine();
25 case ipGrid: return new FillGrid2();
26 case ipTriangles: return new FillTriangles();
27 case ipStars: return new FillStars();
28 case ipCubic: return new FillCubic();
29 // case ipGrid: return new FillGrid();
30 case ipArchimedeanChords: return new FillArchimedeanChords();
31 case ipHilbertCurve: return new FillHilbertCurve();
32 case ipOctagramSpiral: return new FillOctagramSpiral();
33 default: CONFESS("unknown type"); return NULL;
34 }
35 }
36
37 Fill* Fill::new_from_type(const std::string &type)
38 {
39 static t_config_enum_values enum_keys_map = ConfigOptionEnum<InfillPattern>::get_enum_values();
40 t_config_enum_values::const_iterator it = enum_keys_map.find(type);
41 return (it == enum_keys_map.end()) ? NULL : new_from_type(InfillPattern(it->second));
42 }
43
44 Polylines Fill::fill_surface(const Surface *surface, const FillParams &params)
45 {
46 // Perform offset.
47 Slic3r::ExPolygons expp;
48 offset(surface->expolygon, &expp, -0.5*scale_(this->spacing));
49 // Create the infills for each of the regions.
50 Polylines polylines_out;
51 for (size_t i = 0; i < expp.size(); ++ i)
52 _fill_surface_single(
53 params,
54 surface->thickness_layers,
55 _infill_direction(surface),
56 expp[i],
57 polylines_out);
58 return polylines_out;
59 }
60
61 // Calculate a new spacing to fill width with possibly integer number of lines,
62 // the first and last line being centered at the interval ends.
63 // This function possibly increases the spacing, never decreases,
64 // and for a narrow width the increase in spacing may become severe,
65 // therefore the adjustment is limited to 20% increase.
66 coord_t Fill::_adjust_solid_spacing(const coord_t width, const coord_t distance)
67 {
68 assert(width >= 0);
69 assert(distance > 0);
70 // floor(width / distance)
71 coord_t number_of_intervals = (width - EPSILON) / distance;
72 coord_t distance_new = (number_of_intervals == 0) ?
73 distance :
74 ((width - EPSILON) / number_of_intervals);
75 const coordf_t factor = coordf_t(distance_new) / coordf_t(distance);
76 assert(factor > 1. - 1e-5);
77 // How much could the extrusion width be increased? By 20%.
78 const coordf_t factor_max = 1.2;
79 if (factor > factor_max)
80 distance_new = coord_t(floor((coordf_t(distance) * factor_max + 0.5)));
81 return distance_new;
82 }
83
84 // Returns orientation of the infill and the reference point of the infill pattern.
85 // For a normal print, the reference point is the center of a bounding box of the STL.
86 std::pair<float, Point> Fill::_infill_direction(const Surface *surface) const
87 {
88 // set infill angle
89 float out_angle = this->angle;
90
91 if (out_angle == FLT_MAX) {
92 //FIXME Vojtech: Add a warning?
93 printf("Using undefined infill angle\n");
94 out_angle = 0.f;
95 }
96
97 // Bounding box is the bounding box of a perl object Slic3r::Print::Object (c++ object Slic3r::PrintObject)
98 // The bounding box is only undefined in unit tests.
99 Point out_shift = empty(this->bounding_box) ?
100 surface->expolygon.contour.bounding_box().center() :
101 this->bounding_box.center();
102
103 #if 0
104 if (empty(this->bounding_box)) {
105 printf("Fill::_infill_direction: empty bounding box!");
106 } else {
107 printf("Fill::_infill_direction: reference point %d, %d\n", out_shift.x, out_shift.y);
108 }
109 #endif
110
111 if (surface->bridge_angle >= 0) {
112 // use bridge angle
113 //FIXME Vojtech: Add a debugf?
114 // Slic3r::debugf "Filling bridge with angle %d\n", rad2deg($surface->bridge_angle);
115 #ifdef SLIC3R_DEBUG
116 printf("Filling bridge with angle %f\n", surface->bridge_angle);
117 #endif /* SLIC3R_DEBUG */
118 out_angle = surface->bridge_angle;
119 } else if (this->layer_id != size_t(-1)) {
120 // alternate fill direction
121 out_angle += this->_layer_angle(this->layer_id / surface->thickness_layers);
122 } else {
123 // printf("Layer_ID undefined!\n");
124 }
125
126 out_angle += float(M_PI/2.);
127 return std::pair<float, Point>(out_angle, out_shift);
128 }
129
130 } // namespace Slic3r
0 #ifndef slic3r_FillBase_hpp_
1 #define slic3r_FillBase_hpp_
2
3 #include <assert.h>
4 #include <memory.h>
5 #include <float.h>
6 #include <stdint.h>
7
8 #include "../libslic3r.h"
9 #include "../BoundingBox.hpp"
10 #include "../PrintConfig.hpp"
11
12 namespace Slic3r {
13
14 class Surface;
15
16 struct FillParams
17 {
18 FillParams() {
19 memset(this, 0, sizeof(FillParams));
20 // Adjustment does not work.
21 dont_adjust = true;
22 }
23
24 // Fill density, fraction in <0, 1>
25 float density;
26
27 // Don't connect the fill lines around the inner perimeter.
28 bool dont_connect;
29
30 // Don't adjust spacing to fill the space evenly.
31 bool dont_adjust;
32
33 // For Honeycomb.
34 // we were requested to complete each loop;
35 // in this case we don't try to make more continuous paths
36 bool complete;
37 };
38
39 class Fill
40 {
41 public:
42 // Index of the layer.
43 size_t layer_id;
44 // Z coordinate of the top print surface, in unscaled coordinates
45 coordf_t z;
46 // in unscaled coordinates
47 coordf_t spacing;
48 // in radians, ccw, 0 = East
49 float angle;
50 // In scaled coordinates. Maximum lenght of a perimeter segment connecting two infill lines.
51 // Used by the FillRectilinear2, FillGrid2, FillTriangles, FillStars and FillCubic.
52 // If left to zero, the links will not be limited.
53 coord_t link_max_length;
54 // In scaled coordinates. Used by the concentric infill pattern to clip the loops to create extrusion paths.
55 coord_t loop_clipping;
56 // In scaled coordinates. Bounding box of the 2D projection of the object.
57 BoundingBox bounding_box;
58
59 public:
60 virtual ~Fill() {}
61
62 static Fill* new_from_type(const InfillPattern type);
63 static Fill* new_from_type(const std::string &type);
64
65 void set_bounding_box(const Slic3r::BoundingBox &bbox) { bounding_box = bbox; }
66
67 // Use bridge flow for the fill?
68 virtual bool use_bridge_flow() const { return false; }
69
70 // Do not sort the fill lines to optimize the print head path?
71 virtual bool no_sort() const { return false; }
72
73 // Perform the fill.
74 virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
75
76 protected:
77 Fill() :
78 layer_id(size_t(-1)),
79 z(0.f),
80 spacing(0.f),
81 // Initial angle is undefined.
82 angle(FLT_MAX),
83 link_max_length(0),
84 loop_clipping(0),
85 // The initial bounding box is empty, therefore undefined.
86 bounding_box(Point(0, 0), Point(-1, -1))
87 {}
88
89 // The expolygon may be modified by the method to avoid a copy.
90 virtual void _fill_surface_single(
91 const FillParams &params,
92 unsigned int thickness_layers,
93 const std::pair<float, Point> &direction,
94 ExPolygon &expolygon,
95 Polylines &polylines_out) {}
96
97 static coord_t _adjust_solid_spacing(const coord_t width, const coord_t distance);
98
99 virtual float _layer_angle(size_t idx) const {
100 bool odd = idx & 1;
101 return (idx & 1) ? float(M_PI/2.) : 0;
102 }
103
104 virtual std::pair<float, Point> _infill_direction(const Surface *surface) const;
105
106 // Align a coordinate to a grid. The coordinate may be negative,
107 // the aligned value will never be bigger than the original one.
108 static coord_t _align_to_grid(const coord_t coord, const coord_t spacing) {
109 // Current C++ standard defines the result of integer division to be rounded to zero,
110 // for both positive and negative numbers. Here we want to round down for negative
111 // numbers as well.
112 coord_t aligned = (coord < 0) ?
113 ((coord - spacing + 1) / spacing) * spacing :
114 (coord / spacing) * spacing;
115 assert(aligned <= coord);
116 return aligned;
117 }
118 static Point _align_to_grid(Point coord, Point spacing)
119 { return Point(_align_to_grid(coord.x, spacing.x), _align_to_grid(coord.y, spacing.y)); }
120 static coord_t _align_to_grid(coord_t coord, coord_t spacing, coord_t base)
121 { return base + _align_to_grid(coord - base, spacing); }
122 static Point _align_to_grid(Point coord, Point spacing, Point base)
123 { return Point(_align_to_grid(coord.x, spacing.x, base.x), _align_to_grid(coord.y, spacing.y, base.y)); }
124 };
125
126 } // namespace Slic3r
127
128 #endif // slic3r_FillBase_hpp_
0 #include "../ClipperUtils.hpp"
1 #include "../ExPolygon.hpp"
2 #include "../Surface.hpp"
3
4 #include "FillConcentric.hpp"
5
6 namespace Slic3r {
7
8 void FillConcentric::_fill_surface_single(
9 const FillParams &params,
10 unsigned int thickness_layers,
11 const std::pair<float, Point> &direction,
12 ExPolygon &expolygon,
13 Polylines &polylines_out)
14 {
15 // no rotation is supported for this infill pattern
16 BoundingBox bounding_box = expolygon.contour.bounding_box();
17
18 coord_t min_spacing = scale_(this->spacing);
19 coord_t distance = coord_t(min_spacing / params.density);
20
21 if (params.density > 0.9999f && !params.dont_adjust) {
22 distance = this->_adjust_solid_spacing(bounding_box.size().x, distance);
23 this->spacing = unscale(distance);
24 }
25
26 Polygons loops = (Polygons)expolygon;
27 Polygons last = loops;
28 while (! last.empty()) {
29 last = offset2(last, -(distance + min_spacing/2), +min_spacing/2);
30 loops.insert(loops.end(), last.begin(), last.end());
31 }
32
33 // generate paths from the outermost to the innermost, to avoid
34 // adhesion problems of the first central tiny loops
35 union_pt_chained(loops, &loops, false);
36
37 // split paths using a nearest neighbor search
38 size_t iPathFirst = polylines_out.size();
39 Point last_pos(0, 0);
40 for (Polygons::const_iterator it_loop = loops.begin(); it_loop != loops.end(); ++ it_loop) {
41 polylines_out.push_back(it_loop->split_at_index(last_pos.nearest_point_index(*it_loop)));
42 last_pos = polylines_out.back().last_point();
43 }
44
45 // clip the paths to prevent the extruder from getting exactly on the first point of the loop
46 // Keep valid paths only.
47 size_t j = iPathFirst;
48 for (size_t i = iPathFirst; i < polylines_out.size(); ++ i) {
49 polylines_out[i].clip_end(this->loop_clipping);
50 if (polylines_out[i].is_valid()) {
51 if (j < i)
52 std::swap(polylines_out[j], polylines_out[i]);
53 ++ j;
54 }
55 }
56 if (j < polylines_out.size())
57 polylines_out.erase(polylines_out.begin() + j, polylines_out.end());
58 // TODO: return ExtrusionLoop objects to get better chained paths
59 }
60
61 } // namespace Slic3r
0 #ifndef slic3r_FillConcentric_hpp_
1 #define slic3r_FillConcentric_hpp_
2
3 #include "FillBase.hpp"
4
5 namespace Slic3r {
6
7 class FillConcentric : public Fill
8 {
9 public:
10 virtual ~FillConcentric() {}
11
12 protected:
13 virtual void _fill_surface_single(
14 const FillParams &params,
15 unsigned int thickness_layers,
16 const std::pair<float, Point> &direction,
17 ExPolygon &expolygon,
18 Polylines &polylines_out);
19
20 virtual bool no_sort() const { return true; }
21 };
22
23 } // namespace Slic3r
24
25 #endif // slic3r_FillConcentric_hpp_
0 #include "../ClipperUtils.hpp"
1 #include "../PolylineCollection.hpp"
2 #include "../Surface.hpp"
3
4 #include "FillHoneycomb.hpp"
5
6 namespace Slic3r {
7
8 void FillHoneycomb::_fill_surface_single(
9 const FillParams &params,
10 unsigned int thickness_layers,
11 const std::pair<float, Point> &direction,
12 ExPolygon &expolygon,
13 Polylines &polylines_out)
14 {
15 // cache hexagons math
16 CacheID cache_id(params.density, this->spacing);
17 Cache::iterator it_m = this->cache.find(cache_id);
18 if (it_m == this->cache.end()) {
19 #if 0
20 // #if SLIC3R_CPPVER > 11
21 it_m = this->cache.emplace_hint(it_m);
22 #else
23 it_m = this->cache.insert(it_m, std::pair<CacheID, CacheData>(cache_id, CacheData()));
24 #endif
25 CacheData &m = it_m->second;
26 coord_t min_spacing = scale_(this->spacing);
27 m.distance = min_spacing / params.density;
28 m.hex_side = m.distance / (sqrt(3)/2);
29 m.hex_width = m.distance * 2; // $m->{hex_width} == $m->{hex_side} * sqrt(3);
30 coord_t hex_height = m.hex_side * 2;
31 m.pattern_height = hex_height + m.hex_side;
32 m.y_short = m.distance * sqrt(3)/3;
33 m.x_offset = min_spacing / 2;
34 m.y_offset = m.x_offset * sqrt(3)/3;
35 m.hex_center = Point(m.hex_width/2, m.hex_side);
36 }
37 CacheData &m = it_m->second;
38
39 Polygons polygons;
40 {
41 // adjust actual bounding box to the nearest multiple of our hex pattern
42 // and align it so that it matches across layers
43
44 BoundingBox bounding_box = expolygon.contour.bounding_box();
45 {
46 // rotate bounding box according to infill direction
47 Polygon bb_polygon = bounding_box.polygon();
48 bb_polygon.rotate(direction.first, m.hex_center);
49 bounding_box = bb_polygon.bounding_box();
50
51 // extend bounding box so that our pattern will be aligned with other layers
52 // $bounding_box->[X1] and [Y1] represent the displacement between new bounding box offset and old one
53 // The infill is not aligned to the object bounding box, but to a world coordinate system. Supposedly good enough.
54 bounding_box.merge(_align_to_grid(bounding_box.min, Point(m.hex_width, m.pattern_height)));
55 }
56
57 coord_t x = bounding_box.min.x;
58 while (x <= bounding_box.max.x) {
59 Polygon p;
60 coord_t ax[2] = { x + m.x_offset, x + m.distance - m.x_offset };
61 for (size_t i = 0; i < 2; ++ i) {
62 std::reverse(p.points.begin(), p.points.end()); // turn first half upside down
63 for (coord_t y = bounding_box.min.y; y <= bounding_box.max.y; y += m.y_short + m.hex_side + m.y_short + m.hex_side) {
64 p.points.push_back(Point(ax[1], y + m.y_offset));
65 p.points.push_back(Point(ax[0], y + m.y_short - m.y_offset));
66 p.points.push_back(Point(ax[0], y + m.y_short + m.hex_side + m.y_offset));
67 p.points.push_back(Point(ax[1], y + m.y_short + m.hex_side + m.y_short - m.y_offset));
68 p.points.push_back(Point(ax[1], y + m.y_short + m.hex_side + m.y_short + m.hex_side + m.y_offset));
69 }
70 ax[0] = ax[0] + m.distance;
71 ax[1] = ax[1] + m.distance;
72 std::swap(ax[0], ax[1]); // draw symmetrical pattern
73 x += m.distance;
74 }
75 p.rotate(-direction.first, m.hex_center);
76 polygons.push_back(p);
77 }
78 }
79
80 if (params.complete || true) {
81 // we were requested to complete each loop;
82 // in this case we don't try to make more continuous paths
83 Polygons polygons_trimmed = intersection((Polygons)expolygon, polygons);
84 for (Polygons::iterator it = polygons_trimmed.begin(); it != polygons_trimmed.end(); ++ it)
85 polylines_out.push_back(it->split_at_first_point());
86 } else {
87 // consider polygons as polylines without re-appending the initial point:
88 // this cuts the last segment on purpose, so that the jump to the next
89 // path is more straight
90 Polylines paths;
91 {
92 Polylines p;
93 for (Polygons::iterator it = polygons.begin(); it != polygons.end(); ++ it)
94 p.push_back((Polyline)(*it));
95 intersection(p, (Polygons)expolygon, &paths);
96 }
97
98 // connect paths
99 if (! paths.empty()) { // prevent calling leftmost_point() on empty collections
100 Polylines chained = PolylineCollection::chained_path_from(
101 #if SLIC3R_CPPVER >= 11
102 std::move(paths),
103 #else
104 paths,
105 #endif
106 PolylineCollection::leftmost_point(paths), false);
107 assert(paths.empty());
108 paths.clear();
109 for (Polylines::iterator it_path = chained.begin(); it_path != chained.end(); ++ it_path) {
110 if (! paths.empty()) {
111 // distance between first point of this path and last point of last path
112 double distance = paths.back().last_point().distance_to(it_path->first_point());
113 if (distance <= m.hex_width) {
114 paths.back().points.insert(paths.back().points.end(), it_path->points.begin(), it_path->points.end());
115 continue;
116 }
117 }
118 // Don't connect the paths.
119 paths.push_back(*it_path);
120 }
121 }
122
123 // clip paths again to prevent connection segments from crossing the expolygon boundaries
124 intersection(paths, to_polygons(offset_ex(expolygon, SCALED_EPSILON)), &paths);
125 // Move the polylines to the output, avoid a deep copy.
126 size_t j = polylines_out.size();
127 polylines_out.resize(j + paths.size(), Polyline());
128 for (size_t i = 0; i < paths.size(); ++ i)
129 std::swap(polylines_out[j ++], paths[i]);
130 }
131 }
132
133 } // namespace Slic3r
0 #ifndef slic3r_FillHoneycomb_hpp_
1 #define slic3r_FillHoneycomb_hpp_
2
3 #include <map>
4
5 #include "../libslic3r.h"
6
7 #include "FillBase.hpp"
8
9 namespace Slic3r {
10
11 class FillHoneycomb : public Fill
12 {
13 public:
14 virtual ~FillHoneycomb() {}
15
16 protected:
17 virtual void _fill_surface_single(
18 const FillParams &params,
19 unsigned int thickness_layers,
20 const std::pair<float, Point> &direction,
21 ExPolygon &expolygon,
22 Polylines &polylines_out);
23
24 // Caching the
25 struct CacheID
26 {
27 CacheID(float adensity, coordf_t aspacing) :
28 density(adensity), spacing(aspacing) {}
29 float density;
30 coordf_t spacing;
31 bool operator<(const CacheID &other) const
32 { return (density < other.density) || (density == other.density && spacing < other.spacing); }
33 bool operator==(const CacheID &other) const
34 { return density == other.density && spacing == other.spacing; }
35 };
36 struct CacheData
37 {
38 coord_t distance;
39 coord_t hex_side;
40 coord_t hex_width;
41 coord_t pattern_height;
42 coord_t y_short;
43 coord_t x_offset;
44 coord_t y_offset;
45 Point hex_center;
46 };
47 typedef std::map<CacheID, CacheData> Cache;
48 Cache cache;
49
50 virtual float _layer_angle(size_t idx) const { return float(M_PI/3.) * (idx % 3); }
51 };
52
53 } // namespace Slic3r
54
55 #endif // slic3r_FillHoneycomb_hpp_
0 #include "../ClipperUtils.hpp"
1 #include "../PolylineCollection.hpp"
2 #include "../Surface.hpp"
3
4 #include "FillPlanePath.hpp"
5
6 namespace Slic3r {
7
8 void FillPlanePath::_fill_surface_single(
9 const FillParams &params,
10 unsigned int thickness_layers,
11 const std::pair<float, Point> &direction,
12 ExPolygon &expolygon,
13 Polylines &polylines_out)
14 {
15 expolygon.rotate(- direction.first);
16
17 coord_t distance_between_lines = scale_(this->spacing) / params.density;
18
19 // align infill across layers using the object's bounding box
20 // Rotated bounding box of the whole object.
21 BoundingBox bounding_box = this->bounding_box.rotated(- direction.first);
22
23 Point shift = this->_centered() ?
24 bounding_box.center() :
25 bounding_box.min;
26 expolygon.translate(-shift.x, -shift.y);
27 bounding_box.translate(-shift.x, -shift.y);
28
29 Pointfs pts = _generate(
30 coord_t(ceil(coordf_t(bounding_box.min.x) / distance_between_lines)),
31 coord_t(ceil(coordf_t(bounding_box.min.y) / distance_between_lines)),
32 coord_t(ceil(coordf_t(bounding_box.max.x) / distance_between_lines)),
33 coord_t(ceil(coordf_t(bounding_box.max.y) / distance_between_lines)));
34
35 Polylines polylines;
36 if (pts.size() >= 2) {
37 // Convert points to a polyline, upscale.
38 polylines.push_back(Polyline());
39 Polyline &polyline = polylines.back();
40 polyline.points.reserve(pts.size());
41 for (Pointfs::iterator it = pts.begin(); it != pts.end(); ++ it)
42 polyline.points.push_back(Point(
43 coord_t(floor(it->x * distance_between_lines + 0.5)),
44 coord_t(floor(it->y * distance_between_lines + 0.5))));
45 // intersection(polylines_src, offset((Polygons)expolygon, scale_(0.02)), &polylines);
46 intersection(polylines, (Polygons)expolygon, &polylines);
47
48 /*
49 if (1) {
50 require "Slic3r/SVG.pm";
51 print "Writing fill.svg\n";
52 Slic3r::SVG::output("fill.svg",
53 no_arrows => 1,
54 polygons => \@$expolygon,
55 green_polygons => [ $bounding_box->polygon ],
56 polylines => [ $polyline ],
57 red_polylines => \@paths,
58 );
59 }
60 */
61
62 // paths must be repositioned and rotated back
63 for (Polylines::iterator it = polylines.begin(); it != polylines.end(); ++ it) {
64 it->translate(shift.x, shift.y);
65 it->rotate(direction.first);
66 }
67 }
68
69 // Move the polylines to the output, avoid a deep copy.
70 size_t j = polylines_out.size();
71 polylines_out.resize(j + polylines.size(), Polyline());
72 for (size_t i = 0; i < polylines.size(); ++ i)
73 std::swap(polylines_out[j ++], polylines[i]);
74 }
75
76 // Follow an Archimedean spiral, in polar coordinates: r=a+b\theta
77 Pointfs FillArchimedeanChords::_generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y)
78 {
79 // Radius to achieve.
80 coordf_t rmax = std::sqrt(coordf_t(max_x)*coordf_t(max_x)+coordf_t(max_y)*coordf_t(max_y)) * std::sqrt(2.) + 1.5;
81 // Now unwind the spiral.
82 coordf_t a = 1.;
83 coordf_t b = 1./(2.*M_PI);
84 coordf_t theta = 0.;
85 coordf_t r = 1;
86 Pointfs out;
87 //FIXME Vojtech: If used as a solid infill, there is a gap left at the center.
88 out.push_back(Pointf(0, 0));
89 out.push_back(Pointf(1, 0));
90 while (r < rmax) {
91 theta += 1. / r;
92 r = a + b * theta;
93 out.push_back(Pointf(r * cos(theta), r * sin(theta)));
94 }
95 return out;
96 }
97
98 // Adapted from
99 // http://cpansearch.perl.org/src/KRYDE/Math-PlanePath-122/lib/Math/PlanePath/HilbertCurve.pm
100 //
101 // state=0 3--2 plain
102 // |
103 // 0--1
104 //
105 // state=4 1--2 transpose
106 // | |
107 // 0 3
108 //
109 // state=8
110 //
111 // state=12 3 0 rot180 + transpose
112 // | |
113 // 2--1
114 //
115 static inline Point hilbert_n_to_xy(const size_t n)
116 {
117 static const int next_state[16] = { 4,0,0,12, 0,4,4,8, 12,8,8,4, 8,12,12,0 };
118 static const int digit_to_x[16] = { 0,1,1,0, 0,0,1,1, 1,0,0,1, 1,1,0,0 };
119 static const int digit_to_y[16] = { 0,0,1,1, 0,1,1,0, 1,1,0,0, 1,0,0,1 };
120
121 // Number of 2 bit digits.
122 size_t ndigits = 0;
123 {
124 size_t nc = n;
125 while(nc > 0) {
126 nc >>= 2;
127 ++ ndigits;
128 }
129 }
130 int state = (ndigits & 1) ? 4 : 0;
131 int dirstate = (ndigits & 1) ? 0 : 4;
132 coord_t x = 0;
133 coord_t y = 0;
134 for (int i = (int)ndigits - 1; i >= 0; -- i) {
135 int digit = (n >> (i * 2)) & 3;
136 state += digit;
137 if (digit != 3)
138 dirstate = state; // lowest non-3 digit
139 x |= digit_to_x[state] << i;
140 y |= digit_to_y[state] << i;
141 state = next_state[state];
142 }
143 return Point(x, y);
144 }
145
146 Pointfs FillHilbertCurve::_generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y)
147 {
148 // Minimum power of two square to fit the domain.
149 size_t sz = 2;
150 size_t pw = 1;
151 {
152 size_t sz0 = std::max(max_x + 1 - min_x, max_y + 1 - min_y);
153 while (sz < sz0) {
154 sz = sz << 1;
155 ++ pw;
156 }
157 }
158
159 size_t sz2 = sz * sz;
160 Pointfs line;
161 line.reserve(sz2);
162 for (size_t i = 0; i < sz2; ++ i) {
163 Point p = hilbert_n_to_xy(i);
164 line.push_back(Pointf(p.x + min_x, p.y + min_y));
165 }
166 return line;
167 }
168
169 Pointfs FillOctagramSpiral::_generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y)
170 {
171 // Radius to achieve.
172 coordf_t rmax = std::sqrt(coordf_t(max_x)*coordf_t(max_x)+coordf_t(max_y)*coordf_t(max_y)) * std::sqrt(2.) + 1.5;
173 // Now unwind the spiral.
174 coordf_t r = 0;
175 coordf_t r_inc = sqrt(2.);
176 Pointfs out;
177 out.push_back(Pointf(0, 0));
178 while (r < rmax) {
179 r += r_inc;
180 coordf_t rx = r / sqrt(2.);
181 coordf_t r2 = r + rx;
182 out.push_back(Pointf( r, 0.));
183 out.push_back(Pointf( r2, rx));
184 out.push_back(Pointf( rx, rx));
185 out.push_back(Pointf( rx, r2));
186 out.push_back(Pointf(0., r));
187 out.push_back(Pointf(-rx, r2));
188 out.push_back(Pointf(-rx, rx));
189 out.push_back(Pointf(-r2, rx));
190 out.push_back(Pointf(-r, 0.));
191 out.push_back(Pointf(-r2, -rx));
192 out.push_back(Pointf(-rx, -rx));
193 out.push_back(Pointf(-rx, -r2));
194 out.push_back(Pointf(0., -r));
195 out.push_back(Pointf( rx, -r2));
196 out.push_back(Pointf( rx, -rx));
197 out.push_back(Pointf( r2+r_inc, -rx));
198 }
199 return out;
200 }
201
202 } // namespace Slic3r
0 #ifndef slic3r_FillPlanePath_hpp_
1 #define slic3r_FillPlanePath_hpp_
2
3 #include <map>
4
5 #include "../libslic3r.h"
6
7 #include "FillBase.hpp"
8
9 namespace Slic3r {
10
11 // The original Perl code used path generators from Math::PlanePath library:
12 // http://user42.tuxfamily.org/math-planepath/
13 // http://user42.tuxfamily.org/math-planepath/gallery.html
14
15 class FillPlanePath : public Fill
16 {
17 public:
18 virtual ~FillPlanePath() {}
19
20 protected:
21 virtual void _fill_surface_single(
22 const FillParams &params,
23 unsigned int thickness_layers,
24 const std::pair<float, Point> &direction,
25 ExPolygon &expolygon,
26 Polylines &polylines_out);
27
28 virtual float _layer_angle(size_t idx) const { return 0.f; }
29 virtual bool _centered() const = 0;
30 virtual Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y) = 0;
31 };
32
33 class FillArchimedeanChords : public FillPlanePath
34 {
35 public:
36 virtual ~FillArchimedeanChords() {}
37
38 protected:
39 virtual bool _centered() const { return true; }
40 virtual Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y);
41 };
42
43 class FillHilbertCurve : public FillPlanePath
44 {
45 public:
46 virtual ~FillHilbertCurve() {}
47
48 protected:
49 virtual bool _centered() const { return false; }
50 virtual Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y);
51 };
52
53 class FillOctagramSpiral : public FillPlanePath
54 {
55 public:
56 virtual ~FillOctagramSpiral() {}
57
58 protected:
59 virtual bool _centered() const { return true; }
60 virtual Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y);
61 };
62
63 } // namespace Slic3r
64
65 #endif // slic3r_FillPlanePath_hpp_
0 #include "../ClipperUtils.hpp"
1 #include "../ExPolygon.hpp"
2 #include "../PolylineCollection.hpp"
3 #include "../Surface.hpp"
4
5 #include "FillRectilinear.hpp"
6
7 namespace Slic3r {
8
9 void FillRectilinear::_fill_surface_single(
10 const FillParams &params,
11 unsigned int thickness_layers,
12 const std::pair<float, Point> &direction,
13 ExPolygon &expolygon,
14 Polylines &polylines_out)
15 {
16 // rotate polygons so that we can work with vertical lines here
17 expolygon.rotate(- direction.first);
18
19 this->_min_spacing = scale_(this->spacing);
20 assert(params.density > 0.0001f && params.density <= 1.f);
21 this->_line_spacing = coord_t(coordf_t(this->_min_spacing) / params.density);
22 this->_diagonal_distance = this->_line_spacing * 2;
23 this->_line_oscillation = this->_line_spacing - this->_min_spacing; // only for Line infill
24 BoundingBox bounding_box = expolygon.contour.bounding_box();
25
26 // define flow spacing according to requested density
27 if (params.density > 0.9999f && !params.dont_adjust) {
28 this->_line_spacing = this->_adjust_solid_spacing(bounding_box.size().x, this->_line_spacing);
29 this->spacing = unscale(this->_line_spacing);
30 } else {
31 // extend bounding box so that our pattern will be aligned with other layers
32 // Transform the reference point to the rotated coordinate system.
33 bounding_box.merge(_align_to_grid(
34 bounding_box.min,
35 Point(this->_line_spacing, this->_line_spacing),
36 direction.second.rotated(- direction.first)));
37 }
38
39 // generate the basic pattern
40 coord_t x_max = bounding_box.max.x + SCALED_EPSILON;
41 Lines lines;
42 for (coord_t x = bounding_box.min.x; x <= x_max; x += this->_line_spacing)
43 lines.push_back(this->_line(lines.size(), x, bounding_box.min.y, bounding_box.max.y));
44 if (this->_horizontal_lines()) {
45 coord_t y_max = bounding_box.max.y + SCALED_EPSILON;
46 for (coord_t y = bounding_box.min.y; y <= y_max; y += this->_line_spacing)
47 lines.push_back(Line(Point(bounding_box.min.x, y), Point(bounding_box.max.x, y)));
48 }
49
50 // clip paths against a slightly larger expolygon, so that the first and last paths
51 // are kept even if the expolygon has vertical sides
52 // the minimum offset for preventing edge lines from being clipped is SCALED_EPSILON;
53 // however we use a larger offset to support expolygons with slightly skewed sides and
54 // not perfectly straight
55 //FIXME Vojtech: Update the intersecton function to work directly with lines.
56 Polylines polylines_src;
57 polylines_src.reserve(lines.size());
58 for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++ it) {
59 polylines_src.push_back(Polyline());
60 Points &pts = polylines_src.back().points;
61 pts.reserve(2);
62 pts.push_back(it->a);
63 pts.push_back(it->b);
64 }
65 Polylines polylines = intersection(polylines_src, offset((Polygons)expolygon, scale_(0.02)), false);
66
67 // FIXME Vojtech: This is only performed for horizontal lines, not for the vertical lines!
68 const float INFILL_OVERLAP_OVER_SPACING = 0.3f;
69 // How much to extend an infill path from expolygon outside?
70 coord_t extra = coord_t(floor(this->_min_spacing * INFILL_OVERLAP_OVER_SPACING + 0.5f));
71 for (Polylines::iterator it_polyline = polylines.begin(); it_polyline != polylines.end(); ++ it_polyline) {
72 Point *first_point = &it_polyline->points.front();
73 Point *last_point = &it_polyline->points.back();
74 if (first_point->y > last_point->y)
75 std::swap(first_point, last_point);
76 first_point->y -= extra;
77 last_point->y += extra;
78 }
79
80 size_t n_polylines_out_old = polylines_out.size();
81
82 // connect lines
83 if (! params.dont_connect && ! polylines.empty()) { // prevent calling leftmost_point() on empty collections
84 // offset the expolygon by max(min_spacing/2, extra)
85 ExPolygon expolygon_off;
86 {
87 ExPolygons expolygons_off = offset_ex(expolygon, this->_min_spacing/2);
88 if (! expolygons_off.empty()) {
89 // When expanding a polygon, the number of islands could only shrink. Therefore the offset_ex shall generate exactly one expanded island for one input island.
90 assert(expolygons_off.size() == 1);
91 std::swap(expolygon_off, expolygons_off.front());
92 }
93 }
94 Polylines chained = PolylineCollection::chained_path_from(
95 #if SLIC3R_CPPVER >= 11
96 std::move(polylines),
97 #else
98 polylines,
99 #endif
100 PolylineCollection::leftmost_point(polylines), false); // reverse allowed
101 bool first = true;
102 for (Polylines::iterator it_polyline = chained.begin(); it_polyline != chained.end(); ++ it_polyline) {
103 if (! first) {
104 // Try to connect the lines.
105 Points &pts_end = polylines_out.back().points;
106 const Point &first_point = it_polyline->points.front();
107 const Point &last_point = pts_end.back();
108 // Distance in X, Y.
109 const Vector distance = first_point.vector_to(last_point);
110 // TODO: we should also check that both points are on a fill_boundary to avoid
111 // connecting paths on the boundaries of internal regions
112 if (this->_can_connect(std::abs(distance.x), std::abs(distance.y)) &&
113 expolygon_off.contains(Line(last_point, first_point))) {
114 // Append the polyline.
115 pts_end.insert(pts_end.end(), it_polyline->points.begin(), it_polyline->points.end());
116 continue;
117 }
118 }
119 // The lines cannot be connected.
120 #if SLIC3R_CPPVER >= 11
121 polylines_out.push_back(std::move(*it_polyline));
122 #else
123 polylines_out.push_back(Polyline());
124 std::swap(polylines_out.back(), *it_polyline);
125 #endif
126 first = false;
127 }
128 }
129
130 // paths must be rotated back
131 for (Polylines::iterator it = polylines_out.begin() + n_polylines_out_old; it != polylines_out.end(); ++ it) {
132 // No need to translate, the absolute position is irrelevant.
133 // it->translate(- direction.second.x, - direction.second.y);
134 it->rotate(direction.first);
135 }
136 }
137
138 } // namespace Slic3r
0 #ifndef slic3r_FillRectilinear_hpp_
1 #define slic3r_FillRectilinear_hpp_
2
3 #include "../libslic3r.h"
4
5 #include "FillBase.hpp"
6
7 namespace Slic3r {
8
9 class Surface;
10
11 class FillRectilinear : public Fill
12 {
13 public:
14 virtual ~FillRectilinear() {}
15
16 protected:
17 virtual void _fill_surface_single(
18 const FillParams &params,
19 unsigned int thickness_layers,
20 const std::pair<float, Point> &direction,
21 ExPolygon &expolygon,
22 Polylines &polylines_out);
23
24 coord_t _min_spacing;
25 coord_t _line_spacing;
26 // distance threshold for allowing the horizontal infill lines to be connected into a continuous path
27 coord_t _diagonal_distance;
28 // only for line infill
29 coord_t _line_oscillation;
30
31 // Enabled for the grid infill, disabled for the rectilinear and line infill.
32 virtual bool _horizontal_lines() const { return false; }
33
34 virtual Line _line(int i, coord_t x, coord_t y_min, coord_t y_max) const
35 { return Line(Point(x, y_min), Point(x, y_max)); }
36
37 virtual bool _can_connect(coord_t dist_X, coord_t dist_Y) {
38 return dist_X <= this->_diagonal_distance
39 && dist_Y <= this->_diagonal_distance;
40 }
41 };
42
43 class FillLine : public FillRectilinear
44 {
45 public:
46 virtual ~FillLine() {}
47
48 protected:
49 virtual Line _line(int i, coord_t x, coord_t y_min, coord_t y_max) const {
50 coord_t osc = (i & 1) ? this->_line_oscillation : 0;
51 return Line(Point(x - osc, y_min), Point(x + osc, y_max));
52 }
53
54 virtual bool _can_connect(coord_t dist_X, coord_t dist_Y)
55 {
56 coord_t TOLERANCE = 10 * SCALED_EPSILON;
57 return (dist_X >= (this->_line_spacing - this->_line_oscillation) - TOLERANCE)
58 && (dist_X <= (this->_line_spacing + this->_line_oscillation) + TOLERANCE)
59 && (dist_Y <= this->_diagonal_distance);
60 }
61 };
62
63 class FillGrid : public FillRectilinear
64 {
65 public:
66 virtual ~FillGrid() {}
67
68 protected:
69 // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
70 virtual float _layer_angle(size_t idx) const { return 0.f; }
71 // Flag for Slic3r::Fill::Rectilinear to fill both directions.
72 virtual bool _horizontal_lines() const { return true; }
73 };
74
75 }; // namespace Slic3r
76
77 #endif // slic3r_FillRectilinear_hpp_
0 #include <stdlib.h>
1 #include <stdint.h>
2
3 #include <algorithm>
4 #include <cmath>
5 #include <limits>
6
7 #include <boost/static_assert.hpp>
8
9 #include "../ClipperUtils.hpp"
10 #include "../ExPolygon.hpp"
11 #include "../Surface.hpp"
12
13 #include "FillRectilinear2.hpp"
14
15 // #define SLIC3R_DEBUG
16
17 // Make assert active if SLIC3R_DEBUG
18 #ifdef SLIC3R_DEBUG
19 #undef NDEBUG
20 #include "SVG.hpp"
21 #endif
22
23 #include <cassert>
24
25 // We want our version of assert.
26 #include "../libslic3r.h"
27
28 #ifndef myassert
29 #define myassert assert
30 #endif
31
32 namespace Slic3r {
33
34 #ifndef clamp
35 template<typename T>
36 static inline T clamp(T low, T high, T x)
37 {
38 return std::max<T>(low, std::min<T>(high, x));
39 }
40 #endif /* clamp */
41
42 #ifndef sqr
43 template<typename T>
44 static inline T sqr(T x)
45 {
46 return x * x;
47 }
48 #endif /* sqr */
49
50 #ifndef mag2
51 static inline coordf_t mag2(const Point &p)
52 {
53 return sqr(coordf_t(p.x)) + sqr(coordf_t(p.y));
54 }
55 #endif /* mag2 */
56
57 #ifndef mag
58 static inline coordf_t mag(const Point &p)
59 {
60 return std::sqrt(mag2(p));
61 }
62 #endif /* mag */
63
64 enum Orientation
65 {
66 ORIENTATION_CCW = 1,
67 ORIENTATION_CW = -1,
68 ORIENTATION_COLINEAR = 0
69 };
70
71 // Return orientation of the three points (clockwise, counter-clockwise, colinear)
72 // The predicate is exact for the coord_t type, using 64bit signed integers for the temporaries.
73 //FIXME Make sure the temporaries do not overflow,
74 // which means, the coord_t types must not have some of the topmost bits utilized.
75 static inline Orientation orient(const Point &a, const Point &b, const Point &c)
76 {
77 // BOOST_STATIC_ASSERT(sizeof(coord_t) * 2 == sizeof(int64_t));
78 int64_t u = int64_t(b.x) * int64_t(c.y) - int64_t(b.y) * int64_t(c.x);
79 int64_t v = int64_t(a.x) * int64_t(c.y) - int64_t(a.y) * int64_t(c.x);
80 int64_t w = int64_t(a.x) * int64_t(b.y) - int64_t(a.y) * int64_t(b.x);
81 int64_t d = u - v + w;
82 return (d > 0) ? ORIENTATION_CCW : ((d == 0) ? ORIENTATION_COLINEAR : ORIENTATION_CW);
83 }
84
85 // Return orientation of the polygon.
86 // The input polygon must not contain duplicate points.
87 static inline bool is_ccw(const Polygon &poly)
88 {
89 // The polygon shall be at least a triangle.
90 myassert(poly.points.size() >= 3);
91 if (poly.points.size() < 3)
92 return true;
93
94 // 1) Find the lowest lexicographical point.
95 int imin = 0;
96 for (size_t i = 1; i < poly.points.size(); ++ i) {
97 const Point &pmin = poly.points[imin];
98 const Point &p = poly.points[i];
99 if (p.x < pmin.x || (p.x == pmin.x && p.y < pmin.y))
100 imin = i;
101 }
102
103 // 2) Detect the orientation of the corner imin.
104 size_t iPrev = ((imin == 0) ? poly.points.size() : imin) - 1;
105 size_t iNext = ((imin + 1 == poly.points.size()) ? 0 : imin + 1);
106 Orientation o = orient(poly.points[iPrev], poly.points[imin], poly.points[iNext]);
107 // The lowest bottom point must not be collinear if the polygon does not contain duplicate points
108 // or overlapping segments.
109 myassert(o != ORIENTATION_COLINEAR);
110 return o == ORIENTATION_CCW;
111 }
112
113 // Having a segment of a closed polygon, calculate its Euclidian length.
114 // The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop,
115 // therefore the point p1 lies on poly.points[seg1-1], poly.points[seg1] etc.
116 static inline coordf_t segment_length(const Polygon &poly, size_t seg1, const Point &p1, size_t seg2, const Point &p2)
117 {
118 #ifdef SLIC3R_DEBUG
119 // Verify that p1 lies on seg1. This is difficult to verify precisely,
120 // but at least verify, that p1 lies in the bounding box of seg1.
121 for (size_t i = 0; i < 2; ++ i) {
122 size_t seg = (i == 0) ? seg1 : seg2;
123 Point px = (i == 0) ? p1 : p2;
124 Point pa = poly.points[((seg == 0) ? poly.points.size() : seg) - 1];
125 Point pb = poly.points[seg];
126 if (pa.x > pb.x)
127 std::swap(pa.x, pb.x);
128 if (pa.y > pb.y)
129 std::swap(pa.y, pb.y);
130 myassert(px.x >= pa.x && px.x <= pb.x);
131 myassert(px.y >= pa.y && px.y <= pb.y);
132 }
133 #endif /* SLIC3R_DEBUG */
134 const Point *pPrev = &p1;
135 const Point *pThis = NULL;
136 coordf_t len = 0;
137 if (seg1 <= seg2) {
138 for (size_t i = seg1; i < seg2; ++ i, pPrev = pThis)
139 len += pPrev->distance_to(*(pThis = &poly.points[i]));
140 } else {
141 for (size_t i = seg1; i < poly.points.size(); ++ i, pPrev = pThis)
142 len += pPrev->distance_to(*(pThis = &poly.points[i]));
143 for (size_t i = 0; i < seg2; ++ i, pPrev = pThis)
144 len += pPrev->distance_to(*(pThis = &poly.points[i]));
145 }
146 len += pPrev->distance_to(p2);
147 return len;
148 }
149
150 // Append a segment of a closed polygon to a polyline.
151 // The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop.
152 // Only insert intermediate points between seg1 and seg2.
153 static inline void polygon_segment_append(Points &out, const Polygon &polygon, size_t seg1, size_t seg2)
154 {
155 if (seg1 == seg2) {
156 // Nothing to append from this segment.
157 } else if (seg1 < seg2) {
158 // Do not append a point pointed to by seg2.
159 out.insert(out.end(), polygon.points.begin() + seg1, polygon.points.begin() + seg2);
160 } else {
161 out.reserve(out.size() + seg2 + polygon.points.size() - seg1);
162 out.insert(out.end(), polygon.points.begin() + seg1, polygon.points.end());
163 // Do not append a point pointed to by seg2.
164 out.insert(out.end(), polygon.points.begin(), polygon.points.begin() + seg2);
165 }
166 }
167
168 // Append a segment of a closed polygon to a polyline.
169 // The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop,
170 // but this time the segment is traversed backward.
171 // Only insert intermediate points between seg1 and seg2.
172 static inline void polygon_segment_append_reversed(Points &out, const Polygon &polygon, size_t seg1, size_t seg2)
173 {
174 if (seg1 >= seg2) {
175 out.reserve(seg1 - seg2);
176 for (size_t i = seg1; i > seg2; -- i)
177 out.push_back(polygon.points[i - 1]);
178 } else {
179 // it could be, that seg1 == seg2. In that case, append the complete loop.
180 out.reserve(out.size() + seg2 + polygon.points.size() - seg1);
181 for (size_t i = seg1; i > 0; -- i)
182 out.push_back(polygon.points[i - 1]);
183 for (size_t i = polygon.points.size(); i > seg2; -- i)
184 out.push_back(polygon.points[i - 1]);
185 }
186 }
187
188 // Intersection point of a vertical line with a polygon segment.
189 class SegmentIntersection
190 {
191 public:
192 SegmentIntersection() :
193 iContour(0),
194 iSegment(0),
195 pos_p(0),
196 pos_q(1),
197 type(UNKNOWN),
198 consumed_vertical_up(false),
199 consumed_perimeter_right(false)
200 {}
201
202 // Index of a contour in ExPolygonWithOffset, with which this vertical line intersects.
203 size_t iContour;
204 // Index of a segment in iContour, with which this vertical line intersects.
205 size_t iSegment;
206 // y position of the intersection, ratinal number.
207 int64_t pos_p;
208 uint32_t pos_q;
209
210 coord_t pos() const {
211 // Division rounds both positive and negative down to zero.
212 // Add half of q for an arithmetic rounding effect.
213 int64_t p = pos_p;
214 if (p < 0)
215 p -= int64_t(pos_q>>1);
216 else
217 p += int64_t(pos_q>>1);
218 return coord_t(p / int64_t(pos_q));
219 }
220
221 // Kind of intersection. With the original contour, or with the inner offestted contour?
222 // A vertical segment will be at least intersected by OUTER_LOW, OUTER_HIGH,
223 // but it could be intersected with OUTER_LOW, INNER_LOW, INNER_HIGH, OUTER_HIGH,
224 // and there may be more than one pair of INNER_LOW, INNER_HIGH between OUTER_LOW, OUTER_HIGH.
225 enum SegmentIntersectionType {
226 OUTER_LOW = 0,
227 OUTER_HIGH = 1,
228 INNER_LOW = 2,
229 INNER_HIGH = 3,
230 UNKNOWN = -1
231 };
232 SegmentIntersectionType type;
233
234 // Was this segment along the y axis consumed?
235 // Up means up along the vertical segment.
236 bool consumed_vertical_up;
237 // Was a segment of the inner perimeter contour consumed?
238 // Right means right from the vertical segment.
239 bool consumed_perimeter_right;
240
241 // For the INNER_LOW type, this point may be connected to another INNER_LOW point following a perimeter contour.
242 // For the INNER_HIGH type, this point may be connected to another INNER_HIGH point following a perimeter contour.
243 // If INNER_LOW is connected to INNER_HIGH or vice versa,
244 // one has to make sure the vertical infill line does not overlap with the connecting perimeter line.
245 bool is_inner() const { return type == INNER_LOW || type == INNER_HIGH; }
246 bool is_outer() const { return type == OUTER_LOW || type == OUTER_HIGH; }
247 bool is_low () const { return type == INNER_LOW || type == OUTER_LOW; }
248 bool is_high () const { return type == INNER_HIGH || type == OUTER_HIGH; }
249
250 // Compare two y intersection points given by rational numbers.
251 // Note that the rational number is given as pos_p/pos_q, where pos_p is int64 and pos_q is uint32.
252 // This function calculates pos_p * other.pos_q < other.pos_p * pos_q as a 48bit number.
253 // We don't use 128bit intrinsic data types as these are usually not supported by 32bit compilers and
254 // we don't need the full 128bit precision anyway.
255 bool operator<(const SegmentIntersection &other) const
256 {
257 assert(pos_q > 0);
258 assert(other.pos_q > 0);
259 if (pos_p == 0 || other.pos_p == 0) {
260 // Because the denominators are positive and one of the nominators is zero,
261 // following simple statement holds.
262 return pos_p < other.pos_p;
263 } else {
264 // None of the nominators is zero.
265 char sign1 = (pos_p > 0) ? 1 : -1;
266 char sign2 = (other.pos_p > 0) ? 1 : -1;
267 char signs = sign1 * sign2;
268 assert(signs == 1 || signs == -1);
269 if (signs < 0) {
270 // The nominators have different signs.
271 return sign1 < 0;
272 } else {
273 // The nominators have the same sign.
274 // Absolute values
275 uint64_t p1, p2;
276 if (sign1 > 0) {
277 p1 = uint64_t(pos_p);
278 p2 = uint64_t(other.pos_p);
279 } else {
280 p1 = uint64_t(- pos_p);
281 p2 = uint64_t(- other.pos_p);
282 };
283 // Multiply low and high 32bit words of p1 by other_pos.q
284 // 32bit x 32bit => 64bit
285 // l_hi and l_lo overlap by 32 bits.
286 uint64_t l_hi = (p1 >> 32) * uint64_t(other.pos_q);
287 uint64_t l_lo = (p1 & 0xffffffffll) * uint64_t(other.pos_q);
288 l_hi += (l_lo >> 32);
289 uint64_t r_hi = (p2 >> 32) * uint64_t(pos_q);
290 uint64_t r_lo = (p2 & 0xffffffffll) * uint64_t(pos_q);
291 r_hi += (r_lo >> 32);
292 // Compare the high 64 bits.
293 if (l_hi == r_hi) {
294 // Compare the low 32 bits.
295 l_lo &= 0xffffffffll;
296 r_lo &= 0xffffffffll;
297 return (sign1 < 0) ? (l_lo > r_lo) : (l_lo < r_lo);
298 }
299 return (sign1 < 0) ? (l_hi > r_hi) : (l_hi < r_hi);
300 }
301 }
302 }
303
304 bool operator==(const SegmentIntersection &other) const
305 {
306 assert(pos_q > 0);
307 assert(other.pos_q > 0);
308 if (pos_p == 0 || other.pos_p == 0) {
309 // Because the denominators are positive and one of the nominators is zero,
310 // following simple statement holds.
311 return pos_p == other.pos_p;
312 }
313
314 // None of the nominators is zero, none of the denominators is zero.
315 bool positive = pos_p > 0;
316 if (positive != (other.pos_p > 0))
317 return false;
318 // The nominators have the same sign.
319 // Absolute values
320 uint64_t p1 = positive ? uint64_t(pos_p) : uint64_t(- pos_p);
321 uint64_t p2 = positive ? uint64_t(other.pos_p) : uint64_t(- other.pos_p);
322 // Multiply low and high 32bit words of p1 by other_pos.q
323 // 32bit x 32bit => 64bit
324 // l_hi and l_lo overlap by 32 bits.
325 uint64_t l_lo = (p1 & 0xffffffffll) * uint64_t(other.pos_q);
326 uint64_t r_lo = (p2 & 0xffffffffll) * uint64_t(pos_q);
327 if (l_lo != r_lo)
328 return false;
329 uint64_t l_hi = (p1 >> 32) * uint64_t(other.pos_q);
330 uint64_t r_hi = (p2 >> 32) * uint64_t(pos_q);
331 return l_hi + (l_lo >> 32) == r_hi + (r_lo >> 32);
332 }
333 };
334
335 // A vertical line with intersection points with polygons.
336 class SegmentedIntersectionLine
337 {
338 public:
339 // Index of this vertical intersection line.
340 size_t idx;
341 // x position of this vertical intersection line.
342 coord_t pos;
343 // List of intersection points with polygons, sorted increasingly by the y axis.
344 std::vector<SegmentIntersection> intersections;
345 };
346
347 // A container maintaining an expolygon with its inner offsetted polygon.
348 // The purpose of the inner offsetted polygon is to provide segments to connect the infill lines.
349 struct ExPolygonWithOffset
350 {
351 public:
352 ExPolygonWithOffset(
353 const ExPolygon &expolygon,
354 float angle,
355 coord_t aoffset1,
356 coord_t aoffset2)
357 {
358 // Copy and rotate the source polygons.
359 polygons_src = expolygon;
360 polygons_src.contour.rotate(angle);
361 for (Polygons::iterator it = polygons_src.holes.begin(); it != polygons_src.holes.end(); ++ it)
362 it->rotate(angle);
363
364 double mitterLimit = 3.;
365 // for the infill pattern, don't cut the corners.
366 // default miterLimt = 3
367 //double mitterLimit = 10.;
368 myassert(aoffset1 < 0);
369 myassert(aoffset2 < 0);
370 myassert(aoffset2 < aoffset1);
371 bool sticks_removed = remove_sticks(polygons_src);
372 // if (sticks_removed) printf("Sticks removed!\n");
373 polygons_outer = offset(polygons_src, aoffset1,
374 CLIPPER_OFFSET_SCALE,
375 ClipperLib::jtMiter,
376 mitterLimit);
377 polygons_inner = offset(polygons_outer, aoffset2 - aoffset1,
378 CLIPPER_OFFSET_SCALE,
379 ClipperLib::jtMiter,
380 mitterLimit);
381 // Filter out contours with zero area or small area, contours with 2 points only.
382 const double min_area_threshold = 0.01 * aoffset2 * aoffset2;
383 remove_small(polygons_outer, min_area_threshold);
384 remove_small(polygons_inner, min_area_threshold);
385 remove_sticks(polygons_outer);
386 remove_sticks(polygons_inner);
387 n_contours_outer = polygons_outer.size();
388 n_contours_inner = polygons_inner.size();
389 n_contours = n_contours_outer + n_contours_inner;
390 polygons_ccw.assign(n_contours, false);
391 for (size_t i = 0; i < n_contours; ++ i) {
392 contour(i).remove_duplicate_points();
393 myassert(! contour(i).has_duplicate_points());
394 polygons_ccw[i] = is_ccw(contour(i));
395 }
396 }
397
398 // Any contour with offset1
399 bool is_contour_outer(size_t idx) const { return idx < n_contours_outer; }
400 // Any contour with offset2
401 bool is_contour_inner(size_t idx) const { return idx >= n_contours_outer; }
402
403 const Polygon& contour(size_t idx) const
404 { return is_contour_outer(idx) ? polygons_outer[idx] : polygons_inner[idx - n_contours_outer]; }
405
406 Polygon& contour(size_t idx)
407 { return is_contour_outer(idx) ? polygons_outer[idx] : polygons_inner[idx - n_contours_outer]; }
408
409 bool is_contour_ccw(size_t idx) const { return polygons_ccw[idx]; }
410
411 BoundingBox bounding_box_src() const
412 { return get_extents(polygons_src); }
413 BoundingBox bounding_box_outer() const
414 { return get_extents(polygons_outer); }
415 BoundingBox bounding_box_inner() const
416 { return get_extents(polygons_inner); }
417
418 #ifdef SLIC3R_DEBUG
419 void export_to_svg(Slic3r::SVG &svg) {
420 svg.draw_outline(polygons_src, "black");
421 svg.draw_outline(polygons_outer, "green");
422 svg.draw_outline(polygons_inner, "brown");
423 }
424 #endif /* SLIC3R_DEBUG */
425
426 ExPolygon polygons_src;
427 Polygons polygons_outer;
428 Polygons polygons_inner;
429
430 size_t n_contours_outer;
431 size_t n_contours_inner;
432 size_t n_contours;
433
434 protected:
435 // For each polygon of polygons_inner, remember its orientation.
436 std::vector<unsigned char> polygons_ccw;
437 };
438
439 static inline int distance_of_segmens(const Polygon &poly, size_t seg1, size_t seg2, bool forward)
440 {
441 int d = int(seg2) - int(seg1);
442 if (! forward)
443 d = - d;
444 if (d < 0)
445 d += int(poly.points.size());
446 return d;
447 }
448
449 // For a vertical line, an inner contour and an intersection point,
450 // find an intersection point on the previous resp. next vertical line.
451 // The intersection point is connected with the prev resp. next intersection point with iInnerContour.
452 // Return -1 if there is no such point on the previous resp. next vertical line.
453 static inline int intersection_on_prev_next_vertical_line(
454 const ExPolygonWithOffset &poly_with_offset,
455 const std::vector<SegmentedIntersectionLine> &segs,
456 size_t iVerticalLine,
457 size_t iInnerContour,
458 size_t iIntersection,
459 bool dir_is_next)
460 {
461 size_t iVerticalLineOther = iVerticalLine;
462 if (dir_is_next) {
463 if (++ iVerticalLineOther == segs.size())
464 // No successive vertical line.
465 return -1;
466 } else if (iVerticalLineOther -- == 0) {
467 // No preceding vertical line.
468 return -1;
469 }
470
471 const SegmentedIntersectionLine &il = segs[iVerticalLine];
472 const SegmentIntersection &itsct = il.intersections[iIntersection];
473 const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther];
474 const Polygon &poly = poly_with_offset.contour(iInnerContour);
475 // const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour);
476 const bool forward = itsct.is_low() == dir_is_next;
477 // Resulting index of an intersection point on il2.
478 int out = -1;
479 // Find an intersection point on iVerticalLineOther, intersecting iInnerContour
480 // at the same orientation as iIntersection, and being closest to iIntersection
481 // in the number of contour segments, when following the direction of the contour.
482 int dmin = std::numeric_limits<int>::max();
483 for (size_t i = 0; i < il2.intersections.size(); ++ i) {
484 const SegmentIntersection &itsct2 = il2.intersections[i];
485 if (itsct.iContour == itsct2.iContour && itsct.type == itsct2.type) {
486 /*
487 if (itsct.is_low()) {
488 myassert(itsct.type == SegmentIntersection::INNER_LOW);
489 myassert(iIntersection > 0);
490 myassert(il.intersections[iIntersection-1].type == SegmentIntersection::OUTER_LOW);
491 myassert(i > 0);
492 if (il2.intersections[i-1].is_inner())
493 // Take only the lowest inner intersection point.
494 continue;
495 myassert(il2.intersections[i-1].type == SegmentIntersection::OUTER_LOW);
496 } else {
497 myassert(itsct.type == SegmentIntersection::INNER_HIGH);
498 myassert(iIntersection+1 < il.intersections.size());
499 myassert(il.intersections[iIntersection+1].type == SegmentIntersection::OUTER_HIGH);
500 myassert(i+1 < il2.intersections.size());
501 if (il2.intersections[i+1].is_inner())
502 // Take only the highest inner intersection point.
503 continue;
504 myassert(il2.intersections[i+1].type == SegmentIntersection::OUTER_HIGH);
505 }
506 */
507 // The intersection points lie on the same contour and have the same orientation.
508 // Find the intersection point with a shortest path in the direction of the contour.
509 int d = distance_of_segmens(poly, itsct.iSegment, itsct2.iSegment, forward);
510 if (d < dmin) {
511 out = i;
512 dmin = d;
513 }
514 }
515 }
516 //FIXME this routine is not asymptotic optimal, it will be slow if there are many intersection points along the line.
517 return out;
518 }
519
520 static inline int intersection_on_prev_vertical_line(
521 const ExPolygonWithOffset &poly_with_offset,
522 const std::vector<SegmentedIntersectionLine> &segs,
523 size_t iVerticalLine,
524 size_t iInnerContour,
525 size_t iIntersection)
526 {
527 return intersection_on_prev_next_vertical_line(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, false);
528 }
529
530 static inline int intersection_on_next_vertical_line(
531 const ExPolygonWithOffset &poly_with_offset,
532 const std::vector<SegmentedIntersectionLine> &segs,
533 size_t iVerticalLine,
534 size_t iInnerContour,
535 size_t iIntersection)
536 {
537 return intersection_on_prev_next_vertical_line(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, true);
538 }
539
540 enum IntersectionTypeOtherVLine {
541 // There is no connection point on the other vertical line.
542 INTERSECTION_TYPE_OTHER_VLINE_UNDEFINED = -1,
543 // Connection point on the other vertical segment was found
544 // and it could be followed.
545 INTERSECTION_TYPE_OTHER_VLINE_OK = 0,
546 // The connection segment connects to a middle of a vertical segment.
547 // Cannot follow.
548 INTERSECTION_TYPE_OTHER_VLINE_INNER,
549 // Cannot extend the contor to this intersection point as either the connection segment
550 // or the succeeding vertical segment were already consumed.
551 INTERSECTION_TYPE_OTHER_VLINE_CONSUMED,
552 // Not the first intersection along the contor. This intersection point
553 // has been preceded by an intersection point along the vertical line.
554 INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST,
555 };
556
557 // Find an intersection on a previous line, but return -1, if the connecting segment of a perimeter was already extruded.
558 static inline IntersectionTypeOtherVLine intersection_type_on_prev_next_vertical_line(
559 const std::vector<SegmentedIntersectionLine> &segs,
560 size_t iVerticalLine,
561 size_t iIntersection,
562 size_t iIntersectionOther,
563 bool dir_is_next)
564 {
565 // This routine will propose a connecting line even if the connecting perimeter segment intersects
566 // iVertical line multiple times before reaching iIntersectionOther.
567 if (iIntersectionOther == -1)
568 return INTERSECTION_TYPE_OTHER_VLINE_UNDEFINED;
569 myassert(dir_is_next ? (iVerticalLine + 1 < segs.size()) : (iVerticalLine > 0));
570 const SegmentedIntersectionLine &il_this = segs[iVerticalLine];
571 const SegmentIntersection &itsct_this = il_this.intersections[iIntersection];
572 const SegmentedIntersectionLine &il_other = segs[dir_is_next ? (iVerticalLine+1) : (iVerticalLine-1)];
573 const SegmentIntersection &itsct_other = il_other.intersections[iIntersectionOther];
574 myassert(itsct_other.is_inner());
575 myassert(iIntersectionOther > 0);
576 myassert(iIntersectionOther + 1 < il_other.intersections.size());
577 // Is iIntersectionOther at the boundary of a vertical segment?
578 const SegmentIntersection &itsct_other2 = il_other.intersections[itsct_other.is_low() ? iIntersectionOther - 1 : iIntersectionOther + 1];
579 if (itsct_other2.is_inner())
580 // Cannot follow a perimeter segment into the middle of another vertical segment.
581 // Only perimeter segments connecting to the end of a vertical segment are followed.
582 return INTERSECTION_TYPE_OTHER_VLINE_INNER;
583 myassert(itsct_other.is_low() == itsct_other2.is_low());
584 if (dir_is_next ? itsct_this.consumed_perimeter_right : itsct_other.consumed_perimeter_right)
585 // This perimeter segment was already consumed.
586 return INTERSECTION_TYPE_OTHER_VLINE_CONSUMED;
587 if (itsct_other.is_low() ? itsct_other.consumed_vertical_up : il_other.intersections[iIntersectionOther-1].consumed_vertical_up)
588 // This vertical segment was already consumed.
589 return INTERSECTION_TYPE_OTHER_VLINE_CONSUMED;
590 return INTERSECTION_TYPE_OTHER_VLINE_OK;
591 }
592
593 static inline IntersectionTypeOtherVLine intersection_type_on_prev_vertical_line(
594 const std::vector<SegmentedIntersectionLine> &segs,
595 size_t iVerticalLine,
596 size_t iIntersection,
597 size_t iIntersectionPrev)
598 {
599 return intersection_type_on_prev_next_vertical_line(segs, iVerticalLine, iIntersection, iIntersectionPrev, false);
600 }
601
602 static inline IntersectionTypeOtherVLine intersection_type_on_next_vertical_line(
603 const std::vector<SegmentedIntersectionLine> &segs,
604 size_t iVerticalLine,
605 size_t iIntersection,
606 size_t iIntersectionNext)
607 {
608 return intersection_type_on_prev_next_vertical_line(segs, iVerticalLine, iIntersection, iIntersectionNext, true);
609 }
610
611 // Measure an Euclidian length of a perimeter segment when going from iIntersection to iIntersection2.
612 static inline coordf_t measure_perimeter_prev_next_segment_length(
613 const ExPolygonWithOffset &poly_with_offset,
614 const std::vector<SegmentedIntersectionLine> &segs,
615 size_t iVerticalLine,
616 size_t iInnerContour,
617 size_t iIntersection,
618 size_t iIntersection2,
619 bool dir_is_next)
620 {
621 size_t iVerticalLineOther = iVerticalLine;
622 if (dir_is_next) {
623 if (++ iVerticalLineOther == segs.size())
624 // No successive vertical line.
625 return coordf_t(-1);
626 } else if (iVerticalLineOther -- == 0) {
627 // No preceding vertical line.
628 return coordf_t(-1);
629 }
630
631 const SegmentedIntersectionLine &il = segs[iVerticalLine];
632 const SegmentIntersection &itsct = il.intersections[iIntersection];
633 const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther];
634 const SegmentIntersection &itsct2 = il2.intersections[iIntersection2];
635 const Polygon &poly = poly_with_offset.contour(iInnerContour);
636 // const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour);
637 myassert(itsct.type == itsct2.type);
638 myassert(itsct.iContour == itsct2.iContour);
639 myassert(itsct.is_inner());
640 const bool forward = itsct.is_low() == dir_is_next;
641
642 Point p1(il.pos, itsct.pos());
643 Point p2(il2.pos, itsct2.pos());
644 return forward ?
645 segment_length(poly, itsct .iSegment, p1, itsct2.iSegment, p2) :
646 segment_length(poly, itsct2.iSegment, p2, itsct .iSegment, p1);
647 }
648
649 static inline coordf_t measure_perimeter_prev_segment_length(
650 const ExPolygonWithOffset &poly_with_offset,
651 const std::vector<SegmentedIntersectionLine> &segs,
652 size_t iVerticalLine,
653 size_t iInnerContour,
654 size_t iIntersection,
655 size_t iIntersection2)
656 {
657 return measure_perimeter_prev_next_segment_length(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, iIntersection2, false);
658 }
659
660 static inline coordf_t measure_perimeter_next_segment_length(
661 const ExPolygonWithOffset &poly_with_offset,
662 const std::vector<SegmentedIntersectionLine> &segs,
663 size_t iVerticalLine,
664 size_t iInnerContour,
665 size_t iIntersection,
666 size_t iIntersection2)
667 {
668 return measure_perimeter_prev_next_segment_length(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, iIntersection2, true);
669 }
670
671 // Append the points of a perimeter segment when going from iIntersection to iIntersection2.
672 // The first point (the point of iIntersection) will not be inserted,
673 // the last point will be inserted.
674 static inline void emit_perimeter_prev_next_segment(
675 const ExPolygonWithOffset &poly_with_offset,
676 const std::vector<SegmentedIntersectionLine> &segs,
677 size_t iVerticalLine,
678 size_t iInnerContour,
679 size_t iIntersection,
680 size_t iIntersection2,
681 Polyline &out,
682 bool dir_is_next)
683 {
684 size_t iVerticalLineOther = iVerticalLine;
685 if (dir_is_next) {
686 ++ iVerticalLineOther;
687 myassert(iVerticalLineOther < segs.size());
688 } else {
689 myassert(iVerticalLineOther > 0);
690 -- iVerticalLineOther;
691 }
692
693 const SegmentedIntersectionLine &il = segs[iVerticalLine];
694 const SegmentIntersection &itsct = il.intersections[iIntersection];
695 const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther];
696 const SegmentIntersection &itsct2 = il2.intersections[iIntersection2];
697 const Polygon &poly = poly_with_offset.contour(iInnerContour);
698 // const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour);
699 myassert(itsct.type == itsct2.type);
700 myassert(itsct.iContour == itsct2.iContour);
701 myassert(itsct.is_inner());
702 const bool forward = itsct.is_low() == dir_is_next;
703 // Do not append the first point.
704 // out.points.push_back(Point(il.pos, itsct.pos));
705 if (forward)
706 polygon_segment_append(out.points, poly, itsct.iSegment, itsct2.iSegment);
707 else
708 polygon_segment_append_reversed(out.points, poly, itsct.iSegment, itsct2.iSegment);
709 // Append the last point.
710 out.points.push_back(Point(il2.pos, itsct2.pos()));
711 }
712
713 static inline coordf_t measure_perimeter_segment_on_vertical_line_length(
714 const ExPolygonWithOffset &poly_with_offset,
715 const std::vector<SegmentedIntersectionLine> &segs,
716 size_t iVerticalLine,
717 size_t iInnerContour,
718 size_t iIntersection,
719 size_t iIntersection2,
720 bool forward)
721 {
722 const SegmentedIntersectionLine &il = segs[iVerticalLine];
723 const SegmentIntersection &itsct = il.intersections[iIntersection];
724 const SegmentIntersection &itsct2 = il.intersections[iIntersection2];
725 const Polygon &poly = poly_with_offset.contour(iInnerContour);
726 myassert(itsct.is_inner());
727 myassert(itsct2.is_inner());
728 myassert(itsct.type != itsct2.type);
729 myassert(itsct.iContour == iInnerContour);
730 myassert(itsct.iContour == itsct2.iContour);
731 Point p1(il.pos, itsct.pos());
732 Point p2(il.pos, itsct2.pos());
733 return forward ?
734 segment_length(poly, itsct .iSegment, p1, itsct2.iSegment, p2) :
735 segment_length(poly, itsct2.iSegment, p2, itsct .iSegment, p1);
736 }
737
738 // Append the points of a perimeter segment when going from iIntersection to iIntersection2.
739 // The first point (the point of iIntersection) will not be inserted,
740 // the last point will be inserted.
741 static inline void emit_perimeter_segment_on_vertical_line(
742 const ExPolygonWithOffset &poly_with_offset,
743 const std::vector<SegmentedIntersectionLine> &segs,
744 size_t iVerticalLine,
745 size_t iInnerContour,
746 size_t iIntersection,
747 size_t iIntersection2,
748 Polyline &out,
749 bool forward)
750 {
751 const SegmentedIntersectionLine &il = segs[iVerticalLine];
752 const SegmentIntersection &itsct = il.intersections[iIntersection];
753 const SegmentIntersection &itsct2 = il.intersections[iIntersection2];
754 const Polygon &poly = poly_with_offset.contour(iInnerContour);
755 myassert(itsct.is_inner());
756 myassert(itsct2.is_inner());
757 myassert(itsct.type != itsct2.type);
758 myassert(itsct.iContour == iInnerContour);
759 myassert(itsct.iContour == itsct2.iContour);
760 // Do not append the first point.
761 // out.points.push_back(Point(il.pos, itsct.pos));
762 if (forward)
763 polygon_segment_append(out.points, poly, itsct.iSegment, itsct2.iSegment);
764 else
765 polygon_segment_append_reversed(out.points, poly, itsct.iSegment, itsct2.iSegment);
766 // Append the last point.
767 out.points.push_back(Point(il.pos, itsct2.pos()));
768 }
769
770 //TBD: For precise infill, measure the area of a slab spanned by an infill line.
771 /*
772 static inline float measure_outer_contour_slab(
773 const ExPolygonWithOffset &poly_with_offset,
774 const std::vector<SegmentedIntersectionLine> &segs,
775 size_t i_vline,
776 size_t iIntersection)
777 {
778 const SegmentedIntersectionLine &il = segs[i_vline];
779 const SegmentIntersection &itsct = il.intersections[i_vline];
780 const SegmentIntersection &itsct2 = il.intersections[iIntersection2];
781 const Polygon &poly = poly_with_offset.contour((itsct.iContour);
782 myassert(itsct.is_outer());
783 myassert(itsct2.is_outer());
784 myassert(itsct.type != itsct2.type);
785 myassert(itsct.iContour == itsct2.iContour);
786 if (! itsct.is_outer() || ! itsct2.is_outer() || itsct.type == itsct2.type || itsct.iContour != itsct2.iContour)
787 // Error, return zero area.
788 return 0.f;
789
790 // Find possible connection points on the previous / next vertical line.
791 int iPrev = intersection_on_prev_vertical_line(poly_with_offset, segs, i_vline, itsct.iContour, i_intersection);
792 int iNext = intersection_on_next_vertical_line(poly_with_offset, segs, i_vline, itsct.iContour, i_intersection);
793 // Find possible connection points on the same vertical line.
794 int iAbove = iBelow = -1;
795 // Does the perimeter intersect the current vertical line above intrsctn?
796 for (size_t i = i_intersection + 1; i + 1 < seg.intersections.size(); ++ i)
797 if (seg.intersections[i].iContour == itsct.iContour)
798 { iAbove = i; break; }
799 // Does the perimeter intersect the current vertical line below intrsctn?
800 for (int i = int(i_intersection) - 1; i > 0; -- i)
801 if (seg.intersections[i].iContour == itsct.iContour)
802 { iBelow = i; break; }
803
804 if (iSegAbove != -1 && seg.intersections[iAbove].type == SegmentIntersection::OUTER_HIGH) {
805 // Invalidate iPrev resp. iNext, if the perimeter crosses the current vertical line earlier than iPrev resp. iNext.
806 // The perimeter contour orientation.
807 const Polygon &poly = poly_with_offset.contour(itsct.iContour);
808 {
809 int d_horiz = (iPrev == -1) ? std::numeric_limits<int>::max() :
810 distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, itsct.iSegment, true);
811 int d_down = (iBelow == -1) ? std::numeric_limits<int>::max() :
812 distance_of_segmens(poly, iSegBelow, itsct.iSegment, true);
813 int d_up = (iAbove == -1) ? std::numeric_limits<int>::max() :
814 distance_of_segmens(poly, iSegAbove, itsct.iSegment, true);
815 if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up))
816 // The vertical crossing comes eralier than the prev crossing.
817 // Disable the perimeter going back.
818 intrsctn_type_prev = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST;
819 if (d_up > std::min(d_horiz, d_down))
820 // The horizontal crossing comes earlier than the vertical crossing.
821 vert_seg_dir_valid_mask &= ~DIR_BACKWARD;
822 }
823 {
824 int d_horiz = (iNext == -1) ? std::numeric_limits<int>::max() :
825 distance_of_segmens(poly, itsct.iSegment, segs[i_vline+1].intersections[iNext].iSegment, true);
826 int d_down = (iSegBelow == -1) ? std::numeric_limits<int>::max() :
827 distance_of_segmens(poly, itsct.iSegment, iSegBelow, true);
828 int d_up = (iSegAbove == -1) ? std::numeric_limits<int>::max() :
829 distance_of_segmens(poly, itsct.iSegment, iSegAbove, true);
830 if (d_up > std::min(d_horiz, d_down))
831 // The horizontal crossing comes earlier than the vertical crossing.
832 vert_seg_dir_valid_mask &= ~DIR_FORWARD;
833 }
834 }
835 }
836 */
837
838 enum DirectionMask
839 {
840 DIR_FORWARD = 1,
841 DIR_BACKWARD = 2
842 };
843
844 bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillParams &params, float angleBase, float pattern_shift, Polylines &polylines_out)
845 {
846 // At the end, only the new polylines will be rotated back.
847 size_t n_polylines_out_initial = polylines_out.size();
848
849 // Shrink the input polygon a bit first to not push the infill lines out of the perimeters.
850 // const float INFILL_OVERLAP_OVER_SPACING = 0.3f;
851 const float INFILL_OVERLAP_OVER_SPACING = 0.45f;
852 myassert(INFILL_OVERLAP_OVER_SPACING > 0 && INFILL_OVERLAP_OVER_SPACING < 0.5f);
853
854 // Rotate polygons so that we can work with vertical lines here
855 std::pair<float, Point> rotate_vector = this->_infill_direction(surface);
856 rotate_vector.first += angleBase;
857
858 myassert(params.density > 0.0001f && params.density <= 1.f);
859 coord_t line_spacing = coord_t(scale_(this->spacing) / params.density);
860
861 // On the polygons of poly_with_offset, the infill lines will be connected.
862 ExPolygonWithOffset poly_with_offset(
863 surface->expolygon,
864 - rotate_vector.first,
865 scale_(- (0.5 - INFILL_OVERLAP_OVER_SPACING) * this->spacing),
866 scale_(- 0.5 * this->spacing));
867 if (poly_with_offset.n_contours_inner == 0) {
868 // Not a single infill line fits.
869 //FIXME maybe one shall trigger the gap fill here?
870 return true;
871 }
872
873 BoundingBox bounding_box = poly_with_offset.bounding_box_src();
874
875 // define flow spacing according to requested density
876 bool full_infill = params.density > 0.9999f;
877 if (full_infill && !params.dont_adjust) {
878 line_spacing = this->_adjust_solid_spacing(bounding_box.size().x, line_spacing);
879 this->spacing = unscale(line_spacing);
880 } else {
881 // extend bounding box so that our pattern will be aligned with other layers
882 // Transform the reference point to the rotated coordinate system.
883 Point refpt = rotate_vector.second.rotated(- rotate_vector.first);
884 // _align_to_grid will not work correctly with positive pattern_shift.
885 coord_t pattern_shift_scaled = coord_t(scale_(pattern_shift)) % line_spacing;
886 refpt.x -= (pattern_shift_scaled > 0) ? pattern_shift_scaled : (line_spacing + pattern_shift_scaled);
887 bounding_box.merge(_align_to_grid(
888 bounding_box.min,
889 Point(line_spacing, line_spacing),
890 refpt));
891 }
892
893 // Intersect a set of euqally spaced vertical lines wiht expolygon.
894 // n_vlines = ceil(bbox_width / line_spacing)
895 size_t n_vlines = (bounding_box.max.x - bounding_box.min.x + line_spacing - 1) / line_spacing;
896 coord_t x0 = bounding_box.min.x + (line_spacing + SCALED_EPSILON) / 2;
897
898 #ifdef SLIC3R_DEBUG
899 static int iRun = 0;
900 BoundingBox bbox_svg = poly_with_offset.bounding_box_outer();
901 ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-%d.svg", iRun), bbox_svg); // , scale_(1.));
902 poly_with_offset.export_to_svg(svg);
903 {
904 ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-initial-%d.svg", iRun), bbox_svg); // , scale_(1.));
905 poly_with_offset.export_to_svg(svg);
906 }
907 iRun ++;
908 #endif /* SLIC3R_DEBUG */
909
910 // For each contour
911 // Allocate storage for the segments.
912 std::vector<SegmentedIntersectionLine> segs(n_vlines, SegmentedIntersectionLine());
913 for (size_t i = 0; i < n_vlines; ++ i) {
914 segs[i].idx = i;
915 segs[i].pos = x0 + i * line_spacing;
916 }
917 for (size_t iContour = 0; iContour < poly_with_offset.n_contours; ++ iContour) {
918 const Points &contour = poly_with_offset.contour(iContour).points;
919 if (contour.size() < 2)
920 continue;
921 // For each segment
922 for (size_t iSegment = 0; iSegment < contour.size(); ++ iSegment) {
923 size_t iPrev = ((iSegment == 0) ? contour.size() : iSegment) - 1;
924 const Point &p1 = contour[iPrev];
925 const Point &p2 = contour[iSegment];
926 // Which of the equally spaced vertical lines is intersected by this segment?
927 coord_t l = p1.x;
928 coord_t r = p2.x;
929 if (l > r)
930 std::swap(l, r);
931 // il, ir are the left / right indices of vertical lines intersecting a segment
932 int il = (l - x0) / line_spacing;
933 while (il * line_spacing + x0 < l)
934 ++ il;
935 il = std::max(int(0), il);
936 int ir = (r - x0 + line_spacing) / line_spacing;
937 while (ir * line_spacing + x0 > r)
938 -- ir;
939 ir = std::min(int(segs.size()) - 1, ir);
940 if (il > ir)
941 // No vertical line intersects this segment.
942 continue;
943 myassert(il >= 0 && il < segs.size());
944 myassert(ir >= 0 && ir < segs.size());
945 for (int i = il; i <= ir; ++ i) {
946 coord_t this_x = segs[i].pos;
947 assert(this_x == i * line_spacing + x0);
948 SegmentIntersection is;
949 is.iContour = iContour;
950 is.iSegment = iSegment;
951 myassert(l <= this_x);
952 myassert(r >= this_x);
953 // Calculate the intersection position in y axis. x is known.
954 if (p1.x == this_x) {
955 if (p2.x == this_x) {
956 // Ignore strictly vertical segments.
957 continue;
958 }
959 is.pos_p = p1.y;
960 is.pos_q = 1;
961 } else if (p2.x == this_x) {
962 is.pos_p = p2.y;
963 is.pos_q = 1;
964 } else {
965 // First calculate the intersection parameter 't' as a rational number with non negative denominator.
966 if (p2.x > p1.x) {
967 is.pos_p = this_x - p1.x;
968 is.pos_q = p2.x - p1.x;
969 } else {
970 is.pos_p = p1.x - this_x;
971 is.pos_q = p1.x - p2.x;
972 }
973 myassert(is.pos_p >= 0 && is.pos_p <= is.pos_q);
974 // Make an intersection point from the 't'.
975 is.pos_p *= int64_t(p2.y - p1.y);
976 is.pos_p += p1.y * int64_t(is.pos_q);
977 }
978 // +-1 to take rounding into account.
979 myassert(is.pos() + 1 >= std::min(p1.y, p2.y));
980 myassert(is.pos() <= std::max(p1.y, p2.y) + 1);
981 segs[i].intersections.push_back(is);
982 }
983 }
984 }
985
986 // Sort the intersections along their segments, specify the intersection types.
987 for (size_t i_seg = 0; i_seg < segs.size(); ++ i_seg) {
988 SegmentedIntersectionLine &sil = segs[i_seg];
989 // Sort the intersection points using exact rational arithmetic.
990 std::sort(sil.intersections.begin(), sil.intersections.end());
991
992 #if 0
993 // Verify the order, bubble sort the intersections until sorted.
994 bool modified = false;
995 do {
996 modified = false;
997 for (size_t i = 1; i < sil.intersections.size(); ++ i) {
998 size_t iContour1 = sil.intersections[i-1].iContour;
999 size_t iContour2 = sil.intersections[i].iContour;
1000 const Points &contour1 = poly_with_offset.contour(iContour1).points;
1001 const Points &contour2 = poly_with_offset.contour(iContour2).points;
1002 size_t iSegment1 = sil.intersections[i-1].iSegment;
1003 size_t iPrev1 = ((iSegment1 == 0) ? contour1.size() : iSegment1) - 1;
1004 size_t iSegment2 = sil.intersections[i].iSegment;
1005 size_t iPrev2 = ((iSegment2 == 0) ? contour2.size() : iSegment2) - 1;
1006 bool swap = false;
1007 if (iContour1 == iContour2 && iSegment1 == iSegment2) {
1008 // The same segment, it has to be vertical.
1009 myassert(iPrev1 == iPrev2);
1010 swap = contour1[iPrev1].y > contour1[iContour1].y;
1011 #ifdef SLIC3R_DEBUG
1012 if (swap)
1013 printf("Swapping when single vertical segment\n");
1014 #endif
1015 } else {
1016 // Segments are in a general position. Here an exact airthmetics may come into play.
1017 coord_t y1max = std::max(contour1[iPrev1].y, contour1[iSegment1].y);
1018 coord_t y2min = std::min(contour2[iPrev2].y, contour2[iSegment2].y);
1019 if (y1max < y2min) {
1020 // The segments are separated, nothing to do.
1021 } else {
1022 // Use an exact predicate to verify, that segment1 is below segment2.
1023 const Point *a = &contour1[iPrev1];
1024 const Point *b = &contour1[iSegment1];
1025 const Point *c = &contour2[iPrev2];
1026 const Point *d = &contour2[iSegment2];
1027 #ifdef SLIC3R_DEBUG
1028 const Point x1(sil.pos, sil.intersections[i-1].pos);
1029 const Point x2(sil.pos, sil.intersections[i ].pos);
1030 bool successive = false;
1031 #endif /* SLIC3R_DEBUG */
1032 // Sort the points in the two segments by x.
1033 if (a->x > b->x)
1034 std::swap(a, b);
1035 if (c->x > d->x)
1036 std::swap(c, d);
1037 myassert(a->x <= sil.pos);
1038 myassert(c->x <= sil.pos);
1039 myassert(b->x >= sil.pos);
1040 myassert(d->x >= sil.pos);
1041 // Sort the two segments, so the segment <a,b> will be on the left of <c,d>.
1042 bool upper_more_left = false;
1043 if (a->x > c->x) {
1044 upper_more_left = true;
1045 std::swap(a, c);
1046 std::swap(b, d);
1047 }
1048 if (a == c) {
1049 // The segments iSegment1 and iSegment2 are directly connected.
1050 myassert(iContour1 == iContour2);
1051 myassert(iSegment1 == iPrev2 || iPrev1 == iSegment2);
1052 std::swap(c, d);
1053 myassert(a != c && b != c);
1054 #ifdef SLIC3R_DEBUG
1055 successive = true;
1056 #endif /* SLIC3R_DEBUG */
1057 }
1058 #ifdef SLIC3R_DEBUG
1059 else if (b == d) {
1060 // The segments iSegment1 and iSegment2 are directly connected.
1061 myassert(iContour1 == iContour2);
1062 myassert(iSegment1 == iPrev2 || iPrev1 == iSegment2);
1063 myassert(a != c && b != c);
1064 successive = true;
1065 }
1066 #endif /* SLIC3R_DEBUG */
1067 Orientation o = orient(*a, *b, *c);
1068 myassert(o != ORIENTATION_COLINEAR);
1069 swap = upper_more_left != (o == ORIENTATION_CW);
1070 #ifdef SLIC3R_DEBUG
1071 if (swap)
1072 printf(successive ?
1073 "Swapping when iContour1 == iContour2 and successive segments\n" :
1074 "Swapping when exact predicate\n");
1075 #endif
1076 }
1077 }
1078 if (swap) {
1079 // Swap the intersection points, but keep the original positions, so they stay sorted by the y axis.
1080 std::swap(sil.intersections[i-1], sil.intersections[i]);
1081 std::swap(sil.intersections[i-1].pos_p, sil.intersections[i].pos_p);
1082 std::swap(sil.intersections[i-1].pos_q, sil.intersections[i].pos_q);
1083 modified = true;
1084 }
1085 }
1086 } while (modified);
1087 #endif
1088
1089 // Assign the intersection types, remove duplicate or overlapping intersection points.
1090 // When a loop vertex touches a vertical line, intersection point is generated for both segments.
1091 // If such two segments are oriented equally, then one of them is removed.
1092 // Otherwise the vertex is tangential to the vertical line and both segments are removed.
1093 // The same rule applies, if the loop is pinched into a single point and this point touches the vertical line:
1094 // The loop has a zero vertical size at the vertical line, therefore the intersection point is removed.
1095 size_t j = 0;
1096 for (size_t i = 0; i < sil.intersections.size(); ++ i) {
1097 // What is the orientation of the segment at the intersection point?
1098 size_t iContour = sil.intersections[i].iContour;
1099 const Points &contour = poly_with_offset.contour(iContour).points;
1100 size_t iSegment = sil.intersections[i].iSegment;
1101 size_t iPrev = ((iSegment == 0) ? contour.size() : iSegment) - 1;
1102 coord_t dir = contour[iSegment].x - contour[iPrev].x;
1103 // bool ccw = poly_with_offset.is_contour_ccw(iContour);
1104 // bool low = (dir > 0) == ccw;
1105 bool low = dir > 0;
1106 sil.intersections[i].type = poly_with_offset.is_contour_outer(iContour) ?
1107 (low ? SegmentIntersection::OUTER_LOW : SegmentIntersection::OUTER_HIGH) :
1108 (low ? SegmentIntersection::INNER_LOW : SegmentIntersection::INNER_HIGH);
1109 if (j > 0 &&
1110 sil.intersections[i].pos() == sil.intersections[j-1].pos() &&
1111 sil.intersections[i].iContour == sil.intersections[j-1].iContour) {
1112 if (sil.intersections[i].type == sil.intersections[j-1].type) {
1113 // This has to be a corner point crossing the vertical line.
1114 // Remove the second intersection point.
1115 #ifdef SLIC3R_DEBUG
1116 size_t iSegment2 = sil.intersections[j-1].iSegment;
1117 size_t iPrev2 = ((iSegment2 == 0) ? contour.size() : iSegment2) - 1;
1118 myassert(iSegment == iPrev2 || iSegment2 == iPrev);
1119 #endif /* SLIC3R_DEBUG */
1120 } else {
1121 // This is a loop returning to the same point.
1122 // It may as well be a vertex of a loop touching this vertical line.
1123 // Remove both the lines.
1124 -- j;
1125 }
1126 } else {
1127 if (j < i)
1128 sil.intersections[j] = sil.intersections[i];
1129 ++ j;
1130 }
1131 //FIXME solve a degenerate case, where there is a vertical segment on this vertical line and the contour
1132 // follows from left to right or vice versa, leading to low,low or high,high intersections.
1133 }
1134 // Shrink the list of intersections, if any of the intersection was removed during the classification.
1135 if (j < sil.intersections.size())
1136 sil.intersections.erase(sil.intersections.begin() + j, sil.intersections.end());
1137 }
1138
1139 // Verify the segments. If something is wrong, give up.
1140 #define ASSERT_OR_RETURN(CONDITION) do { assert(CONDITION); if (! (CONDITION)) return false; } while (0)
1141 for (size_t i_seg = 0; i_seg < segs.size(); ++ i_seg) {
1142 SegmentedIntersectionLine &sil = segs[i_seg];
1143 // The intersection points have to be even.
1144 ASSERT_OR_RETURN((sil.intersections.size() & 1) == 0);
1145 for (size_t i = 0; i < sil.intersections.size();) {
1146 // An intersection segment crossing the bigger contour may cross the inner offsetted contour even number of times.
1147 ASSERT_OR_RETURN(sil.intersections[i].type == SegmentIntersection::OUTER_LOW);
1148 size_t j = i + 1;
1149 ASSERT_OR_RETURN(j < sil.intersections.size());
1150 ASSERT_OR_RETURN(sil.intersections[j].type == SegmentIntersection::INNER_LOW || sil.intersections[j].type == SegmentIntersection::OUTER_HIGH);
1151 for (; j < sil.intersections.size() && sil.intersections[j].is_inner(); ++ j) ;
1152 ASSERT_OR_RETURN(j < sil.intersections.size());
1153 ASSERT_OR_RETURN((j & 1) == 1);
1154 ASSERT_OR_RETURN(sil.intersections[j].type == SegmentIntersection::OUTER_HIGH);
1155 ASSERT_OR_RETURN(i + 1 == j || sil.intersections[j - 1].type == SegmentIntersection::INNER_HIGH);
1156 i = j + 1;
1157 }
1158 }
1159 #undef ASSERT_OR_RETURN
1160
1161 #ifdef SLIC3R_DEBUG
1162 // Paint the segments and finalize the SVG file.
1163 for (size_t i_seg = 0; i_seg < segs.size(); ++ i_seg) {
1164 SegmentedIntersectionLine &sil = segs[i_seg];
1165 for (size_t i = 0; i < sil.intersections.size();) {
1166 size_t j = i + 1;
1167 for (; j < sil.intersections.size() && sil.intersections[j].is_inner(); ++ j) ;
1168 if (i + 1 == j) {
1169 svg.draw(Line(Point(sil.pos, sil.intersections[i].pos()), Point(sil.pos, sil.intersections[j].pos())), "blue");
1170 } else {
1171 svg.draw(Line(Point(sil.pos, sil.intersections[i].pos()), Point(sil.pos, sil.intersections[i+1].pos())), "green");
1172 svg.draw(Line(Point(sil.pos, sil.intersections[i+1].pos()), Point(sil.pos, sil.intersections[j-1].pos())), (j - i + 1 > 4) ? "yellow" : "magenta");
1173 svg.draw(Line(Point(sil.pos, sil.intersections[j-1].pos()), Point(sil.pos, sil.intersections[j].pos())), "green");
1174 }
1175 i = j + 1;
1176 }
1177 }
1178 svg.Close();
1179 #endif /* SLIC3R_DEBUG */
1180
1181 // For each outer only chords, measure their maximum distance to the bow of the outer contour.
1182 // Mark an outer only chord as consumed, if the distance is low.
1183 for (size_t i_vline = 0; i_vline < segs.size(); ++ i_vline) {
1184 SegmentedIntersectionLine &seg = segs[i_vline];
1185 for (size_t i_intersection = 0; i_intersection + 1 < seg.intersections.size(); ++ i_intersection) {
1186 if (seg.intersections[i_intersection].type == SegmentIntersection::OUTER_LOW &&
1187 seg.intersections[i_intersection+1].type == SegmentIntersection::OUTER_HIGH) {
1188 bool consumed = false;
1189 // if (full_infill) {
1190 // measure_outer_contour_slab(poly_with_offset, segs, i_vline, i_ntersection);
1191 // } else
1192 consumed = true;
1193 seg.intersections[i_intersection].consumed_vertical_up = consumed;
1194 }
1195 }
1196 }
1197
1198 // Now construct a graph.
1199 // Find the first point.
1200 // Naively one would expect to achieve best results by chaining the paths by the shortest distance,
1201 // but that procedure does not create the longest continuous paths.
1202 // A simple "sweep left to right" procedure achieves better results.
1203 size_t i_vline = 0;
1204 size_t i_intersection = size_t(-1);
1205 // Follow the line, connect the lines into a graph.
1206 // Until no new line could be added to the output path:
1207 Point pointLast;
1208 Polyline *polyline_current = NULL;
1209 if (! polylines_out.empty())
1210 pointLast = polylines_out.back().points.back();
1211 for (;;) {
1212 if (i_intersection == size_t(-1)) {
1213 // The path has been interrupted. Find a next starting point, closest to the previous extruder position.
1214 coordf_t dist2min = std::numeric_limits<coordf_t>().max();
1215 for (size_t i_vline2 = 0; i_vline2 < segs.size(); ++ i_vline2) {
1216 const SegmentedIntersectionLine &seg = segs[i_vline2];
1217 if (! seg.intersections.empty()) {
1218 myassert(seg.intersections.size() > 1);
1219 // Even number of intersections with the loops.
1220 myassert((seg.intersections.size() & 1) == 0);
1221 myassert(seg.intersections.front().type == SegmentIntersection::OUTER_LOW);
1222 for (size_t i = 0; i < seg.intersections.size(); ++ i) {
1223 const SegmentIntersection &intrsctn = seg.intersections[i];
1224 if (intrsctn.is_outer()) {
1225 myassert(intrsctn.is_low() || i > 0);
1226 bool consumed = intrsctn.is_low() ?
1227 intrsctn.consumed_vertical_up :
1228 seg.intersections[i-1].consumed_vertical_up;
1229 if (! consumed) {
1230 coordf_t dist2 = sqr(coordf_t(pointLast.x - seg.pos)) + sqr(coordf_t(pointLast.y - intrsctn.pos()));
1231 if (dist2 < dist2min) {
1232 dist2min = dist2;
1233 i_vline = i_vline2;
1234 i_intersection = i;
1235 //FIXME We are taking the first left point always. Verify, that the caller chains the paths
1236 // by a shortest distance, while reversing the paths if needed.
1237 //if (polylines_out.empty())
1238 // Initial state, take the first line, which is the first from the left.
1239 goto found;
1240 }
1241 }
1242 }
1243 }
1244 }
1245 }
1246 if (i_intersection == size_t(-1))
1247 // We are finished.
1248 break;
1249 found:
1250 // Start a new path.
1251 polylines_out.push_back(Polyline());
1252 polyline_current = &polylines_out.back();
1253 // Emit the first point of a path.
1254 pointLast = Point(segs[i_vline].pos, segs[i_vline].intersections[i_intersection].pos());
1255 polyline_current->points.push_back(pointLast);
1256 }
1257
1258 // From the initial point (i_vline, i_intersection), follow a path.
1259 SegmentedIntersectionLine &seg = segs[i_vline];
1260 SegmentIntersection *intrsctn = &seg.intersections[i_intersection];
1261 bool going_up = intrsctn->is_low();
1262 bool try_connect = false;
1263 if (going_up) {
1264 myassert(! intrsctn->consumed_vertical_up);
1265 myassert(i_intersection + 1 < seg.intersections.size());
1266 // Step back to the beginning of the vertical segment to mark it as consumed.
1267 if (intrsctn->is_inner()) {
1268 myassert(i_intersection > 0);
1269 -- intrsctn;
1270 -- i_intersection;
1271 }
1272 // Consume the complete vertical segment up to the outer contour.
1273 do {
1274 intrsctn->consumed_vertical_up = true;
1275 ++ intrsctn;
1276 ++ i_intersection;
1277 myassert(i_intersection < seg.intersections.size());
1278 } while (intrsctn->type != SegmentIntersection::OUTER_HIGH);
1279 if ((intrsctn - 1)->is_inner()) {
1280 // Step back.
1281 -- intrsctn;
1282 -- i_intersection;
1283 myassert(intrsctn->type == SegmentIntersection::INNER_HIGH);
1284 try_connect = true;
1285 }
1286 } else {
1287 // Going down.
1288 myassert(intrsctn->is_high());
1289 myassert(i_intersection > 0);
1290 myassert(! (intrsctn - 1)->consumed_vertical_up);
1291 // Consume the complete vertical segment up to the outer contour.
1292 if (intrsctn->is_inner())
1293 intrsctn->consumed_vertical_up = true;
1294 do {
1295 myassert(i_intersection > 0);
1296 -- intrsctn;
1297 -- i_intersection;
1298 intrsctn->consumed_vertical_up = true;
1299 } while (intrsctn->type != SegmentIntersection::OUTER_LOW);
1300 if ((intrsctn + 1)->is_inner()) {
1301 // Step back.
1302 ++ intrsctn;
1303 ++ i_intersection;
1304 myassert(intrsctn->type == SegmentIntersection::INNER_LOW);
1305 try_connect = true;
1306 }
1307 }
1308 if (try_connect) {
1309 // Decide, whether to finish the segment, or whether to follow the perimeter.
1310
1311 // 1) Find possible connection points on the previous / next vertical line.
1312 int iPrev = intersection_on_prev_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection);
1313 int iNext = intersection_on_next_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection);
1314 IntersectionTypeOtherVLine intrsctn_type_prev = intersection_type_on_prev_vertical_line(segs, i_vline, i_intersection, iPrev);
1315 IntersectionTypeOtherVLine intrsctn_type_next = intersection_type_on_next_vertical_line(segs, i_vline, i_intersection, iNext);
1316
1317 // 2) Find possible connection points on the same vertical line.
1318 int iAbove = -1;
1319 int iBelow = -1;
1320 int iSegAbove = -1;
1321 int iSegBelow = -1;
1322 {
1323 SegmentIntersection::SegmentIntersectionType type_crossing = (intrsctn->type == SegmentIntersection::INNER_LOW) ?
1324 SegmentIntersection::INNER_HIGH : SegmentIntersection::INNER_LOW;
1325 // Does the perimeter intersect the current vertical line above intrsctn?
1326 for (size_t i = i_intersection + 1; i + 1 < seg.intersections.size(); ++ i)
1327 // if (seg.intersections[i].iContour == intrsctn->iContour && seg.intersections[i].type == type_crossing) {
1328 if (seg.intersections[i].iContour == intrsctn->iContour) {
1329 iAbove = i;
1330 iSegAbove = seg.intersections[i].iSegment;
1331 break;
1332 }
1333 // Does the perimeter intersect the current vertical line below intrsctn?
1334 for (size_t i = i_intersection - 1; i > 0; -- i)
1335 // if (seg.intersections[i].iContour == intrsctn->iContour && seg.intersections[i].type == type_crossing) {
1336 if (seg.intersections[i].iContour == intrsctn->iContour) {
1337 iBelow = i;
1338 iSegBelow = seg.intersections[i].iSegment;
1339 break;
1340 }
1341 }
1342
1343 // 3) Sort the intersection points, clear iPrev / iNext / iSegBelow / iSegAbove,
1344 // if it is preceded by any other intersection point along the contour.
1345 unsigned int vert_seg_dir_valid_mask =
1346 (going_up ?
1347 (iSegAbove != -1 && seg.intersections[iAbove].type == SegmentIntersection::INNER_LOW) :
1348 (iSegBelow != -1 && seg.intersections[iBelow].type == SegmentIntersection::INNER_HIGH)) ?
1349 (DIR_FORWARD | DIR_BACKWARD) :
1350 0;
1351 {
1352 // Invalidate iPrev resp. iNext, if the perimeter crosses the current vertical line earlier than iPrev resp. iNext.
1353 // The perimeter contour orientation.
1354 const bool forward = intrsctn->is_low(); // == poly_with_offset.is_contour_ccw(intrsctn->iContour);
1355 const Polygon &poly = poly_with_offset.contour(intrsctn->iContour);
1356 {
1357 int d_horiz = (iPrev == -1) ? std::numeric_limits<int>::max() :
1358 distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, intrsctn->iSegment, forward);
1359 int d_down = (iSegBelow == -1) ? std::numeric_limits<int>::max() :
1360 distance_of_segmens(poly, iSegBelow, intrsctn->iSegment, forward);
1361 int d_up = (iSegAbove == -1) ? std::numeric_limits<int>::max() :
1362 distance_of_segmens(poly, iSegAbove, intrsctn->iSegment, forward);
1363 if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up))
1364 // The vertical crossing comes eralier than the prev crossing.
1365 // Disable the perimeter going back.
1366 intrsctn_type_prev = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST;
1367 if (going_up ? (d_up > std::min(d_horiz, d_down)) : (d_down > std::min(d_horiz, d_up)))
1368 // The horizontal crossing comes earlier than the vertical crossing.
1369 vert_seg_dir_valid_mask &= ~(forward ? DIR_BACKWARD : DIR_FORWARD);
1370 }
1371 {
1372 int d_horiz = (iNext == -1) ? std::numeric_limits<int>::max() :
1373 distance_of_segmens(poly, intrsctn->iSegment, segs[i_vline+1].intersections[iNext].iSegment, forward);
1374 int d_down = (iSegBelow == -1) ? std::numeric_limits<int>::max() :
1375 distance_of_segmens(poly, intrsctn->iSegment, iSegBelow, forward);
1376 int d_up = (iSegAbove == -1) ? std::numeric_limits<int>::max() :
1377 distance_of_segmens(poly, intrsctn->iSegment, iSegAbove, forward);
1378 if (intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up))
1379 // The vertical crossing comes eralier than the prev crossing.
1380 // Disable the perimeter going forward.
1381 intrsctn_type_next = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST;
1382 if (going_up ? (d_up > std::min(d_horiz, d_down)) : (d_down > std::min(d_horiz, d_up)))
1383 // The horizontal crossing comes earlier than the vertical crossing.
1384 vert_seg_dir_valid_mask &= ~(forward ? DIR_FORWARD : DIR_BACKWARD);
1385 }
1386 }
1387
1388 // 4) Try to connect to a previous or next vertical line, making a zig-zag pattern.
1389 if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK || intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) {
1390 coordf_t distPrev = (intrsctn_type_prev != INTERSECTION_TYPE_OTHER_VLINE_OK) ? std::numeric_limits<coord_t>::max() :
1391 measure_perimeter_prev_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iPrev);
1392 coordf_t distNext = (intrsctn_type_next != INTERSECTION_TYPE_OTHER_VLINE_OK) ? std::numeric_limits<coord_t>::max() :
1393 measure_perimeter_next_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext);
1394 // Take the shorter path.
1395 //FIXME this may not be always the best strategy to take the shortest connection line now.
1396 bool take_next = (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) ?
1397 (distNext < distPrev) :
1398 intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK;
1399 myassert(intrsctn->is_inner());
1400 bool skip = params.dont_connect || (link_max_length > 0 && (take_next ? distNext : distPrev) > link_max_length);
1401 if (skip) {
1402 // Just skip the connecting contour and start a new path.
1403 goto dont_connect;
1404 polyline_current->points.push_back(Point(seg.pos, intrsctn->pos()));
1405 polylines_out.push_back(Polyline());
1406 polyline_current = &polylines_out.back();
1407 const SegmentedIntersectionLine &il2 = segs[take_next ? (i_vline + 1) : (i_vline - 1)];
1408 polyline_current->points.push_back(Point(il2.pos, il2.intersections[take_next ? iNext : iPrev].pos()));
1409 } else {
1410 polyline_current->points.push_back(Point(seg.pos, intrsctn->pos()));
1411 emit_perimeter_prev_next_segment(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, take_next ? iNext : iPrev, *polyline_current, take_next);
1412 }
1413 // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed.
1414 if (iPrev != -1)
1415 segs[i_vline-1].intersections[iPrev].consumed_perimeter_right = true;
1416 if (iNext != -1)
1417 intrsctn->consumed_perimeter_right = true;
1418 //FIXME consume the left / right connecting segments at the other end of this line? Currently it is not critical because a perimeter segment is not followed if the vertical segment at the other side has already been consumed.
1419 // Advance to the neighbor line.
1420 if (take_next) {
1421 ++ i_vline;
1422 i_intersection = iNext;
1423 } else {
1424 -- i_vline;
1425 i_intersection = iPrev;
1426 }
1427 continue;
1428 }
1429
1430 // 5) Try to connect to a previous or next point on the same vertical line.
1431 if (vert_seg_dir_valid_mask) {
1432 bool valid = true;
1433 // Verify, that there is no intersection with the inner contour up to the end of the contour segment.
1434 // Verify, that the successive segment has not been consumed yet.
1435 if (going_up) {
1436 if (seg.intersections[iAbove].consumed_vertical_up) {
1437 valid = false;
1438 } else {
1439 for (int i = (int)i_intersection + 1; i < iAbove && valid; ++i)
1440 if (seg.intersections[i].is_inner())
1441 valid = false;
1442 }
1443 } else {
1444 if (seg.intersections[iBelow-1].consumed_vertical_up) {
1445 valid = false;
1446 } else {
1447 for (int i = iBelow + 1; i < (int)i_intersection && valid; ++i)
1448 if (seg.intersections[i].is_inner())
1449 valid = false;
1450 }
1451 }
1452 if (valid) {
1453 const Polygon &poly = poly_with_offset.contour(intrsctn->iContour);
1454 int iNext = going_up ? iAbove : iBelow;
1455 int iSegNext = going_up ? iSegAbove : iSegBelow;
1456 bool dir_forward = (vert_seg_dir_valid_mask == (DIR_FORWARD | DIR_BACKWARD)) ?
1457 // Take the shorter length between the current and the next intersection point.
1458 (distance_of_segmens(poly, intrsctn->iSegment, iSegNext, true) <
1459 distance_of_segmens(poly, intrsctn->iSegment, iSegNext, false)) :
1460 (vert_seg_dir_valid_mask == DIR_FORWARD);
1461 // Skip this perimeter line?
1462 bool skip = params.dont_connect;
1463 if (! skip && link_max_length > 0) {
1464 coordf_t link_length = measure_perimeter_segment_on_vertical_line_length(
1465 poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, dir_forward);
1466 skip = link_length > link_max_length;
1467 }
1468 polyline_current->points.push_back(Point(seg.pos, intrsctn->pos()));
1469 if (skip) {
1470 // Just skip the connecting contour and start a new path.
1471 polylines_out.push_back(Polyline());
1472 polyline_current = &polylines_out.back();
1473 polyline_current->points.push_back(Point(seg.pos, seg.intersections[iNext].pos()));
1474 } else {
1475 // Consume the connecting contour and the next segment.
1476 emit_perimeter_segment_on_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, *polyline_current, dir_forward);
1477 }
1478 // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed.
1479 // If there are any outer intersection points skipped (bypassed) by the contour,
1480 // mark them as processed.
1481 if (going_up) {
1482 for (int i = (int)i_intersection; i < iAbove; ++ i)
1483 seg.intersections[i].consumed_vertical_up = true;
1484 } else {
1485 for (int i = iBelow; i < (int)i_intersection; ++ i)
1486 seg.intersections[i].consumed_vertical_up = true;
1487 }
1488 // seg.intersections[going_up ? i_intersection : i_intersection - 1].consumed_vertical_up = true;
1489 intrsctn->consumed_perimeter_right = true;
1490 i_intersection = iNext;
1491 if (going_up)
1492 ++ intrsctn;
1493 else
1494 -- intrsctn;
1495 intrsctn->consumed_perimeter_right = true;
1496 continue;
1497 }
1498 }
1499 dont_connect:
1500 // No way to continue the current polyline. Take the rest of the line up to the outer contour.
1501 // This will finish the polyline, starting another polyline at a new point.
1502 if (going_up)
1503 ++ intrsctn;
1504 else
1505 -- intrsctn;
1506 }
1507
1508 // Finish the current vertical line,
1509 // reset the current vertical line to pick a new starting point in the next round.
1510 myassert(intrsctn->is_outer());
1511 myassert(intrsctn->is_high() == going_up);
1512 pointLast = Point(seg.pos, intrsctn->pos());
1513 polyline_current->points.push_back(pointLast);
1514 // Handle duplicate points and zero length segments.
1515 polyline_current->remove_duplicate_points();
1516 myassert(! polyline_current->has_duplicate_points());
1517 // Handle nearly zero length edges.
1518 if (polyline_current->points.size() <= 1 ||
1519 (polyline_current->points.size() == 2 &&
1520 std::abs(polyline_current->points.front().x - polyline_current->points.back().x) < SCALED_EPSILON &&
1521 std::abs(polyline_current->points.front().y - polyline_current->points.back().y) < SCALED_EPSILON))
1522 polylines_out.pop_back();
1523 intrsctn = NULL;
1524 i_intersection = -1;
1525 polyline_current = NULL;
1526 }
1527
1528 #ifdef SLIC3R_DEBUG
1529 {
1530 {
1531 ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-final-%03d.svg", iRun), bbox_svg); // , scale_(1.));
1532 poly_with_offset.export_to_svg(svg);
1533 for (size_t i = n_polylines_out_initial; i < polylines_out.size(); ++ i)
1534 svg.draw(polylines_out[i].lines(), "black");
1535 }
1536 // Paint a picture per polyline. This makes it easier to discover the order of the polylines and their overlap.
1537 for (size_t i_polyline = n_polylines_out_initial; i_polyline < polylines_out.size(); ++ i_polyline) {
1538 ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-final-%03d-%03d.svg", iRun, i_polyline), bbox_svg); // , scale_(1.));
1539 svg.draw(polylines_out[i_polyline].lines(), "black");
1540 }
1541 }
1542 #endif /* SLIC3R_DEBUG */
1543
1544 // paths must be rotated back
1545 for (Polylines::iterator it = polylines_out.begin() + n_polylines_out_initial; it != polylines_out.end(); ++ it) {
1546 // No need to translate, the absolute position is irrelevant.
1547 // it->translate(- rotate_vector.second.x, - rotate_vector.second.y);
1548 myassert(! it->has_duplicate_points());
1549 it->rotate(rotate_vector.first);
1550 //FIXME rather simplify the paths to avoid very short edges?
1551 //myassert(! it->has_duplicate_points());
1552 it->remove_duplicate_points();
1553 }
1554
1555 #ifdef SLIC3R_DEBUG
1556 // Verify, that there are no duplicate points in the sequence.
1557 for (Polylines::iterator it = polylines_out.begin(); it != polylines_out.end(); ++ it)
1558 myassert(! it->has_duplicate_points());
1559 #endif /* SLIC3R_DEBUG */
1560
1561 return true;
1562 }
1563
1564 Polylines FillRectilinear2::fill_surface(const Surface *surface, const FillParams &params)
1565 {
1566 Polylines polylines_out;
1567 if (! fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out)) {
1568 printf("FillRectilinear2::fill_surface() failed to fill a region.\n");
1569 }
1570 return polylines_out;
1571 }
1572
1573 Polylines FillGrid2::fill_surface(const Surface *surface, const FillParams &params)
1574 {
1575 // Each linear fill covers half of the target coverage.
1576 FillParams params2 = params;
1577 params2.density *= 0.5f;
1578 Polylines polylines_out;
1579 if (! fill_surface_by_lines(surface, params2, 0.f, 0.f, polylines_out) ||
1580 ! fill_surface_by_lines(surface, params2, float(M_PI / 2.), 0.f, polylines_out)) {
1581 printf("FillGrid2::fill_surface() failed to fill a region.\n");
1582 }
1583 return polylines_out;
1584 }
1585
1586 Polylines FillTriangles::fill_surface(const Surface *surface, const FillParams &params)
1587 {
1588 // Each linear fill covers 1/3 of the target coverage.
1589 FillParams params2 = params;
1590 params2.density *= 0.333333333f;
1591 Polylines polylines_out;
1592 if (! fill_surface_by_lines(surface, params2, 0.f, 0., polylines_out) ||
1593 ! fill_surface_by_lines(surface, params2, float(M_PI / 3.), 0., polylines_out) ||
1594 ! fill_surface_by_lines(surface, params2, float(2. * M_PI / 3.), 0.5 * this->spacing / params2.density, polylines_out)) {
1595 printf("FillTriangles::fill_surface() failed to fill a region.\n");
1596 }
1597 return polylines_out;
1598 }
1599
1600 Polylines FillStars::fill_surface(const Surface *surface, const FillParams &params)
1601 {
1602 // Each linear fill covers 1/3 of the target coverage.
1603 FillParams params2 = params;
1604 params2.density *= 0.333333333f;
1605 Polylines polylines_out;
1606 if (! fill_surface_by_lines(surface, params2, 0.f, 0., polylines_out) ||
1607 ! fill_surface_by_lines(surface, params2, float(M_PI / 3.), 0., polylines_out) ||
1608 ! fill_surface_by_lines(surface, params2, float(2. * M_PI / 3.), 0., polylines_out)) {
1609 printf("FillStars::fill_surface() failed to fill a region.\n");
1610 }
1611 return polylines_out;
1612 }
1613
1614 Polylines FillCubic::fill_surface(const Surface *surface, const FillParams &params)
1615 {
1616 // Each linear fill covers 1/3 of the target coverage.
1617 FillParams params2 = params;
1618 params2.density *= 0.333333333f;
1619 Polylines polylines_out;
1620 if (! fill_surface_by_lines(surface, params2, 0.f, z, polylines_out) ||
1621 ! fill_surface_by_lines(surface, params2, float(M_PI / 3.), -z, polylines_out) ||
1622 // Rotated by PI*2/3 + PI to achieve reverse sloping wall.
1623 ! fill_surface_by_lines(surface, params2, float(M_PI * 2. / 3.), z, polylines_out)) {
1624 printf("FillCubic::fill_surface() failed to fill a region.\n");
1625 }
1626 return polylines_out;
1627 }
1628
1629 } // namespace Slic3r
0 #ifndef slic3r_FillRectilinear2_hpp_
1 #define slic3r_FillRectilinear2_hpp_
2
3 #include "../libslic3r.h"
4
5 #include "FillBase.hpp"
6
7 namespace Slic3r {
8
9 class Surface;
10
11 class FillRectilinear2 : public Fill
12 {
13 public:
14 virtual ~FillRectilinear2() {}
15 virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
16
17 protected:
18 bool fill_surface_by_lines(const Surface *surface, const FillParams &params, float angleBase, float pattern_shift, Polylines &polylines_out);
19 };
20
21 class FillGrid2 : public FillRectilinear2
22 {
23 public:
24 virtual ~FillGrid2() {}
25 virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
26
27 protected:
28 // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
29 virtual float _layer_angle(size_t idx) const { return 0.f; }
30 };
31
32 class FillTriangles : public FillRectilinear2
33 {
34 public:
35 virtual ~FillTriangles() {}
36 virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
37
38 protected:
39 // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
40 virtual float _layer_angle(size_t idx) const { return 0.f; }
41 };
42
43 class FillStars : public FillRectilinear2
44 {
45 public:
46 virtual ~FillStars() {}
47 virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
48
49 protected:
50 // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
51 virtual float _layer_angle(size_t idx) const { return 0.f; }
52 };
53
54 class FillCubic : public FillRectilinear2
55 {
56 public:
57 virtual ~FillCubic() {}
58 virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
59
60 protected:
61 // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
62 virtual float _layer_angle(size_t idx) const { return 0.f; }
63 };
64
65
66 }; // namespace Slic3r
67
68 #endif // slic3r_FillRectilinear2_hpp_
0 #include "Flow.hpp"
1 #include <cmath>
2 #include <assert.h>
3
4 namespace Slic3r {
5
6 /* This constructor builds a Flow object from an extrusion width config setting
7 and other context properties. */
8 Flow
9 Flow::new_from_config_width(FlowRole role, const ConfigOptionFloatOrPercent &width, float nozzle_diameter, float height, float bridge_flow_ratio) {
10 // we need layer height unless it's a bridge
11 if (height <= 0 && bridge_flow_ratio == 0) CONFESS("Invalid flow height supplied to new_from_config_width()");
12
13 float w;
14 if (bridge_flow_ratio > 0) {
15 // if bridge flow was requested, calculate bridge width
16 height = w = Flow::_bridge_width(nozzle_diameter, bridge_flow_ratio);
17 } else if (!width.percent && width.value == 0) {
18 // if user left option to 0, calculate a sane default width
19 w = Flow::_auto_width(role, nozzle_diameter, height);
20 } else {
21 // if user set a manual value, use it
22 w = width.get_abs_value(height);
23 }
24
25 return Flow(w, height, nozzle_diameter, bridge_flow_ratio > 0);
26 }
27
28 /* This constructor builds a Flow object from a given centerline spacing. */
29 Flow
30 Flow::new_from_spacing(float spacing, float nozzle_diameter, float height, bool bridge) {
31 // we need layer height unless it's a bridge
32 if (height <= 0 && !bridge) CONFESS("Invalid flow height supplied to new_from_spacing()");
33
34 float w = Flow::_width_from_spacing(spacing, nozzle_diameter, height, bridge);
35 if (bridge) height = w;
36 return Flow(w, height, nozzle_diameter, bridge);
37 }
38
39 /* This method returns the centerline spacing between two adjacent extrusions
40 having the same extrusion width (and other properties). */
41 float
42 Flow::spacing() const {
43 if (this->bridge) {
44 return this->width + BRIDGE_EXTRA_SPACING;
45 }
46
47 // rectangle with semicircles at the ends
48 float min_flow_spacing = this->width - this->height * (1 - PI/4.0);
49 return this->width - OVERLAP_FACTOR * (this->width - min_flow_spacing);
50 }
51
52 /* This method returns the centerline spacing between an extrusion using this
53 flow and another one using another flow.
54 this->spacing(other) shall return the same value as other.spacing(*this) */
55 float
56 Flow::spacing(const Flow &other) const {
57 assert(this->height == other.height);
58 assert(this->bridge == other.bridge);
59
60 if (this->bridge) {
61 return this->width/2 + other.width/2 + BRIDGE_EXTRA_SPACING;
62 }
63
64 return this->spacing()/2 + other.spacing()/2;
65 }
66
67 /* This method returns extrusion volume per head move unit. */
68 double
69 Flow::mm3_per_mm() const {
70 if (this->bridge) {
71 return (this->width * this->width) * PI/4.0;
72 }
73
74 // rectangle with semicircles at the ends
75 return this->width * this->height + (this->height*this->height) / 4.0 * (PI-4.0);
76 }
77
78 /* This static method returns bridge width for a given nozzle diameter. */
79 float Flow::_bridge_width(float nozzle_diameter, float bridge_flow_ratio) {
80 return (bridge_flow_ratio == 1.) ?
81 // optimization to avoid sqrt()
82 nozzle_diameter :
83 sqrt(bridge_flow_ratio) * nozzle_diameter;
84 }
85
86 /* This static method returns a sane extrusion width default. */
87 float
88 Flow::_auto_width(FlowRole role, float nozzle_diameter, float height) {
89 // here we calculate a sane default by matching the flow speed (at the nozzle) and the feed rate
90 // shape: rectangle with semicircles at the ends
91 float width = ((nozzle_diameter*nozzle_diameter) * PI + (height*height) * (4.0 - PI)) / (4.0 * height);
92
93 float min = nozzle_diameter * 1.05;
94 float max = -1;
95 if (role == frExternalPerimeter || role == frSupportMaterial || role == frSupportMaterialInterface) {
96 min = max = nozzle_diameter;
97 } else if (role != frInfill) {
98 // do not limit width for sparse infill so that we use full native flow for it
99 max = nozzle_diameter * 1.7;
100 }
101 if (max != -1 && width > max) width = max;
102 if (width < min) width = min;
103
104 return width;
105 }
106
107 /* This static method returns the extrusion width value corresponding to the supplied centerline spacing. */
108 float
109 Flow::_width_from_spacing(float spacing, float nozzle_diameter, float height, bool bridge) {
110 if (bridge) {
111 return spacing - BRIDGE_EXTRA_SPACING;
112 }
113
114 // rectangle with semicircles at the ends
115 return spacing + OVERLAP_FACTOR * height * (1 - PI/4.0);
116 }
117
118 }
0 #ifndef slic3r_Flow_hpp_
1 #define slic3r_Flow_hpp_
2
3 #include "libslic3r.h"
4 #include "Config.hpp"
5 #include "ExtrusionEntity.hpp"
6
7 namespace Slic3r {
8
9 #define BRIDGE_EXTRA_SPACING 0.05
10 #define OVERLAP_FACTOR 1.0
11
12 enum FlowRole {
13 frExternalPerimeter,
14 frPerimeter,
15 frInfill,
16 frSolidInfill,
17 frTopSolidInfill,
18 frSupportMaterial,
19 frSupportMaterialInterface,
20 };
21
22 class Flow
23 {
24 public:
25 float width, height, nozzle_diameter;
26 bool bridge;
27
28 Flow(float _w, float _h, float _nd, bool _bridge = false)
29 : width(_w), height(_h), nozzle_diameter(_nd), bridge(_bridge) {};
30 float spacing() const;
31 float spacing(const Flow &other) const;
32 double mm3_per_mm() const;
33 coord_t scaled_width() const {
34 return scale_(this->width);
35 };
36 coord_t scaled_spacing() const {
37 return scale_(this->spacing());
38 };
39 coord_t scaled_spacing(const Flow &other) const {
40 return scale_(this->spacing(other));
41 };
42
43 static Flow new_from_config_width(FlowRole role, const ConfigOptionFloatOrPercent &width, float nozzle_diameter, float height, float bridge_flow_ratio);
44 static Flow new_from_spacing(float spacing, float nozzle_diameter, float height, bool bridge);
45
46 private:
47 static float _bridge_width(float nozzle_diameter, float bridge_flow_ratio);
48 static float _auto_width(FlowRole role, float nozzle_diameter, float height);
49 static float _width_from_spacing(float spacing, float nozzle_diameter, float height, bool bridge);
50 static float _spacing(float width, float nozzle_diameter, float height, float bridge_flow_ratio);
51 };
52
53 }
54
55 #endif
0 #include <memory.h>
1 #include <string.h>
2 #include <float.h>
3
4 #include "../libslic3r.h"
5 #include "../PrintConfig.hpp"
6
7 #include "Analyzer.hpp"
8
9 namespace Slic3r {
10
11 void GCodeMovesDB::reset()
12 {
13 for (size_t i = 0; i < m_layers.size(); ++ i)
14 delete m_layers[i];
15 m_layers.clear();
16 }
17
18 GCodeAnalyzer::GCodeAnalyzer(const Slic3r::GCodeConfig *config) :
19 m_config(config)
20 {
21 reset();
22 m_moves = new GCodeMovesDB();
23 }
24
25 GCodeAnalyzer::~GCodeAnalyzer()
26 {
27 delete m_moves;
28 }
29
30 void GCodeAnalyzer::reset()
31 {
32 output_buffer.clear();
33 output_buffer_length = 0;
34
35 m_current_extruder = 0;
36 // Zero the position of the XYZE axes + the current feed
37 memset(m_current_pos, 0, sizeof(float) * 5);
38 m_current_extrusion_role = erNone;
39 m_current_extrusion_width = 0;
40 m_current_extrusion_height = 0;
41 // Expect the first command to fill the nozzle (deretract).
42 m_retracted = true;
43 m_moves->reset();
44 }
45
46 const char* GCodeAnalyzer::process(const char *szGCode, bool flush)
47 {
48 // Reset length of the output_buffer.
49 output_buffer_length = 0;
50
51 if (szGCode != 0) {
52 const char *p = szGCode;
53 while (*p != 0) {
54 // Find end of the line.
55 const char *endl = p;
56 // Slic3r always generates end of lines in a Unix style.
57 for (; *endl != 0 && *endl != '\n'; ++ endl) ;
58 // Process a G-code line, store it into the provided GCodeLine object.
59 bool should_output = process_line(p, endl - p);
60 if (*endl == '\n')
61 ++ endl;
62 if (should_output)
63 push_to_output(p, endl - p);
64 p = endl;
65 }
66 }
67
68 return output_buffer.data();
69 }
70
71 // Is a white space?
72 static inline bool is_ws(const char c) { return c == ' ' || c == '\t'; }
73 // Is it an end of line? Consider a comment to be an end of line as well.
74 static inline bool is_eol(const char c) { return c == 0 || c == '\r' || c == '\n' || c == ';'; };
75 // Is it a white space or end of line?
76 static inline bool is_ws_or_eol(const char c) { return is_ws(c) || is_eol(c); };
77
78 // Eat whitespaces.
79 static void eatws(const char *&line)
80 {
81 while (is_ws(*line))
82 ++ line;
83 }
84
85 // Parse an int starting at the current position of a line.
86 // If succeeded, the line pointer is advanced.
87 static inline int parse_int(const char *&line)
88 {
89 char *endptr = NULL;
90 long result = strtol(line, &endptr, 10);
91 if (endptr == NULL || !is_ws_or_eol(*endptr))
92 throw std::runtime_error("GCodePressureEqualizer: Error parsing an int");
93 line = endptr;
94 return int(result);
95 };
96
97 // Parse an int starting at the current position of a line.
98 // If succeeded, the line pointer is advanced.
99 static inline float parse_float(const char *&line)
100 {
101 char *endptr = NULL;
102 float result = strtof(line, &endptr);
103 if (endptr == NULL || !is_ws_or_eol(*endptr))
104 throw std::runtime_error("GCodePressureEqualizer: Error parsing a float");
105 line = endptr;
106 return result;
107 };
108
109 #define EXTRUSION_ROLE_TAG ";_EXTRUSION_ROLE:"
110 bool GCodeAnalyzer::process_line(const char *line, const size_t len)
111 {
112 if (strncmp(line, EXTRUSION_ROLE_TAG, strlen(EXTRUSION_ROLE_TAG)) == 0) {
113 line += strlen(EXTRUSION_ROLE_TAG);
114 int role = atoi(line);
115 this->m_current_extrusion_role = ExtrusionRole(role);
116 return false;
117 }
118
119 /*
120 // Set the type, copy the line to the buffer.
121 buf.type = GCODE_MOVE_TYPE_OTHER;
122 buf.modified = false;
123 if (buf.raw.size() < len + 1)
124 buf.raw.assign(line, line + len + 1);
125 else
126 memcpy(buf.raw.data(), line, len);
127 buf.raw[len] = 0;
128 buf.raw_length = len;
129
130 memcpy(buf.pos_start, m_current_pos, sizeof(float)*5);
131 memcpy(buf.pos_end, m_current_pos, sizeof(float)*5);
132 memset(buf.pos_provided, 0, 5);
133
134 buf.volumetric_extrusion_rate = 0.f;
135 buf.volumetric_extrusion_rate_start = 0.f;
136 buf.volumetric_extrusion_rate_end = 0.f;
137 buf.max_volumetric_extrusion_rate_slope_positive = 0.f;
138 buf.max_volumetric_extrusion_rate_slope_negative = 0.f;
139 buf.extrusion_role = m_current_extrusion_role;
140
141 // Parse the G-code line, store the result into the buf.
142 switch (toupper(*line ++)) {
143 case 'G': {
144 int gcode = parse_int(line);
145 eatws(line);
146 switch (gcode) {
147 case 0:
148 case 1:
149 {
150 // G0, G1: A FFF 3D printer does not make a difference between the two.
151 float new_pos[5];
152 memcpy(new_pos, m_current_pos, sizeof(float)*5);
153 bool changed[5] = { false, false, false, false, false };
154 while (!is_eol(*line)) {
155 char axis = toupper(*line++);
156 int i = -1;
157 switch (axis) {
158 case 'X':
159 case 'Y':
160 case 'Z':
161 i = axis - 'X';
162 break;
163 case 'E':
164 i = 3;
165 break;
166 case 'F':
167 i = 4;
168 break;
169 default:
170 assert(false);
171 }
172 if (i == -1)
173 throw std::runtime_error(std::string("GCodePressureEqualizer: Invalid axis for G0/G1: ") + axis);
174 buf.pos_provided[i] = true;
175 new_pos[i] = parse_float(line);
176 if (i == 3 && m_config->use_relative_e_distances.value)
177 new_pos[i] += m_current_pos[i];
178 changed[i] = new_pos[i] != m_current_pos[i];
179 eatws(line);
180 }
181 if (changed[3]) {
182 // Extrusion, retract or unretract.
183 float diff = new_pos[3] - m_current_pos[3];
184 if (diff < 0) {
185 buf.type = GCODE_MOVE_TYPE_RETRACT;
186 m_retracted = true;
187 } else if (! changed[0] && ! changed[1] && ! changed[2]) {
188 // assert(m_retracted);
189 buf.type = GCODE_MOVE_TYPE_UNRETRACT;
190 m_retracted = false;
191 } else {
192 assert(changed[0] || changed[1]);
193 // Moving in XY plane.
194 buf.type = GCODE_MOVE_TYPE_EXTRUDE;
195 // Calculate the volumetric extrusion rate.
196 float diff[4];
197 for (size_t i = 0; i < 4; ++ i)
198 diff[i] = new_pos[i] - m_current_pos[i];
199 // volumetric extrusion rate = A_filament * F_xyz * L_e / L_xyz [mm^3/min]
200 float len2 = diff[0]*diff[0]+diff[1]*diff[1]+diff[2]*diff[2];
201 float rate = m_filament_crossections[m_current_extruder] * new_pos[4] * sqrt((diff[3]*diff[3])/len2);
202 buf.volumetric_extrusion_rate = rate;
203 buf.volumetric_extrusion_rate_start = rate;
204 buf.volumetric_extrusion_rate_end = rate;
205 m_stat.update(rate, sqrt(len2));
206 if (rate < 10.f) {
207 printf("Extremely low flow rate: %f\n", rate);
208 }
209 }
210 } else if (changed[0] || changed[1] || changed[2]) {
211 // Moving without extrusion.
212 buf.type = GCODE_MOVE_TYPE_MOVE;
213 }
214 memcpy(m_current_pos, new_pos, sizeof(float) * 5);
215 break;
216 }
217 case 92:
218 {
219 // G92 : Set Position
220 // Set a logical coordinate position to a new value without actually moving the machine motors.
221 // Which axes to set?
222 bool set = false;
223 while (!is_eol(*line)) {
224 char axis = toupper(*line++);
225 switch (axis) {
226 case 'X':
227 case 'Y':
228 case 'Z':
229 m_current_pos[axis - 'X'] = (!is_ws_or_eol(*line)) ? parse_float(line) : 0.f;
230 set = true;
231 break;
232 case 'E':
233 m_current_pos[3] = (!is_ws_or_eol(*line)) ? parse_float(line) : 0.f;
234 set = true;
235 break;
236 default:
237 throw std::runtime_error(std::string("GCodePressureEqualizer: Incorrect axis in a G92 G-code: ") + axis);
238 }
239 eatws(line);
240 }
241 assert(set);
242 break;
243 }
244 case 10:
245 case 22:
246 // Firmware retract.
247 buf.type = GCODE_MOVE_TYPE_RETRACT;
248 m_retracted = true;
249 break;
250 case 11:
251 case 23:
252 // Firmware unretract.
253 buf.type = GCODE_MOVE_TYPE_UNRETRACT;
254 m_retracted = false;
255 break;
256 default:
257 // Ignore the rest.
258 break;
259 }
260 break;
261 }
262 case 'M': {
263 int mcode = parse_int(line);
264 eatws(line);
265 switch (mcode) {
266 default:
267 // Ignore the rest of the M-codes.
268 break;
269 }
270 break;
271 }
272 case 'T':
273 {
274 // Activate an extruder head.
275 int new_extruder = parse_int(line);
276 if (new_extruder != m_current_extruder) {
277 m_current_extruder = new_extruder;
278 m_retracted = true;
279 buf.type = GCODE_MOVE_TYPE_TOOL_CHANGE;
280 } else {
281 buf.type = GCODE_MOVE_TYPE_NOOP;
282 }
283 break;
284 }
285 }
286
287 buf.extruder_id = m_current_extruder;
288 memcpy(buf.pos_end, m_current_pos, sizeof(float)*5);
289 */
290 return true;
291 }
292
293 void GCodeAnalyzer::push_to_output(const char *text, const size_t len, bool add_eol)
294 {
295 // New length of the output buffer content.
296 size_t len_new = output_buffer_length + len + 1;
297 if (add_eol)
298 ++ len_new;
299
300 // Resize the output buffer to a power of 2 higher than the required memory.
301 if (output_buffer.size() < len_new) {
302 size_t v = len_new;
303 // Compute the next highest power of 2 of 32-bit v
304 // http://graphics.stanford.edu/~seander/bithacks.html
305 v--;
306 v |= v >> 1;
307 v |= v >> 2;
308 v |= v >> 4;
309 v |= v >> 8;
310 v |= v >> 16;
311 v++;
312 output_buffer.resize(v);
313 }
314
315 // Copy the text to the output.
316 if (len != 0) {
317 memcpy(output_buffer.data() + output_buffer_length, text, len);
318 output_buffer_length += len;
319 }
320 if (add_eol)
321 output_buffer[output_buffer_length ++] = '\n';
322 output_buffer[output_buffer_length] = 0;
323 }
324
325 } // namespace Slic3r
0 #ifndef slic3r_GCode_PressureEqualizer_hpp_
1 #define slic3r_GCode_PressureEqualizer_hpp_
2
3 #include "../libslic3r.h"
4 #include "../PrintConfig.hpp"
5 #include "../ExtrusionEntity.hpp"
6
7 namespace Slic3r {
8
9 enum GCodeMoveType
10 {
11 GCODE_MOVE_TYPE_NOOP,
12 GCODE_MOVE_TYPE_RETRACT,
13 GCODE_MOVE_TYPE_UNRETRACT,
14 GCODE_MOVE_TYPE_TOOL_CHANGE,
15 GCODE_MOVE_TYPE_MOVE,
16 GCODE_MOVE_TYPE_EXTRUDE,
17 };
18
19 // For visualization purposes, for the purposes of the G-code analysis and timing.
20 // The size of this structure is 56B.
21 // Keep the size of this structure as small as possible, because all moves of a complete print
22 // may be held in RAM.
23 struct GCodeMove
24 {
25 bool moving_xy(const float* pos_start) const { return fabs(pos_end[0] - pos_start[0]) > 0.f || fabs(pos_end[1] - pos_start[1]) > 0.f; }
26 bool moving_xy() const { return moving_xy(get_pos_start()); }
27 bool moving_z (const float* pos_start) const { return fabs(pos_end[2] - pos_start[2]) > 0.f; }
28 bool moving_z () const { return moving_z(get_pos_start()); }
29 bool extruding(const float* pos_start) const { return moving_xy() && pos_end[3] > pos_start[3]; }
30 bool extruding() const { return extruding(get_pos_start()); }
31 bool retracting(const float* pos_start) const { return pos_end[3] < pos_start[3]; }
32 bool retracting() const { return retracting(get_pos_start()); }
33 bool deretracting(const float* pos_start) const { return ! moving_xy() && pos_end[3] > pos_start[3]; }
34 bool deretracting() const { return deretracting(get_pos_start()); }
35
36 float dist_xy2(const float* pos_start) const { return (pos_end[0] - pos_start[0]) * (pos_end[0] - pos_start[0]) + (pos_end[1] - pos_start[1]) * (pos_end[1] - pos_start[1]); }
37 float dist_xy2() const { return dist_xy2(get_pos_start()); }
38 float dist_xyz2(const float* pos_start) const { return (pos_end[0] - pos_start[0]) * (pos_end[0] - pos_start[0]) + (pos_end[1] - pos_start[1]) * (pos_end[1] - pos_start[1]) + (pos_end[2] - pos_start[2]) * (pos_end[2] - pos_start[2]); }
39 float dist_xyz2() const { return dist_xyz2(get_pos_start()); }
40
41 float dist_xy(const float* pos_start) const { return sqrt(dist_xy2(pos_start)); }
42 float dist_xy() const { return dist_xy(get_pos_start()); }
43 float dist_xyz(const float* pos_start) const { return sqrt(dist_xyz2(pos_start)); }
44 float dist_xyz() const { return dist_xyz(get_pos_start()); }
45
46 float dist_e(const float* pos_start) const { return fabs(pos_end[3] - pos_start[3]); }
47 float dist_e() const { return dist_e(get_pos_start()); }
48
49 float feedrate() const { return pos_end[4]; }
50 float time(const float* pos_start) const { return dist_xyz(pos_start) / feedrate(); }
51 float time() const { return time(get_pos_start()); }
52 float time_inv(const float* pos_start) const { return feedrate() / dist_xyz(pos_start); }
53 float time_inv() const { return time_inv(get_pos_start()); }
54
55 const float* get_pos_start() const { assert(type != GCODE_MOVE_TYPE_NOOP); return this[-1].pos_end; }
56
57 // Pack the enums to conserve space. With C++x11 the allocation size could be declared for enums, but for old C++ this is the only portable way.
58 // GCodeLineType
59 uint8_t type;
60 // Index of the active extruder.
61 uint8_t extruder_id;
62 // ExtrusionRole
63 uint8_t extrusion_role;
64 // For example, is it a bridge flow? Is the fan on?
65 uint8_t flags;
66 // X,Y,Z,E,F. Storing the state of the currently active extruder only.
67 float pos_end[5];
68 // Extrusion width, height for this segment in um.
69 uint16_t extrusion_width;
70 uint16_t extrusion_height;
71 };
72
73 typedef std::vector<GCodeMove> GCodeMoves;
74
75 struct GCodeLayer
76 {
77 // Index of an object printed.
78 size_t object_idx;
79 // Index of an object instance printed.
80 size_t object_instance_idx;
81 // Index of the layer printed.
82 size_t layer_idx;
83 // Top z coordinate of the layer printed.
84 float layer_z_top;
85
86 // Moves over this layer. The 0th move is always of type GCODELINETYPE_NOOP and
87 // it sets the initial position and tool for the layer.
88 GCodeMoves moves;
89
90 // Indices into m_moves, where the tool changes happen.
91 // This is useful, if one wants to display just only a piece of the path quickly.
92 std::vector<size_t> tool_changes;
93 };
94
95 typedef std::vector<GCodeLayer*> GCodeLayerPtrs;
96
97 class GCodeMovesDB
98 {
99 public:
100 GCodeMovesDB() {};
101 ~GCodeMovesDB() { reset(); }
102 void reset();
103 GCodeLayerPtrs m_layers;
104 };
105
106 // Processes a G-code to extract moves and their types.
107 // This information is then used to render the print simulation colored by the extrusion type
108 // or various speeds.
109 // The GCodeAnalyzer is employed as a G-Code filter. It reads the G-code as it is generated,
110 // parses the comments generated by Slic3r just for the analyzer, and removes these comments.
111 class GCodeAnalyzer
112 {
113 public:
114 GCodeAnalyzer(const Slic3r::GCodeConfig *config);
115 ~GCodeAnalyzer();
116
117 void reset();
118
119 // Process a next batch of G-code lines. Flush the internal buffers if asked for.
120 const char* process(const char *szGCode, bool flush);
121 // Length of the buffer returned by process().
122 size_t get_output_buffer_length() const { return output_buffer_length; }
123
124 private:
125 // Keeps the reference, does not own the config.
126 const Slic3r::GCodeConfig *m_config;
127
128 // Internal data.
129 // X,Y,Z,E,F
130 float m_current_pos[5];
131 size_t m_current_extruder;
132 ExtrusionRole m_current_extrusion_role;
133 uint16_t m_current_extrusion_width;
134 uint16_t m_current_extrusion_height;
135 bool m_retracted;
136
137 GCodeMovesDB *m_moves;
138
139 // Output buffer will only grow. It will not be reallocated over and over.
140 std::vector<char> output_buffer;
141 size_t output_buffer_length;
142
143 bool process_line(const char *line, const size_t len);
144
145 // Push the text to the end of the output_buffer.
146 void push_to_output(const char *text, const size_t len, bool add_eol = true);
147 };
148
149 } // namespace Slic3r
150
151 #endif /* slic3r_GCode_PressureEqualizer_hpp_ */
0 #include <memory.h>
1 #include <string.h>
2 #include <float.h>
3
4 #include "../libslic3r.h"
5 #include "../PrintConfig.hpp"
6
7 #include "PressureEqualizer.hpp"
8
9 namespace Slic3r {
10
11 GCodePressureEqualizer::GCodePressureEqualizer(const Slic3r::GCodeConfig *config) :
12 m_config(config)
13 {
14 reset();
15 }
16
17 GCodePressureEqualizer::~GCodePressureEqualizer()
18 {
19 }
20
21 void GCodePressureEqualizer::reset()
22 {
23 circular_buffer_pos = 0;
24 circular_buffer_size = 100;
25 circular_buffer_items = 0;
26 circular_buffer.assign(circular_buffer_size, GCodeLine());
27
28 output_buffer.clear();
29 output_buffer_length = 0;
30
31 m_current_extruder = 0;
32 // Zero the position of the XYZE axes + the current feed
33 memset(m_current_pos, 0, sizeof(float) * 5);
34 m_current_extrusion_role = erNone;
35 // Expect the first command to fill the nozzle (deretract).
36 m_retracted = true;
37
38 // Calculate filamet crossections for the multiple extruders.
39 m_filament_crossections.clear();
40 for (size_t i = 0; i < m_config->filament_diameter.values.size(); ++ i) {
41 double r = m_config->filament_diameter.values[i];
42 double a = 0.25f*M_PI*r*r;
43 m_filament_crossections.push_back(float(a));
44 }
45
46 m_max_segment_length = 20.f;
47 // Volumetric rate of a 0.45mm x 0.2mm extrusion at 60mm/s XY movement: 0.45*0.2*60*60=5.4*60 = 324 mm^3/min
48 // Volumetric rate of a 0.45mm x 0.2mm extrusion at 20mm/s XY movement: 0.45*0.2*20*60=1.8*60 = 108 mm^3/min
49 // Slope of the volumetric rate, changing from 20mm/s to 60mm/s over 2 seconds: (5.4-1.8)*60*60/2=60*60*1.8 = 6480 mm^3/min^2 = 1.8 mm^3/s^2
50 m_max_volumetric_extrusion_rate_slope_positive = (this->m_config == NULL) ? 6480.f :
51 this->m_config->max_volumetric_extrusion_rate_slope_positive.value * 60.f * 60.f;
52 m_max_volumetric_extrusion_rate_slope_negative = (this->m_config == NULL) ? 6480.f :
53 this->m_config->max_volumetric_extrusion_rate_slope_negative.value * 60.f * 60.f;
54
55 for (size_t i = 0; i < numExtrusionRoles; ++ i) {
56 m_max_volumetric_extrusion_rate_slopes[i].negative = m_max_volumetric_extrusion_rate_slope_negative;
57 m_max_volumetric_extrusion_rate_slopes[i].positive = m_max_volumetric_extrusion_rate_slope_positive;
58 }
59
60 // Don't regulate the pressure in infill.
61 m_max_volumetric_extrusion_rate_slopes[erBridgeInfill].negative = 0;
62 m_max_volumetric_extrusion_rate_slopes[erBridgeInfill].positive = 0;
63 // Don't regulate the pressure in gap fill.
64 m_max_volumetric_extrusion_rate_slopes[erGapFill].negative = 0;
65 m_max_volumetric_extrusion_rate_slopes[erGapFill].positive = 0;
66
67 m_stat.reset();
68 line_idx = 0;
69 }
70
71 const char* GCodePressureEqualizer::process(const char *szGCode, bool flush)
72 {
73 // Reset length of the output_buffer.
74 output_buffer_length = 0;
75
76 if (szGCode != 0) {
77 const char *p = szGCode;
78 while (*p != 0) {
79 // Find end of the line.
80 const char *endl = p;
81 // Slic3r always generates end of lines in a Unix style.
82 for (; *endl != 0 && *endl != '\n'; ++ endl) ;
83 if (circular_buffer_items == circular_buffer_size)
84 // Buffer is full. Push out the oldest line.
85 output_gcode_line(circular_buffer[circular_buffer_pos]);
86 else
87 ++ circular_buffer_items;
88 // Process a G-code line, store it into the provided GCodeLine object.
89 size_t idx_tail = circular_buffer_pos;
90 circular_buffer_pos = circular_buffer_idx_next(circular_buffer_pos);
91 if (! process_line(p, endl - p, circular_buffer[idx_tail])) {
92 // The line has to be forgotten. It contains comment marks, which shall be
93 // filtered out of the target g-code.
94 circular_buffer_pos = idx_tail;
95 -- circular_buffer_items;
96 }
97 p = endl;
98 if (*p == '\n')
99 ++ p;
100 }
101 }
102
103 if (flush) {
104 // Flush the remaining valid lines of the circular buffer.
105 for (size_t idx = circular_buffer_idx_head(); circular_buffer_items > 0; -- circular_buffer_items) {
106 output_gcode_line(circular_buffer[idx]);
107 if (++ idx == circular_buffer_size)
108 idx = 0;
109 }
110 // Reset the index pointer.
111 assert(circular_buffer_items == 0);
112 circular_buffer_pos = 0;
113
114 #if 1
115 printf("Statistics: \n");
116 printf("Minimum volumetric extrusion rate: %f\n", m_stat.volumetric_extrusion_rate_min);
117 printf("Maximum volumetric extrusion rate: %f\n", m_stat.volumetric_extrusion_rate_max);
118 if (m_stat.extrusion_length > 0)
119 m_stat.volumetric_extrusion_rate_avg /= m_stat.extrusion_length;
120 printf("Average volumetric extrusion rate: %f\n", m_stat.volumetric_extrusion_rate_avg);
121 m_stat.reset();
122 #endif
123 }
124
125 return output_buffer.data();
126 }
127
128 // Is a white space?
129 static inline bool is_ws(const char c) { return c == ' ' || c == '\t'; }
130 // Is it an end of line? Consider a comment to be an end of line as well.
131 static inline bool is_eol(const char c) { return c == 0 || c == '\r' || c == '\n' || c == ';'; };
132 // Is it a white space or end of line?
133 static inline bool is_ws_or_eol(const char c) { return is_ws(c) || is_eol(c); };
134
135 // Eat whitespaces.
136 static void eatws(const char *&line)
137 {
138 while (is_ws(*line))
139 ++ line;
140 }
141
142 // Parse an int starting at the current position of a line.
143 // If succeeded, the line pointer is advanced.
144 static inline int parse_int(const char *&line)
145 {
146 char *endptr = NULL;
147 long result = strtol(line, &endptr, 10);
148 if (endptr == NULL || !is_ws_or_eol(*endptr))
149 throw std::runtime_error("GCodePressureEqualizer: Error parsing an int");
150 line = endptr;
151 return int(result);
152 };
153
154 // Parse an int starting at the current position of a line.
155 // If succeeded, the line pointer is advanced.
156 static inline float parse_float(const char *&line)
157 {
158 char *endptr = NULL;
159 float result = strtof(line, &endptr);
160 if (endptr == NULL || !is_ws_or_eol(*endptr))
161 throw std::runtime_error("GCodePressureEqualizer: Error parsing a float");
162 line = endptr;
163 return result;
164 };
165
166 #define EXTRUSION_ROLE_TAG ";_EXTRUSION_ROLE:"
167 bool GCodePressureEqualizer::process_line(const char *line, const size_t len, GCodeLine &buf)
168 {
169 if (strncmp(line, EXTRUSION_ROLE_TAG, strlen(EXTRUSION_ROLE_TAG)) == 0) {
170 line += strlen(EXTRUSION_ROLE_TAG);
171 int role = atoi(line);
172 this->m_current_extrusion_role = ExtrusionRole(role);
173 ++ line_idx;
174 return false;
175 }
176
177 // Set the type, copy the line to the buffer.
178 buf.type = GCODELINETYPE_OTHER;
179 buf.modified = false;
180 if (buf.raw.size() < len + 1)
181 buf.raw.assign(line, line + len + 1);
182 else
183 memcpy(buf.raw.data(), line, len);
184 buf.raw[len] = 0;
185 buf.raw_length = len;
186
187 memcpy(buf.pos_start, m_current_pos, sizeof(float)*5);
188 memcpy(buf.pos_end, m_current_pos, sizeof(float)*5);
189 memset(buf.pos_provided, 0, 5);
190
191 buf.volumetric_extrusion_rate = 0.f;
192 buf.volumetric_extrusion_rate_start = 0.f;
193 buf.volumetric_extrusion_rate_end = 0.f;
194 buf.max_volumetric_extrusion_rate_slope_positive = 0.f;
195 buf.max_volumetric_extrusion_rate_slope_negative = 0.f;
196 buf.extrusion_role = m_current_extrusion_role;
197
198 // Parse the G-code line, store the result into the buf.
199 switch (toupper(*line ++)) {
200 case 'G': {
201 int gcode = parse_int(line);
202 eatws(line);
203 switch (gcode) {
204 case 0:
205 case 1:
206 {
207 // G0, G1: A FFF 3D printer does not make a difference between the two.
208 float new_pos[5];
209 memcpy(new_pos, m_current_pos, sizeof(float)*5);
210 bool changed[5] = { false, false, false, false, false };
211 while (!is_eol(*line)) {
212 char axis = toupper(*line++);
213 int i = -1;
214 switch (axis) {
215 case 'X':
216 case 'Y':
217 case 'Z':
218 i = axis - 'X';
219 break;
220 case 'E':
221 i = 3;
222 break;
223 case 'F':
224 i = 4;
225 break;
226 default:
227 assert(false);
228 }
229 if (i == -1)
230 throw std::runtime_error(std::string("GCodePressureEqualizer: Invalid axis for G0/G1: ") + axis);
231 buf.pos_provided[i] = true;
232 new_pos[i] = parse_float(line);
233 if (i == 3 && m_config->use_relative_e_distances.value)
234 new_pos[i] += m_current_pos[i];
235 changed[i] = new_pos[i] != m_current_pos[i];
236 eatws(line);
237 }
238 if (changed[3]) {
239 // Extrusion, retract or unretract.
240 float diff = new_pos[3] - m_current_pos[3];
241 if (diff < 0) {
242 buf.type = GCODELINETYPE_RETRACT;
243 m_retracted = true;
244 } else if (! changed[0] && ! changed[1] && ! changed[2]) {
245 // assert(m_retracted);
246 buf.type = GCODELINETYPE_UNRETRACT;
247 m_retracted = false;
248 } else {
249 assert(changed[0] || changed[1]);
250 // Moving in XY plane.
251 buf.type = GCODELINETYPE_EXTRUDE;
252 // Calculate the volumetric extrusion rate.
253 float diff[4];
254 for (size_t i = 0; i < 4; ++ i)
255 diff[i] = new_pos[i] - m_current_pos[i];
256 // volumetric extrusion rate = A_filament * F_xyz * L_e / L_xyz [mm^3/min]
257 float len2 = diff[0]*diff[0]+diff[1]*diff[1]+diff[2]*diff[2];
258 float rate = m_filament_crossections[m_current_extruder] * new_pos[4] * sqrt((diff[3]*diff[3])/len2);
259 buf.volumetric_extrusion_rate = rate;
260 buf.volumetric_extrusion_rate_start = rate;
261 buf.volumetric_extrusion_rate_end = rate;
262 m_stat.update(rate, sqrt(len2));
263 if (rate < 40.f) {
264 printf("Extremely low flow rate: %f. Line %d, Length: %f, extrusion: %f Old position: (%f, %f, %f), new position: (%f, %f, %f)\n",
265 rate,
266 line_idx,
267 sqrt(len2), sqrt((diff[3]*diff[3])/len2),
268 m_current_pos[0], m_current_pos[1], m_current_pos[2],
269 new_pos[0], new_pos[1], new_pos[2]);
270 }
271 }
272 } else if (changed[0] || changed[1] || changed[2]) {
273 // Moving without extrusion.
274 buf.type = GCODELINETYPE_MOVE;
275 }
276 memcpy(m_current_pos, new_pos, sizeof(float) * 5);
277 break;
278 }
279 case 92:
280 {
281 // G92 : Set Position
282 // Set a logical coordinate position to a new value without actually moving the machine motors.
283 // Which axes to set?
284 bool set = false;
285 while (!is_eol(*line)) {
286 char axis = toupper(*line++);
287 switch (axis) {
288 case 'X':
289 case 'Y':
290 case 'Z':
291 m_current_pos[axis - 'X'] = (!is_ws_or_eol(*line)) ? parse_float(line) : 0.f;
292 set = true;
293 break;
294 case 'E':
295 m_current_pos[3] = (!is_ws_or_eol(*line)) ? parse_float(line) : 0.f;
296 set = true;
297 break;
298 default:
299 throw std::runtime_error(std::string("GCodePressureEqualizer: Incorrect axis in a G92 G-code: ") + axis);
300 }
301 eatws(line);
302 }
303 assert(set);
304 break;
305 }
306 case 10:
307 case 22:
308 // Firmware retract.
309 buf.type = GCODELINETYPE_RETRACT;
310 m_retracted = true;
311 break;
312 case 11:
313 case 23:
314 // Firmware unretract.
315 buf.type = GCODELINETYPE_UNRETRACT;
316 m_retracted = false;
317 break;
318 default:
319 // Ignore the rest.
320 break;
321 }
322 break;
323 }
324 case 'M': {
325 int mcode = parse_int(line);
326 eatws(line);
327 switch (mcode) {
328 default:
329 // Ignore the rest of the M-codes.
330 break;
331 }
332 break;
333 }
334 case 'T':
335 {
336 // Activate an extruder head.
337 int new_extruder = parse_int(line);
338 if (new_extruder != m_current_extruder) {
339 m_current_extruder = new_extruder;
340 m_retracted = true;
341 buf.type = GCODELINETYPE_TOOL_CHANGE;
342 } else {
343 buf.type = GCODELINETYPE_NOOP;
344 }
345 break;
346 }
347 }
348
349 buf.extruder_id = m_current_extruder;
350 memcpy(buf.pos_end, m_current_pos, sizeof(float)*5);
351
352 adjust_volumetric_rate();
353 ++ line_idx;
354 return true;
355 }
356
357 void GCodePressureEqualizer::output_gcode_line(GCodeLine &line)
358 {
359 if (! line.modified) {
360 push_to_output(line.raw.data(), line.raw_length, true);
361 return;
362 }
363
364 // The line was modified.
365 // Find the comment.
366 const char *comment = line.raw.data();
367 while (*comment != ';' && *comment != 0) ++comment;
368 if (*comment != ';')
369 comment = NULL;
370
371 // Emit the line with lowered extrusion rates.
372 float l2 = line.dist_xyz2();
373 float l = sqrt(l2);
374 size_t nSegments = size_t(ceil(l / m_max_segment_length));
375 if (nSegments == 1) {
376 // Just update this segment.
377 push_line_to_output(line, line.feedrate() * line.volumetric_correction_avg(), comment);
378 } else {
379 bool accelerating = line.volumetric_extrusion_rate_start < line.volumetric_extrusion_rate_end;
380 // Update the initial and final feed rate values.
381 line.pos_start[4] = line.volumetric_extrusion_rate_start * line.pos_end[4] / line.volumetric_extrusion_rate;
382 line.pos_end [4] = line.volumetric_extrusion_rate_end * line.pos_end[4] / line.volumetric_extrusion_rate;
383 float feed_avg = 0.5f * (line.pos_start[4] + line.pos_end[4]);
384 // Limiting volumetric extrusion rate slope for this segment.
385 float max_volumetric_extrusion_rate_slope = accelerating ?
386 line.max_volumetric_extrusion_rate_slope_positive : line.max_volumetric_extrusion_rate_slope_negative;
387 // Total time for the segment, corrected for the possibly lowered volumetric feed rate,
388 // if accelerating / decelerating over the complete segment.
389 float t_total = line.dist_xyz() / feed_avg;
390 // Time of the acceleration / deceleration part of the segment, if accelerating / decelerating
391 // with the maximum volumetric extrusion rate slope.
392 float t_acc = 0.5f * (line.volumetric_extrusion_rate_start + line.volumetric_extrusion_rate_end) / max_volumetric_extrusion_rate_slope;
393 float l_acc = l;
394 float l_steady = 0.f;
395 if (t_acc < t_total) {
396 // One may achieve higher print speeds if part of the segment is not speed limited.
397 float l_acc = t_acc * feed_avg;
398 float l_steady = l - l_acc;
399 if (l_steady < 0.5f * m_max_segment_length) {
400 l_acc = l;
401 l_steady = 0.f;
402 } else
403 nSegments = size_t(ceil(l_acc / m_max_segment_length));
404 }
405 float pos_start[5];
406 float pos_end [5];
407 float pos_end2 [4];
408 memcpy(pos_start, line.pos_start, sizeof(float)*5);
409 memcpy(pos_end , line.pos_end , sizeof(float)*5);
410 if (l_steady > 0.f) {
411 // There will be a steady feed segment emitted.
412 if (accelerating) {
413 // Prepare the final steady feed rate segment.
414 memcpy(pos_end2, pos_end, sizeof(float)*4);
415 float t = l_acc / l;
416 for (int i = 0; i < 4; ++ i) {
417 pos_end[i] = pos_start[i] + (pos_end[i] - pos_start[i]) * t;
418 line.pos_provided[i] = true;
419 }
420 } else {
421 // Emit the steady feed rate segment.
422 float t = l_steady / l;
423 for (int i = 0; i < 4; ++ i) {
424 line.pos_end[i] = pos_start[i] + (pos_end[i] - pos_start[i]) * t;
425 line.pos_provided[i] = true;
426 }
427 push_line_to_output(line, pos_start[4], comment);
428 comment = NULL;
429 memcpy(line.pos_start, line.pos_end, sizeof(float)*5);
430 memcpy(pos_start, line.pos_end, sizeof(float)*5);
431 }
432 }
433 // Split the segment into pieces.
434 for (size_t i = 1; i < nSegments; ++ i) {
435 float t = float(i) / float(nSegments);
436 for (size_t j = 0; j < 4; ++ j) {
437 line.pos_end[j] = pos_start[j] + (pos_end[j] - pos_start[j]) * t;
438 line.pos_provided[j] = true;
439 }
440 // Interpolate the feed rate at the center of the segment.
441 push_line_to_output(line, pos_start[4] + (pos_end[4] - pos_start[4]) * (float(i) - 0.5f) / float(nSegments), comment);
442 comment = NULL;
443 memcpy(line.pos_start, line.pos_end, sizeof(float)*5);
444 }
445 if (l_steady > 0.f && accelerating) {
446 for (int i = 0; i < 4; ++ i) {
447 line.pos_end[i] = pos_end2[i];
448 line.pos_provided[i] = true;
449 }
450 push_line_to_output(line, pos_end[4], comment);
451 }
452 }
453 }
454
455 void GCodePressureEqualizer::adjust_volumetric_rate()
456 {
457 if (circular_buffer_items < 2)
458 return;
459
460 // Go back from the current circular_buffer_pos and lower the feedtrate to decrease the slope of the extrusion rate changes.
461 const size_t idx_head = circular_buffer_idx_head();
462 const size_t idx_tail = circular_buffer_idx_prev(circular_buffer_idx_tail());
463 size_t idx = idx_tail;
464 if (idx == idx_head || ! circular_buffer[idx].extruding())
465 // Nothing to do, the last move is not extruding.
466 return;
467
468 float feedrate_per_extrusion_role[numExtrusionRoles];
469 for (size_t i = 0; i < numExtrusionRoles; ++ i)
470 feedrate_per_extrusion_role[i] = FLT_MAX;
471 feedrate_per_extrusion_role[circular_buffer[idx].extrusion_role] = circular_buffer[idx].volumetric_extrusion_rate_start;
472
473 bool modified = true;
474 while (modified && idx != idx_head) {
475 size_t idx_prev = circular_buffer_idx_prev(idx);
476 for (; ! circular_buffer[idx_prev].extruding() && idx_prev != idx_head; idx_prev = circular_buffer_idx_prev(idx_prev)) ;
477 if (! circular_buffer[idx_prev].extruding())
478 break;
479 // Volumetric extrusion rate at the start of the succeding segment.
480 float rate_succ = circular_buffer[idx].volumetric_extrusion_rate_start;
481 // What is the gradient of the extrusion rate between idx_prev and idx?
482 idx = idx_prev;
483 GCodeLine &line = circular_buffer[idx];
484 for (size_t iRole = 1; iRole < numExtrusionRoles; ++ iRole) {
485 float rate_slope = m_max_volumetric_extrusion_rate_slopes[iRole].negative;
486 if (rate_slope == 0)
487 // The negative rate is unlimited.
488 continue;
489 float rate_end = feedrate_per_extrusion_role[iRole];
490 if (iRole == line.extrusion_role && rate_succ < rate_end)
491 // Limit by the succeeding volumetric flow rate.
492 rate_end = rate_succ;
493 if (line.volumetric_extrusion_rate_end > rate_end) {
494 line.volumetric_extrusion_rate_end = rate_end;
495 line.modified = true;
496 } else if (iRole == line.extrusion_role) {
497 rate_end = line.volumetric_extrusion_rate_end;
498 } else if (rate_end == FLT_MAX) {
499 // The rate for ExtrusionRole iRole is unlimited.
500 continue;
501 } else {
502 // Use the original, 'floating' extrusion rate as a starting point for the limiter.
503 }
504 // modified = false;
505 float rate_start = rate_end + rate_slope * line.time_corrected();
506 if (rate_start < line.volumetric_extrusion_rate_start) {
507 // Limit the volumetric extrusion rate at the start of this segment due to a segment
508 // of ExtrusionType iRole, which will be extruded in the future.
509 line.volumetric_extrusion_rate_start = rate_start;
510 line.max_volumetric_extrusion_rate_slope_negative = rate_slope;
511 line.modified = true;
512 // modified = true;
513 }
514 feedrate_per_extrusion_role[iRole] = (iRole == line.extrusion_role) ? line.volumetric_extrusion_rate_start : rate_start;
515 }
516 }
517
518 // Go forward and adjust the feedrate to decrease the slope of the extrusion rate changes.
519 for (size_t i = 0; i < numExtrusionRoles; ++ i)
520 feedrate_per_extrusion_role[i] = FLT_MAX;
521 feedrate_per_extrusion_role[circular_buffer[idx].extrusion_role] = circular_buffer[idx].volumetric_extrusion_rate_end;
522
523 assert(circular_buffer[idx].extruding());
524 while (idx != idx_tail) {
525 size_t idx_next = circular_buffer_idx_next(idx);
526 for (; ! circular_buffer[idx_next].extruding() && idx_next != idx_tail; idx_next = circular_buffer_idx_next(idx_next)) ;
527 if (! circular_buffer[idx_next].extruding())
528 break;
529 float rate_prec = circular_buffer[idx].volumetric_extrusion_rate_end;
530 // What is the gradient of the extrusion rate between idx_prev and idx?
531 idx = idx_next;
532 GCodeLine &line = circular_buffer[idx];
533 for (size_t iRole = 1; iRole < numExtrusionRoles; ++ iRole) {
534 float rate_slope = m_max_volumetric_extrusion_rate_slopes[iRole].positive;
535 if (rate_slope == 0)
536 // The positive rate is unlimited.
537 continue;
538 float rate_start = feedrate_per_extrusion_role[iRole];
539 if (iRole == line.extrusion_role && rate_prec < rate_start)
540 rate_start = rate_prec;
541 if (line.volumetric_extrusion_rate_start > rate_start) {
542 line.volumetric_extrusion_rate_start = rate_start;
543 line.modified = true;
544 } else if (iRole == line.extrusion_role) {
545 rate_start = line.volumetric_extrusion_rate_start;
546 } else if (rate_start == FLT_MAX) {
547 // The rate for ExtrusionRole iRole is unlimited.
548 continue;
549 } else {
550 // Use the original, 'floating' extrusion rate as a starting point for the limiter.
551 }
552 float rate_end = (rate_slope == 0) ? FLT_MAX : rate_start + rate_slope * line.time_corrected();
553 if (rate_end < line.volumetric_extrusion_rate_end) {
554 // Limit the volumetric extrusion rate at the start of this segment due to a segment
555 // of ExtrusionType iRole, which was extruded before.
556 line.volumetric_extrusion_rate_end = rate_end;
557 line.max_volumetric_extrusion_rate_slope_positive = rate_slope;
558 line.modified = true;
559 }
560 feedrate_per_extrusion_role[iRole] = (iRole == line.extrusion_role) ? line.volumetric_extrusion_rate_end : rate_end;
561 }
562 }
563 }
564
565 void GCodePressureEqualizer::push_axis_to_output(const char axis, const float value, bool add_eol)
566 {
567 char buf[2048];
568 int len = sprintf(buf,
569 (axis == 'E') ? " %c%.3f" : " %c%.5f",
570 axis, value);
571 push_to_output(buf, len, add_eol);
572 }
573
574 void GCodePressureEqualizer::push_to_output(const char *text, const size_t len, bool add_eol)
575 {
576 // New length of the output buffer content.
577 size_t len_new = output_buffer_length + len + 1;
578 if (add_eol)
579 ++ len_new;
580
581 // Resize the output buffer to a power of 2 higher than the required memory.
582 if (output_buffer.size() < len_new) {
583 size_t v = len_new;
584 // Compute the next highest power of 2 of 32-bit v
585 // http://graphics.stanford.edu/~seander/bithacks.html
586 v--;
587 v |= v >> 1;
588 v |= v >> 2;
589 v |= v >> 4;
590 v |= v >> 8;
591 v |= v >> 16;
592 v++;
593 output_buffer.resize(v);
594 }
595
596 // Copy the text to the output.
597 if (len != 0) {
598 memcpy(output_buffer.data() + output_buffer_length, text, len);
599 output_buffer_length += len;
600 }
601 if (add_eol)
602 output_buffer[output_buffer_length ++] = '\n';
603 output_buffer[output_buffer_length] = 0;
604 }
605
606 void GCodePressureEqualizer::push_line_to_output(const GCodeLine &line, const float new_feedrate, const char *comment)
607 {
608 push_to_output("G1", 2, false);
609 for (char i = 0; i < 3; ++ i)
610 if (line.pos_provided[i])
611 push_axis_to_output('X'+i, line.pos_end[i]);
612 push_axis_to_output('E', m_config->use_relative_e_distances.value ? (line.pos_end[3] - line.pos_start[3]) : line.pos_end[3]);
613 // if (line.pos_provided[4] || fabs(line.feedrate() - new_feedrate) > 1e-5)
614 push_axis_to_output('F', new_feedrate);
615 // output comment and EOL
616 push_to_output(comment, (comment == NULL) ? 0 : strlen(comment), true);
617 }
618
619 } // namespace Slic3r
0 #ifndef slic3r_GCode_PressureEqualizer_hpp_
1 #define slic3r_GCode_PressureEqualizer_hpp_
2
3 #include "../libslic3r.h"
4 #include "../PrintConfig.hpp"
5 #include "../ExtrusionEntity.hpp"
6
7 namespace Slic3r {
8
9 // Processes a G-code. Finds changes in the volumetric extrusion speed and adjusts the transitions
10 // between these paths to limit fast changes in the volumetric extrusion speed.
11 class GCodePressureEqualizer
12 {
13 public:
14 GCodePressureEqualizer(const Slic3r::GCodeConfig *config);
15 ~GCodePressureEqualizer();
16
17 void reset();
18
19 // Process a next batch of G-code lines. Flush the internal buffers if asked for.
20 const char* process(const char *szGCode, bool flush);
21
22 size_t get_output_buffer_length() const { return output_buffer_length; }
23
24 private:
25 struct Statistics
26 {
27 void reset() {
28 volumetric_extrusion_rate_min = std::numeric_limits<float>::max();
29 volumetric_extrusion_rate_max = 0.f;
30 volumetric_extrusion_rate_avg = 0.f;
31 extrusion_length = 0.f;
32 }
33 void update(float volumetric_extrusion_rate, float length) {
34 volumetric_extrusion_rate_min = std::min(volumetric_extrusion_rate_min, volumetric_extrusion_rate);
35 volumetric_extrusion_rate_max = std::max(volumetric_extrusion_rate_max, volumetric_extrusion_rate);
36 volumetric_extrusion_rate_avg += volumetric_extrusion_rate * length;
37 extrusion_length += length;
38 }
39 float volumetric_extrusion_rate_min;
40 float volumetric_extrusion_rate_max;
41 float volumetric_extrusion_rate_avg;
42 float extrusion_length;
43 };
44
45 struct Statistics m_stat;
46
47 // Keeps the reference, does not own the config.
48 const Slic3r::GCodeConfig *m_config;
49
50 // Private configuration values
51 // How fast could the volumetric extrusion rate increase / decrase? mm^3/sec^2
52 struct ExtrusionRateSlope {
53 float positive;
54 float negative;
55 };
56 enum { numExtrusionRoles = erSupportMaterialInterface + 1 };
57 ExtrusionRateSlope m_max_volumetric_extrusion_rate_slopes[numExtrusionRoles];
58 float m_max_volumetric_extrusion_rate_slope_positive;
59 float m_max_volumetric_extrusion_rate_slope_negative;
60 // Maximum segment length to split a long segment, if the initial and the final flow rate differ.
61 float m_max_segment_length;
62
63 // Configuration extracted from config.
64 // Area of the crossestion of each filament. Necessary to calculate the volumetric flow rate.
65 std::vector<float> m_filament_crossections;
66
67 // Internal data.
68 // X,Y,Z,E,F
69 float m_current_pos[5];
70 size_t m_current_extruder;
71 ExtrusionRole m_current_extrusion_role;
72 bool m_retracted;
73
74 enum GCodeLineType
75 {
76 GCODELINETYPE_INVALID,
77 GCODELINETYPE_NOOP,
78 GCODELINETYPE_OTHER,
79 GCODELINETYPE_RETRACT,
80 GCODELINETYPE_UNRETRACT,
81 GCODELINETYPE_TOOL_CHANGE,
82 GCODELINETYPE_MOVE,
83 GCODELINETYPE_EXTRUDE,
84 };
85
86 struct GCodeLine
87 {
88 GCodeLine() :
89 type(GCODELINETYPE_INVALID),
90 raw_length(0),
91 modified(false),
92 extruder_id(0),
93 volumetric_extrusion_rate(0.f),
94 volumetric_extrusion_rate_start(0.f),
95 volumetric_extrusion_rate_end(0.f)
96 {}
97
98 bool moving_xy() const { return fabs(pos_end[0] - pos_start[0]) > 0.f || fabs(pos_end[1] - pos_start[1]) > 0.f; }
99 bool moving_z () const { return fabs(pos_end[2] - pos_start[2]) > 0.f; }
100 bool extruding() const { return moving_xy() && pos_end[3] > pos_start[3]; }
101 bool retracting() const { return pos_end[3] < pos_start[3]; }
102 bool deretracting() const { return ! moving_xy() && pos_end[3] > pos_start[3]; }
103
104 float dist_xy2() const { return (pos_end[0] - pos_start[0]) * (pos_end[0] - pos_start[0]) + (pos_end[1] - pos_start[1]) * (pos_end[1] - pos_start[1]); }
105 float dist_xyz2() const { return (pos_end[0] - pos_start[0]) * (pos_end[0] - pos_start[0]) + (pos_end[1] - pos_start[1]) * (pos_end[1] - pos_start[1]) + (pos_end[2] - pos_start[2]) * (pos_end[2] - pos_start[2]); }
106 float dist_xy() const { return sqrt(dist_xy2()); }
107 float dist_xyz() const { return sqrt(dist_xyz2()); }
108 float dist_e() const { return fabs(pos_end[3] - pos_start[3]); }
109
110 float feedrate() const { return pos_end[4]; }
111 float time() const { return dist_xyz() / feedrate(); }
112 float time_inv() const { return feedrate() / dist_xyz(); }
113 float volumetric_correction_avg() const {
114 float avg_correction = 0.5f * (volumetric_extrusion_rate_start + volumetric_extrusion_rate_end) / volumetric_extrusion_rate;
115 assert(avg_correction > 0.f);
116 assert(avg_correction <= 1.00000001f);
117 return avg_correction;
118 }
119 float time_corrected() const { return time() * volumetric_correction_avg(); }
120
121 GCodeLineType type;
122
123 // We try to keep the string buffer once it has been allocated, so it will not be reallocated over and over.
124 std::vector<char> raw;
125 size_t raw_length;
126 // If modified, the raw text has to be adapted by the new extrusion rate,
127 // or maybe the line needs to be split into multiple lines.
128 bool modified;
129
130 // float timeStart;
131 // float timeEnd;
132 // X,Y,Z,E,F. Storing the state of the currently active extruder only.
133 float pos_start[5];
134 float pos_end[5];
135 // Was the axis found on the G-code line? X,Y,Z,F
136 bool pos_provided[5];
137
138 // Index of the active extruder.
139 size_t extruder_id;
140 // Extrusion role of this segment.
141 ExtrusionRole extrusion_role;
142
143 // Current volumetric extrusion rate.
144 float volumetric_extrusion_rate;
145 // Volumetric extrusion rate at the start of this segment.
146 float volumetric_extrusion_rate_start;
147 // Volumetric extrusion rate at the end of this segment.
148 float volumetric_extrusion_rate_end;
149
150 // Volumetric extrusion rate slope limiting this segment.
151 // If set to zero, the slope is unlimited.
152 float max_volumetric_extrusion_rate_slope_positive;
153 float max_volumetric_extrusion_rate_slope_negative;
154 };
155
156 // Circular buffer of GCode lines. The circular buffer size will be limited to circular_buffer_size.
157 std::vector<GCodeLine> circular_buffer;
158 // Current position of the circular buffer (index, where to write the next line to, the line has to be pushed out before it is overwritten).
159 size_t circular_buffer_pos;
160 // Circular buffer size, configuration value.
161 size_t circular_buffer_size;
162 // Number of valid lines in the circular buffer. Lower or equal to circular_buffer_size.
163 size_t circular_buffer_items;
164
165 // Output buffer will only grow. It will not be reallocated over and over.
166 std::vector<char> output_buffer;
167 size_t output_buffer_length;
168
169 // For debugging purposes. Index of the G-code line processed.
170 size_t line_idx;
171
172 bool process_line(const char *line, const size_t len, GCodeLine &buf);
173 void output_gcode_line(GCodeLine &buf);
174
175 // Go back from the current circular_buffer_pos and lower the feedtrate to decrease the slope of the extrusion rate changes.
176 // Then go forward and adjust the feedrate to decrease the slope of the extrusion rate changes.
177 void adjust_volumetric_rate();
178
179 // Push the text to the end of the output_buffer.
180 void push_to_output(const char *text, const size_t len, bool add_eol = true);
181 // Push an axis assignment to the end of the output buffer.
182 void push_axis_to_output(const char axis, const float value, bool add_eol = false);
183 // Push a G-code line to the output,
184 void push_line_to_output(const GCodeLine &line, const float new_feedrate, const char *comment);
185
186 size_t circular_buffer_idx_head() const {
187 size_t idx = circular_buffer_pos + circular_buffer_size - circular_buffer_items;
188 if (idx >= circular_buffer_size)
189 idx -= circular_buffer_size;
190 return idx;
191 }
192
193 size_t circular_buffer_idx_tail() const { return circular_buffer_pos; }
194
195 size_t circular_buffer_idx_prev(size_t idx) const {
196 idx += circular_buffer_size - 1;
197 if (idx >= circular_buffer_size)
198 idx -= circular_buffer_size;
199 return idx;
200 }
201
202 size_t circular_buffer_idx_next(size_t idx) const {
203 if (++ idx >= circular_buffer_size)
204 idx -= circular_buffer_size;
205 return idx;
206 }
207 };
208
209 } // namespace Slic3r
210
211 #endif /* slic3r_GCode_PressureEqualizer_hpp_ */
0 #include "GCode.hpp"
1 #include "ExtrusionEntity.hpp"
2 #include "EdgeGrid.hpp"
3 #include <algorithm>
4 #include <cstdlib>
5 #include <math.h>
6
7 #include "SVG.hpp"
8
9 #if 0
10 // Enable debugging and asserts, even in the release build.
11 #define DEBUG
12 #define _DEBUG
13 #undef NDEBUG
14 #endif
15
16 #include <assert.h>
17
18 namespace Slic3r {
19
20 AvoidCrossingPerimeters::AvoidCrossingPerimeters()
21 : use_external_mp(false), use_external_mp_once(false), disable_once(true),
22 _external_mp(NULL), _layer_mp(NULL)
23 {
24 }
25
26 AvoidCrossingPerimeters::~AvoidCrossingPerimeters()
27 {
28 if (this->_external_mp != NULL)
29 delete this->_external_mp;
30
31 if (this->_layer_mp != NULL)
32 delete this->_layer_mp;
33 }
34
35 void
36 AvoidCrossingPerimeters::init_external_mp(const ExPolygons &islands)
37 {
38 if (this->_external_mp != NULL)
39 delete this->_external_mp;
40
41 this->_external_mp = new MotionPlanner(islands);
42 }
43
44 void
45 AvoidCrossingPerimeters::init_layer_mp(const ExPolygons &islands)
46 {
47 if (this->_layer_mp != NULL)
48 delete this->_layer_mp;
49
50 this->_layer_mp = new MotionPlanner(islands);
51 }
52
53 Polyline
54 AvoidCrossingPerimeters::travel_to(GCode &gcodegen, Point point)
55 {
56 if (this->use_external_mp || this->use_external_mp_once) {
57 // get current origin set in gcodegen
58 // (the one that will be used to translate the G-code coordinates by)
59 Point scaled_origin = Point::new_scale(gcodegen.origin.x, gcodegen.origin.y);
60
61 // represent last_pos in absolute G-code coordinates
62 Point last_pos = gcodegen.last_pos();
63 last_pos.translate(scaled_origin);
64
65 // represent point in absolute G-code coordinates
66 point.translate(scaled_origin);
67
68 // calculate path
69 Polyline travel = this->_external_mp->shortest_path(last_pos, point);
70 //exit(0);
71 // translate the path back into the shifted coordinate system that gcodegen
72 // is currently using for writing coordinates
73 travel.translate(scaled_origin.negative());
74 return travel;
75 } else {
76 return this->_layer_mp->shortest_path(gcodegen.last_pos(), point);
77 }
78 }
79
80 OozePrevention::OozePrevention()
81 : enable(false)
82 {
83 }
84
85 std::string
86 OozePrevention::pre_toolchange(GCode &gcodegen)
87 {
88 std::string gcode;
89
90 // move to the nearest standby point
91 if (!this->standby_points.empty()) {
92 // get current position in print coordinates
93 Pointf3 writer_pos = gcodegen.writer.get_position();
94 Point pos = Point::new_scale(writer_pos.x, writer_pos.y);
95
96 // find standby point
97 Point standby_point;
98 pos.nearest_point(this->standby_points, &standby_point);
99
100 /* We don't call gcodegen.travel_to() because we don't need retraction (it was already
101 triggered by the caller) nor avoid_crossing_perimeters and also because the coordinates
102 of the destination point must not be transformed by origin nor current extruder offset. */
103 gcode += gcodegen.writer.travel_to_xy(Pointf::new_unscale(standby_point),
104 "move to standby position");
105 }
106
107 if (gcodegen.config.standby_temperature_delta.value != 0) {
108 // we assume that heating is always slower than cooling, so no need to block
109 gcode += gcodegen.writer.set_temperature
110 (this->_get_temp(gcodegen) + gcodegen.config.standby_temperature_delta.value, false);
111 }
112
113 return gcode;
114 }
115
116 std::string
117 OozePrevention::post_toolchange(GCode &gcodegen)
118 {
119 std::string gcode;
120
121 if (gcodegen.config.standby_temperature_delta.value != 0) {
122 gcode += gcodegen.writer.set_temperature(this->_get_temp(gcodegen), true);
123 }
124
125 return gcode;
126 }
127
128 int
129 OozePrevention::_get_temp(GCode &gcodegen)
130 {
131 return (gcodegen.layer != NULL && gcodegen.layer->id() == 0)
132 ? gcodegen.config.first_layer_temperature.get_at(gcodegen.writer.extruder()->id)
133 : gcodegen.config.temperature.get_at(gcodegen.writer.extruder()->id);
134 }
135
136 Wipe::Wipe()
137 : enable(false)
138 {
139 }
140
141 bool
142 Wipe::has_path()
143 {
144 return !this->path.points.empty();
145 }
146
147 void
148 Wipe::reset_path()
149 {
150 this->path = Polyline();
151 }
152
153 std::string
154 Wipe::wipe(GCode &gcodegen, bool toolchange)
155 {
156 std::string gcode;
157
158 /* Reduce feedrate a bit; travel speed is often too high to move on existing material.
159 Too fast = ripping of existing material; too slow = short wipe path, thus more blob. */
160 double wipe_speed = gcodegen.writer.config.travel_speed.value * 0.8;
161
162 // get the retraction length
163 double length = toolchange
164 ? gcodegen.writer.extruder()->retract_length_toolchange()
165 : gcodegen.writer.extruder()->retract_length();
166
167 if (length > 0) {
168 /* Calculate how long we need to travel in order to consume the required
169 amount of retraction. In other words, how far do we move in XY at wipe_speed
170 for the time needed to consume retract_length at retract_speed? */
171 double wipe_dist = scale_(length / gcodegen.writer.extruder()->retract_speed() * wipe_speed);
172
173 /* Take the stored wipe path and replace first point with the current actual position
174 (they might be different, for example, in case of loop clipping). */
175 Polyline wipe_path;
176 wipe_path.append(gcodegen.last_pos());
177 wipe_path.append(
178 this->path.points.begin() + 1,
179 this->path.points.end()
180 );
181
182 wipe_path.clip_end(wipe_path.length() - wipe_dist);
183
184 // subdivide the retraction in segments
185 double retracted = 0;
186 Lines lines = wipe_path.lines();
187 for (Lines::const_iterator line = lines.begin(); line != lines.end(); ++line) {
188 double segment_length = line->length();
189 /* Reduce retraction length a bit to avoid effective retraction speed to be greater than the configured one
190 due to rounding (TODO: test and/or better math for this) */
191 double dE = length * (segment_length / wipe_dist) * 0.95;
192 gcode += gcodegen.writer.set_speed(wipe_speed*60, "", gcodegen.enable_cooling_markers ? ";_WIPE" : "");
193 gcode += gcodegen.writer.extrude_to_xy(
194 gcodegen.point_to_gcode(line->b),
195 -dE,
196 "wipe and retract"
197 );
198 retracted += dE;
199 }
200 gcodegen.writer.extruder()->retracted += retracted;
201
202 // prevent wiping again on same path
203 this->reset_path();
204 }
205
206 return gcode;
207 }
208
209 #define EXTRUDER_CONFIG(OPT) this->config.OPT.get_at(this->writer.extruder()->id)
210
211 GCode::GCode()
212 : placeholder_parser(NULL), enable_loop_clipping(true),
213 enable_cooling_markers(false), enable_extrusion_role_markers(false), enable_analyzer_markers(false),
214 layer_count(0),
215 layer_index(-1), layer(NULL), first_layer(false), elapsed_time(0.0), volumetric_speed(0),
216 _last_pos_defined(false),
217 _lower_layer_edge_grid(NULL),
218 _last_extrusion_role(erNone)
219 {
220 }
221
222 GCode::~GCode()
223 {
224 delete _lower_layer_edge_grid;
225 _lower_layer_edge_grid = NULL;
226 }
227
228 const Point&
229 GCode::last_pos() const
230 {
231 return this->_last_pos;
232 }
233
234 void
235 GCode::set_last_pos(const Point &pos)
236 {
237 this->_last_pos = pos;
238 this->_last_pos_defined = true;
239 }
240
241 bool
242 GCode::last_pos_defined() const
243 {
244 return this->_last_pos_defined;
245 }
246
247 void
248 GCode::apply_print_config(const PrintConfig &print_config)
249 {
250 this->writer.apply_print_config(print_config);
251 this->config.apply(print_config);
252 }
253
254 void
255 GCode::set_extruders(const std::vector<unsigned int> &extruder_ids)
256 {
257 this->writer.set_extruders(extruder_ids);
258
259 // enable wipe path generation if any extruder has wipe enabled
260 this->wipe.enable = false;
261 for (std::vector<unsigned int>::const_iterator it = extruder_ids.begin();
262 it != extruder_ids.end(); ++it) {
263 if (this->config.wipe.get_at(*it)) {
264 this->wipe.enable = true;
265 break;
266 }
267 }
268 }
269
270 void
271 GCode::set_origin(const Pointf &pointf)
272 {
273 // if origin increases (goes towards right), last_pos decreases because it goes towards left
274 const Point translate(
275 scale_(this->origin.x - pointf.x),
276 scale_(this->origin.y - pointf.y)
277 );
278 this->_last_pos.translate(translate);
279 this->wipe.path.translate(translate);
280 this->origin = pointf;
281 }
282
283 std::string
284 GCode::preamble()
285 {
286 std::string gcode = this->writer.preamble();
287
288 /* Perform a *silent* move to z_offset: we need this to initialize the Z
289 position of our writer object so that any initial lift taking place
290 before the first layer change will raise the extruder from the correct
291 initial Z instead of 0. */
292 this->writer.travel_to_z(this->config.z_offset.value);
293
294 return gcode;
295 }
296
297 std::string
298 GCode::change_layer(const Layer &layer)
299 {
300 this->layer = &layer;
301 this->layer_index++;
302 this->first_layer = (layer.id() == 0);
303 delete this->_lower_layer_edge_grid;
304 this->_lower_layer_edge_grid = NULL;
305
306 std::string gcode;
307
308 if (enable_analyzer_markers) {
309 // Store the binary pointer to the layer object directly into the G-code to be accessed by the GCodeAnalyzer.
310 char buf[64];
311 sprintf(buf, ";_LAYEROBJ:%p\n", this->layer);
312 gcode += buf;
313 }
314
315 // avoid computing islands and overhangs if they're not needed
316 if (this->config.avoid_crossing_perimeters) {
317 ExPolygons islands;
318 union_(layer.slices, &islands, true);
319 this->avoid_crossing_perimeters.init_layer_mp(islands);
320 }
321
322 if (this->layer_count > 0) {
323 gcode += this->writer.update_progress(this->layer_index, this->layer_count);
324 }
325
326 coordf_t z = layer.print_z + this->config.z_offset.value; // in unscaled coordinates
327 if (EXTRUDER_CONFIG(retract_layer_change) && this->writer.will_move_z(z)) {
328 gcode += this->retract();
329 }
330 {
331 std::ostringstream comment;
332 comment << "move to next layer (" << this->layer_index << ")";
333 gcode += this->writer.travel_to_z(z, comment.str());
334 }
335
336 // forget last wiping path as wiping after raising Z is pointless
337 this->wipe.reset_path();
338
339 return gcode;
340 }
341
342 static inline const char* ExtrusionRole2String(const ExtrusionRole role)
343 {
344 switch (role) {
345 case erNone: return "erNone";
346 case erPerimeter: return "erPerimeter";
347 case erExternalPerimeter: return "erExternalPerimeter";
348 case erOverhangPerimeter: return "erOverhangPerimeter";
349 case erInternalInfill: return "erInternalInfill";
350 case erSolidInfill: return "erSolidInfill";
351 case erTopSolidInfill: return "erTopSolidInfill";
352 case erBridgeInfill: return "erBridgeInfill";
353 case erGapFill: return "erGapFill";
354 case erSkirt: return "erSkirt";
355 case erSupportMaterial: return "erSupportMaterial";
356 case erSupportMaterialInterface: return "erSupportMaterialInterface";
357 default: return "erInvalid";
358 };
359 }
360
361 static inline const char* ExtrusionLoopRole2String(const ExtrusionLoopRole role)
362 {
363 switch (role) {
364 case elrDefault: return "elrDefault";
365 case elrContourInternalPerimeter: return "elrContourInternalPerimeter";
366 case elrSkirt: return "elrSkirt";
367 default: return "elrInvalid";
368 }
369 };
370
371 // Return a value in <0, 1> of a cubic B-spline kernel centered around zero.
372 // The B-spline is re-scaled so it has value 1 at zero.
373 static inline float bspline_kernel(float x)
374 {
375 x = std::abs(x);
376 if (x < 1.f) {
377 return 1.f - (3. / 2.) * x * x + (3.f / 4.f) * x * x * x;
378 }
379 else if (x < 2.f) {
380 x -= 1.f;
381 float x2 = x * x;
382 float x3 = x2 * x;
383 return (1.f / 4.f) - (3.f / 4.f) * x + (3.f / 4.f) * x2 - (1.f / 4.f) * x3;
384 }
385 else
386 return 0;
387 }
388
389 static float extrudate_overlap_penalty(float nozzle_r, float weight_zero, float overlap_distance)
390 {
391 // The extrudate is not fully supported by the lower layer. Fit a polynomial penalty curve.
392 // Solved by sympy package:
393 /*
394 from sympy import *
395 (x,a,b,c,d,r,z)=symbols('x a b c d r z')
396 p = a + b*x + c*x*x + d*x*x*x
397 p2 = p.subs(solve([p.subs(x, -r), p.diff(x).subs(x, -r), p.diff(x,x).subs(x, -r), p.subs(x, 0)-z], [a, b, c, d]))
398 from sympy.plotting import plot
399 plot(p2.subs(r,0.2).subs(z,1.), (x, -1, 3), adaptive=False, nb_of_points=400)
400 */
401 if (overlap_distance < - nozzle_r) {
402 // The extrudate is fully supported by the lower layer. This is the ideal case, therefore zero penalty.
403 return 0.f;
404 } else {
405 float x = overlap_distance / nozzle_r;
406 float x2 = x * x;
407 float x3 = x2 * x;
408 return weight_zero * (1.f + 3.f * x + 3.f * x2 + x3);
409 }
410 }
411
412 static Points::iterator project_point_to_polygon_and_insert(Polygon &polygon, const Point &pt, double eps)
413 {
414 assert(polygon.points.size() >= 2);
415 if (polygon.points.size() <= 1)
416 if (polygon.points.size() == 1)
417 return polygon.points.begin();
418
419 Point pt_min;
420 double d_min = std::numeric_limits<double>::max();
421 size_t i_min = size_t(-1);
422
423 for (size_t i = 0; i < polygon.points.size(); ++ i) {
424 size_t j = i + 1;
425 if (j == polygon.points.size())
426 j = 0;
427 const Point &p1 = polygon.points[i];
428 const Point &p2 = polygon.points[j];
429 const Slic3r::Point v_seg = p1.vector_to(p2);
430 const Slic3r::Point v_pt = p1.vector_to(pt);
431 const int64_t l2_seg = int64_t(v_seg.x) * int64_t(v_seg.x) + int64_t(v_seg.y) * int64_t(v_seg.y);
432 int64_t t_pt = int64_t(v_seg.x) * int64_t(v_pt.x) + int64_t(v_seg.y) * int64_t(v_pt.y);
433 if (t_pt < 0) {
434 // Closest to p1.
435 double dabs = sqrt(int64_t(v_pt.x) * int64_t(v_pt.x) + int64_t(v_pt.y) * int64_t(v_pt.y));
436 if (dabs < d_min) {
437 d_min = dabs;
438 i_min = i;
439 pt_min = p1;
440 }
441 }
442 else if (t_pt > l2_seg) {
443 // Closest to p2. Then p2 is the starting point of another segment, which shall be discovered in the next step.
444 continue;
445 } else {
446 // Closest to the segment.
447 assert(t_pt >= 0 && t_pt <= l2_seg);
448 int64_t d_seg = int64_t(v_seg.y) * int64_t(v_pt.x) - int64_t(v_seg.x) * int64_t(v_pt.y);
449 double d = double(d_seg) / sqrt(double(l2_seg));
450 double dabs = std::abs(d);
451 if (dabs < d_min) {
452 d_min = dabs;
453 i_min = i;
454 // Evaluate the foot point.
455 pt_min = p1;
456 double linv = double(d_seg) / double(l2_seg);
457 pt_min.x = pt.x - coord_t(floor(double(v_seg.y) * linv + 0.5));
458 pt_min.y = pt.y + coord_t(floor(double(v_seg.x) * linv + 0.5));
459 assert(Line(p1, p2).distance_to(pt_min) < scale_(1e-5));
460 }
461 }
462 }
463
464 assert(i_min != size_t(-1));
465 if (pt_min.distance_to(polygon.points[i_min]) > eps) {
466 // Insert a new point on the segment i_min, i_min+1.
467 return polygon.points.insert(polygon.points.begin() + (i_min + 1), pt_min);
468 }
469 return polygon.points.begin() + i_min;
470 }
471
472 std::vector<float> polygon_parameter_by_length(const Polygon &polygon)
473 {
474 // Parametrize the polygon by its length.
475 std::vector<float> lengths(polygon.points.size()+1, 0.);
476 for (size_t i = 1; i < polygon.points.size(); ++ i)
477 lengths[i] = lengths[i-1] + polygon.points[i].distance_to(polygon.points[i-1]);
478 lengths.back() = lengths[lengths.size()-2] + polygon.points.front().distance_to(polygon.points.back());
479 return lengths;
480 }
481
482 std::vector<float> polygon_angles_at_vertices(const Polygon &polygon, const std::vector<float> &lengths, float min_arm_length)
483 {
484 assert(polygon.points.size() + 1 == lengths.size());
485 if (min_arm_length > 0.25f * lengths.back())
486 min_arm_length = 0.25f * lengths.back();
487
488 // Find the initial prev / next point span.
489 size_t idx_prev = polygon.points.size();
490 size_t idx_curr = 0;
491 size_t idx_next = 1;
492 while (idx_prev > idx_curr && lengths.back() - lengths[idx_prev] < min_arm_length)
493 -- idx_prev;
494 while (idx_next < idx_prev && lengths[idx_next] < min_arm_length)
495 ++ idx_next;
496
497 std::vector<float> angles(polygon.points.size(), 0.f);
498 for (; idx_curr < polygon.points.size(); ++ idx_curr) {
499 // Move idx_prev up until the distance between idx_prev and idx_curr is lower than min_arm_length.
500 if (idx_prev >= idx_curr) {
501 while (idx_prev < polygon.points.size() && lengths.back() - lengths[idx_prev] + lengths[idx_curr] > min_arm_length)
502 ++ idx_prev;
503 if (idx_prev == polygon.points.size())
504 idx_prev = 0;
505 }
506 while (idx_prev < idx_curr && lengths[idx_curr] - lengths[idx_prev] > min_arm_length)
507 ++ idx_prev;
508 // Move idx_prev one step back.
509 if (idx_prev == 0)
510 idx_prev = polygon.points.size() - 1;
511 else
512 -- idx_prev;
513 // Move idx_next up until the distance between idx_curr and idx_next is greater than min_arm_length.
514 if (idx_curr <= idx_next) {
515 while (idx_next < polygon.points.size() && lengths[idx_next] - lengths[idx_curr] < min_arm_length)
516 ++ idx_next;
517 if (idx_next == polygon.points.size())
518 idx_next = 0;
519 }
520 while (idx_next < idx_curr && lengths.back() - lengths[idx_curr] + lengths[idx_next] < min_arm_length)
521 ++ idx_next;
522 // Calculate angle between idx_prev, idx_curr, idx_next.
523 const Point &p0 = polygon.points[idx_prev];
524 const Point &p1 = polygon.points[idx_curr];
525 const Point &p2 = polygon.points[idx_next];
526 const Point v1 = p0.vector_to(p1);
527 const Point v2 = p1.vector_to(p2);
528 int64_t dot = int64_t(v1.x)*int64_t(v2.x) + int64_t(v1.y)*int64_t(v2.y);
529 int64_t cross = int64_t(v1.x)*int64_t(v2.y) - int64_t(v1.y)*int64_t(v2.x);
530 float angle = float(atan2(double(cross), double(dot)));
531 angles[idx_curr] = angle;
532 }
533
534 return angles;
535 }
536
537 std::string
538 GCode::extrude(ExtrusionLoop loop, std::string description, double speed)
539 {
540 // get a copy; don't modify the orientation of the original loop object otherwise
541 // next copies (if any) would not detect the correct orientation
542
543 if (this->layer->lower_layer != NULL) {
544 if (this->_lower_layer_edge_grid == NULL) {
545 // Create the distance field for a layer below.
546 const coord_t distance_field_resolution = scale_(1.f);
547 this->_lower_layer_edge_grid = new EdgeGrid::Grid();
548 this->_lower_layer_edge_grid->create(this->layer->lower_layer->slices, distance_field_resolution);
549 this->_lower_layer_edge_grid->calculate_sdf();
550 #if 0
551 {
552 static int iRun = 0;
553 BoundingBox bbox = this->_lower_layer_edge_grid->bbox();
554 bbox.min.x -= scale_(5.f);
555 bbox.min.y -= scale_(5.f);
556 bbox.max.x += scale_(5.f);
557 bbox.max.y += scale_(5.f);
558 EdgeGrid::save_png(*this->_lower_layer_edge_grid, bbox, scale_(0.1f), debug_out_path("GCode_extrude_loop_edge_grid-%d.png", iRun++));
559 }
560 #endif
561 }
562 }
563
564 // extrude all loops ccw
565 bool was_clockwise = loop.make_counter_clockwise();
566
567 SeamPosition seam_position = this->config.seam_position;
568 if (loop.role == elrSkirt) seam_position = spNearest;
569
570 // find the point of the loop that is closest to the current extruder position
571 // or randomize if requested
572 Point last_pos = this->last_pos();
573 if (this->config.spiral_vase) {
574 loop.split_at(last_pos);
575 } else if (seam_position == spNearest || seam_position == spAligned) {
576 Polygon polygon = loop.polygon();
577 const coordf_t nozzle_dmr = EXTRUDER_CONFIG(nozzle_diameter);
578 const coord_t nozzle_r = scale_(0.5*nozzle_dmr);
579
580 // Retrieve the last start position for this object.
581 float last_pos_weight = 1.f;
582 if (seam_position == spAligned && this->layer != NULL && this->_seam_position.count(this->layer->object()) > 0) {
583 last_pos = this->_seam_position[this->layer->object()];
584 last_pos_weight = 5.f;
585 }
586
587 // Insert a projection of last_pos into the polygon.
588 size_t last_pos_proj_idx;
589 {
590 Points::iterator it = project_point_to_polygon_and_insert(polygon, last_pos, 0.1 * nozzle_r);
591 last_pos_proj_idx = it - polygon.points.begin();
592 }
593 Point last_pos_proj = polygon.points[last_pos_proj_idx];
594 // Parametrize the polygon by its length.
595 std::vector<float> lengths = polygon_parameter_by_length(polygon);
596
597 // For each polygon point, store a penalty.
598 // First calculate the angles, store them as penalties. The angles are caluculated over a minimum arm length of nozzle_r.
599 std::vector<float> penalties = polygon_angles_at_vertices(polygon, lengths, nozzle_r);
600 // No penalty for reflex points, slight penalty for convex points, high penalty for flat surfaces.
601 const float penaltyConvexVertex = 1.f;
602 const float penaltyFlatSurface = 5.f;
603 const float penaltySeam = 1.3f;
604 const float penaltyOverhangHalf = 10.f;
605 // Penalty for visible seams.
606 for (size_t i = 0; i < polygon.points.size(); ++ i) {
607 float ccwAngle = penalties[i];
608 if (was_clockwise)
609 ccwAngle = - ccwAngle;
610 float penalty = 0;
611 // if (ccwAngle <- float(PI/3.))
612 if (ccwAngle <- float(0.6 * PI))
613 // Sharp reflex vertex. We love that, it hides the seam perfectly.
614 penalty = 0.f;
615 // else if (ccwAngle > float(PI/3.))
616 else if (ccwAngle > float(0.6 * PI))
617 // Seams on sharp convex vertices are more visible than on reflex vertices.
618 penalty = penaltyConvexVertex;
619 else if (ccwAngle < 0.f) {
620 // Interpolate penalty between maximum and zero.
621 penalty = penaltyFlatSurface * bspline_kernel(ccwAngle * (PI * 2. / 3.));
622 } else {
623 assert(ccwAngle >= 0.f);
624 // Interpolate penalty between maximum and the penalty for a convex vertex.
625 penalty = penaltyConvexVertex + (penaltyFlatSurface - penaltyConvexVertex) * bspline_kernel(ccwAngle * (PI * 2. / 3.));
626 }
627 // Give a negative penalty for points close to the last point or the prefered seam location.
628 //float dist_to_last_pos_proj = last_pos_proj.distance_to(polygon.points[i]);
629 float dist_to_last_pos_proj = (i < last_pos_proj_idx) ?
630 std::min(lengths[last_pos_proj_idx] - lengths[i], lengths.back() - lengths[last_pos_proj_idx] + lengths[i]) :
631 std::min(lengths[i] - lengths[last_pos_proj_idx], lengths.back() - lengths[i] + lengths[last_pos_proj_idx]);
632 float dist_max = 0.1f * lengths.back(); // 5.f * nozzle_dmr
633 penalty -= last_pos_weight * bspline_kernel(dist_to_last_pos_proj / dist_max);
634 penalties[i] = std::max(0.f, penalty);
635 }
636
637 // Penalty for overhangs.
638 if (this->_lower_layer_edge_grid) {
639 // Use the edge grid distance field structure over the lower layer to calculate overhangs.
640 coord_t nozzle_r = scale_(0.5*nozzle_dmr);
641 coord_t search_r = scale_(0.8*nozzle_dmr);
642 for (size_t i = 0; i < polygon.points.size(); ++ i) {
643 const Point &p = polygon.points[i];
644 coordf_t dist;
645 // Signed distance is positive outside the object, negative inside the object.
646 // The point is considered at an overhang, if it is more than nozzle radius
647 // outside of the lower layer contour.
648 bool found = this->_lower_layer_edge_grid->signed_distance(p, search_r, dist);
649 // If the approximate Signed Distance Field was initialized over this->_lower_layer_edge_grid,
650 // then the signed distnace shall always be known.
651 assert(found);
652 penalties[i] += extrudate_overlap_penalty(nozzle_r, penaltyOverhangHalf, dist);
653 }
654 }
655
656 // Find a point with a minimum penalty.
657 size_t idx_min = std::min_element(penalties.begin(), penalties.end()) - penalties.begin();
658
659 // Export the contour into a SVG file.
660 #if 0
661 {
662 static int iRun = 0;
663 SVG svg(debug_out_path("GCode_extrude_loop-%d.svg", iRun ++));
664 if (this->layer->lower_layer != NULL)
665 svg.draw(this->layer->lower_layer->slices.expolygons);
666 for (size_t i = 0; i < loop.paths.size(); ++ i)
667 svg.draw(loop.paths[i].as_polyline(), "red");
668 Polylines polylines;
669 for (size_t i = 0; i < loop.paths.size(); ++ i)
670 polylines.push_back(loop.paths[i].as_polyline());
671 Slic3r::Polygons polygons;
672 coordf_t nozzle_dmr = EXTRUDER_CONFIG(nozzle_diameter);
673 coord_t delta = scale_(0.5*nozzle_dmr);
674 Slic3r::offset(polylines, &polygons, delta);
675 // for (size_t i = 0; i < polygons.size(); ++ i) svg.draw((Polyline)polygons[i], "blue");
676 svg.draw(last_pos, "green", 3);
677 svg.draw(polygon.points[idx_min], "yellow", 3);
678 svg.Close();
679 }
680 #endif
681
682 // Split the loop at the point with a minium penalty.
683 if (!loop.split_at_vertex(polygon.points[idx_min]))
684 // The point is not in the original loop. Insert it.
685 loop.split_at(polygon.points[idx_min]);
686
687 } else if (seam_position == spRandom) {
688 if (loop.role == elrContourInternalPerimeter) {
689 // This loop does not contain any other loop. Set a random position.
690 // The other loops will get a seam close to the random point chosen
691 // on the inner most contour.
692 //FIXME This works correctly for inner contours first only.
693 //FIXME Better parametrize the loop by its length.
694 Polygon polygon = loop.polygon();
695 Point centroid = polygon.centroid();
696 last_pos = Point(polygon.bounding_box().max.x, centroid.y);
697 last_pos.rotate(fmod((float)rand()/16.0, 2.0*PI), centroid);
698 }
699 loop.split_at(last_pos);
700 }
701
702 // clip the path to avoid the extruder to get exactly on the first point of the loop;
703 // if polyline was shorter than the clipping distance we'd get a null polyline, so
704 // we discard it in that case
705 double clip_length = this->enable_loop_clipping
706 ? scale_(EXTRUDER_CONFIG(nozzle_diameter)) * LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER
707 : 0;
708
709 // get paths
710 ExtrusionPaths paths;
711 loop.clip_end(clip_length, &paths);
712 if (paths.empty()) return "";
713
714 // apply the small perimeter speed
715 if (paths.front().is_perimeter() && loop.length() <= SMALL_PERIMETER_LENGTH) {
716 if (speed == -1) speed = this->config.get_abs_value("small_perimeter_speed");
717 }
718
719 // extrude along the path
720 std::string gcode;
721 for (ExtrusionPaths::const_iterator path = paths.begin(); path != paths.end(); ++path)
722 // description += ExtrusionLoopRole2String(loop.role);
723 // description += ExtrusionRole2String(path->role);
724 gcode += this->_extrude(*path, description, speed);
725
726 // reset acceleration
727 gcode += this->writer.set_acceleration(this->config.default_acceleration.value);
728
729 if (this->wipe.enable)
730 this->wipe.path = paths.front().polyline; // TODO: don't limit wipe to last path
731
732 // make a little move inwards before leaving loop
733 if (paths.back().role == erExternalPerimeter && this->layer != NULL && this->config.perimeters > 1) {
734 // detect angle between last and first segment
735 // the side depends on the original winding order of the polygon (left for contours, right for holes)
736 Point a = paths.front().polyline.points[1]; // second point
737 Point b = *(paths.back().polyline.points.end()-3); // second to last point
738 if (was_clockwise) {
739 // swap points
740 Point c = a; a = b; b = c;
741 }
742
743 double angle = paths.front().first_point().ccw_angle(a, b) / 3;
744
745 // turn left if contour, turn right if hole
746 if (was_clockwise) angle *= -1;
747
748 // create the destination point along the first segment and rotate it
749 // we make sure we don't exceed the segment length because we don't know
750 // the rotation of the second segment so we might cross the object boundary
751 Line first_segment(
752 paths.front().polyline.points[0],
753 paths.front().polyline.points[1]
754 );
755 double distance = std::min(
756 scale_(EXTRUDER_CONFIG(nozzle_diameter)),
757 first_segment.length()
758 );
759 Point point = first_segment.point_at(distance);
760 point.rotate(angle, first_segment.a);
761
762 // generate the travel move
763 gcode += this->writer.travel_to_xy(this->point_to_gcode(point), "move inwards before travel");
764 }
765
766 return gcode;
767 }
768
769 std::string
770 GCode::extrude(const ExtrusionEntity &entity, std::string description, double speed)
771 {
772 if (const ExtrusionPath* path = dynamic_cast<const ExtrusionPath*>(&entity)) {
773 return this->extrude(*path, description, speed);
774 } else if (const ExtrusionLoop* loop = dynamic_cast<const ExtrusionLoop*>(&entity)) {
775 return this->extrude(*loop, description, speed);
776 } else {
777 CONFESS("Invalid argument supplied to extrude()");
778 return "";
779 }
780 }
781
782 std::string
783 GCode::extrude(const ExtrusionPath &path, std::string description, double speed)
784 {
785 // description += ExtrusionRole2String(path.role);
786 std::string gcode = this->_extrude(path, description, speed);
787
788 // reset acceleration
789 gcode += this->writer.set_acceleration(this->config.default_acceleration.value);
790
791 return gcode;
792 }
793
794 std::string
795 GCode::_extrude(ExtrusionPath path, std::string description, double speed)
796 {
797 path.simplify(SCALED_RESOLUTION);
798
799 std::string gcode;
800
801 // go to first point of extrusion path
802 if (!this->_last_pos_defined || !this->_last_pos.coincides_with(path.first_point())) {
803 gcode += this->travel_to(
804 path.first_point(),
805 path.role,
806 "move to first " + description + " point"
807 );
808 }
809
810 // compensate retraction
811 gcode += this->unretract();
812
813 // adjust acceleration
814 {
815 double acceleration;
816 if (this->config.first_layer_acceleration.value > 0 && this->first_layer) {
817 acceleration = this->config.first_layer_acceleration.value;
818 } else if (this->config.perimeter_acceleration.value > 0 && path.is_perimeter()) {
819 acceleration = this->config.perimeter_acceleration.value;
820 } else if (this->config.bridge_acceleration.value > 0 && path.is_bridge()) {
821 acceleration = this->config.bridge_acceleration.value;
822 } else if (this->config.infill_acceleration.value > 0 && path.is_infill()) {
823 acceleration = this->config.infill_acceleration.value;
824 } else {
825 acceleration = this->config.default_acceleration.value;
826 }
827 gcode += this->writer.set_acceleration(acceleration);
828 }
829
830 // calculate extrusion length per distance unit
831 double e_per_mm = this->writer.extruder()->e_per_mm3 * path.mm3_per_mm;
832 if (this->writer.extrusion_axis().empty()) e_per_mm = 0;
833
834 // set speed
835 if (speed == -1) {
836 if (path.role == erPerimeter) {
837 speed = this->config.get_abs_value("perimeter_speed");
838 } else if (path.role == erExternalPerimeter) {
839 speed = this->config.get_abs_value("external_perimeter_speed");
840 } else if (path.role == erOverhangPerimeter || path.role == erBridgeInfill) {
841 speed = this->config.get_abs_value("bridge_speed");
842 } else if (path.role == erInternalInfill) {
843 speed = this->config.get_abs_value("infill_speed");
844 } else if (path.role == erSolidInfill) {
845 speed = this->config.get_abs_value("solid_infill_speed");
846 } else if (path.role == erTopSolidInfill) {
847 speed = this->config.get_abs_value("top_solid_infill_speed");
848 } else if (path.role == erGapFill) {
849 speed = this->config.get_abs_value("gap_fill_speed");
850 } else {
851 CONFESS("Invalid speed");
852 }
853 }
854 if (this->first_layer) {
855 speed = this->config.get_abs_value("first_layer_speed", speed);
856 }
857 if (this->volumetric_speed != 0 && speed == 0) {
858 speed = this->volumetric_speed / path.mm3_per_mm;
859 }
860 if (this->config.max_volumetric_speed.value > 0) {
861 // cap speed with max_volumetric_speed anyway (even if user is not using autospeed)
862 speed = std::min(
863 speed,
864 this->config.max_volumetric_speed.value / path.mm3_per_mm
865 );
866 }
867 if (EXTRUDER_CONFIG(filament_max_volumetric_speed) > 0) {
868 // cap speed with max_volumetric_speed anyway (even if user is not using autospeed)
869 speed = std::min(
870 speed,
871 EXTRUDER_CONFIG(filament_max_volumetric_speed) / path.mm3_per_mm
872 );
873 }
874 double F = speed * 60; // convert mm/sec to mm/min
875
876 // extrude arc or line
877 if (this->enable_extrusion_role_markers || this->enable_analyzer_markers) {
878 if (path.role != this->_last_extrusion_role) {
879 this->_last_extrusion_role = path.role;
880 char buf[32];
881 sprintf(buf, ";_EXTRUSION_ROLE:%d\n", int(path.role));
882 gcode += buf;
883 }
884 }
885 if (path.is_bridge() && this->enable_cooling_markers)
886 gcode += ";_BRIDGE_FAN_START\n";
887 gcode += this->writer.set_speed(F, "", this->enable_cooling_markers ? ";_EXTRUDE_SET_SPEED" : "");
888 double path_length = 0;
889 {
890 std::string comment = this->config.gcode_comments ? description : "";
891 Lines lines = path.polyline.lines();
892 for (Lines::const_iterator line = lines.begin(); line != lines.end(); ++line) {
893 const double line_length = line->length() * SCALING_FACTOR;
894 path_length += line_length;
895
896 gcode += this->writer.extrude_to_xy(
897 this->point_to_gcode(line->b),
898 e_per_mm * line_length,
899 comment
900 );
901 }
902 }
903 if (this->wipe.enable) {
904 this->wipe.path = path.polyline;
905 this->wipe.path.reverse();
906 }
907 if (path.is_bridge() && this->enable_cooling_markers)
908 gcode += ";_BRIDGE_FAN_END\n";
909
910 this->set_last_pos(path.last_point());
911
912 if (this->config.cooling)
913 this->elapsed_time += path_length / F * 60;
914
915 return gcode;
916 }
917
918 // This method accepts &point in print coordinates.
919 std::string
920 GCode::travel_to(const Point &point, ExtrusionRole role, std::string comment)
921 {
922 /* Define the travel move as a line between current position and the taget point.
923 This is expressed in print coordinates, so it will need to be translated by
924 this->origin in order to get G-code coordinates. */
925 Polyline travel;
926 travel.append(this->last_pos());
927 travel.append(point);
928
929 // check whether a straight travel move would need retraction
930 bool needs_retraction = this->needs_retraction(travel, role);
931
932 // if a retraction would be needed, try to use avoid_crossing_perimeters to plan a
933 // multi-hop travel path inside the configuration space
934 if (needs_retraction
935 && this->config.avoid_crossing_perimeters
936 && !this->avoid_crossing_perimeters.disable_once) {
937 travel = this->avoid_crossing_perimeters.travel_to(*this, point);
938
939 // check again whether the new travel path still needs a retraction
940 needs_retraction = this->needs_retraction(travel, role);
941 //if (needs_retraction && this->layer_index > 1) exit(0);
942 }
943
944 // Re-allow avoid_crossing_perimeters for the next travel moves
945 this->avoid_crossing_perimeters.disable_once = false;
946 this->avoid_crossing_perimeters.use_external_mp_once = false;
947
948 // generate G-code for the travel move
949 std::string gcode;
950 if (needs_retraction) gcode += this->retract();
951
952 // use G1 because we rely on paths being straight (G0 may make round paths)
953 Lines lines = travel.lines();
954 double path_length = 0;
955 for (Lines::const_iterator line = lines.begin(); line != lines.end(); ++line) {
956 const double line_length = line->length() * SCALING_FACTOR;
957 path_length += line_length;
958
959 gcode += this->writer.travel_to_xy(this->point_to_gcode(line->b), comment);
960 }
961
962 if (this->config.cooling)
963 this->elapsed_time += path_length / this->config.get_abs_value("travel_speed");
964
965 return gcode;
966 }
967
968 bool
969 GCode::needs_retraction(const Polyline &travel, ExtrusionRole role)
970 {
971 if (travel.length() < scale_(EXTRUDER_CONFIG(retract_before_travel))) {
972 // skip retraction if the move is shorter than the configured threshold
973 return false;
974 }
975
976 if (role == erSupportMaterial) {
977 const SupportLayer* support_layer = dynamic_cast<const SupportLayer*>(this->layer);
978 if (support_layer != NULL && support_layer->support_islands.contains(travel)) {
979 // skip retraction if this is a travel move inside a support material island
980 return false;
981 }
982 }
983
984 if (this->config.only_retract_when_crossing_perimeters && this->layer != NULL) {
985 if (this->config.fill_density.value > 0
986 && this->layer->any_internal_region_slice_contains(travel)) {
987 /* skip retraction if travel is contained in an internal slice *and*
988 internal infill is enabled (so that stringing is entirely not visible) */
989 return false;
990 } else if (this->layer->any_bottom_region_slice_contains(travel)
991 && this->layer->upper_layer != NULL
992 && this->layer->upper_layer->slices.contains(travel)
993 && (this->config.bottom_solid_layers.value >= 2 || this->config.fill_density.value > 0)) {
994 /* skip retraction if travel is contained in an *infilled* bottom slice
995 but only if it's also covered by an *infilled* upper layer's slice
996 so that it's not visible from above (a bottom surface might not have an
997 upper slice in case of a thin membrane) */
998 return false;
999 }
1000 }
1001
1002 // retract if only_retract_when_crossing_perimeters is disabled or doesn't apply
1003 return true;
1004 }
1005
1006 std::string
1007 GCode::retract(bool toolchange)
1008 {
1009 std::string gcode;
1010
1011 if (this->writer.extruder() == NULL)
1012 return gcode;
1013
1014 // wipe (if it's enabled for this extruder and we have a stored wipe path)
1015 if (EXTRUDER_CONFIG(wipe) && this->wipe.has_path()) {
1016 gcode += this->wipe.wipe(*this, toolchange);
1017 }
1018
1019 /* The parent class will decide whether we need to perform an actual retraction
1020 (the extruder might be already retracted fully or partially). We call these
1021 methods even if we performed wipe, since this will ensure the entire retraction
1022 length is honored in case wipe path was too short. */
1023 gcode += toolchange ? this->writer.retract_for_toolchange() : this->writer.retract();
1024
1025 gcode += this->writer.reset_e();
1026 if (this->writer.extruder()->retract_length() > 0 || this->config.use_firmware_retraction)
1027 gcode += this->writer.lift();
1028
1029 return gcode;
1030 }
1031
1032 std::string
1033 GCode::unretract()
1034 {
1035 std::string gcode;
1036 gcode += this->writer.unlift();
1037 gcode += this->writer.unretract();
1038 return gcode;
1039 }
1040
1041 std::string
1042 GCode::set_extruder(unsigned int extruder_id)
1043 {
1044 this->placeholder_parser->set("current_extruder", extruder_id);
1045 if (!this->writer.need_toolchange(extruder_id))
1046 return "";
1047
1048 // if we are running a single-extruder setup, just set the extruder and return nothing
1049 if (!this->writer.multiple_extruders) {
1050 return this->writer.toolchange(extruder_id);
1051 }
1052
1053 // prepend retraction on the current extruder
1054 std::string gcode = this->retract(true);
1055
1056 // append custom toolchange G-code
1057 if (this->writer.extruder() != NULL && !this->config.toolchange_gcode.value.empty()) {
1058 PlaceholderParser pp = *this->placeholder_parser;
1059 pp.set("previous_extruder", this->writer.extruder()->id);
1060 pp.set("next_extruder", extruder_id);
1061 gcode += pp.process(this->config.toolchange_gcode.value) + '\n';
1062 }
1063
1064 // if ooze prevention is enabled, park current extruder in the nearest
1065 // standby point and set it to the standby temperature
1066 if (this->ooze_prevention.enable && this->writer.extruder() != NULL)
1067 gcode += this->ooze_prevention.pre_toolchange(*this);
1068
1069 // append the toolchange command
1070 gcode += this->writer.toolchange(extruder_id);
1071
1072 // set the new extruder to the operating temperature
1073 if (this->ooze_prevention.enable)
1074 gcode += this->ooze_prevention.post_toolchange(*this);
1075
1076 return gcode;
1077 }
1078
1079 // convert a model-space scaled point into G-code coordinates
1080 Pointf
1081 GCode::point_to_gcode(const Point &point)
1082 {
1083 Pointf extruder_offset = EXTRUDER_CONFIG(extruder_offset);
1084 return Pointf(
1085 unscale(point.x) + this->origin.x - extruder_offset.x,
1086 unscale(point.y) + this->origin.y - extruder_offset.y
1087 );
1088 }
1089
1090 }
0 #ifndef slic3r_GCode_hpp_
1 #define slic3r_GCode_hpp_
2
3 #include "libslic3r.h"
4 #include "ExPolygon.hpp"
5 #include "GCodeWriter.hpp"
6 #include "Layer.hpp"
7 #include "MotionPlanner.hpp"
8 #include "Point.hpp"
9 #include "PlaceholderParser.hpp"
10 #include "Print.hpp"
11 #include "PrintConfig.hpp"
12 #include <string>
13
14 namespace Slic3r {
15
16 // Forward declarations.
17 class GCode;
18 namespace EdgeGrid { class Grid; }
19
20 class AvoidCrossingPerimeters {
21 public:
22
23 // this flag triggers the use of the external configuration space
24 bool use_external_mp;
25 bool use_external_mp_once; // just for the next travel move
26
27 // this flag disables avoid_crossing_perimeters just for the next travel move
28 // we enable it by default for the first travel move in print
29 bool disable_once;
30
31 AvoidCrossingPerimeters();
32 ~AvoidCrossingPerimeters();
33 void init_external_mp(const ExPolygons &islands);
34 void init_layer_mp(const ExPolygons &islands);
35 Polyline travel_to(GCode &gcodegen, Point point);
36
37 private:
38 MotionPlanner* _external_mp;
39 MotionPlanner* _layer_mp;
40 };
41
42 class OozePrevention {
43 public:
44 bool enable;
45 Points standby_points;
46
47 OozePrevention();
48 std::string pre_toolchange(GCode &gcodegen);
49 std::string post_toolchange(GCode &gcodegen);
50
51 private:
52 int _get_temp(GCode &gcodegen);
53 };
54
55 class Wipe {
56 public:
57 bool enable;
58 Polyline path;
59
60 Wipe();
61 bool has_path();
62 void reset_path();
63 std::string wipe(GCode &gcodegen, bool toolchange = false);
64 };
65
66 class GCode {
67 public:
68
69 /* Origin of print coordinates expressed in unscaled G-code coordinates.
70 This affects the input arguments supplied to the extrude*() and travel_to()
71 methods. */
72 Pointf origin;
73 FullPrintConfig config;
74 GCodeWriter writer;
75 PlaceholderParser* placeholder_parser;
76 OozePrevention ooze_prevention;
77 Wipe wipe;
78 AvoidCrossingPerimeters avoid_crossing_perimeters;
79 bool enable_loop_clipping;
80 // If enabled, the G-code generator will put following comments at the ends
81 // of the G-code lines: _EXTRUDE_SET_SPEED, _WIPE, _BRIDGE_FAN_START, _BRIDGE_FAN_END
82 // Those comments are received and consumed (removed from the G-code) by the CoolingBuffer.pm Perl module.
83 bool enable_cooling_markers;
84 // Markers for the Pressure Equalizer to recognize the extrusion type.
85 // The Pressure Equalizer removes the markers from the final G-code.
86 bool enable_extrusion_role_markers;
87 // Extended markers for the G-code Analyzer.
88 // The G-code Analyzer will remove these comments from the final G-code.
89 bool enable_analyzer_markers;
90 // How many times will change_layer() be called?
91 // change_layer() will update the progress bar.
92 size_t layer_count;
93 // Progress bar indicator. Increments from -1 up to layer_count.
94 int layer_index;
95 // Current layer processed. Insequential printing mode, only a single copy will be printed.
96 // In non-sequential mode, all its copies will be printed.
97 const Layer* layer;
98 std::map<const PrintObject*,Point> _seam_position;
99 // Distance Field structure to
100 EdgeGrid::Grid *_lower_layer_edge_grid;
101 bool first_layer; // this flag triggers first layer speeds
102 // Used by the CoolingBuffer.pm Perl module to calculate time spent per layer change.
103 // This value is not quite precise. First it only accouts for extrusion moves and travel moves,
104 // it does not account for wipe, retract / unretract moves.
105 // second it does not account for the velocity profiles of the printer.
106 float elapsed_time; // seconds
107 double volumetric_speed;
108 // Support for the extrusion role markers. Which marker is active?
109 ExtrusionRole _last_extrusion_role;
110
111 GCode();
112 ~GCode();
113 const Point& last_pos() const;
114 void set_last_pos(const Point &pos);
115 bool last_pos_defined() const;
116 void apply_print_config(const PrintConfig &print_config);
117 void set_extruders(const std::vector<unsigned int> &extruder_ids);
118 void set_origin(const Pointf &pointf);
119 std::string preamble();
120 std::string change_layer(const Layer &layer);
121 std::string extrude(const ExtrusionEntity &entity, std::string description = "", double speed = -1);
122 std::string extrude(ExtrusionLoop loop, std::string description = "", double speed = -1);
123 std::string extrude(const ExtrusionPath &path, std::string description = "", double speed = -1);
124 std::string travel_to(const Point &point, ExtrusionRole role, std::string comment);
125 bool needs_retraction(const Polyline &travel, ExtrusionRole role = erNone);
126 std::string retract(bool toolchange = false);
127 std::string unretract();
128 std::string set_extruder(unsigned int extruder_id);
129 Pointf point_to_gcode(const Point &point);
130
131 private:
132 Point _last_pos;
133 bool _last_pos_defined;
134 std::string _extrude(ExtrusionPath path, std::string description = "", double speed = -1);
135 };
136
137 }
138
139 #endif
0 #ifdef BOOST_LIBS
1 #include "GCodeSender.hpp"
2 #include <iostream>
3 #include <istream>
4 #include <string>
5 #include <boost/algorithm/string/predicate.hpp>
6 #include <boost/algorithm/string/trim.hpp>
7 #include <boost/date_time/posix_time/posix_time.hpp>
8 #include <boost/lexical_cast.hpp>
9
10 #if defined(__APPLE__) || defined(__linux) || defined(__OpenBSD__)
11 #include <termios.h>
12 #endif
13 #if __APPLE__
14 #include <sys/ioctl.h>
15 #include <IOKit/serial/ioss.h>
16 #endif
17 #ifdef __linux
18 #include <sys/ioctl.h>
19 #include <linux/serial.h>
20 #endif
21
22 //#define DEBUG_SERIAL
23 #ifdef DEBUG_SERIAL
24 #include <fstream>
25 std::fstream fs;
26 #endif
27
28 #define KEEP_SENT 20
29
30 namespace Slic3r {
31
32 namespace asio = boost::asio;
33
34 GCodeSender::GCodeSender()
35 : io(), serial(io), can_send(false), sent(0), open(false), error(false),
36 connected(false), queue_paused(false)
37 {}
38
39 GCodeSender::~GCodeSender()
40 {
41 this->disconnect();
42 }
43
44 bool
45 GCodeSender::connect(std::string devname, unsigned int baud_rate)
46 {
47 this->disconnect();
48
49 this->set_error_status(false);
50 try {
51 this->serial.open(devname);
52 } catch (boost::system::system_error &e) {
53 this->set_error_status(true);
54 return false;
55 }
56
57 this->serial.set_option(asio::serial_port_base::parity(asio::serial_port_base::parity::odd));
58 this->serial.set_option(asio::serial_port_base::character_size(asio::serial_port_base::character_size(8)));
59 this->serial.set_option(asio::serial_port_base::flow_control(asio::serial_port_base::flow_control::none));
60 this->serial.set_option(asio::serial_port_base::stop_bits(asio::serial_port_base::stop_bits::one));
61 this->set_baud_rate(baud_rate);
62
63 this->serial.close();
64 this->serial.open(devname);
65 this->serial.set_option(asio::serial_port_base::parity(asio::serial_port_base::parity::none));
66
67 // set baud rate again because set_option overwrote it
68 this->set_baud_rate(baud_rate);
69 this->open = true;
70 this->reset();
71
72 // a reset firmware expect line numbers to start again from 1
73 this->sent = 0;
74 this->last_sent.clear();
75
76 /* Initialize debugger */
77 #ifdef DEBUG_SERIAL
78 fs.open("serial.txt", std::fstream::out | std::fstream::trunc);
79 #endif
80
81 // this gives some work to the io_service before it is started
82 // (post() runs the supplied function in its thread)
83 this->io.post(boost::bind(&GCodeSender::do_read, this));
84
85 // start reading in the background thread
86 boost::thread t(boost::bind(&asio::io_service::run, &this->io));
87 this->background_thread.swap(t);
88
89 return true;
90 }
91
92 void
93 GCodeSender::set_baud_rate(unsigned int baud_rate)
94 {
95 try {
96 // This does not support speeds > 115200
97 this->serial.set_option(asio::serial_port_base::baud_rate(baud_rate));
98 } catch (boost::system::system_error &e) {
99 boost::asio::serial_port::native_handle_type handle = this->serial.native_handle();
100
101 #if __APPLE__
102 termios ios;
103 ::tcgetattr(handle, &ios);
104 ::cfsetspeed(&ios, baud_rate);
105 speed_t newSpeed = baud_rate;
106 ioctl(handle, IOSSIOSPEED, &newSpeed);
107 ::tcsetattr(handle, TCSANOW, &ios);
108 #elif __linux
109 termios ios;
110 ::tcgetattr(handle, &ios);
111 ::cfsetispeed(&ios, B38400);
112 ::cfsetospeed(&ios, B38400);
113 ::tcflush(handle, TCIFLUSH);
114 ::tcsetattr(handle, TCSANOW, &ios);
115
116 struct serial_struct ss;
117 ioctl(handle, TIOCGSERIAL, &ss);
118 ss.flags = (ss.flags & ~ASYNC_SPD_MASK) | ASYNC_SPD_CUST;
119 ss.custom_divisor = (ss.baud_base + (baud_rate / 2)) / baud_rate;
120 //cout << "bbase " << ss.baud_base << " div " << ss.custom_divisor;
121 long closestSpeed = ss.baud_base / ss.custom_divisor;
122 //cout << " Closest speed " << closestSpeed << endl;
123 ss.reserved_char[0] = 0;
124 if (closestSpeed < baud_rate * 98 / 100 || closestSpeed > baud_rate * 102 / 100) {
125 printf("Failed to set baud rate\n");
126 }
127
128 ioctl(handle, TIOCSSERIAL, &ss);
129 printf("< set_baud_rate: %u\n", baud_rate);
130 #elif __OpenBSD__
131 struct termios ios;
132 ::tcgetattr(handle, &ios);
133 ::cfsetspeed(&ios, baud_rate);
134 if (::tcsetattr(handle, TCSAFLUSH, &ios) != 0)
135 printf("Failed to set baud rate: %s\n", strerror(errno));
136 #else
137 //throw invalid_argument ("OS does not currently support custom bauds");
138 #endif
139 }
140 }
141
142 void
143 GCodeSender::disconnect()
144 {
145 if (!this->open) return;
146 this->open = false;
147 this->connected = false;
148 this->io.post(boost::bind(&GCodeSender::do_close, this));
149 this->background_thread.join();
150 this->io.reset();
151 /*
152 if (this->error_status()) {
153 throw(boost::system::system_error(boost::system::error_code(),
154 "Error while closing the device"));
155 }
156 */
157
158 #ifdef DEBUG_SERIAL
159 fs.close();
160 #endif
161 }
162
163 bool
164 GCodeSender::is_connected() const
165 {
166 return this->connected;
167 }
168
169 bool
170 GCodeSender::wait_connected(unsigned int timeout) const
171 {
172 using namespace boost::posix_time;
173 ptime t0 = second_clock::local_time() + seconds(timeout);
174 while (!this->connected) {
175 if (second_clock::local_time() > t0) return false;
176 boost::this_thread::sleep(boost::posix_time::milliseconds(100));
177 }
178 return true;
179 }
180
181 size_t
182 GCodeSender::queue_size() const
183 {
184 boost::lock_guard<boost::mutex> l(this->queue_mutex);
185 return this->queue.size();
186 }
187
188 void
189 GCodeSender::pause_queue()
190 {
191 boost::lock_guard<boost::mutex> l(this->queue_mutex);
192 this->queue_paused = true;
193 }
194
195 void
196 GCodeSender::resume_queue()
197 {
198 {
199 boost::lock_guard<boost::mutex> l(this->queue_mutex);
200 this->queue_paused = false;
201 }
202 this->send();
203 }
204
205 void
206 GCodeSender::purge_queue(bool priority)
207 {
208 boost::lock_guard<boost::mutex> l(this->queue_mutex);
209 if (priority) {
210 // clear priority queue
211 std::list<std::string> empty;
212 std::swap(this->priqueue, empty);
213 } else {
214 // clear queue
215 std::queue<std::string> empty;
216 std::swap(this->queue, empty);
217 this->queue_paused = false;
218 }
219 }
220
221 // purge log and return its contents
222 std::vector<std::string>
223 GCodeSender::purge_log()
224 {
225 boost::lock_guard<boost::mutex> l(this->log_mutex);
226 std::vector<std::string> retval;
227 retval.reserve(this->log.size());
228 while (!this->log.empty()) {
229 retval.push_back(this->log.front());
230 this->log.pop();
231 }
232 return retval;
233 }
234
235 std::string
236 GCodeSender::getT() const
237 {
238 boost::lock_guard<boost::mutex> l(this->log_mutex);
239 return this->T;
240 }
241
242 std::string
243 GCodeSender::getB() const
244 {
245 boost::lock_guard<boost::mutex> l(this->log_mutex);
246 return this->B;
247 }
248
249 void
250 GCodeSender::do_close()
251 {
252 this->set_error_status(false);
253 boost::system::error_code ec;
254 this->serial.cancel(ec);
255 if (ec) this->set_error_status(true);
256 this->serial.close(ec);
257 if (ec) this->set_error_status(true);
258 }
259
260 void
261 GCodeSender::set_error_status(bool e)
262 {
263 boost::lock_guard<boost::mutex> l(this->error_mutex);
264 this->error = e;
265 }
266
267 bool
268 GCodeSender::error_status() const
269 {
270 boost::lock_guard<boost::mutex> l(this->error_mutex);
271 return this->error;
272 }
273
274 void
275 GCodeSender::do_read()
276 {
277 // read one line
278 asio::async_read_until(
279 this->serial,
280 this->read_buffer,
281 '\n',
282 boost::bind(
283 &GCodeSender::on_read,
284 this,
285 asio::placeholders::error,
286 asio::placeholders::bytes_transferred
287 )
288 );
289 }
290
291 void
292 GCodeSender::on_read(const boost::system::error_code& error,
293 size_t bytes_transferred)
294 {
295 this->set_error_status(false);
296 if (error) {
297 if (error.value() == 45) {
298 // OS X bug: http://osdir.com/ml/lib.boost.asio.user/2008-08/msg00004.html
299 this->do_read();
300 } else {
301 // printf("ERROR: [%d] %s\n", error.value(), error.message().c_str());
302 // error can be true even because the serial port was closed.
303 // In this case it is not a real error, so ignore.
304 if (this->open) {
305 this->do_close();
306 this->set_error_status(true);
307 }
308 }
309 return;
310 }
311
312 std::istream is(&this->read_buffer);
313 std::string line;
314 std::getline(is, line);
315 if (!line.empty()) {
316 #ifdef DEBUG_SERIAL
317 fs << "<< " << line << std::endl << std::flush;
318 #endif
319
320 // note that line might contain \r at its end
321 // parse incoming line
322 if (!this->connected
323 && (boost::starts_with(line, "start")
324 || boost::starts_with(line, "Grbl ")
325 || boost::starts_with(line, "ok")
326 || boost::contains(line, "T:"))) {
327 this->connected = true;
328 {
329 boost::lock_guard<boost::mutex> l(this->queue_mutex);
330 this->can_send = true;
331 }
332 this->send();
333 } else if (boost::starts_with(line, "ok")) {
334 {
335 boost::lock_guard<boost::mutex> l(this->queue_mutex);
336 this->can_send = true;
337 }
338 this->send();
339 } else if (boost::istarts_with(line, "resend") // Marlin uses "Resend: "
340 || boost::istarts_with(line, "rs")) {
341 // extract the first number from line
342 boost::algorithm::trim_left_if(line, !boost::algorithm::is_digit());
343 size_t toresend = boost::lexical_cast<size_t>(line.substr(0, line.find_first_not_of("0123456789")));
344 if (toresend >= this->sent - this->last_sent.size()) {
345 {
346 boost::lock_guard<boost::mutex> l(this->queue_mutex);
347
348 // move the unsent lines to priqueue
349 this->priqueue.insert(
350 this->priqueue.begin(), // insert at the beginning
351 this->last_sent.begin() + toresend - (this->sent - this->last_sent.size()) - 1,
352 this->last_sent.end()
353 );
354
355 // we can empty last_sent because it's not useful anymore
356 this->last_sent.clear();
357
358 // start resending with the requested line number
359 this->sent = toresend - 1;
360 this->can_send = true;
361 }
362 this->send();
363 } else {
364 printf("Cannot resend " PRINTF_ZU " (oldest we have is " PRINTF_ZU ")\n", toresend, this->sent - this->last_sent.size());
365 }
366 } else if (boost::starts_with(line, "wait")) {
367 // ignore
368 } else {
369 // push any other line into the log
370 boost::lock_guard<boost::mutex> l(this->log_mutex);
371 this->log.push(line);
372 }
373
374 // parse temperature info
375 {
376 size_t pos = line.find("T:");
377 if (pos != std::string::npos && line.size() > pos + 2) {
378 // we got temperature info
379 boost::lock_guard<boost::mutex> l(this->log_mutex);
380 this->T = line.substr(pos+2, line.find_first_not_of("0123456789.", pos+2) - (pos+2));
381
382 pos = line.find("B:");
383 if (pos != std::string::npos && line.size() > pos + 2) {
384 // we got bed temperature info
385 this->B = line.substr(pos+2, line.find_first_not_of("0123456789.", pos+2) - (pos+2));
386 }
387 }
388 }
389 }
390 this->do_read();
391 }
392
393 void
394 GCodeSender::send(const std::vector<std::string> &lines, bool priority)
395 {
396 // append lines to queue
397 {
398 boost::lock_guard<boost::mutex> l(this->queue_mutex);
399 for (std::vector<std::string>::const_iterator line = lines.begin(); line != lines.end(); ++line) {
400 if (priority) {
401 this->priqueue.push_back(*line);
402 } else {
403 this->queue.push(*line);
404 }
405 }
406 }
407 this->send();
408 }
409
410 void
411 GCodeSender::send(const std::string &line, bool priority)
412 {
413 // append line to queue
414 {
415 boost::lock_guard<boost::mutex> l(this->queue_mutex);
416 if (priority) {
417 this->priqueue.push_back(line);
418 } else {
419 this->queue.push(line);
420 }
421 }
422 this->send();
423 }
424
425 void
426 GCodeSender::send()
427 {
428 this->io.post(boost::bind(&GCodeSender::do_send, this));
429 }
430
431 void
432 GCodeSender::do_send()
433 {
434 boost::lock_guard<boost::mutex> l(this->queue_mutex);
435
436 // printer is not connected or we're still waiting for the previous ack
437 if (!this->can_send) return;
438
439 std::string line;
440 while (!this->priqueue.empty() || (!this->queue.empty() && !this->queue_paused)) {
441 if (!this->priqueue.empty()) {
442 line = this->priqueue.front();
443 this->priqueue.pop_front();
444 } else {
445 line = this->queue.front();
446 this->queue.pop();
447 }
448
449 // strip comments
450 size_t comment_pos = line.find_first_of(';');
451 if (comment_pos != std::string::npos)
452 line.erase(comment_pos, std::string::npos);
453 boost::algorithm::trim(line);
454
455 // if line is not empty, send it
456 if (!line.empty()) break;
457 // if line is empty, process next item in queue
458 }
459 if (line.empty()) return;
460
461 // compute full line
462 this->sent++;
463 std::string full_line = "N" + boost::lexical_cast<std::string>(this->sent) + " " + line;
464
465 // calculate checksum
466 int cs = 0;
467 for (std::string::const_iterator it = full_line.begin(); it != full_line.end(); ++it)
468 cs = cs ^ *it;
469
470 // write line to device
471 full_line += "*";
472 full_line += boost::lexical_cast<std::string>(cs);
473 full_line += "\n";
474
475 #ifdef DEBUG_SERIAL
476 fs << ">> " << full_line << std::flush;
477 #endif
478
479 this->last_sent.push_back(line);
480 this->can_send = false;
481
482 if (this->last_sent.size() > KEEP_SENT)
483 this->last_sent.erase(this->last_sent.begin(), this->last_sent.end() - KEEP_SENT);
484
485 // we can't supply asio::buffer(full_line) to async_write() because full_line is on the
486 // stack and the buffer would lose its underlying storage causing memory corruption
487 std::ostream os(&this->write_buffer);
488 os << full_line;
489 asio::async_write(this->serial, this->write_buffer, boost::bind(&GCodeSender::on_write, this, boost::asio::placeholders::error,
490 boost::asio::placeholders::bytes_transferred));
491 }
492
493 void
494 GCodeSender::on_write(const boost::system::error_code& error,
495 size_t bytes_transferred)
496 {
497 this->set_error_status(false);
498 if (error) {
499 if (this->open) {
500 this->do_close();
501 this->set_error_status(true);
502 }
503 return;
504 }
505
506 this->do_send();
507 }
508
509 void
510 GCodeSender::set_DTR(bool on)
511 {
512 #if defined(_WIN32) && !defined(__SYMBIAN32__)
513 asio::serial_port_service::native_handle_type handle = this->serial.native_handle();
514 if (on)
515 EscapeCommFunction(handle, SETDTR);
516 else
517 EscapeCommFunction(handle, CLRDTR);
518 #else
519 int fd = this->serial.native_handle();
520 int status;
521 ioctl(fd, TIOCMGET, &status);
522 if (on)
523 status |= TIOCM_DTR;
524 else
525 status &= ~TIOCM_DTR;
526 ioctl(fd, TIOCMSET, &status);
527 #endif
528 }
529
530 void
531 GCodeSender::reset()
532 {
533 this->set_DTR(false);
534 boost::this_thread::sleep(boost::posix_time::milliseconds(200));
535 this->set_DTR(true);
536 boost::this_thread::sleep(boost::posix_time::milliseconds(200));
537 this->set_DTR(false);
538 boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
539 {
540 boost::lock_guard<boost::mutex> l(this->queue_mutex);
541 this->can_send = true;
542 }
543 }
544
545 }
546
547 #endif
0 #ifndef slic3r_GCodeSender_hpp_
1 #define slic3r_GCodeSender_hpp_
2 #ifdef BOOST_LIBS
3
4 #include "libslic3r.h"
5 #include <queue>
6 #include <string>
7 #include <vector>
8 #include <boost/asio.hpp>
9 #include <boost/bind.hpp>
10 #include <boost/thread.hpp>
11
12 namespace Slic3r {
13
14 namespace asio = boost::asio;
15
16 class GCodeSender : private boost::noncopyable {
17 public:
18 GCodeSender();
19 ~GCodeSender();
20 bool connect(std::string devname, unsigned int baud_rate);
21 void send(const std::vector<std::string> &lines, bool priority = false);
22 void send(const std::string &s, bool priority = false);
23 void disconnect();
24 bool error_status() const;
25 bool is_connected() const;
26 bool wait_connected(unsigned int timeout = 3) const;
27 size_t queue_size() const;
28 void pause_queue();
29 void resume_queue();
30 void purge_queue(bool priority = false);
31 std::vector<std::string> purge_log();
32 std::string getT() const;
33 std::string getB() const;
34 void set_DTR(bool on);
35 void reset();
36
37 private:
38 asio::io_service io;
39 asio::serial_port serial;
40 boost::thread background_thread;
41 boost::asio::streambuf read_buffer, write_buffer;
42 bool open; // whether the serial socket is connected
43 bool connected; // whether the printer is online
44 bool error;
45 mutable boost::mutex error_mutex;
46
47 // this mutex guards queue, priqueue, can_send, queue_paused, sent, last_sent
48 mutable boost::mutex queue_mutex;
49 std::queue<std::string> queue;
50 std::list<std::string> priqueue;
51 bool can_send;
52 bool queue_paused;
53 size_t sent;
54 std::vector<std::string> last_sent;
55
56 // this mutex guards log, T, B
57 mutable boost::mutex log_mutex;
58 std::queue<std::string> log;
59 std::string T, B;
60
61 void set_baud_rate(unsigned int baud_rate);
62 void set_error_status(bool e);
63 void do_send();
64 void on_write(const boost::system::error_code& error, size_t bytes_transferred);
65 void do_close();
66 void do_read();
67 void on_read(const boost::system::error_code& error, size_t bytes_transferred);
68 void send();
69 };
70
71 } // namespace Slic3r
72
73 #endif /* BOOST_LIBS */
74 #endif /* slic3r_GCodeSender_hpp_ */
0 #include "GCodeWriter.hpp"
1 #include <algorithm>
2 #include <iomanip>
3 #include <iostream>
4 #include <map>
5
6 #define FLAVOR_IS(val) this->config.gcode_flavor == val
7 #define FLAVOR_IS_NOT(val) this->config.gcode_flavor != val
8 #define COMMENT(comment) if (this->config.gcode_comments && !comment.empty()) gcode << " ; " << comment;
9 #define PRECISION(val, precision) std::fixed << std::setprecision(precision) << val
10 #define XYZF_NUM(val) PRECISION(val, 3)
11 #define E_NUM(val) PRECISION(val, 5)
12
13 namespace Slic3r {
14
15 Extruder*
16 GCodeWriter::extruder()
17 {
18 return this->_extruder;
19 }
20
21 std::string
22 GCodeWriter::extrusion_axis() const
23 {
24 return this->_extrusion_axis;
25 }
26
27 void
28 GCodeWriter::apply_print_config(const PrintConfig &print_config)
29 {
30 this->config.apply(print_config, true);
31 this->_extrusion_axis = this->config.get_extrusion_axis();
32 }
33
34 void
35 GCodeWriter::set_extruders(const std::vector<unsigned int> &extruder_ids)
36 {
37 for (std::vector<unsigned int>::const_iterator i = extruder_ids.begin(); i != extruder_ids.end(); ++i) {
38 this->extruders.insert( std::pair<unsigned int,Extruder>(*i, Extruder(*i, &this->config)) );
39 }
40
41 /* we enable support for multiple extruder if any extruder greater than 0 is used
42 (even if prints only uses that one) since we need to output Tx commands
43 first extruder has index 0 */
44 this->multiple_extruders = (*std::max_element(extruder_ids.begin(), extruder_ids.end())) > 0;
45 }
46
47 std::string
48 GCodeWriter::preamble()
49 {
50 std::ostringstream gcode;
51
52 if (FLAVOR_IS_NOT(gcfMakerWare)) {
53 gcode << "G21 ; set units to millimeters\n";
54 gcode << "G90 ; use absolute coordinates\n";
55 }
56 if (FLAVOR_IS(gcfRepRap) || FLAVOR_IS(gcfTeacup)) {
57 if (this->config.use_relative_e_distances) {
58 gcode << "M83 ; use relative distances for extrusion\n";
59 } else {
60 gcode << "M82 ; use absolute distances for extrusion\n";
61 }
62 gcode << this->reset_e(true);
63 }
64
65 return gcode.str();
66 }
67
68 std::string
69 GCodeWriter::postamble() const
70 {
71 std::ostringstream gcode;
72 if (FLAVOR_IS(gcfMachinekit))
73 gcode << "M2 ; end of program\n";
74 return gcode.str();
75 }
76
77 std::string
78 GCodeWriter::set_temperature(unsigned int temperature, bool wait, int tool) const
79 {
80 if (wait && (FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish)))
81 return "";
82
83 std::string code, comment;
84 if (wait && FLAVOR_IS_NOT(gcfTeacup)) {
85 code = "M109";
86 comment = "set temperature and wait for it to be reached";
87 } else {
88 code = "M104";
89 comment = "set temperature";
90 }
91
92 std::ostringstream gcode;
93 gcode << code << " ";
94 if (FLAVOR_IS(gcfMach3) || FLAVOR_IS(gcfMachinekit)) {
95 gcode << "P";
96 } else {
97 gcode << "S";
98 }
99 gcode << temperature;
100 if (tool != -1 && (this->multiple_extruders || FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish))) {
101 gcode << " T" << tool;
102 }
103 gcode << " ; " << comment << "\n";
104
105 if (FLAVOR_IS(gcfTeacup) && wait)
106 gcode << "M116 ; wait for temperature to be reached\n";
107
108 return gcode.str();
109 }
110
111 std::string
112 GCodeWriter::set_bed_temperature(unsigned int temperature, bool wait) const
113 {
114 std::string code, comment;
115 if (wait && FLAVOR_IS_NOT(gcfTeacup)) {
116 if (FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish)) {
117 code = "M109";
118 } else {
119 code = "M190";
120 }
121 comment = "set bed temperature and wait for it to be reached";
122 } else {
123 code = "M140";
124 comment = "set bed temperature";
125 }
126
127 std::ostringstream gcode;
128 gcode << code << " ";
129 if (FLAVOR_IS(gcfMach3) || FLAVOR_IS(gcfMachinekit)) {
130 gcode << "P";
131 } else {
132 gcode << "S";
133 }
134 gcode << temperature << " ; " << comment << "\n";
135
136 if (FLAVOR_IS(gcfTeacup) && wait)
137 gcode << "M116 ; wait for bed temperature to be reached\n";
138
139 return gcode.str();
140 }
141
142 std::string
143 GCodeWriter::set_fan(unsigned int speed, bool dont_save)
144 {
145 std::ostringstream gcode;
146 if (this->_last_fan_speed != speed || dont_save) {
147 if (!dont_save) this->_last_fan_speed = speed;
148
149 if (speed == 0) {
150 if (FLAVOR_IS(gcfTeacup)) {
151 gcode << "M106 S0";
152 } else if (FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish)) {
153 gcode << "M127";
154 } else {
155 gcode << "M107";
156 }
157 if (this->config.gcode_comments) gcode << " ; disable fan";
158 gcode << "\n";
159 } else {
160 if (FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish)) {
161 gcode << "M126";
162 } else {
163 gcode << "M106 ";
164 if (FLAVOR_IS(gcfMach3) || FLAVOR_IS(gcfMachinekit)) {
165 gcode << "P";
166 } else {
167 gcode << "S";
168 }
169 gcode << (255.0 * speed / 100.0);
170 }
171 if (this->config.gcode_comments) gcode << " ; enable fan";
172 gcode << "\n";
173 }
174 }
175 return gcode.str();
176 }
177
178 std::string
179 GCodeWriter::set_acceleration(unsigned int acceleration)
180 {
181 if (acceleration == 0 || acceleration == this->_last_acceleration)
182 return "";
183
184 this->_last_acceleration = acceleration;
185
186 std::ostringstream gcode;
187 gcode << "M204 S" << acceleration;
188 if (this->config.gcode_comments) gcode << " ; adjust acceleration";
189 gcode << "\n";
190
191 return gcode.str();
192 }
193
194 std::string
195 GCodeWriter::reset_e(bool force)
196 {
197 if (FLAVOR_IS(gcfMach3)
198 || FLAVOR_IS(gcfMakerWare)
199 || FLAVOR_IS(gcfSailfish))
200 return "";
201
202 if (this->_extruder != NULL) {
203 if (this->_extruder->E == 0 && !force) return "";
204 this->_extruder->E = 0;
205 }
206
207 if (!this->_extrusion_axis.empty() && !this->config.use_relative_e_distances) {
208 std::ostringstream gcode;
209 gcode << "G92 " << this->_extrusion_axis << "0";
210 if (this->config.gcode_comments) gcode << " ; reset extrusion distance";
211 gcode << "\n";
212 return gcode.str();
213 } else {
214 return "";
215 }
216 }
217
218 std::string
219 GCodeWriter::update_progress(unsigned int num, unsigned int tot, bool allow_100) const
220 {
221 if (FLAVOR_IS_NOT(gcfMakerWare) && FLAVOR_IS_NOT(gcfSailfish))
222 return "";
223
224 unsigned int percent = 100.0 * num / tot;
225 if (!allow_100) percent = std::min(percent, (unsigned int)99);
226
227 std::ostringstream gcode;
228 gcode << "M73 P" << percent;
229 if (this->config.gcode_comments) gcode << " ; update progress";
230 gcode << "\n";
231 return gcode.str();
232 }
233
234 bool
235 GCodeWriter::need_toolchange(unsigned int extruder_id) const
236 {
237 // return false if this extruder was already selected
238 return (this->_extruder == NULL) || (this->_extruder->id != extruder_id);
239 }
240
241 std::string
242 GCodeWriter::set_extruder(unsigned int extruder_id)
243 {
244 if (!this->need_toolchange(extruder_id)) return "";
245 return this->toolchange(extruder_id);
246 }
247
248 std::string
249 GCodeWriter::toolchange(unsigned int extruder_id)
250 {
251 // set the new extruder
252 this->_extruder = &this->extruders.find(extruder_id)->second;
253
254 // return the toolchange command
255 // if we are running a single-extruder setup, just set the extruder and return nothing
256 std::ostringstream gcode;
257 if (this->multiple_extruders) {
258 if (FLAVOR_IS(gcfMakerWare)) {
259 gcode << "M135 T";
260 } else if (FLAVOR_IS(gcfSailfish)) {
261 gcode << "M108 T";
262 } else {
263 gcode << "T";
264 }
265 gcode << extruder_id;
266 if (this->config.gcode_comments) gcode << " ; change extruder";
267 gcode << "\n";
268
269 gcode << this->reset_e(true);
270 }
271 return gcode.str();
272 }
273
274 std::string
275 GCodeWriter::set_speed(double F, const std::string &comment,
276 const std::string &cooling_marker) const
277 {
278 std::ostringstream gcode;
279 gcode << "G1 F" << F;
280 COMMENT(comment);
281 gcode << cooling_marker;
282 gcode << "\n";
283 return gcode.str();
284 }
285
286 std::string
287 GCodeWriter::travel_to_xy(const Pointf &point, const std::string &comment)
288 {
289 this->_pos.x = point.x;
290 this->_pos.y = point.y;
291
292 std::ostringstream gcode;
293 gcode << "G1 X" << XYZF_NUM(point.x)
294 << " Y" << XYZF_NUM(point.y)
295 << " F" << XYZF_NUM(this->config.travel_speed.value * 60.0);
296 COMMENT(comment);
297 gcode << "\n";
298 return gcode.str();
299 }
300
301 std::string
302 GCodeWriter::travel_to_xyz(const Pointf3 &point, const std::string &comment)
303 {
304 /* If target Z is lower than current Z but higher than nominal Z we
305 don't perform the Z move but we only move in the XY plane and
306 adjust the nominal Z by reducing the lift amount that will be
307 used for unlift. */
308 if (!this->will_move_z(point.z)) {
309 double nominal_z = this->_pos.z - this->_lifted;
310 this->_lifted = this->_lifted - (point.z - nominal_z);
311 return this->travel_to_xy(point);
312 }
313
314 /* In all the other cases, we perform an actual XYZ move and cancel
315 the lift. */
316 this->_lifted = 0;
317 this->_pos = point;
318
319 std::ostringstream gcode;
320 gcode << "G1 X" << XYZF_NUM(point.x)
321 << " Y" << XYZF_NUM(point.y)
322 << " Z" << XYZF_NUM(point.z)
323 << " F" << XYZF_NUM(this->config.travel_speed.value * 60.0);
324 COMMENT(comment);
325 gcode << "\n";
326 return gcode.str();
327 }
328
329 std::string
330 GCodeWriter::travel_to_z(double z, const std::string &comment)
331 {
332 /* If target Z is lower than current Z but higher than nominal Z
333 we don't perform the move but we only adjust the nominal Z by
334 reducing the lift amount that will be used for unlift. */
335 if (!this->will_move_z(z)) {
336 double nominal_z = this->_pos.z - this->_lifted;
337 this->_lifted = this->_lifted - (z - nominal_z);
338 return "";
339 }
340
341 /* In all the other cases, we perform an actual Z move and cancel
342 the lift. */
343 this->_lifted = 0;
344 return this->_travel_to_z(z, comment);
345 }
346
347 std::string
348 GCodeWriter::_travel_to_z(double z, const std::string &comment)
349 {
350 this->_pos.z = z;
351
352 std::ostringstream gcode;
353 gcode << "G1 Z" << XYZF_NUM(z)
354 << " F" << XYZF_NUM(this->config.travel_speed.value * 60.0);
355 COMMENT(comment);
356 gcode << "\n";
357 return gcode.str();
358 }
359
360 bool
361 GCodeWriter::will_move_z(double z) const
362 {
363 /* If target Z is lower than current Z but higher than nominal Z
364 we don't perform an actual Z move. */
365 if (this->_lifted > 0) {
366 double nominal_z = this->_pos.z - this->_lifted;
367 if (z >= nominal_z && z <= this->_pos.z)
368 return false;
369 }
370 return true;
371 }
372
373 std::string
374 GCodeWriter::extrude_to_xy(const Pointf &point, double dE, const std::string &comment)
375 {
376 this->_pos.x = point.x;
377 this->_pos.y = point.y;
378 this->_extruder->extrude(dE);
379
380 std::ostringstream gcode;
381 gcode << "G1 X" << XYZF_NUM(point.x)
382 << " Y" << XYZF_NUM(point.y)
383 << " " << this->_extrusion_axis << E_NUM(this->_extruder->E);
384 COMMENT(comment);
385 gcode << "\n";
386 return gcode.str();
387 }
388
389 std::string
390 GCodeWriter::extrude_to_xyz(const Pointf3 &point, double dE, const std::string &comment)
391 {
392 this->_pos = point;
393 this->_lifted = 0;
394 this->_extruder->extrude(dE);
395
396 std::ostringstream gcode;
397 gcode << "G1 X" << XYZF_NUM(point.x)
398 << " Y" << XYZF_NUM(point.y)
399 << " Z" << XYZF_NUM(point.z)
400 << " " << this->_extrusion_axis << E_NUM(this->_extruder->E);
401 COMMENT(comment);
402 gcode << "\n";
403 return gcode.str();
404 }
405
406 std::string
407 GCodeWriter::retract()
408 {
409 return this->_retract(
410 this->_extruder->retract_length(),
411 this->_extruder->retract_restart_extra(),
412 "retract"
413 );
414 }
415
416 std::string
417 GCodeWriter::retract_for_toolchange()
418 {
419 return this->_retract(
420 this->_extruder->retract_length_toolchange(),
421 this->_extruder->retract_restart_extra_toolchange(),
422 "retract for toolchange"
423 );
424 }
425
426 std::string
427 GCodeWriter::_retract(double length, double restart_extra, const std::string &comment)
428 {
429 std::ostringstream gcode;
430
431 /* If firmware retraction is enabled, we use a fake value of 1
432 since we ignore the actual configured retract_length which
433 might be 0, in which case the retraction logic gets skipped. */
434 if (this->config.use_firmware_retraction) length = 1;
435
436 // If we use volumetric E values we turn lengths into volumes */
437 if (this->config.use_volumetric_e) {
438 double d = this->_extruder->filament_diameter();
439 double area = d * d * PI/4;
440 length = length * area;
441 restart_extra = restart_extra * area;
442 }
443
444 double dE = this->_extruder->retract(length, restart_extra);
445 if (dE != 0) {
446 if (this->config.use_firmware_retraction) {
447 if (FLAVOR_IS(gcfMachinekit))
448 gcode << "G22 ; retract\n";
449 else
450 gcode << "G10 ; retract\n";
451 } else {
452 gcode << "G1 " << this->_extrusion_axis << E_NUM(this->_extruder->E)
453 << " F" << this->_extruder->retract_speed_mm_min;
454 COMMENT(comment);
455 gcode << "\n";
456 }
457 }
458
459 if (FLAVOR_IS(gcfMakerWare))
460 gcode << "M103 ; extruder off\n";
461
462 return gcode.str();
463 }
464
465 std::string
466 GCodeWriter::unretract()
467 {
468 std::ostringstream gcode;
469
470 if (FLAVOR_IS(gcfMakerWare))
471 gcode << "M101 ; extruder on\n";
472
473 double dE = this->_extruder->unretract();
474 if (dE != 0) {
475 if (this->config.use_firmware_retraction) {
476 if (FLAVOR_IS(gcfMachinekit))
477 gcode << "G23 ; unretract\n";
478 else
479 gcode << "G11 ; unretract\n";
480 gcode << this->reset_e();
481 } else {
482 // use G1 instead of G0 because G0 will blend the restart with the previous travel move
483 gcode << "G1 " << this->_extrusion_axis << E_NUM(this->_extruder->E)
484 << " F" << this->_extruder->retract_speed_mm_min;
485 if (this->config.gcode_comments) gcode << " ; unretract";
486 gcode << "\n";
487 }
488 }
489
490 return gcode.str();
491 }
492
493 /* If this method is called more than once before calling unlift(),
494 it will not perform subsequent lifts, even if Z was raised manually
495 (i.e. with travel_to_z()) and thus _lifted was reduced. */
496 std::string
497 GCodeWriter::lift()
498 {
499 // check whether the above/below conditions are met
500 double target_lift = 0;
501 {
502 double above = this->config.retract_lift_above.get_at(this->_extruder->id);
503 double below = this->config.retract_lift_below.get_at(this->_extruder->id);
504 if (this->_pos.z >= above && (below == 0 || this->_pos.z <= below))
505 target_lift = this->config.retract_lift.get_at(this->_extruder->id);
506 }
507 if (this->_lifted == 0 && target_lift > 0) {
508 this->_lifted = target_lift;
509 return this->_travel_to_z(this->_pos.z + target_lift, "lift Z");
510 }
511 return "";
512 }
513
514 std::string
515 GCodeWriter::unlift()
516 {
517 std::string gcode;
518 if (this->_lifted > 0) {
519 gcode += this->_travel_to_z(this->_pos.z - this->_lifted, "restore layer Z");
520 this->_lifted = 0;
521 }
522 return gcode;
523 }
524
525 Pointf3
526 GCodeWriter::get_position() const
527 {
528 return this->_pos;
529 }
530
531 }
0 #ifndef slic3r_GCodeWriter_hpp_
1 #define slic3r_GCodeWriter_hpp_
2
3 #include "libslic3r.h"
4 #include <string>
5 #include "Extruder.hpp"
6 #include "Point.hpp"
7 #include "PrintConfig.hpp"
8
9 namespace Slic3r {
10
11 class GCodeWriter {
12 public:
13 GCodeConfig config;
14 std::map<unsigned int,Extruder> extruders;
15 bool multiple_extruders;
16
17 GCodeWriter()
18 : multiple_extruders(false), _extrusion_axis("E"), _extruder(NULL),
19 _last_acceleration(0), _last_fan_speed(0), _lifted(0)
20 {};
21 Extruder* extruder();
22 std::string extrusion_axis() const;
23 void apply_print_config(const PrintConfig &print_config);
24 void set_extruders(const std::vector<unsigned int> &extruder_ids);
25 std::string preamble();
26 std::string postamble() const;
27 std::string set_temperature(unsigned int temperature, bool wait = false, int tool = -1) const;
28 std::string set_bed_temperature(unsigned int temperature, bool wait = false) const;
29 std::string set_fan(unsigned int speed, bool dont_save = false);
30 std::string set_acceleration(unsigned int acceleration);
31 std::string reset_e(bool force = false);
32 std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false) const;
33 bool need_toolchange(unsigned int extruder_id) const;
34 std::string set_extruder(unsigned int extruder_id);
35 std::string toolchange(unsigned int extruder_id);
36 std::string set_speed(double F, const std::string &comment = std::string(), const std::string &cooling_marker = std::string()) const;
37 std::string travel_to_xy(const Pointf &point, const std::string &comment = std::string());
38 std::string travel_to_xyz(const Pointf3 &point, const std::string &comment = std::string());
39 std::string travel_to_z(double z, const std::string &comment = std::string());
40 bool will_move_z(double z) const;
41 std::string extrude_to_xy(const Pointf &point, double dE, const std::string &comment = std::string());
42 std::string extrude_to_xyz(const Pointf3 &point, double dE, const std::string &comment = std::string());
43 std::string retract();
44 std::string retract_for_toolchange();
45 std::string unretract();
46 std::string lift();
47 std::string unlift();
48 Pointf3 get_position() const;
49
50 private:
51 std::string _extrusion_axis;
52 Extruder* _extruder;
53 unsigned int _last_acceleration;
54 unsigned int _last_fan_speed;
55 double _lifted;
56 Pointf3 _pos;
57
58 std::string _travel_to_z(double z, const std::string &comment);
59 std::string _retract(double length, double restart_extra, const std::string &comment);
60 };
61
62 } /* namespace Slic3r */
63
64 #endif /* slic3r_GCodeWriter_hpp_ */
0 #include "Geometry.hpp"
1 #include "ClipperUtils.hpp"
2 #include "ExPolygon.hpp"
3 #include "Line.hpp"
4 #include "PolylineCollection.hpp"
5 #include "clipper.hpp"
6 #include <algorithm>
7 #include <cassert>
8 #include <cmath>
9 #include <list>
10 #include <map>
11 #include <set>
12 #include <utility>
13 #include <stack>
14 #include <vector>
15
16 #ifdef SLIC3R_DEBUG
17 #include "SVG.hpp"
18 #endif
19
20 #ifdef SLIC3R_DEBUG
21 namespace boost { namespace polygon {
22
23 // The following code for the visualization of the boost Voronoi diagram is based on:
24 //
25 // Boost.Polygon library voronoi_graphic_utils.hpp header file
26 // Copyright Andrii Sydorchuk 2010-2012.
27 // Distributed under the Boost Software License, Version 1.0.
28 // (See accompanying file LICENSE_1_0.txt or copy at
29 // http://www.boost.org/LICENSE_1_0.txt)
30 template <typename CT>
31 class voronoi_visual_utils {
32 public:
33 // Discretize parabolic Voronoi edge.
34 // Parabolic Voronoi edges are always formed by one point and one segment
35 // from the initial input set.
36 //
37 // Args:
38 // point: input point.
39 // segment: input segment.
40 // max_dist: maximum discretization distance.
41 // discretization: point discretization of the given Voronoi edge.
42 //
43 // Template arguments:
44 // InCT: coordinate type of the input geometries (usually integer).
45 // Point: point type, should model point concept.
46 // Segment: segment type, should model segment concept.
47 //
48 // Important:
49 // discretization should contain both edge endpoints initially.
50 template <class InCT1, class InCT2,
51 template<class> class Point,
52 template<class> class Segment>
53 static
54 typename enable_if<
55 typename gtl_and<
56 typename gtl_if<
57 typename is_point_concept<
58 typename geometry_concept< Point<InCT1> >::type
59 >::type
60 >::type,
61 typename gtl_if<
62 typename is_segment_concept<
63 typename geometry_concept< Segment<InCT2> >::type
64 >::type
65 >::type
66 >::type,
67 void
68 >::type discretize(
69 const Point<InCT1>& point,
70 const Segment<InCT2>& segment,
71 const CT max_dist,
72 std::vector< Point<CT> >* discretization) {
73 // Apply the linear transformation to move start point of the segment to
74 // the point with coordinates (0, 0) and the direction of the segment to
75 // coincide the positive direction of the x-axis.
76 CT segm_vec_x = cast(x(high(segment))) - cast(x(low(segment)));
77 CT segm_vec_y = cast(y(high(segment))) - cast(y(low(segment)));
78 CT sqr_segment_length = segm_vec_x * segm_vec_x + segm_vec_y * segm_vec_y;
79
80 // Compute x-coordinates of the endpoints of the edge
81 // in the transformed space.
82 CT projection_start = sqr_segment_length *
83 get_point_projection((*discretization)[0], segment);
84 CT projection_end = sqr_segment_length *
85 get_point_projection((*discretization)[1], segment);
86
87 // Compute parabola parameters in the transformed space.
88 // Parabola has next representation:
89 // f(x) = ((x-rot_x)^2 + rot_y^2) / (2.0*rot_y).
90 CT point_vec_x = cast(x(point)) - cast(x(low(segment)));
91 CT point_vec_y = cast(y(point)) - cast(y(low(segment)));
92 CT rot_x = segm_vec_x * point_vec_x + segm_vec_y * point_vec_y;
93 CT rot_y = segm_vec_x * point_vec_y - segm_vec_y * point_vec_x;
94
95 // Save the last point.
96 Point<CT> last_point = (*discretization)[1];
97 discretization->pop_back();
98
99 // Use stack to avoid recursion.
100 std::stack<CT> point_stack;
101 point_stack.push(projection_end);
102 CT cur_x = projection_start;
103 CT cur_y = parabola_y(cur_x, rot_x, rot_y);
104
105 // Adjust max_dist parameter in the transformed space.
106 const CT max_dist_transformed = max_dist * max_dist * sqr_segment_length;
107 while (!point_stack.empty()) {
108 CT new_x = point_stack.top();
109 CT new_y = parabola_y(new_x, rot_x, rot_y);
110
111 // Compute coordinates of the point of the parabola that is
112 // furthest from the current line segment.
113 CT mid_x = (new_y - cur_y) / (new_x - cur_x) * rot_y + rot_x;
114 CT mid_y = parabola_y(mid_x, rot_x, rot_y);
115
116 // Compute maximum distance between the given parabolic arc
117 // and line segment that discretize it.
118 CT dist = (new_y - cur_y) * (mid_x - cur_x) -
119 (new_x - cur_x) * (mid_y - cur_y);
120 dist = dist * dist / ((new_y - cur_y) * (new_y - cur_y) +
121 (new_x - cur_x) * (new_x - cur_x));
122 if (dist <= max_dist_transformed) {
123 // Distance between parabola and line segment is less than max_dist.
124 point_stack.pop();
125 CT inter_x = (segm_vec_x * new_x - segm_vec_y * new_y) /
126 sqr_segment_length + cast(x(low(segment)));
127 CT inter_y = (segm_vec_x * new_y + segm_vec_y * new_x) /
128 sqr_segment_length + cast(y(low(segment)));
129 discretization->push_back(Point<CT>(inter_x, inter_y));
130 cur_x = new_x;
131 cur_y = new_y;
132 } else {
133 point_stack.push(mid_x);
134 }
135 }
136
137 // Update last point.
138 discretization->back() = last_point;
139 }
140
141 private:
142 // Compute y(x) = ((x - a) * (x - a) + b * b) / (2 * b).
143 static CT parabola_y(CT x, CT a, CT b) {
144 return ((x - a) * (x - a) + b * b) / (b + b);
145 }
146
147 // Get normalized length of the distance between:
148 // 1) point projection onto the segment
149 // 2) start point of the segment
150 // Return this length divided by the segment length. This is made to avoid
151 // sqrt computation during transformation from the initial space to the
152 // transformed one and vice versa. The assumption is made that projection of
153 // the point lies between the start-point and endpoint of the segment.
154 template <class InCT,
155 template<class> class Point,
156 template<class> class Segment>
157 static
158 typename enable_if<
159 typename gtl_and<
160 typename gtl_if<
161 typename is_point_concept<
162 typename geometry_concept< Point<int> >::type
163 >::type
164 >::type,
165 typename gtl_if<
166 typename is_segment_concept<
167 typename geometry_concept< Segment<long> >::type
168 >::type
169 >::type
170 >::type,
171 CT
172 >::type get_point_projection(
173 const Point<CT>& point, const Segment<InCT>& segment) {
174 CT segment_vec_x = cast(x(high(segment))) - cast(x(low(segment)));
175 CT segment_vec_y = cast(y(high(segment))) - cast(y(low(segment)));
176 CT point_vec_x = x(point) - cast(x(low(segment)));
177 CT point_vec_y = y(point) - cast(y(low(segment)));
178 CT sqr_segment_length =
179 segment_vec_x * segment_vec_x + segment_vec_y * segment_vec_y;
180 CT vec_dot = segment_vec_x * point_vec_x + segment_vec_y * point_vec_y;
181 return vec_dot / sqr_segment_length;
182 }
183
184 template <typename InCT>
185 static CT cast(const InCT& value) {
186 return static_cast<CT>(value);
187 }
188 };
189
190 } } // namespace boost::polygon
191 #endif
192
193 using namespace boost::polygon; // provides also high() and low()
194
195 namespace Slic3r { namespace Geometry {
196
197 static bool
198 sort_points (Point a, Point b)
199 {
200 return (a.x < b.x) || (a.x == b.x && a.y < b.y);
201 }
202
203 /* This implementation is based on Andrew's monotone chain 2D convex hull algorithm */
204 Polygon
205 convex_hull(Points points)
206 {
207 assert(points.size() >= 3);
208 // sort input points
209 std::sort(points.begin(), points.end(), sort_points);
210
211 int n = points.size(), k = 0;
212 Polygon hull;
213 hull.points.resize(2*n);
214
215 // Build lower hull
216 for (int i = 0; i < n; i++) {
217 while (k >= 2 && points[i].ccw(hull.points[k-2], hull.points[k-1]) <= 0) k--;
218 hull.points[k++] = points[i];
219 }
220
221 // Build upper hull
222 for (int i = n-2, t = k+1; i >= 0; i--) {
223 while (k >= t && points[i].ccw(hull.points[k-2], hull.points[k-1]) <= 0) k--;
224 hull.points[k++] = points[i];
225 }
226
227 hull.points.resize(k);
228
229 assert( hull.points.front().coincides_with(hull.points.back()) );
230 hull.points.pop_back();
231
232 return hull;
233 }
234
235 Polygon
236 convex_hull(const Polygons &polygons)
237 {
238 Points pp;
239 for (Polygons::const_iterator p = polygons.begin(); p != polygons.end(); ++p) {
240 pp.insert(pp.end(), p->points.begin(), p->points.end());
241 }
242 return convex_hull(pp);
243 }
244
245 /* accepts an arrayref of points and returns a list of indices
246 according to a nearest-neighbor walk */
247 void
248 chained_path(const Points &points, std::vector<Points::size_type> &retval, Point start_near)
249 {
250 PointConstPtrs my_points;
251 std::map<const Point*,Points::size_type> indices;
252 my_points.reserve(points.size());
253 for (Points::const_iterator it = points.begin(); it != points.end(); ++it) {
254 my_points.push_back(&*it);
255 indices[&*it] = it - points.begin();
256 }
257
258 retval.reserve(points.size());
259 while (!my_points.empty()) {
260 Points::size_type idx = start_near.nearest_point_index(my_points);
261 start_near = *my_points[idx];
262 retval.push_back(indices[ my_points[idx] ]);
263 my_points.erase(my_points.begin() + idx);
264 }
265 }
266
267 void
268 chained_path(const Points &points, std::vector<Points::size_type> &retval)
269 {
270 if (points.empty()) return; // can't call front() on empty vector
271 chained_path(points, retval, points.front());
272 }
273
274 /* retval and items must be different containers */
275 template<class T>
276 void
277 chained_path_items(Points &points, T &items, T &retval)
278 {
279 std::vector<Points::size_type> indices;
280 chained_path(points, indices);
281 for (std::vector<Points::size_type>::const_iterator it = indices.begin(); it != indices.end(); ++it)
282 retval.push_back(items[*it]);
283 }
284 template void chained_path_items(Points &points, ClipperLib::PolyNodes &items, ClipperLib::PolyNodes &retval);
285
286 bool
287 directions_parallel(double angle1, double angle2, double max_diff)
288 {
289 double diff = fabs(angle1 - angle2);
290 max_diff += EPSILON;
291 return diff < max_diff || fabs(diff - PI) < max_diff;
292 }
293
294 template<class T>
295 bool
296 contains(const std::vector<T> &vector, const Point &point)
297 {
298 for (typename std::vector<T>::const_iterator it = vector.begin(); it != vector.end(); ++it) {
299 if (it->contains(point)) return true;
300 }
301 return false;
302 }
303 template bool contains(const ExPolygons &vector, const Point &point);
304
305 double
306 rad2deg(double angle)
307 {
308 return angle / PI * 180.0;
309 }
310
311 double
312 rad2deg_dir(double angle)
313 {
314 angle = (angle < PI) ? (-angle + PI/2.0) : (angle + PI/2.0);
315 if (angle < 0) angle += PI;
316 return rad2deg(angle);
317 }
318
319 double
320 deg2rad(double angle)
321 {
322 return PI * angle / 180.0;
323 }
324
325 void
326 simplify_polygons(const Polygons &polygons, double tolerance, Polygons* retval)
327 {
328 Polygons pp;
329 for (Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++it) {
330 Polygon p = *it;
331 p.points.push_back(p.points.front());
332 p.points = MultiPoint::_douglas_peucker(p.points, tolerance);
333 p.points.pop_back();
334 pp.push_back(p);
335 }
336 Slic3r::simplify_polygons(pp, retval);
337 }
338
339 double
340 linint(double value, double oldmin, double oldmax, double newmin, double newmax)
341 {
342 return (value - oldmin) * (newmax - newmin) / (oldmax - oldmin) + newmin;
343 }
344
345 #if 0
346 // Point with a weight, by which the points are sorted.
347 // If the points have the same weight, sort them lexicographically by their positions.
348 struct ArrangeItem {
349 ArrangeItem() {}
350 Pointf pos;
351 coordf_t weight;
352 bool operator<(const ArrangeItem &other) const {
353 return weight < other.weight ||
354 ((weight == other.weight) && (pos.y < other.pos.y || (pos.y == other.pos.y && pos.x < other.pos.x)));
355 }
356 };
357
358 Pointfs arrange(size_t num_parts, const Pointf &part_size, coordf_t gap, const BoundingBoxf* bed_bounding_box)
359 {
360 // Use actual part size (the largest) plus separation distance (half on each side) in spacing algorithm.
361 const Pointf cell_size(part_size.x + gap, part_size.y + gap);
362
363 const BoundingBoxf bed_bbox = (bed_bounding_box != NULL && bed_bounding_box->defined) ?
364 *bed_bounding_box :
365 // Bogus bed size, large enough not to trigger the unsufficient bed size error.
366 BoundingBoxf(
367 Pointf(0, 0),
368 Pointf(cell_size.x * num_parts, cell_size.y * num_parts));
369
370 // This is how many cells we have available into which to put parts.
371 size_t cellw = size_t(floor((bed_bbox.size().x + gap) / cell_size.x));
372 size_t cellh = size_t(floor((bed_bbox.size().y + gap) / cell_size.y));
373 if (num_parts > cellw * cellh)
374 CONFESS(PRINTF_ZU " parts won't fit in your print area!\n", num_parts);
375
376 // Get a bounding box of cellw x cellh cells, centered at the center of the bed.
377 Pointf cells_size(cellw * cell_size.x - gap, cellh * cell_size.y - gap);
378 Pointf cells_offset(bed_bbox.center() - 0.5 * cells_size);
379 BoundingBoxf cells_bb(cells_offset, cells_size + cells_offset);
380
381 // List of cells, sorted by distance from center.
382 std::vector<ArrangeItem> cellsorder(cellw * cellh, ArrangeItem());
383 for (size_t j = 0; j < cellh; ++ j) {
384 // Center of the jth row on the bed.
385 coordf_t cy = linint(j + 0.5, 0., double(cellh), cells_bb.min.y, cells_bb.max.y);
386 // Offset from the bed center.
387 coordf_t yd = cells_bb.center().y - cy;
388 for (size_t i = 0; i < cellw; ++ i) {
389 // Center of the ith column on the bed.
390 coordf_t cx = linint(i + 0.5, 0., double(cellw), cells_bb.min.x, cells_bb.max.x);
391 // Offset from the bed center.
392 coordf_t xd = cells_bb.center().x - cx;
393 // Cell with a distance from the bed center.
394 ArrangeItem &ci = cellsorder[j * cellw + i];
395 // Cell center
396 ci.pos.x = cx;
397 ci.pos.y = cy;
398 // Square distance of the cell center to the bed center.
399 ci.weight = xd * xd + yd * yd;
400 }
401 }
402 // Sort the cells lexicographically by their distances to the bed center and left to right / bttom to top.
403 std::sort(cellsorder.begin(), cellsorder.end());
404 cellsorder.erase(cellsorder.begin() + num_parts, cellsorder.end());
405
406 // Return the (left,top) corners of the cells.
407 Pointfs positions;
408 positions.reserve(num_parts);
409 for (std::vector<ArrangeItem>::const_iterator it = cellsorder.begin(); it != cellsorder.end(); ++ it)
410 positions.push_back(Pointf(it->pos.x - 0.5 * part_size.x, it->pos.y - 0.5 * part_size.y));
411 return positions;
412 }
413 #else
414 class ArrangeItem {
415 public:
416 Pointf pos;
417 size_t index_x, index_y;
418 coordf_t dist;
419 };
420 class ArrangeItemIndex {
421 public:
422 coordf_t index;
423 ArrangeItem item;
424 ArrangeItemIndex(coordf_t _index, ArrangeItem _item) : index(_index), item(_item) {};
425 };
426
427 bool
428 arrange(size_t total_parts, const Pointf &part_size, coordf_t dist, const BoundingBoxf* bb, Pointfs &positions)
429 {
430 positions.clear();
431
432 Pointf part = part_size;
433
434 // use actual part size (the largest) plus separation distance (half on each side) in spacing algorithm
435 part.x += dist;
436 part.y += dist;
437
438 Pointf area;
439 if (bb != NULL && bb->defined) {
440 area = bb->size();
441 } else {
442 // bogus area size, large enough not to trigger the error below
443 area.x = part.x * total_parts;
444 area.y = part.y * total_parts;
445 }
446
447 // this is how many cells we have available into which to put parts
448 size_t cellw = floor((area.x + dist) / part.x);
449 size_t cellh = floor((area.y + dist) / part.y);
450 if (total_parts > (cellw * cellh))
451 return false;
452
453 // total space used by cells
454 Pointf cells(cellw * part.x, cellh * part.y);
455
456 // bounding box of total space used by cells
457 BoundingBoxf cells_bb;
458 cells_bb.merge(Pointf(0,0)); // min
459 cells_bb.merge(cells); // max
460
461 // center bounding box to area
462 cells_bb.translate(
463 (area.x - cells.x) / 2,
464 (area.y - cells.y) / 2
465 );
466
467 // list of cells, sorted by distance from center
468 std::vector<ArrangeItemIndex> cellsorder;
469
470 // work out distance for all cells, sort into list
471 for (size_t i = 0; i <= cellw-1; ++i) {
472 for (size_t j = 0; j <= cellh-1; ++j) {
473 coordf_t cx = linint(i + 0.5, 0, cellw, cells_bb.min.x, cells_bb.max.x);
474 coordf_t cy = linint(j + 0.5, 0, cellh, cells_bb.min.y, cells_bb.max.y);
475
476 coordf_t xd = fabs((area.x / 2) - cx);
477 coordf_t yd = fabs((area.y / 2) - cy);
478
479 ArrangeItem c;
480 c.pos.x = cx;
481 c.pos.y = cy;
482 c.index_x = i;
483 c.index_y = j;
484 c.dist = xd * xd + yd * yd - fabs((cellw / 2) - (i + 0.5));
485
486 // binary insertion sort
487 {
488 coordf_t index = c.dist;
489 size_t low = 0;
490 size_t high = cellsorder.size();
491 while (low < high) {
492 size_t mid = (low + ((high - low) / 2)) | 0;
493 coordf_t midval = cellsorder[mid].index;
494
495 if (midval < index) {
496 low = mid + 1;
497 } else if (midval > index) {
498 high = mid;
499 } else {
500 cellsorder.insert(cellsorder.begin() + mid, ArrangeItemIndex(index, c));
501 goto ENDSORT;
502 }
503 }
504 cellsorder.insert(cellsorder.begin() + low, ArrangeItemIndex(index, c));
505 }
506 ENDSORT: true;
507 }
508 }
509
510 // the extents of cells actually used by objects
511 coordf_t lx = 0;
512 coordf_t ty = 0;
513 coordf_t rx = 0;
514 coordf_t by = 0;
515
516 // now find cells actually used by objects, map out the extents so we can position correctly
517 for (size_t i = 1; i <= total_parts; ++i) {
518 ArrangeItemIndex c = cellsorder[i - 1];
519 coordf_t cx = c.item.index_x;
520 coordf_t cy = c.item.index_y;
521 if (i == 1) {
522 lx = rx = cx;
523 ty = by = cy;
524 } else {
525 if (cx > rx) rx = cx;
526 if (cx < lx) lx = cx;
527 if (cy > by) by = cy;
528 if (cy < ty) ty = cy;
529 }
530 }
531 // now we actually place objects into cells, positioned such that the left and bottom borders are at 0
532 for (size_t i = 1; i <= total_parts; ++i) {
533 ArrangeItemIndex c = cellsorder.front();
534 cellsorder.erase(cellsorder.begin());
535 coordf_t cx = c.item.index_x - lx;
536 coordf_t cy = c.item.index_y - ty;
537
538 positions.push_back(Pointf(cx * part.x, cy * part.y));
539 }
540
541 if (bb != NULL && bb->defined) {
542 for (Pointfs::iterator p = positions.begin(); p != positions.end(); ++p) {
543 p->x += bb->min.x;
544 p->y += bb->min.y;
545 }
546 }
547
548 return true;
549 }
550 #endif
551
552 #ifdef SLIC3R_DEBUG
553 // The following code for the visualization of the boost Voronoi diagram is based on:
554 //
555 // Boost.Polygon library voronoi_visualizer.cpp file
556 // Copyright Andrii Sydorchuk 2010-2012.
557 // Distributed under the Boost Software License, Version 1.0.
558 // (See accompanying file LICENSE_1_0.txt or copy at
559 // http://www.boost.org/LICENSE_1_0.txt)
560 namespace Voronoi { namespace Internal {
561
562 typedef double coordinate_type;
563 typedef boost::polygon::point_data<coordinate_type> point_type;
564 typedef boost::polygon::segment_data<coordinate_type> segment_type;
565 typedef boost::polygon::rectangle_data<coordinate_type> rect_type;
566 // typedef voronoi_builder<int> VB;
567 typedef boost::polygon::voronoi_diagram<coordinate_type> VD;
568 typedef VD::cell_type cell_type;
569 typedef VD::cell_type::source_index_type source_index_type;
570 typedef VD::cell_type::source_category_type source_category_type;
571 typedef VD::edge_type edge_type;
572 typedef VD::cell_container_type cell_container_type;
573 typedef VD::cell_container_type vertex_container_type;
574 typedef VD::edge_container_type edge_container_type;
575 typedef VD::const_cell_iterator const_cell_iterator;
576 typedef VD::const_vertex_iterator const_vertex_iterator;
577 typedef VD::const_edge_iterator const_edge_iterator;
578
579 static const std::size_t EXTERNAL_COLOR = 1;
580
581 inline void color_exterior(const VD::edge_type* edge)
582 {
583 if (edge->color() == EXTERNAL_COLOR)
584 return;
585 edge->color(EXTERNAL_COLOR);
586 edge->twin()->color(EXTERNAL_COLOR);
587 const VD::vertex_type* v = edge->vertex1();
588 if (v == NULL || !edge->is_primary())
589 return;
590 v->color(EXTERNAL_COLOR);
591 const VD::edge_type* e = v->incident_edge();
592 do {
593 color_exterior(e);
594 e = e->rot_next();
595 } while (e != v->incident_edge());
596 }
597
598 inline point_type retrieve_point(const std::vector<segment_type> &segments, const cell_type& cell)
599 {
600 assert(cell.source_category() == SOURCE_CATEGORY_SEGMENT_START_POINT || cell.source_category() == SOURCE_CATEGORY_SEGMENT_END_POINT);
601 return (cell.source_category() == SOURCE_CATEGORY_SEGMENT_START_POINT) ? low(segments[cell.source_index()]) : high(segments[cell.source_index()]);
602 }
603
604 inline void clip_infinite_edge(const std::vector<segment_type> &segments, const edge_type& edge, coordinate_type bbox_max_size, std::vector<point_type>* clipped_edge)
605 {
606 const cell_type& cell1 = *edge.cell();
607 const cell_type& cell2 = *edge.twin()->cell();
608 point_type origin, direction;
609 // Infinite edges could not be created by two segment sites.
610 if (cell1.contains_point() && cell2.contains_point()) {
611 point_type p1 = retrieve_point(segments, cell1);
612 point_type p2 = retrieve_point(segments, cell2);
613 origin.x((p1.x() + p2.x()) * 0.5);
614 origin.y((p1.y() + p2.y()) * 0.5);
615 direction.x(p1.y() - p2.y());
616 direction.y(p2.x() - p1.x());
617 } else {
618 origin = cell1.contains_segment() ? retrieve_point(segments, cell2) : retrieve_point(segments, cell1);
619 segment_type segment = cell1.contains_segment() ? segments[cell1.source_index()] : segments[cell2.source_index()];
620 coordinate_type dx = high(segment).x() - low(segment).x();
621 coordinate_type dy = high(segment).y() - low(segment).y();
622 if ((low(segment) == origin) ^ cell1.contains_point()) {
623 direction.x(dy);
624 direction.y(-dx);
625 } else {
626 direction.x(-dy);
627 direction.y(dx);
628 }
629 }
630 coordinate_type koef = bbox_max_size / (std::max)(fabs(direction.x()), fabs(direction.y()));
631 if (edge.vertex0() == NULL) {
632 clipped_edge->push_back(point_type(
633 origin.x() - direction.x() * koef,
634 origin.y() - direction.y() * koef));
635 } else {
636 clipped_edge->push_back(
637 point_type(edge.vertex0()->x(), edge.vertex0()->y()));
638 }
639 if (edge.vertex1() == NULL) {
640 clipped_edge->push_back(point_type(
641 origin.x() + direction.x() * koef,
642 origin.y() + direction.y() * koef));
643 } else {
644 clipped_edge->push_back(
645 point_type(edge.vertex1()->x(), edge.vertex1()->y()));
646 }
647 }
648
649 inline void sample_curved_edge(const std::vector<segment_type> &segments, const edge_type& edge, std::vector<point_type> &sampled_edge, coordinate_type max_dist)
650 {
651 point_type point = edge.cell()->contains_point() ?
652 retrieve_point(segments, *edge.cell()) :
653 retrieve_point(segments, *edge.twin()->cell());
654 segment_type segment = edge.cell()->contains_point() ?
655 segments[edge.twin()->cell()->source_index()] :
656 segments[edge.cell()->source_index()];
657 ::boost::polygon::voronoi_visual_utils<coordinate_type>::discretize(point, segment, max_dist, &sampled_edge);
658 }
659
660 } /* namespace Internal */ } // namespace Voronoi
661
662 static inline void dump_voronoi_to_svg(const Lines &lines, /* const */ voronoi_diagram<double> &vd, const ThickPolylines *polylines, const char *path)
663 {
664 const double scale = 0.2;
665 const std::string inputSegmentPointColor = "lightseagreen";
666 const coord_t inputSegmentPointRadius = coord_t(0.09 * scale / SCALING_FACTOR);
667 const std::string inputSegmentColor = "lightseagreen";
668 const coord_t inputSegmentLineWidth = coord_t(0.03 * scale / SCALING_FACTOR);
669
670 const std::string voronoiPointColor = "black";
671 const coord_t voronoiPointRadius = coord_t(0.06 * scale / SCALING_FACTOR);
672 const std::string voronoiLineColorPrimary = "black";
673 const std::string voronoiLineColorSecondary = "green";
674 const std::string voronoiArcColor = "red";
675 const coord_t voronoiLineWidth = coord_t(0.02 * scale / SCALING_FACTOR);
676
677 const bool internalEdgesOnly = false;
678 const bool primaryEdgesOnly = false;
679
680 BoundingBox bbox = BoundingBox(lines);
681 bbox.min.x -= coord_t(1. / SCALING_FACTOR);
682 bbox.min.y -= coord_t(1. / SCALING_FACTOR);
683 bbox.max.x += coord_t(1. / SCALING_FACTOR);
684 bbox.max.y += coord_t(1. / SCALING_FACTOR);
685
686 ::Slic3r::SVG svg(path, bbox);
687
688 if (polylines != NULL)
689 svg.draw(*polylines, "lime", "lime", voronoiLineWidth);
690
691 // bbox.scale(1.2);
692 // For clipping of half-lines to some reasonable value.
693 // The line will then be clipped by the SVG viewer anyway.
694 const double bbox_dim_max = double(bbox.max.x - bbox.min.x) + double(bbox.max.y - bbox.min.y);
695 // For the discretization of the Voronoi parabolic segments.
696 const double discretization_step = 0.0005 * bbox_dim_max;
697
698 // Make a copy of the input segments with the double type.
699 std::vector<Voronoi::Internal::segment_type> segments;
700 for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++ it)
701 segments.push_back(Voronoi::Internal::segment_type(
702 Voronoi::Internal::point_type(double(it->a.x), double(it->a.y)),
703 Voronoi::Internal::point_type(double(it->b.x), double(it->b.y))));
704
705 // Color exterior edges.
706 for (voronoi_diagram<double>::const_edge_iterator it = vd.edges().begin(); it != vd.edges().end(); ++it)
707 if (!it->is_finite())
708 Voronoi::Internal::color_exterior(&(*it));
709
710 // Draw the end points of the input polygon.
711 for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++it) {
712 svg.draw(it->a, inputSegmentPointColor, inputSegmentPointRadius);
713 svg.draw(it->b, inputSegmentPointColor, inputSegmentPointRadius);
714 }
715 // Draw the input polygon.
716 for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++it)
717 svg.draw(Line(Point(coord_t(it->a.x), coord_t(it->a.y)), Point(coord_t(it->b.x), coord_t(it->b.y))), inputSegmentColor, inputSegmentLineWidth);
718
719 #if 1
720 // Draw voronoi vertices.
721 for (voronoi_diagram<double>::const_vertex_iterator it = vd.vertices().begin(); it != vd.vertices().end(); ++it)
722 if (! internalEdgesOnly || it->color() != Voronoi::Internal::EXTERNAL_COLOR)
723 svg.draw(Point(coord_t(it->x()), coord_t(it->y())), voronoiPointColor, voronoiPointRadius);
724
725 for (voronoi_diagram<double>::const_edge_iterator it = vd.edges().begin(); it != vd.edges().end(); ++it) {
726 if (primaryEdgesOnly && !it->is_primary())
727 continue;
728 if (internalEdgesOnly && (it->color() == Voronoi::Internal::EXTERNAL_COLOR))
729 continue;
730 std::vector<Voronoi::Internal::point_type> samples;
731 std::string color = voronoiLineColorPrimary;
732 if (!it->is_finite()) {
733 Voronoi::Internal::clip_infinite_edge(segments, *it, bbox_dim_max, &samples);
734 if (! it->is_primary())
735 color = voronoiLineColorSecondary;
736 } else {
737 // Store both points of the segment into samples. sample_curved_edge will split the initial line
738 // until the discretization_step is reached.
739 samples.push_back(Voronoi::Internal::point_type(it->vertex0()->x(), it->vertex0()->y()));
740 samples.push_back(Voronoi::Internal::point_type(it->vertex1()->x(), it->vertex1()->y()));
741 if (it->is_curved()) {
742 Voronoi::Internal::sample_curved_edge(segments, *it, samples, discretization_step);
743 color = voronoiArcColor;
744 } else if (! it->is_primary())
745 color = voronoiLineColorSecondary;
746 }
747 for (std::size_t i = 0; i + 1 < samples.size(); ++i)
748 svg.draw(Line(Point(coord_t(samples[i].x()), coord_t(samples[i].y())), Point(coord_t(samples[i+1].x()), coord_t(samples[i+1].y()))), color, voronoiLineWidth);
749 }
750 #endif
751
752 if (polylines != NULL)
753 svg.draw(*polylines, "blue", voronoiLineWidth);
754
755 svg.Close();
756 }
757 #endif /* SLIC3R_DEBUG */
758
759 // Euclidian distance of two boost::polygon points.
760 template<typename T>
761 T dist(const boost::polygon::point_data<T> &p1,const boost::polygon::point_data<T> &p2)
762 {
763 T dx = p2.x() - p1.x();
764 T dy = p2.y() - p1.y();
765 return sqrt(dx*dx+dy*dy);
766 }
767
768 // Find a foot point of "px" on a segment "seg".
769 template<typename segment_type, typename point_type>
770 inline point_type project_point_to_segment(segment_type &seg, point_type &px)
771 {
772 typedef typename point_type::coordinate_type T;
773 const point_type &p0 = low(seg);
774 const point_type &p1 = high(seg);
775 const point_type dir(p1.x()-p0.x(), p1.y()-p0.y());
776 const point_type dproj(px.x()-p0.x(), px.y()-p0.y());
777 const T t = (dir.x()*dproj.x() + dir.y()*dproj.y()) / (dir.x()*dir.x() + dir.y()*dir.y());
778 assert(t >= T(-1e-6) && t <= T(1. + 1e-6));
779 return point_type(p0.x() + t*dir.x(), p0.y() + t*dir.y());
780 }
781
782 template<typename VD, typename SEGMENTS>
783 inline const typename VD::point_type retrieve_cell_point(const typename VD::cell_type& cell, const SEGMENTS &segments)
784 {
785 assert(cell.source_category() == SOURCE_CATEGORY_SEGMENT_START_POINT || cell.source_category() == SOURCE_CATEGORY_SEGMENT_END_POINT);
786 return (cell.source_category() == SOURCE_CATEGORY_SEGMENT_START_POINT) ? low(segments[cell.source_index()]) : high(segments[cell.source_index()]);
787 }
788
789 template<typename VD, typename SEGMENTS>
790 inline std::pair<typename VD::coord_type, typename VD::coord_type>
791 measure_edge_thickness(const VD &vd, const typename VD::edge_type& edge, const SEGMENTS &segments)
792 {
793 typedef typename VD::coord_type T;
794 const typename VD::point_type pa(edge.vertex0()->x(), edge.vertex0()->y());
795 const typename VD::point_type pb(edge.vertex1()->x(), edge.vertex1()->y());
796 const typename VD::cell_type &cell1 = *edge.cell();
797 const typename VD::cell_type &cell2 = *edge.twin()->cell();
798 if (cell1.contains_segment()) {
799 if (cell2.contains_segment()) {
800 // Both cells contain a linear segment, the left / right cells are symmetric.
801 // Project pa, pb to the left segment.
802 const typename VD::segment_type segment1 = segments[cell1.source_index()];
803 const typename VD::point_type p1a = project_point_to_segment(segment1, pa);
804 const typename VD::point_type p1b = project_point_to_segment(segment1, pb);
805 return std::pair<T, T>(T(2.)*dist(pa, p1a), T(2.)*dist(pb, p1b));
806 } else {
807 // 1st cell contains a linear segment, 2nd cell contains a point.
808 // The medial axis between the cells is a parabolic arc.
809 // Project pa, pb to the left segment.
810 const typename VD::point_type p2 = retrieve_cell_point<VD>(cell2, segments);
811 return std::pair<T, T>(T(2.)*dist(pa, p2), T(2.)*dist(pb, p2));
812 }
813 } else if (cell2.contains_segment()) {
814 // 1st cell contains a point, 2nd cell contains a linear segment.
815 // The medial axis between the cells is a parabolic arc.
816 const typename VD::point_type p1 = retrieve_cell_point<VD>(cell1, segments);
817 return std::pair<T, T>(T(2.)*dist(pa, p1), T(2.)*dist(pb, p1));
818 } else {
819 // Both cells contain a point. The left / right regions are triangular and symmetric.
820 const typename VD::point_type p1 = retrieve_cell_point<VD>(cell1, segments);
821 return std::pair<T, T>(T(2.)*dist(pa, p1), T(2.)*dist(pb, p1));
822 }
823 }
824
825 // Converts the Line instances of Lines vector to VD::segment_type.
826 template<typename VD>
827 class Lines2VDSegments
828 {
829 public:
830 Lines2VDSegments(const Lines &alines) : lines(alines) {}
831 typename VD::segment_type operator[](size_t idx) const {
832 return typename VD::segment_type(
833 typename VD::point_type(typename VD::coord_type(lines[idx].a.x), typename VD::coord_type(lines[idx].a.y)),
834 typename VD::point_type(typename VD::coord_type(lines[idx].b.x), typename VD::coord_type(lines[idx].b.y)));
835 }
836 private:
837 const Lines &lines;
838 };
839
840 void
841 MedialAxis::build(ThickPolylines* polylines)
842 {
843 construct_voronoi(this->lines.begin(), this->lines.end(), &this->vd);
844
845 /*
846 // DEBUG: dump all Voronoi edges
847 {
848 for (VD::const_edge_iterator edge = this->vd.edges().begin(); edge != this->vd.edges().end(); ++edge) {
849 if (edge->is_infinite()) continue;
850
851 ThickPolyline polyline;
852 polyline.points.push_back(Point( edge->vertex0()->x(), edge->vertex0()->y() ));
853 polyline.points.push_back(Point( edge->vertex1()->x(), edge->vertex1()->y() ));
854 polylines->push_back(polyline);
855 }
856 return;
857 }
858 */
859
860 typedef const VD::vertex_type vert_t;
861 typedef const VD::edge_type edge_t;
862
863 // collect valid edges (i.e. prune those not belonging to MAT)
864 // note: this keeps twins, so it inserts twice the number of the valid edges
865 this->valid_edges.clear();
866 {
867 std::set<const VD::edge_type*> seen_edges;
868 for (VD::const_edge_iterator edge = this->vd.edges().begin(); edge != this->vd.edges().end(); ++edge) {
869 // if we only process segments representing closed loops, none if the
870 // infinite edges (if any) would be part of our MAT anyway
871 if (edge->is_secondary() || edge->is_infinite()) continue;
872
873 // don't re-validate twins
874 if (seen_edges.find(&*edge) != seen_edges.end()) continue; // TODO: is this needed?
875 seen_edges.insert(&*edge);
876 seen_edges.insert(edge->twin());
877
878 if (!this->validate_edge(&*edge)) continue;
879 this->valid_edges.insert(&*edge);
880 this->valid_edges.insert(edge->twin());
881 }
882 }
883 this->edges = this->valid_edges;
884
885 // iterate through the valid edges to build polylines
886 while (!this->edges.empty()) {
887 const edge_t* edge = *this->edges.begin();
888
889 // start a polyline
890 ThickPolyline polyline;
891 polyline.points.push_back(Point( edge->vertex0()->x(), edge->vertex0()->y() ));
892 polyline.points.push_back(Point( edge->vertex1()->x(), edge->vertex1()->y() ));
893 polyline.width.push_back(this->thickness[edge].first);
894 polyline.width.push_back(this->thickness[edge].second);
895
896 // remove this edge and its twin from the available edges
897 (void)this->edges.erase(edge);
898 (void)this->edges.erase(edge->twin());
899
900 // get next points
901 this->process_edge_neighbors(edge, &polyline);
902
903 // get previous points
904 {
905 ThickPolyline rpolyline;
906 this->process_edge_neighbors(edge->twin(), &rpolyline);
907 polyline.points.insert(polyline.points.begin(), rpolyline.points.rbegin(), rpolyline.points.rend());
908 polyline.width.insert(polyline.width.begin(), rpolyline.width.rbegin(), rpolyline.width.rend());
909 polyline.endpoints.first = rpolyline.endpoints.second;
910 }
911
912 assert(polyline.width.size() == polyline.points.size()*2 - 2);
913
914 // prevent loop endpoints from being extended
915 if (polyline.first_point().coincides_with(polyline.last_point())) {
916 polyline.endpoints.first = false;
917 polyline.endpoints.second = false;
918 }
919
920 // append polyline to result
921 polylines->push_back(polyline);
922 }
923
924 #ifdef SLIC3R_DEBUG
925 {
926 static int iRun = 0;
927 dump_voronoi_to_svg(this->lines, this->vd, polylines, debug_out_path("MedialAxis-%d.svg", iRun ++).c_str());
928 printf("Thick lines: ");
929 for (ThickPolylines::const_iterator it = polylines->begin(); it != polylines->end(); ++ it) {
930 ThickLines lines = it->thicklines();
931 for (ThickLines::const_iterator it2 = lines.begin(); it2 != lines.end(); ++ it2) {
932 printf("%f,%f ", it2->a_width, it2->b_width);
933 }
934 }
935 printf("\n");
936 }
937 #endif /* SLIC3R_DEBUG */
938 }
939
940 void
941 MedialAxis::build(Polylines* polylines)
942 {
943 ThickPolylines tp;
944 this->build(&tp);
945 polylines->insert(polylines->end(), tp.begin(), tp.end());
946 }
947
948 void
949 MedialAxis::process_edge_neighbors(const VD::edge_type* edge, ThickPolyline* polyline)
950 {
951 while (true) {
952 // Since rot_next() works on the edge starting point but we want
953 // to find neighbors on the ending point, we just swap edge with
954 // its twin.
955 const VD::edge_type* twin = edge->twin();
956
957 // count neighbors for this edge
958 std::vector<const VD::edge_type*> neighbors;
959 for (const VD::edge_type* neighbor = twin->rot_next(); neighbor != twin;
960 neighbor = neighbor->rot_next()) {
961 if (this->valid_edges.count(neighbor) > 0) neighbors.push_back(neighbor);
962 }
963
964 // if we have a single neighbor then we can continue recursively
965 if (neighbors.size() == 1) {
966 const VD::edge_type* neighbor = neighbors.front();
967
968 // break if this is a closed loop
969 if (this->edges.count(neighbor) == 0) return;
970
971 Point new_point(neighbor->vertex1()->x(), neighbor->vertex1()->y());
972 polyline->points.push_back(new_point);
973 polyline->width.push_back(this->thickness[neighbor].first);
974 polyline->width.push_back(this->thickness[neighbor].second);
975 (void)this->edges.erase(neighbor);
976 (void)this->edges.erase(neighbor->twin());
977 edge = neighbor;
978 } else if (neighbors.size() == 0) {
979 polyline->endpoints.second = true;
980 return;
981 } else {
982 // T-shaped or star-shaped joint
983 return;
984 }
985 }
986 }
987
988 bool
989 MedialAxis::validate_edge(const VD::edge_type* edge)
990 {
991 // construct the line representing this edge of the Voronoi diagram
992 const Line line(
993 Point( edge->vertex0()->x(), edge->vertex0()->y() ),
994 Point( edge->vertex1()->x(), edge->vertex1()->y() )
995 );
996
997 // discard edge if it lies outside the supplied shape
998 // this could maybe be optimized (checking inclusion of the endpoints
999 // might give false positives as they might belong to the contour itself)
1000 if (this->expolygon != NULL) {
1001 if (line.a.coincides_with(line.b)) {
1002 // in this case, contains(line) returns a false positive
1003 if (!this->expolygon->contains(line.a)) return false;
1004 } else {
1005 if (!this->expolygon->contains(line)) return false;
1006 }
1007 }
1008
1009 // retrieve the original line segments which generated the edge we're checking
1010 const VD::cell_type* cell_l = edge->cell();
1011 const VD::cell_type* cell_r = edge->twin()->cell();
1012 const Line &segment_l = this->retrieve_segment(cell_l);
1013 const Line &segment_r = this->retrieve_segment(cell_r);
1014
1015 /*
1016 SVG svg("edge.svg");
1017 svg.draw(*this->expolygon);
1018 svg.draw(line);
1019 svg.draw(segment_l, "red");
1020 svg.draw(segment_r, "blue");
1021 svg.Close();
1022 */
1023
1024 /* Calculate thickness of the cross-section at both the endpoints of this edge.
1025 Our Voronoi edge is part of a CCW sequence going around its Voronoi cell
1026 located on the left side. (segment_l).
1027 This edge's twin goes around segment_r. Thus, segment_r is
1028 oriented in the same direction as our main edge, and segment_l is oriented
1029 in the same direction as our twin edge.
1030 We used to only consider the (half-)distances to segment_r, and that works
1031 whenever segment_l and segment_r are almost specular and facing. However,
1032 at curves they are staggered and they only face for a very little length
1033 (our very short edge represents such visibility).
1034 Both w0 and w1 can be calculated either towards cell_l or cell_r with equal
1035 results by Voronoi definition.
1036 When cell_l or cell_r don't refer to the segment but only to an endpoint, we
1037 calculate the distance to that endpoint instead. */
1038
1039 coordf_t w0 = cell_r->contains_segment()
1040 ? line.a.distance_to(segment_r)*2
1041 : line.a.distance_to(this->retrieve_endpoint(cell_r))*2;
1042
1043 coordf_t w1 = cell_l->contains_segment()
1044 ? line.b.distance_to(segment_l)*2
1045 : line.b.distance_to(this->retrieve_endpoint(cell_l))*2;
1046
1047 if (cell_l->contains_segment() && cell_r->contains_segment()) {
1048 // calculate the relative angle between the two boundary segments
1049 double angle = fabs(segment_r.orientation() - segment_l.orientation());
1050 if (angle > PI) angle = 2*PI - angle;
1051 assert(angle >= 0 && angle <= PI);
1052
1053 // fabs(angle) ranges from 0 (collinear, same direction) to PI (collinear, opposite direction)
1054 // we're interested only in segments close to the second case (facing segments)
1055 // so we allow some tolerance.
1056 // this filter ensures that we're dealing with a narrow/oriented area (longer than thick)
1057 // we don't run it on edges not generated by two segments (thus generated by one segment
1058 // and the endpoint of another segment), since their orientation would not be meaningful
1059 if (PI - angle > PI/8) {
1060 // angle is not narrow enough
1061
1062 // only apply this filter to segments that are not too short otherwise their
1063 // angle could possibly be not meaningful
1064 if (w0 < SCALED_EPSILON || w1 < SCALED_EPSILON || line.length() >= this->min_width)
1065 return false;
1066 }
1067 } else {
1068 if (w0 < SCALED_EPSILON || w1 < SCALED_EPSILON)
1069 return false;
1070 }
1071
1072 if (w0 < this->min_width && w1 < this->min_width)
1073 return false;
1074
1075 if (w0 > this->max_width && w1 > this->max_width)
1076 return false;
1077
1078 this->thickness[edge] = std::make_pair(w0, w1);
1079 this->thickness[edge->twin()] = std::make_pair(w1, w0);
1080
1081 return true;
1082 }
1083
1084 const Line&
1085 MedialAxis::retrieve_segment(const VD::cell_type* cell) const
1086 {
1087 return this->lines[cell->source_index()];
1088 }
1089
1090 const Point&
1091 MedialAxis::retrieve_endpoint(const VD::cell_type* cell) const
1092 {
1093 const Line& line = this->retrieve_segment(cell);
1094 if (cell->source_category() == SOURCE_CATEGORY_SEGMENT_START_POINT) {
1095 return line.a;
1096 } else {
1097 return line.b;
1098 }
1099 }
1100
1101 } }
0 #ifndef slic3r_Geometry_hpp_
1 #define slic3r_Geometry_hpp_
2
3 #include "libslic3r.h"
4 #include "BoundingBox.hpp"
5 #include "ExPolygon.hpp"
6 #include "Polygon.hpp"
7 #include "Polyline.hpp"
8
9 #include "boost/polygon/voronoi.hpp"
10 using boost::polygon::voronoi_builder;
11 using boost::polygon::voronoi_diagram;
12
13 namespace Slic3r { namespace Geometry {
14
15 Polygon convex_hull(Points points);
16 Polygon convex_hull(const Polygons &polygons);
17 void chained_path(const Points &points, std::vector<Points::size_type> &retval, Point start_near);
18 void chained_path(const Points &points, std::vector<Points::size_type> &retval);
19 template<class T> void chained_path_items(Points &points, T &items, T &retval);
20 bool directions_parallel(double angle1, double angle2, double max_diff = 0);
21 template<class T> bool contains(const std::vector<T> &vector, const Point &point);
22 double rad2deg(double angle);
23 double rad2deg_dir(double angle);
24 double deg2rad(double angle);
25 void simplify_polygons(const Polygons &polygons, double tolerance, Polygons* retval);
26
27 double linint(double value, double oldmin, double oldmax, double newmin, double newmax);
28 bool arrange(
29 // input
30 size_t num_parts, const Pointf &part_size, coordf_t gap, const BoundingBoxf* bed_bounding_box,
31 // output
32 Pointfs &positions);
33
34 class MedialAxis {
35 public:
36 Lines lines;
37 const ExPolygon* expolygon;
38 double max_width;
39 double min_width;
40 MedialAxis(double _max_width, double _min_width, const ExPolygon* _expolygon = NULL)
41 : max_width(_max_width), min_width(_min_width), expolygon(_expolygon) {};
42 void build(ThickPolylines* polylines);
43 void build(Polylines* polylines);
44
45 private:
46 class VD : public voronoi_diagram<double> {
47 public:
48 typedef double coord_type;
49 typedef boost::polygon::point_data<coordinate_type> point_type;
50 typedef boost::polygon::segment_data<coordinate_type> segment_type;
51 typedef boost::polygon::rectangle_data<coordinate_type> rect_type;
52 };
53 VD vd;
54 std::set<const VD::edge_type*> edges, valid_edges;
55 std::map<const VD::edge_type*, std::pair<coordf_t,coordf_t> > thickness;
56 void process_edge_neighbors(const VD::edge_type* edge, ThickPolyline* polyline);
57 bool validate_edge(const VD::edge_type* edge);
58 const Line& retrieve_segment(const VD::cell_type* cell) const;
59 const Point& retrieve_endpoint(const VD::cell_type* cell) const;
60 };
61
62 } }
63
64 #endif
0 #include "Layer.hpp"
1 #include "ClipperUtils.hpp"
2 #include "Geometry.hpp"
3 #include "Print.hpp"
4 #include "Fill/Fill.hpp"
5 #include "SVG.hpp"
6
7 namespace Slic3r {
8
9 Layer::Layer(size_t id, PrintObject *object, coordf_t height, coordf_t print_z,
10 coordf_t slice_z)
11 : upper_layer(NULL),
12 lower_layer(NULL),
13 regions(),
14 slicing_errors(false),
15 slice_z(slice_z),
16 print_z(print_z),
17 height(height),
18 slices(),
19 _id(id),
20 _object(object)
21 {
22 }
23
24 Layer::~Layer()
25 {
26 // remove references to self
27 if (NULL != this->upper_layer) {
28 this->upper_layer->lower_layer = NULL;
29 }
30
31 if (NULL != this->lower_layer) {
32 this->lower_layer->upper_layer = NULL;
33 }
34
35 this->clear_regions();
36 }
37
38 size_t
39 Layer::id() const
40 {
41 return this->_id;
42 }
43
44 void
45 Layer::set_id(size_t id)
46 {
47 this->_id = id;
48 }
49
50 PrintObject*
51 Layer::object()
52 {
53 return this->_object;
54 }
55
56 const PrintObject*
57 Layer::object() const
58 {
59 return this->_object;
60 }
61
62
63 size_t
64 Layer::region_count() const
65 {
66 return this->regions.size();
67 }
68
69 void
70 Layer::clear_regions()
71 {
72 for (size_t i = 0; i < this->regions.size(); ++ i)
73 delete this->regions[i];
74 this->regions.clear();
75 }
76
77 LayerRegion*
78 Layer::add_region(PrintRegion* print_region)
79 {
80 LayerRegion* region = new LayerRegion(this, print_region);
81 this->regions.push_back(region);
82 return region;
83 }
84
85 void
86 Layer::delete_region(int idx)
87 {
88 LayerRegionPtrs::iterator i = this->regions.begin() + idx;
89 LayerRegion* item = *i;
90 this->regions.erase(i);
91 delete item;
92 }
93
94 // merge all regions' slices to get islands
95 void
96 Layer::make_slices()
97 {
98 ExPolygons slices;
99 if (this->regions.size() == 1) {
100 // optimization: if we only have one region, take its slices
101 slices = this->regions.front()->slices;
102 } else {
103 Polygons slices_p;
104 FOREACH_LAYERREGION(this, layerm) {
105 Polygons region_slices_p = (*layerm)->slices;
106 slices_p.insert(slices_p.end(), region_slices_p.begin(), region_slices_p.end());
107 }
108 union_(slices_p, &slices);
109 }
110
111 this->slices.expolygons.clear();
112 this->slices.expolygons.reserve(slices.size());
113
114 // prepare ordering points
115 Points ordering_points;
116 ordering_points.reserve(slices.size());
117 for (ExPolygons::const_iterator ex = slices.begin(); ex != slices.end(); ++ex)
118 ordering_points.push_back(ex->contour.first_point());
119
120 // sort slices
121 std::vector<Points::size_type> order;
122 Slic3r::Geometry::chained_path(ordering_points, order);
123
124 // populate slices vector
125 for (std::vector<Points::size_type>::const_iterator it = order.begin(); it != order.end(); ++it) {
126 this->slices.expolygons.push_back(slices[*it]);
127 }
128 }
129
130 void
131 Layer::merge_slices()
132 {
133 FOREACH_LAYERREGION(this, layerm) {
134 (*layerm)->merge_slices();
135 }
136 }
137
138 template <class T>
139 bool
140 Layer::any_internal_region_slice_contains(const T &item) const
141 {
142 FOREACH_LAYERREGION(this, layerm) {
143 if ((*layerm)->slices.any_internal_contains(item)) return true;
144 }
145 return false;
146 }
147 template bool Layer::any_internal_region_slice_contains<Polyline>(const Polyline &item) const;
148
149 template <class T>
150 bool
151 Layer::any_bottom_region_slice_contains(const T &item) const
152 {
153 FOREACH_LAYERREGION(this, layerm) {
154 if ((*layerm)->slices.any_bottom_contains(item)) return true;
155 }
156 return false;
157 }
158 template bool Layer::any_bottom_region_slice_contains<Polyline>(const Polyline &item) const;
159
160
161 // Here the perimeters are created cummulatively for all layer regions sharing the same parameters influencing the perimeters.
162 // The perimeter paths and the thin fills (ExtrusionEntityCollection) are assigned to the first compatible layer region.
163 // The resulting fill surface is split back among the originating regions.
164 void
165 Layer::make_perimeters()
166 {
167 #ifdef SLIC3R_DEBUG
168 printf("Making perimeters for layer " PRINTF_ZU "\n", this->id());
169 #endif
170
171 // keep track of regions whose perimeters we have already generated
172 std::set<size_t> done;
173
174 FOREACH_LAYERREGION(this, layerm) {
175 size_t region_id = layerm - this->regions.begin();
176 if (done.find(region_id) != done.end()) continue;
177 done.insert(region_id);
178 const PrintRegionConfig &config = (*layerm)->region()->config;
179
180 // find compatible regions
181 LayerRegionPtrs layerms;
182 layerms.push_back(*layerm);
183 for (LayerRegionPtrs::const_iterator it = layerm + 1; it != this->regions.end(); ++it) {
184 LayerRegion* other_layerm = *it;
185 const PrintRegionConfig &other_config = other_layerm->region()->config;
186
187 if (config.perimeter_extruder == other_config.perimeter_extruder
188 && config.perimeters == other_config.perimeters
189 && config.perimeter_speed == other_config.perimeter_speed
190 && config.gap_fill_speed == other_config.gap_fill_speed
191 && config.overhangs == other_config.overhangs
192 && config.serialize("perimeter_extrusion_width").compare(other_config.serialize("perimeter_extrusion_width")) == 0
193 && config.thin_walls == other_config.thin_walls
194 && config.external_perimeters_first == other_config.external_perimeters_first) {
195 layerms.push_back(other_layerm);
196 done.insert(it - this->regions.begin());
197 }
198 }
199
200 if (layerms.size() == 1) { // optimization
201 (*layerm)->fill_surfaces.surfaces.clear();
202 (*layerm)->perimeter_surfaces.surfaces.clear();
203 (*layerm)->make_perimeters((*layerm)->slices, &(*layerm)->perimeter_surfaces, &(*layerm)->fill_surfaces);
204 this->perimeter_expolygons.expolygons.clear();
205 for (Surfaces::const_iterator it = (*layerm)->perimeter_surfaces.surfaces.begin(); it != (*layerm)->perimeter_surfaces.surfaces.end(); ++ it)
206 this->perimeter_expolygons.expolygons.push_back(it->expolygon);
207 } else {
208 // group slices (surfaces) according to number of extra perimeters
209 std::map<unsigned short,Surfaces> slices; // extra_perimeters => [ surface, surface... ]
210 for (LayerRegionPtrs::iterator l = layerms.begin(); l != layerms.end(); ++l) {
211 for (Surfaces::iterator s = (*l)->slices.surfaces.begin(); s != (*l)->slices.surfaces.end(); ++s) {
212 slices[s->extra_perimeters].push_back(*s);
213 }
214 }
215
216 // merge the surfaces assigned to each group
217 SurfaceCollection new_slices;
218 for (std::map<unsigned short,Surfaces>::const_iterator it = slices.begin(); it != slices.end(); ++it) {
219 ExPolygons expp = union_ex(it->second, true);
220 for (ExPolygons::iterator ex = expp.begin(); ex != expp.end(); ++ex) {
221 Surface s = it->second.front(); // clone type and extra_perimeters
222 s.expolygon = *ex;
223 new_slices.surfaces.push_back(s);
224 }
225 }
226
227 // make perimeters
228 SurfaceCollection perimeter_surfaces;
229 SurfaceCollection fill_surfaces;
230 (*layerm)->make_perimeters(new_slices, &perimeter_surfaces, &fill_surfaces);
231 // Copy the perimeter surfaces to the layer's surfaces before splitting them into the regions.
232 this->perimeter_expolygons.expolygons.clear();
233 for (Surfaces::const_iterator it = perimeter_surfaces.surfaces.begin(); it != perimeter_surfaces.surfaces.end(); ++ it)
234 this->perimeter_expolygons.expolygons.push_back(it->expolygon);
235
236 // assign fill_surfaces to each layer
237 if (!fill_surfaces.surfaces.empty()) {
238 for (LayerRegionPtrs::iterator l = layerms.begin(); l != layerms.end(); ++l) {
239 // Separate the fill surfaces.
240 ExPolygons expp = intersection_ex(
241 fill_surfaces,
242 (*l)->slices
243 );
244 (*l)->fill_surfaces.surfaces.clear();
245
246 for (ExPolygons::iterator ex = expp.begin(); ex != expp.end(); ++ex) {
247 Surface s = fill_surfaces.surfaces.front(); // clone type and extra_perimeters
248 s.expolygon = *ex;
249 (*l)->fill_surfaces.surfaces.push_back(s);
250 }
251
252 // Separate the perimeter surfaces.
253 expp = intersection_ex(
254 perimeter_surfaces,
255 (*l)->slices
256 );
257 (*l)->perimeter_surfaces.surfaces.clear();
258
259 for (ExPolygons::iterator ex = expp.begin(); ex != expp.end(); ++ex) {
260 Surface s = fill_surfaces.surfaces.front(); // clone type and extra_perimeters
261 s.expolygon = *ex;
262 (*l)->perimeter_surfaces.surfaces.push_back(s);
263 }
264 }
265 }
266 }
267 }
268 }
269
270 void Layer::make_fills()
271 {
272 #ifdef SLIC3R_DEBUG
273 printf("Making fills for layer " PRINTF_ZU "\n", this->id());
274 #endif
275 for (LayerRegionPtrs::iterator it_layerm = regions.begin(); it_layerm != regions.end(); ++ it_layerm) {
276 LayerRegion &layerm = *(*it_layerm);
277 layerm.fills.clear();
278 make_fill(layerm, layerm.fills);
279 #ifndef NDEBUG
280 for (size_t i = 0; i < layerm.fills.entities.size(); ++ i)
281 assert(dynamic_cast<ExtrusionEntityCollection*>(layerm.fills.entities[i]) != NULL);
282 #endif
283 }
284 }
285
286 void Layer::export_region_slices_to_svg(const char *path)
287 {
288 BoundingBox bbox;
289 for (LayerRegionPtrs::const_iterator region = this->regions.begin(); region != this->regions.end(); ++region)
290 for (Surfaces::const_iterator surface = (*region)->slices.surfaces.begin(); surface != (*region)->slices.surfaces.end(); ++surface)
291 bbox.merge(get_extents(surface->expolygon));
292 Point legend_size = export_surface_type_legend_to_svg_box_size();
293 Point legend_pos(bbox.min.x, bbox.max.y);
294 bbox.merge(Point(std::max(bbox.min.x + legend_size.x, bbox.max.x), bbox.max.y + legend_size.y));
295
296 SVG svg(path, bbox);
297 const float transparency = 0.5f;
298 for (LayerRegionPtrs::const_iterator region = this->regions.begin(); region != this->regions.end(); ++region)
299 for (Surfaces::const_iterator surface = (*region)->slices.surfaces.begin(); surface != (*region)->slices.surfaces.end(); ++surface)
300 svg.draw(surface->expolygon, surface_type_to_color_name(surface->surface_type), transparency);
301 export_surface_type_legend_to_svg(svg, legend_pos);
302 svg.Close();
303 }
304
305 // Export to "out/LayerRegion-name-%d.svg" with an increasing index with every export.
306 void Layer::export_region_slices_to_svg_debug(const char *name)
307 {
308 static size_t idx = 0;
309 this->export_region_slices_to_svg(debug_out_path("Layer-slices-%s-%d.svg", name, idx ++).c_str());
310 }
311
312 void Layer::export_region_fill_surfaces_to_svg(const char *path)
313 {
314 BoundingBox bbox;
315 for (LayerRegionPtrs::const_iterator region = this->regions.begin(); region != this->regions.end(); ++region)
316 for (Surfaces::const_iterator surface = (*region)->fill_surfaces.surfaces.begin(); surface != (*region)->fill_surfaces.surfaces.end(); ++surface)
317 bbox.merge(get_extents(surface->expolygon));
318 Point legend_size = export_surface_type_legend_to_svg_box_size();
319 Point legend_pos(bbox.min.x, bbox.max.y);
320 bbox.merge(Point(std::max(bbox.min.x + legend_size.x, bbox.max.x), bbox.max.y + legend_size.y));
321
322 SVG svg(path, bbox);
323 const float transparency = 0.5f;
324 for (LayerRegionPtrs::const_iterator region = this->regions.begin(); region != this->regions.end(); ++region)
325 for (Surfaces::const_iterator surface = (*region)->fill_surfaces.surfaces.begin(); surface != (*region)->fill_surfaces.surfaces.end(); ++surface)
326 svg.draw(surface->expolygon, surface_type_to_color_name(surface->surface_type), transparency);
327 export_surface_type_legend_to_svg(svg, legend_pos);
328 svg.Close();
329 }
330
331 // Export to "out/LayerRegion-name-%d.svg" with an increasing index with every export.
332 void Layer::export_region_fill_surfaces_to_svg_debug(const char *name)
333 {
334 static size_t idx = 0;
335 this->export_region_fill_surfaces_to_svg(debug_out_path("Layer-fill_surfaces-%s-%d.svg", name, idx ++).c_str());
336 }
337
338 SupportLayer::SupportLayer(size_t id, PrintObject *object, coordf_t height,
339 coordf_t print_z, coordf_t slice_z)
340 : Layer(id, object, height, print_z, slice_z)
341 {
342 }
343
344 SupportLayer::~SupportLayer()
345 {
346 }
347
348
349 }
0 #ifndef slic3r_Layer_hpp_
1 #define slic3r_Layer_hpp_
2
3 #include "libslic3r.h"
4 #include "Flow.hpp"
5 #include "SurfaceCollection.hpp"
6 #include "ExtrusionEntityCollection.hpp"
7 #include "ExPolygonCollection.hpp"
8 #include "PolylineCollection.hpp"
9
10
11 namespace Slic3r {
12
13 typedef std::pair<coordf_t,coordf_t> t_layer_height_range;
14 typedef std::map<t_layer_height_range,coordf_t> t_layer_height_ranges;
15
16 class Layer;
17 class PrintRegion;
18 class PrintObject;
19
20
21 // TODO: make stuff private
22 class LayerRegion
23 {
24 friend class Layer;
25
26 public:
27 Layer* layer();
28 PrintRegion* region() { return this->_region; }
29 const PrintRegion* region() const { return this->_region; }
30
31 // collection of surfaces generated by slicing the original geometry
32 // divided by type top/bottom/internal
33 SurfaceCollection slices;
34
35 // collection of extrusion paths/loops filling gaps
36 ExtrusionEntityCollection thin_fills;
37
38 // collection of surfaces for infill generation
39 SurfaceCollection fill_surfaces;
40
41 // Collection of perimeter surfaces. This is a cached result of diff(slices, fill_surfaces).
42 // While not necessary, the memory consumption is meager and it speeds up calculation.
43 // The perimeter_surfaces keep the IDs of the slices (top/bottom/)
44 SurfaceCollection perimeter_surfaces;
45
46 // collection of expolygons representing the bridged areas (thus not
47 // needing support material)
48 Polygons bridged;
49
50 // collection of polylines representing the unsupported bridge edges
51 PolylineCollection unsupported_bridge_edges;
52
53 // ordered collection of extrusion paths/loops to build all perimeters
54 // (this collection contains only ExtrusionEntityCollection objects)
55 ExtrusionEntityCollection perimeters;
56
57 // ordered collection of extrusion paths to fill surfaces
58 // (this collection contains only ExtrusionEntityCollection objects)
59 ExtrusionEntityCollection fills;
60
61 Flow flow(FlowRole role, bool bridge = false, double width = -1) const;
62 void merge_slices();
63 void slices_to_fill_surfaces_clipped();
64 void prepare_fill_surfaces();
65 void make_perimeters(const SurfaceCollection &slices, SurfaceCollection* perimeter_surfaces, SurfaceCollection* fill_surfaces);
66 void process_external_surfaces(const Layer* lower_layer);
67 double infill_area_threshold() const;
68
69 void export_region_slices_to_svg(const char *path);
70 void export_region_fill_surfaces_to_svg(const char *path);
71 // Export to "out/LayerRegion-name-%d.svg" with an increasing index with every export.
72 void export_region_slices_to_svg_debug(const char *name);
73 void export_region_fill_surfaces_to_svg_debug(const char *name);
74
75 private:
76 Layer *_layer;
77 PrintRegion *_region;
78
79 LayerRegion(Layer *layer, PrintRegion *region);
80 ~LayerRegion();
81 };
82
83
84 typedef std::vector<LayerRegion*> LayerRegionPtrs;
85
86 class Layer {
87 friend class PrintObject;
88
89 public:
90 size_t id() const;
91 void set_id(size_t id);
92 PrintObject* object();
93 const PrintObject* object() const;
94
95 Layer *upper_layer;
96 Layer *lower_layer;
97 LayerRegionPtrs regions;
98 bool slicing_errors;
99 coordf_t slice_z; // Z used for slicing in unscaled coordinates
100 coordf_t print_z; // Z used for printing in unscaled coordinates
101 coordf_t height; // layer height in unscaled coordinates
102
103 // collection of expolygons generated by slicing the original geometry;
104 // also known as 'islands' (all regions and surface types are merged here)
105 ExPolygonCollection slices;
106 // Surfaces of the perimeters including their gap fill.
107 ExPolygonCollection perimeter_expolygons;
108
109
110 size_t region_count() const;
111 const LayerRegion* get_region(int idx) const { return this->regions.at(idx); }
112 LayerRegion* get_region(int idx) { return this->regions.at(idx); }
113 LayerRegion* add_region(PrintRegion* print_region);
114
115 void make_slices();
116 void merge_slices();
117 template <class T> bool any_internal_region_slice_contains(const T &item) const;
118 template <class T> bool any_bottom_region_slice_contains(const T &item) const;
119 void make_perimeters();
120 void make_fills();
121
122 void export_region_slices_to_svg(const char *path);
123 void export_region_fill_surfaces_to_svg(const char *path);
124 // Export to "out/LayerRegion-name-%d.svg" with an increasing index with every export.
125 void export_region_slices_to_svg_debug(const char *name);
126 void export_region_fill_surfaces_to_svg_debug(const char *name);
127
128 protected:
129 size_t _id; // sequential number of layer, 0-based
130 PrintObject *_object;
131
132
133 Layer(size_t id, PrintObject *object, coordf_t height, coordf_t print_z,
134 coordf_t slice_z);
135 virtual ~Layer();
136
137 void clear_regions();
138 void delete_region(int idx);
139 };
140
141
142 class SupportLayer : public Layer {
143 friend class PrintObject;
144
145 public:
146 // Polygons covered by the supports: base, interface and contact areas.
147 ExPolygonCollection support_islands;
148 // Extrusion paths for the support base.
149 ExtrusionEntityCollection support_fills;
150 // Extrusion paths for the support interface and contacts.
151 ExtrusionEntityCollection support_interface_fills;
152
153 protected:
154 SupportLayer(size_t id, PrintObject *object, coordf_t height, coordf_t print_z,
155 coordf_t slice_z);
156 virtual ~SupportLayer();
157 };
158
159
160 }
161
162 #endif
0 #include "Layer.hpp"
1 #include "BridgeDetector.hpp"
2 #include "ClipperUtils.hpp"
3 #include "PerimeterGenerator.hpp"
4 #include "Print.hpp"
5 #include "Surface.hpp"
6 #include "BoundingBox.hpp"
7 #include "SVG.hpp"
8
9 #include <string>
10 #include <map>
11
12 namespace Slic3r {
13
14 LayerRegion::LayerRegion(Layer *layer, PrintRegion *region)
15 : _layer(layer),
16 _region(region)
17 {
18 }
19
20 LayerRegion::~LayerRegion()
21 {
22 }
23
24 Layer*
25 LayerRegion::layer()
26 {
27 return this->_layer;
28 }
29
30 Flow
31 LayerRegion::flow(FlowRole role, bool bridge, double width) const
32 {
33 return this->_region->flow(
34 role,
35 this->_layer->height,
36 bridge,
37 this->_layer->id() == 0,
38 width,
39 *this->_layer->object()
40 );
41 }
42
43 void
44 LayerRegion::merge_slices()
45 {
46 ExPolygons expp;
47 // without safety offset, artifacts are generated (GH #2494)
48 union_(to_polygons(STDMOVE(this->slices.surfaces)), &expp, true);
49 this->slices.surfaces.clear();
50 surfaces_append(this->slices.surfaces, expp, stInternal);
51 }
52
53 // Fill in layerm->fill_surfaces by trimming the layerm->slices by the cummulative layerm->fill_surfaces.
54 void LayerRegion::slices_to_fill_surfaces_clipped()
55 {
56 // Note: this method should be idempotent, but fill_surfaces gets modified
57 // in place. However we're now only using its boundaries (which are invariant)
58 // so we're safe. This guarantees idempotence of prepare_infill() also in case
59 // that combine_infill() turns some fill_surface into VOID surfaces.
60 Polygons fill_boundaries = to_polygons(STDMOVE(this->fill_surfaces));
61 this->fill_surfaces.surfaces.clear();
62 for (Surfaces::const_iterator surface = this->slices.surfaces.begin(); surface != this->slices.surfaces.end(); ++ surface)
63 surfaces_append(
64 this->fill_surfaces.surfaces,
65 intersection_ex(to_polygons(surface->expolygon), fill_boundaries),
66 surface->surface_type);
67 }
68
69 void
70 LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollection* perimeter_surfaces, SurfaceCollection* fill_surfaces)
71 {
72 this->perimeters.clear();
73 this->thin_fills.clear();
74
75 PerimeterGenerator g(
76 // input:
77 &slices,
78 this->layer()->height,
79 this->flow(frPerimeter),
80 &this->region()->config,
81 &this->layer()->object()->config,
82 &this->layer()->object()->print()->config,
83
84 // output:
85 &this->perimeters,
86 &this->thin_fills,
87 perimeter_surfaces,
88 fill_surfaces
89 );
90
91 if (this->layer()->lower_layer != NULL)
92 // Cummulative sum of polygons over all the regions.
93 g.lower_slices = &this->layer()->lower_layer->slices;
94
95 g.layer_id = this->layer()->id();
96 g.ext_perimeter_flow = this->flow(frExternalPerimeter);
97 g.overhang_flow = this->region()->flow(frPerimeter, -1, true, false, -1, *this->layer()->object());
98 g.solid_infill_flow = this->flow(frSolidInfill);
99
100 g.process();
101 }
102
103 //#define EXTERNAL_SURFACES_OFFSET_PARAMETERS CLIPPER_OFFSET_SCALE, ClipperLib::jtMiter, 3.
104 //#define EXTERNAL_SURFACES_OFFSET_PARAMETERS CLIPPER_OFFSET_SCALE, ClipperLib::jtMiter, 1.5
105 #define EXTERNAL_SURFACES_OFFSET_PARAMETERS CLIPPER_OFFSET_SCALE, ClipperLib::jtSquare, 0.
106
107 void
108 LayerRegion::process_external_surfaces(const Layer* lower_layer)
109 {
110 const Surfaces &surfaces = this->fill_surfaces.surfaces;
111 const double margin = scale_(EXTERNAL_INFILL_MARGIN);
112
113 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
114 export_region_fill_surfaces_to_svg_debug("3_process_external_surfaces-initial");
115 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
116
117 // 1) Collect bottom and bridge surfaces, each of them grown by a fixed 3mm offset
118 // for better anchoring.
119 // Bottom surfaces, grown.
120 Surfaces bottom;
121 // Bridge surfaces, initialy not grown.
122 Surfaces bridges;
123 // Top surfaces, grown.
124 Surfaces top;
125 // Internal surfaces, not grown.
126 Surfaces internal;
127 // Areas, where an infill of various types (top, bottom, bottom bride, sparse, void) could be placed.
128 Polygons fill_boundaries;
129
130 // Collect top surfaces and internal surfaces.
131 // Collect fill_boundaries: If we're slicing with no infill, we can't extend external surfaces over non-existent infill.
132 // This loop destroys the surfaces (aliasing this->fill_surfaces.surfaces) by moving into top/internal/fill_boundaries!
133 {
134 // bottom_polygons are used to trim inflated top surfaces.
135 fill_boundaries.reserve(number_polygons(surfaces));
136 bool has_infill = this->region()->config.fill_density.value > 0.;
137 for (Surfaces::iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface) {
138 if (surface->surface_type == stTop) {
139 // Collect the top surfaces, inflate them and trim them by the bottom surfaces.
140 // This gives the priority to bottom surfaces.
141 surfaces_append(top, offset_ex(surface->expolygon, float(margin), EXTERNAL_SURFACES_OFFSET_PARAMETERS), *surface);
142 } else if (surface->surface_type == stBottom || (surface->surface_type == stBottomBridge && lower_layer == NULL)) {
143 // Grown by 3mm.
144 surfaces_append(bottom, offset_ex(surface->expolygon, float(margin), EXTERNAL_SURFACES_OFFSET_PARAMETERS), *surface);
145 } else if (surface->surface_type == stBottomBridge) {
146 if (! surface->empty())
147 bridges.push_back(*surface);
148 }
149 bool internal_surface = surface->surface_type != stTop && ! surface->is_bottom();
150 if (has_infill || surface->surface_type != stInternal) {
151 if (internal_surface)
152 // Make a copy as the following line uses the move semantics.
153 internal.push_back(*surface);
154 polygons_append(fill_boundaries, STDMOVE(surface->expolygon));
155 } else if (internal_surface)
156 internal.push_back(STDMOVE(*surface));
157 }
158 }
159
160 #if 0
161 {
162 static int iRun = 0;
163 bridges.export_to_svg(debug_out_path("bridges-before-grouping-%d.svg", iRun ++), true);
164 }
165 #endif
166
167 if (bridges.empty())
168 {
169 fill_boundaries = union_(fill_boundaries, true);
170 } else
171 {
172 // 1) Calculate the inflated bridge regions, each constrained to its island.
173 ExPolygons fill_boundaries_ex = union_ex(fill_boundaries, true);
174 std::vector<Polygons> bridges_grown;
175 std::vector<BoundingBox> bridge_bboxes;
176
177 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
178 {
179 static int iRun = 0;
180 SVG svg(debug_out_path("3_process_external_surfaces-fill_regions-%d.svg", iRun ++).c_str(), get_extents(fill_boundaries_ex));
181 svg.draw(fill_boundaries_ex);
182 svg.draw_outline(fill_boundaries_ex, "black", "blue", scale_(0.05));
183 svg.Close();
184 }
185
186 // export_region_fill_surfaces_to_svg_debug("3_process_external_surfaces-initial");
187 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
188
189 {
190 // Bridge expolygons, grown, to be tested for intersection with other bridge regions.
191 std::vector<BoundingBox> fill_boundaries_ex_bboxes = get_extents_vector(fill_boundaries_ex);
192 bridges_grown.reserve(bridges.size());
193 bridge_bboxes.reserve(bridges.size());
194 for (size_t i = 0; i < bridges.size(); ++ i) {
195 // Find the island of this bridge.
196 const Point pt = bridges[i].expolygon.contour.points.front();
197 int idx_island = -1;
198 for (int j = 0; j < int(fill_boundaries_ex.size()); ++ j)
199 if (fill_boundaries_ex_bboxes[j].contains(pt) &&
200 fill_boundaries_ex[j].contains(pt)) {
201 idx_island = j;
202 break;
203 }
204 // Grown by 3mm.
205 Polygons polys = offset(bridges[i].expolygon, float(margin), EXTERNAL_SURFACES_OFFSET_PARAMETERS);
206 if (idx_island == -1) {
207 printf("Bridge did not fall into the source region!\r\n");
208 } else {
209 // Found an island, to which this bridge region belongs. Trim it,
210 polys = intersection(polys, to_polygons(fill_boundaries_ex[idx_island]));
211 }
212 bridge_bboxes.push_back(get_extents(polys));
213 bridges_grown.push_back(STDMOVE(polys));
214 }
215 }
216
217 // 2) Group the bridge surfaces by overlaps.
218 std::vector<size_t> bridge_group(bridges.size(), (size_t)-1);
219 size_t n_groups = 0;
220 for (size_t i = 0; i < bridges.size(); ++ i) {
221 // A grup id for this bridge.
222 size_t group_id = (bridge_group[i] == -1) ? (n_groups ++) : bridge_group[i];
223 bridge_group[i] = group_id;
224 // For all possibly overlaping bridges:
225 for (size_t j = i + 1; j < bridges.size(); ++ j) {
226 if (! bridge_bboxes[i].overlap(bridge_bboxes[j]))
227 continue;
228 if (intersection(bridges_grown[i], bridges_grown[j], false).empty())
229 continue;
230 // The two bridge regions intersect. Give them the same group id.
231 if (bridge_group[j] != -1) {
232 // The j'th bridge has been merged with some other bridge before.
233 size_t group_id_new = bridge_group[j];
234 for (size_t k = 0; k < j; ++ k)
235 if (bridge_group[k] == group_id)
236 bridge_group[k] = group_id_new;
237 group_id = group_id_new;
238 }
239 bridge_group[j] = group_id;
240 }
241 }
242
243 // 3) Merge the groups with the same group id, detect bridges.
244 {
245 for (size_t group_id = 0; group_id < n_groups; ++ group_id) {
246 size_t n_bridges_merged = 0;
247 size_t idx_last = (size_t)-1;
248 for (size_t i = 0; i < bridges.size(); ++ i) {
249 if (bridge_group[i] == group_id) {
250 ++ n_bridges_merged;
251 idx_last = i;
252 }
253 }
254 if (n_bridges_merged == 0)
255 // This group has no regions assigned as these were moved into another group.
256 continue;
257 // Collect the initial ungrown regions and the grown polygons.
258 ExPolygons initial;
259 Polygons grown;
260 for (size_t i = 0; i < bridges.size(); ++ i) {
261 if (bridge_group[i] != group_id)
262 continue;
263 initial.push_back(STDMOVE(bridges[i].expolygon));
264 polygons_append(grown, bridges_grown[i]);
265 }
266 // detect bridge direction before merging grown surfaces otherwise adjacent bridges
267 // would get merged into a single one while they need different directions
268 // also, supply the original expolygon instead of the grown one, because in case
269 // of very thin (but still working) anchors, the grown expolygon would go beyond them
270 BridgeDetector bd(
271 initial,
272 lower_layer->slices,
273 //FIXME parameters are not correct!
274 // flow(FlowRole role, bool bridge = false, double width = -1) const;
275 this->flow(frInfill, true, this->layer()->height).scaled_width()
276 );
277 #ifdef SLIC3R_DEBUG
278 printf("Processing bridge at layer " PRINTF_ZU ":\n", this->layer()->id());
279 #endif
280 if (bd.detect_angle()) {
281 bridges[idx_last].bridge_angle = bd.angle;
282 if (this->layer()->object()->config.support_material) {
283 polygons_append(this->bridged, bd.coverage());
284 this->unsupported_bridge_edges.append(bd.unsupported_edges());
285 }
286 }
287 // without safety offset, artifacts are generated (GH #2494)
288 surfaces_append(bottom, union_ex(grown, true), bridges[idx_last]);
289 }
290
291 fill_boundaries = STDMOVE(to_polygons(fill_boundaries_ex));
292 }
293
294 #if 0
295 {
296 static int iRun = 0;
297 bridges.export_to_svg(debug_out_path("bridges-after-grouping-%d.svg", iRun ++), true);
298 }
299 #endif
300 }
301
302 Surfaces new_surfaces;
303 {
304 // Merge top and bottom in a single collection.
305 surfaces_append(top, STDMOVE(bottom));
306 // Intersect the grown surfaces with the actual fill boundaries.
307 Polygons bottom_polygons = to_polygons(bottom);
308 for (size_t i = 0; i < top.size(); ++ i) {
309 Surface &s1 = top[i];
310 if (s1.empty())
311 continue;
312 Polygons polys;
313 polygons_append(polys, STDMOVE(s1));
314 for (size_t j = i + 1; j < top.size(); ++ j) {
315 Surface &s2 = top[j];
316 if (! s2.empty() && surfaces_could_merge(s1, s2))
317 polygons_append(polys, STDMOVE(s2));
318 }
319 if (s1.surface_type == stTop)
320 // Trim the top surfaces by the bottom surfaces. This gives the priority to the bottom surfaces.
321 polys = diff(polys, bottom_polygons);
322 surfaces_append(
323 new_surfaces,
324 // Don't use a safety offset as fill_boundaries were already united using the safety offset.
325 STDMOVE(intersection_ex(polys, fill_boundaries, false)),
326 s1);
327 }
328 }
329
330 // Subtract the new top surfaces from the other non-top surfaces and re-add them.
331 Polygons new_polygons = to_polygons(new_surfaces);
332 for (size_t i = 0; i < internal.size(); ++ i) {
333 Surface &s1 = internal[i];
334 if (s1.empty())
335 continue;
336 Polygons polys;
337 polygons_append(polys, STDMOVE(s1));
338 for (size_t j = i + 1; j < internal.size(); ++ j) {
339 Surface &s2 = internal[j];
340 if (! s2.empty() && surfaces_could_merge(s1, s2))
341 polygons_append(polys, STDMOVE(s2));
342 }
343 ExPolygons new_expolys = diff_ex(polys, new_polygons);
344 polygons_append(new_polygons, to_polygons(new_expolys));
345 surfaces_append(new_surfaces, STDMOVE(new_expolys), s1);
346 }
347
348 this->fill_surfaces.surfaces = STDMOVE(new_surfaces);
349
350 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
351 export_region_fill_surfaces_to_svg_debug("3_process_external_surfaces-final");
352 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
353 }
354
355 void
356 LayerRegion::prepare_fill_surfaces()
357 {
358 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
359 export_region_slices_to_svg_debug("2_prepare_fill_surfaces-initial");
360 export_region_fill_surfaces_to_svg_debug("2_prepare_fill_surfaces-initial");
361 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
362
363 /* Note: in order to make the psPrepareInfill step idempotent, we should never
364 alter fill_surfaces boundaries on which our idempotency relies since that's
365 the only meaningful information returned by psPerimeters. */
366
367 // if no solid layers are requested, turn top/bottom surfaces to internal
368 if (this->region()->config.top_solid_layers == 0) {
369 for (Surfaces::iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface) {
370 if (surface->surface_type == stTop) {
371 if (this->layer()->object()->config.infill_only_where_needed) {
372 surface->surface_type = stInternalVoid;
373 } else {
374 surface->surface_type = stInternal;
375 }
376 }
377 }
378 }
379 if (this->region()->config.bottom_solid_layers == 0) {
380 for (Surfaces::iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface) {
381 if (surface->surface_type == stBottom || surface->surface_type == stBottomBridge)
382 surface->surface_type = stInternal;
383 }
384 }
385
386 // turn too small internal regions into solid regions according to the user setting
387 if (this->region()->config.fill_density.value > 0) {
388 // scaling an area requires two calls!
389 double min_area = scale_(scale_(this->region()->config.solid_infill_below_area.value));
390 for (Surfaces::iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface) {
391 if (surface->surface_type == stInternal && surface->area() <= min_area)
392 surface->surface_type = stInternalSolid;
393 }
394 }
395
396 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
397 export_region_slices_to_svg_debug("2_prepare_fill_surfaces-final");
398 export_region_fill_surfaces_to_svg_debug("2_prepare_fill_surfaces-final");
399 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
400 }
401
402 double
403 LayerRegion::infill_area_threshold() const
404 {
405 double ss = this->flow(frSolidInfill).scaled_spacing();
406 return ss*ss;
407 }
408
409
410 void LayerRegion::export_region_slices_to_svg(const char *path)
411 {
412 BoundingBox bbox;
413 for (Surfaces::const_iterator surface = this->slices.surfaces.begin(); surface != this->slices.surfaces.end(); ++surface)
414 bbox.merge(get_extents(surface->expolygon));
415 Point legend_size = export_surface_type_legend_to_svg_box_size();
416 Point legend_pos(bbox.min.x, bbox.max.y);
417 bbox.merge(Point(std::max(bbox.min.x + legend_size.x, bbox.max.x), bbox.max.y + legend_size.y));
418
419 SVG svg(path, bbox);
420 const float transparency = 0.5f;
421 for (Surfaces::const_iterator surface = this->slices.surfaces.begin(); surface != this->slices.surfaces.end(); ++surface)
422 svg.draw(surface->expolygon, surface_type_to_color_name(surface->surface_type), transparency);
423 for (Surfaces::const_iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface)
424 svg.draw(surface->expolygon.lines(), surface_type_to_color_name(surface->surface_type));
425 export_surface_type_legend_to_svg(svg, legend_pos);
426 svg.Close();
427 }
428
429 // Export to "out/LayerRegion-name-%d.svg" with an increasing index with every export.
430 void LayerRegion::export_region_slices_to_svg_debug(const char *name)
431 {
432 static std::map<std::string, size_t> idx_map;
433 size_t &idx = idx_map[name];
434 this->export_region_slices_to_svg(debug_out_path("LayerRegion-slices-%s-%d.svg", name, idx ++).c_str());
435 }
436
437 void LayerRegion::export_region_fill_surfaces_to_svg(const char *path)
438 {
439 BoundingBox bbox;
440 for (Surfaces::const_iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface)
441 bbox.merge(get_extents(surface->expolygon));
442 Point legend_size = export_surface_type_legend_to_svg_box_size();
443 Point legend_pos(bbox.min.x, bbox.max.y);
444 bbox.merge(Point(std::max(bbox.min.x + legend_size.x, bbox.max.x), bbox.max.y + legend_size.y));
445
446 SVG svg(path, bbox);
447 const float transparency = 0.5f;
448 for (Surfaces::const_iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface) {
449 svg.draw(surface->expolygon, surface_type_to_color_name(surface->surface_type), transparency);
450 svg.draw_outline(surface->expolygon, "black", "blue", scale_(0.05));
451 }
452 export_surface_type_legend_to_svg(svg, legend_pos);
453 svg.Close();
454 }
455
456 // Export to "out/LayerRegion-name-%d.svg" with an increasing index with every export.
457 void LayerRegion::export_region_fill_surfaces_to_svg_debug(const char *name)
458 {
459 static std::map<std::string, size_t> idx_map;
460 size_t &idx = idx_map[name];
461 this->export_region_fill_surfaces_to_svg(debug_out_path("LayerRegion-fill_surfaces-%s-%d.svg", name, idx ++).c_str());
462 }
463
464 }
465
0 #include "Geometry.hpp"
1 #include "Line.hpp"
2 #include "Polyline.hpp"
3 #include <algorithm>
4 #include <cmath>
5 #include <sstream>
6
7 namespace Slic3r {
8
9 std::string
10 Line::wkt() const
11 {
12 std::ostringstream ss;
13 ss << "LINESTRING(" << this->a.x << " " << this->a.y << ","
14 << this->b.x << " " << this->b.y << ")";
15 return ss.str();
16 }
17
18 Line::operator Lines() const
19 {
20 Lines lines;
21 lines.push_back(*this);
22 return lines;
23 }
24
25 Line::operator Polyline() const
26 {
27 Polyline pl;
28 pl.points.push_back(this->a);
29 pl.points.push_back(this->b);
30 return pl;
31 }
32
33 void
34 Line::scale(double factor)
35 {
36 this->a.scale(factor);
37 this->b.scale(factor);
38 }
39
40 void
41 Line::translate(double x, double y)
42 {
43 this->a.translate(x, y);
44 this->b.translate(x, y);
45 }
46
47 void
48 Line::rotate(double angle, const Point &center)
49 {
50 this->a.rotate(angle, center);
51 this->b.rotate(angle, center);
52 }
53
54 void
55 Line::reverse()
56 {
57 std::swap(this->a, this->b);
58 }
59
60 double
61 Line::length() const
62 {
63 return this->a.distance_to(this->b);
64 }
65
66 Point
67 Line::midpoint() const
68 {
69 return Point((this->a.x + this->b.x) / 2.0, (this->a.y + this->b.y) / 2.0);
70 }
71
72 void
73 Line::point_at(double distance, Point* point) const
74 {
75 double len = this->length();
76 *point = this->a;
77 if (this->a.x != this->b.x)
78 point->x = this->a.x + (this->b.x - this->a.x) * distance / len;
79 if (this->a.y != this->b.y)
80 point->y = this->a.y + (this->b.y - this->a.y) * distance / len;
81 }
82
83 Point
84 Line::point_at(double distance) const
85 {
86 Point p;
87 this->point_at(distance, &p);
88 return p;
89 }
90
91 bool
92 Line::intersection_infinite(const Line &other, Point* point) const
93 {
94 Vector x = this->a.vector_to(other.a);
95 Vector d1 = this->vector();
96 Vector d2 = other.vector();
97
98 double cross = d1.x * d2.y - d1.y * d2.x;
99 if (std::fabs(cross) < EPSILON)
100 return false;
101
102 double t1 = (x.x * d2.y - x.y * d2.x)/cross;
103 point->x = this->a.x + d1.x * t1;
104 point->y = this->a.y + d1.y * t1;
105 return true;
106 }
107
108 bool
109 Line::coincides_with(const Line &line) const
110 {
111 return this->a.coincides_with(line.a) && this->b.coincides_with(line.b);
112 }
113
114 double
115 Line::distance_to(const Point &point) const
116 {
117 return point.distance_to(*this);
118 }
119
120 double
121 Line::atan2_() const
122 {
123 return atan2(this->b.y - this->a.y, this->b.x - this->a.x);
124 }
125
126 double
127 Line::orientation() const
128 {
129 double angle = this->atan2_();
130 if (angle < 0) angle = 2*PI + angle;
131 return angle;
132 }
133
134 double
135 Line::direction() const
136 {
137 double atan2 = this->atan2_();
138 return (fabs(atan2 - PI) < EPSILON) ? 0
139 : (atan2 < 0) ? (atan2 + PI)
140 : atan2;
141 }
142
143 bool
144 Line::parallel_to(double angle) const {
145 return Slic3r::Geometry::directions_parallel(this->direction(), angle);
146 }
147
148 bool
149 Line::parallel_to(const Line &line) const {
150 return this->parallel_to(line.direction());
151 }
152
153 Vector
154 Line::vector() const
155 {
156 return Vector(this->b.x - this->a.x, this->b.y - this->a.y);
157 }
158
159 Vector
160 Line::normal() const
161 {
162 return Vector((this->b.y - this->a.y), -(this->b.x - this->a.x));
163 }
164
165 void
166 Line::extend_end(double distance)
167 {
168 // relocate last point by extending the segment by the specified length
169 Line line = *this;
170 line.reverse();
171 this->b = line.point_at(-distance);
172 }
173
174 void
175 Line::extend_start(double distance)
176 {
177 // relocate first point by extending the first segment by the specified length
178 this->a = this->point_at(-distance);
179 }
180
181 bool
182 Line::intersection(const Line& line, Point* intersection) const
183 {
184 double denom = ((double)(line.b.y - line.a.y)*(this->b.x - this->a.x)) -
185 ((double)(line.b.x - line.a.x)*(this->b.y - this->a.y));
186
187 double nume_a = ((double)(line.b.x - line.a.x)*(this->a.y - line.a.y)) -
188 ((double)(line.b.y - line.a.y)*(this->a.x - line.a.x));
189
190 double nume_b = ((double)(this->b.x - this->a.x)*(this->a.y - line.a.y)) -
191 ((double)(this->b.y - this->a.y)*(this->a.x - line.a.x));
192
193 if (fabs(denom) < EPSILON) {
194 if (fabs(nume_a) < EPSILON && fabs(nume_b) < EPSILON) {
195 return false; // coincident
196 }
197 return false; // parallel
198 }
199
200 double ua = nume_a / denom;
201 double ub = nume_b / denom;
202
203 if (ua >= 0 && ua <= 1.0f && ub >= 0 && ub <= 1.0f)
204 {
205 // Get the intersection point.
206 intersection->x = this->a.x + ua*(this->b.x - this->a.x);
207 intersection->y = this->a.y + ua*(this->b.y - this->a.y);
208 return true;
209 }
210
211 return false; // not intersecting
212 }
213
214 double
215 Line::ccw(const Point& point) const
216 {
217 return point.ccw(*this);
218 }
219
220 Pointf3
221 Linef3::intersect_plane(double z) const
222 {
223 return Pointf3(
224 this->a.x + (this->b.x - this->a.x) * (z - this->a.z) / (this->b.z - this->a.z),
225 this->a.y + (this->b.y - this->a.y) * (z - this->a.z) / (this->b.z - this->a.z),
226 z
227 );
228 }
229
230 void
231 Linef3::scale(double factor)
232 {
233 this->a.scale(factor);
234 this->b.scale(factor);
235 }
236
237 }
0 #ifndef slic3r_Line_hpp_
1 #define slic3r_Line_hpp_
2
3 #include "libslic3r.h"
4 #include "Point.hpp"
5
6 namespace Slic3r {
7
8 class Line;
9 class Linef3;
10 class Polyline;
11 class ThickLine;
12 typedef std::vector<Line> Lines;
13 typedef std::vector<ThickLine> ThickLines;
14
15 class Line
16 {
17 public:
18 Point a;
19 Point b;
20 Line() {};
21 explicit Line(Point _a, Point _b): a(_a), b(_b) {};
22 std::string wkt() const;
23 operator Lines() const;
24 operator Polyline() const;
25 void scale(double factor);
26 void translate(double x, double y);
27 void rotate(double angle, const Point &center);
28 void reverse();
29 double length() const;
30 Point midpoint() const;
31 void point_at(double distance, Point* point) const;
32 Point point_at(double distance) const;
33 bool intersection_infinite(const Line &other, Point* point) const;
34 bool coincides_with(const Line &line) const;
35 double distance_to(const Point &point) const;
36 bool parallel_to(double angle) const;
37 bool parallel_to(const Line &line) const;
38 double atan2_() const;
39 double orientation() const;
40 double direction() const;
41 Vector vector() const;
42 Vector normal() const;
43 void extend_end(double distance);
44 void extend_start(double distance);
45 bool intersection(const Line& line, Point* intersection) const;
46 double ccw(const Point& point) const;
47 };
48
49 class ThickLine : public Line
50 {
51 public:
52 coordf_t a_width, b_width;
53
54 ThickLine() : a_width(0), b_width(0) {};
55 ThickLine(Point _a, Point _b) : a_width(0), b_width(0), Line(_a, _b) {};
56 };
57
58 class Linef
59 {
60 public:
61 Pointf a;
62 Pointf b;
63 Linef() {};
64 explicit Linef(Pointf _a, Pointf _b): a(_a), b(_b) {};
65 };
66
67 class Linef3
68 {
69 public:
70 Pointf3 a;
71 Pointf3 b;
72 Linef3() {};
73 explicit Linef3(Pointf3 _a, Pointf3 _b): a(_a), b(_b) {};
74 Pointf3 intersect_plane(double z) const;
75 void scale(double factor);
76 };
77
78 }
79
80 // start Boost
81 #include <boost/polygon/polygon.hpp>
82 namespace boost { namespace polygon {
83 template <>
84 struct geometry_concept<Line> { typedef segment_concept type; };
85
86 template <>
87 struct segment_traits<Line> {
88 typedef coord_t coordinate_type;
89 typedef Point point_type;
90
91 static inline point_type get(const Line& line, direction_1d dir) {
92 return dir.to_int() ? line.b : line.a;
93 }
94 };
95 } }
96 // end Boost
97
98 #endif
0 #include "Model.hpp"
1 #include "Geometry.hpp"
2
3 namespace Slic3r {
4
5 Model::Model() {}
6
7 Model::Model(const Model &other)
8 {
9 // copy materials
10 for (ModelMaterialMap::const_iterator i = other.materials.begin(); i != other.materials.end(); ++i)
11 this->add_material(i->first, *i->second);
12
13 // copy objects
14 this->objects.reserve(other.objects.size());
15 for (ModelObjectPtrs::const_iterator i = other.objects.begin(); i != other.objects.end(); ++i)
16 this->add_object(**i, true);
17 }
18
19 Model& Model::operator= (Model other)
20 {
21 this->swap(other);
22 return *this;
23 }
24
25 void
26 Model::swap(Model &other)
27 {
28 std::swap(this->materials, other.materials);
29 std::swap(this->objects, other.objects);
30 }
31
32 Model::~Model()
33 {
34 this->clear_objects();
35 this->clear_materials();
36 }
37
38 ModelObject*
39 Model::add_object()
40 {
41 ModelObject* new_object = new ModelObject(this);
42 this->objects.push_back(new_object);
43 return new_object;
44 }
45
46 ModelObject*
47 Model::add_object(const ModelObject &other, bool copy_volumes)
48 {
49 ModelObject* new_object = new ModelObject(this, other, copy_volumes);
50 this->objects.push_back(new_object);
51 return new_object;
52 }
53
54 void
55 Model::delete_object(size_t idx)
56 {
57 ModelObjectPtrs::iterator i = this->objects.begin() + idx;
58 delete *i;
59 this->objects.erase(i);
60 }
61
62 void
63 Model::clear_objects()
64 {
65 // int instead of size_t because it can be -1 when vector is empty
66 for (int i = this->objects.size()-1; i >= 0; --i)
67 this->delete_object(i);
68 }
69
70 void
71 Model::delete_material(t_model_material_id material_id)
72 {
73 ModelMaterialMap::iterator i = this->materials.find(material_id);
74 if (i != this->materials.end()) {
75 delete i->second;
76 this->materials.erase(i);
77 }
78 }
79
80 void
81 Model::clear_materials()
82 {
83 while (!this->materials.empty())
84 this->delete_material( this->materials.begin()->first );
85 }
86
87 ModelMaterial*
88 Model::add_material(t_model_material_id material_id)
89 {
90 ModelMaterial* material = this->get_material(material_id);
91 if (material == NULL) {
92 material = this->materials[material_id] = new ModelMaterial(this);
93 }
94 return material;
95 }
96
97 ModelMaterial*
98 Model::add_material(t_model_material_id material_id, const ModelMaterial &other)
99 {
100 // delete existing material if any
101 ModelMaterial* material = this->get_material(material_id);
102 if (material != NULL) {
103 delete material;
104 }
105
106 // set new material
107 material = new ModelMaterial(this, other);
108 this->materials[material_id] = material;
109 return material;
110 }
111
112 ModelMaterial*
113 Model::get_material(t_model_material_id material_id)
114 {
115 ModelMaterialMap::iterator i = this->materials.find(material_id);
116 if (i == this->materials.end()) {
117 return NULL;
118 } else {
119 return i->second;
120 }
121 }
122
123 bool
124 Model::has_objects_with_no_instances() const
125 {
126 for (ModelObjectPtrs::const_iterator i = this->objects.begin();
127 i != this->objects.end(); ++i)
128 {
129 if ((*i)->instances.empty()) {
130 return true;
131 }
132 }
133
134 return false;
135 }
136
137 // makes sure all objects have at least one instance
138 bool
139 Model::add_default_instances()
140 {
141 // apply a default position to all objects not having one
142 for (ModelObjectPtrs::const_iterator o = this->objects.begin(); o != this->objects.end(); ++o) {
143 if ((*o)->instances.empty()) {
144 (*o)->add_instance();
145 }
146 }
147 return true;
148 }
149
150 // this returns the bounding box of the *transformed* instances
151 BoundingBoxf3
152 Model::bounding_box() const
153 {
154 BoundingBoxf3 bb;
155 for (ModelObjectPtrs::const_iterator o = this->objects.begin(); o != this->objects.end(); ++o) {
156 bb.merge((*o)->bounding_box());
157 }
158 return bb;
159 }
160
161 void
162 Model::center_instances_around_point(const Pointf &point)
163 {
164 BoundingBoxf3 bb = this->bounding_box();
165
166 Sizef3 size = bb.size();
167 coordf_t shift_x = -bb.min.x + point.x - size.x/2;
168 coordf_t shift_y = -bb.min.y + point.y - size.y/2;
169 for (ModelObjectPtrs::const_iterator o = this->objects.begin(); o != this->objects.end(); ++o) {
170 for (ModelInstancePtrs::const_iterator i = (*o)->instances.begin(); i != (*o)->instances.end(); ++i) {
171 (*i)->offset.translate(shift_x, shift_y);
172 }
173 (*o)->invalidate_bounding_box();
174 }
175 }
176
177 void
178 Model::align_instances_to_origin()
179 {
180 BoundingBoxf3 bb = this->bounding_box();
181
182 Pointf new_center = (Pointf)bb.size();
183 new_center.translate(-new_center.x/2, -new_center.y/2);
184 this->center_instances_around_point(new_center);
185 }
186
187 void
188 Model::translate(coordf_t x, coordf_t y, coordf_t z)
189 {
190 for (ModelObjectPtrs::const_iterator o = this->objects.begin(); o != this->objects.end(); ++o) {
191 (*o)->translate(x, y, z);
192 }
193 }
194
195 // flattens everything to a single mesh
196 TriangleMesh
197 Model::mesh() const
198 {
199 TriangleMesh mesh;
200 for (ModelObjectPtrs::const_iterator o = this->objects.begin(); o != this->objects.end(); ++o) {
201 mesh.merge((*o)->mesh());
202 }
203 return mesh;
204 }
205
206 // flattens everything to a single mesh
207 TriangleMesh
208 Model::raw_mesh() const
209 {
210 TriangleMesh mesh;
211 for (ModelObjectPtrs::const_iterator o = this->objects.begin(); o != this->objects.end(); ++o) {
212 mesh.merge((*o)->raw_mesh());
213 }
214 return mesh;
215 }
216
217 bool
218 Model::_arrange(const Pointfs &sizes, coordf_t dist, const BoundingBoxf* bb, Pointfs &out) const
219 {
220 // we supply unscaled data to arrange()
221 return Slic3r::Geometry::arrange(
222 sizes.size(), // number of parts
223 BoundingBoxf(sizes).max, // width and height of a single cell
224 dist, // distance between cells
225 bb, // bounding box of the area to fill
226 out // output positions
227 );
228 }
229
230 /* arrange objects preserving their instance count
231 but altering their instance positions */
232 bool
233 Model::arrange_objects(coordf_t dist, const BoundingBoxf* bb)
234 {
235 // get the (transformed) size of each instance so that we take
236 // into account their different transformations when packing
237 Pointfs instance_sizes;
238 for (ModelObjectPtrs::const_iterator o = this->objects.begin(); o != this->objects.end(); ++o) {
239 for (size_t i = 0; i < (*o)->instances.size(); ++i) {
240 instance_sizes.push_back((*o)->instance_bounding_box(i).size());
241 }
242 }
243
244 Pointfs positions;
245 if (! this->_arrange(instance_sizes, dist, bb, positions))
246 return false;
247
248 for (ModelObjectPtrs::const_iterator o = this->objects.begin(); o != this->objects.end(); ++o) {
249 for (ModelInstancePtrs::const_iterator i = (*o)->instances.begin(); i != (*o)->instances.end(); ++i) {
250 (*i)->offset = positions.back();
251 positions.pop_back();
252 }
253 (*o)->invalidate_bounding_box();
254 }
255 return true;
256 }
257
258 /* duplicate the entire model preserving instance relative positions */
259 void
260 Model::duplicate(size_t copies_num, coordf_t dist, const BoundingBoxf* bb)
261 {
262 Pointfs model_sizes(copies_num-1, this->bounding_box().size());
263 Pointfs positions;
264 if (! this->_arrange(model_sizes, dist, bb, positions))
265 CONFESS("Cannot duplicate part as the resulting objects would not fit on the print bed.\n");
266
267 // note that this will leave the object count unaltered
268
269 for (ModelObjectPtrs::const_iterator o = this->objects.begin(); o != this->objects.end(); ++o) {
270 // make a copy of the pointers in order to avoid recursion when appending their copies
271 ModelInstancePtrs instances = (*o)->instances;
272 for (ModelInstancePtrs::const_iterator i = instances.begin(); i != instances.end(); ++i) {
273 for (Pointfs::const_iterator pos = positions.begin(); pos != positions.end(); ++pos) {
274 ModelInstance* instance = (*o)->add_instance(**i);
275 instance->offset.translate(*pos);
276 }
277 }
278 (*o)->invalidate_bounding_box();
279 }
280 }
281
282 /* this will append more instances to each object
283 and then automatically rearrange everything */
284 void
285 Model::duplicate_objects(size_t copies_num, coordf_t dist, const BoundingBoxf* bb)
286 {
287 for (ModelObjectPtrs::const_iterator o = this->objects.begin(); o != this->objects.end(); ++o) {
288 // make a copy of the pointers in order to avoid recursion when appending their copies
289 ModelInstancePtrs instances = (*o)->instances;
290 for (ModelInstancePtrs::const_iterator i = instances.begin(); i != instances.end(); ++i) {
291 for (size_t k = 2; k <= copies_num; ++k)
292 (*o)->add_instance(**i);
293 }
294 }
295
296 this->arrange_objects(dist, bb);
297 }
298
299 void
300 Model::duplicate_objects_grid(size_t x, size_t y, coordf_t dist)
301 {
302 if (this->objects.size() > 1) throw "Grid duplication is not supported with multiple objects";
303 if (this->objects.empty()) throw "No objects!";
304
305 ModelObject* object = this->objects.front();
306 object->clear_instances();
307
308 Sizef3 size = object->bounding_box().size();
309
310 for (size_t x_copy = 1; x_copy <= x; ++x_copy) {
311 for (size_t y_copy = 1; y_copy <= y; ++y_copy) {
312 ModelInstance* instance = object->add_instance();
313 instance->offset.x = (size.x + dist) * (x_copy-1);
314 instance->offset.y = (size.y + dist) * (y_copy-1);
315 }
316 }
317 }
318
319 ModelMaterial::ModelMaterial(Model *model) : model(model) {}
320 ModelMaterial::ModelMaterial(Model *model, const ModelMaterial &other)
321 : attributes(other.attributes), config(other.config), model(model)
322 {}
323
324 void
325 ModelMaterial::apply(const t_model_material_attributes &attributes)
326 {
327 this->attributes.insert(attributes.begin(), attributes.end());
328 }
329
330
331 ModelObject::ModelObject(Model *model)
332 : model(model), _bounding_box_valid(false)
333 {}
334
335 ModelObject::ModelObject(Model *model, const ModelObject &other, bool copy_volumes)
336 : name(other.name),
337 input_file(other.input_file),
338 instances(),
339 volumes(),
340 config(other.config),
341 layer_height_ranges(other.layer_height_ranges),
342 origin_translation(other.origin_translation),
343 _bounding_box(other._bounding_box),
344 _bounding_box_valid(other._bounding_box_valid),
345 model(model)
346 {
347 if (copy_volumes) {
348 this->volumes.reserve(other.volumes.size());
349 for (ModelVolumePtrs::const_iterator i = other.volumes.begin(); i != other.volumes.end(); ++i)
350 this->add_volume(**i);
351 }
352
353 this->instances.reserve(other.instances.size());
354 for (ModelInstancePtrs::const_iterator i = other.instances.begin(); i != other.instances.end(); ++i)
355 this->add_instance(**i);
356 }
357
358 ModelObject& ModelObject::operator= (ModelObject other)
359 {
360 this->swap(other);
361 return *this;
362 }
363
364 void
365 ModelObject::swap(ModelObject &other)
366 {
367 std::swap(this->input_file, other.input_file);
368 std::swap(this->instances, other.instances);
369 std::swap(this->volumes, other.volumes);
370 std::swap(this->config, other.config);
371 std::swap(this->layer_height_ranges, other.layer_height_ranges);
372 std::swap(this->origin_translation, other.origin_translation);
373 std::swap(this->_bounding_box, other._bounding_box);
374 std::swap(this->_bounding_box_valid, other._bounding_box_valid);
375 }
376
377 ModelObject::~ModelObject()
378 {
379 this->clear_volumes();
380 this->clear_instances();
381 }
382
383 ModelVolume*
384 ModelObject::add_volume(const TriangleMesh &mesh)
385 {
386 ModelVolume* v = new ModelVolume(this, mesh);
387 this->volumes.push_back(v);
388 this->invalidate_bounding_box();
389 return v;
390 }
391
392 ModelVolume*
393 ModelObject::add_volume(const ModelVolume &other)
394 {
395 ModelVolume* v = new ModelVolume(this, other);
396 this->volumes.push_back(v);
397 this->invalidate_bounding_box();
398 return v;
399 }
400
401 void
402 ModelObject::delete_volume(size_t idx)
403 {
404 ModelVolumePtrs::iterator i = this->volumes.begin() + idx;
405 delete *i;
406 this->volumes.erase(i);
407 this->invalidate_bounding_box();
408 }
409
410 void
411 ModelObject::clear_volumes()
412 {
413 // int instead of size_t because it can be -1 when vector is empty
414 for (int i = this->volumes.size()-1; i >= 0; --i)
415 this->delete_volume(i);
416 }
417
418 ModelInstance*
419 ModelObject::add_instance()
420 {
421 ModelInstance* i = new ModelInstance(this);
422 this->instances.push_back(i);
423 this->invalidate_bounding_box();
424 return i;
425 }
426
427 ModelInstance*
428 ModelObject::add_instance(const ModelInstance &other)
429 {
430 ModelInstance* i = new ModelInstance(this, other);
431 this->instances.push_back(i);
432 this->invalidate_bounding_box();
433 return i;
434 }
435
436 void
437 ModelObject::delete_instance(size_t idx)
438 {
439 ModelInstancePtrs::iterator i = this->instances.begin() + idx;
440 delete *i;
441 this->instances.erase(i);
442 this->invalidate_bounding_box();
443 }
444
445 void
446 ModelObject::delete_last_instance()
447 {
448 this->delete_instance(this->instances.size() - 1);
449 }
450
451 void
452 ModelObject::clear_instances()
453 {
454 for (size_t i = 0; i < this->instances.size(); ++i)
455 this->delete_instance(i);
456 }
457
458 // this returns the bounding box of the *transformed* instances
459 BoundingBoxf3
460 ModelObject::bounding_box()
461 {
462 if (!this->_bounding_box_valid) this->update_bounding_box();
463 return this->_bounding_box;
464 }
465
466 void
467 ModelObject::invalidate_bounding_box()
468 {
469 this->_bounding_box_valid = false;
470 }
471
472 void
473 ModelObject::update_bounding_box()
474 {
475 this->_bounding_box = this->mesh().bounding_box();
476 this->_bounding_box_valid = true;
477 }
478
479 // flattens all volumes and instances into a single mesh
480 TriangleMesh
481 ModelObject::mesh() const
482 {
483 TriangleMesh mesh;
484 TriangleMesh raw_mesh = this->raw_mesh();
485
486 for (ModelInstancePtrs::const_iterator i = this->instances.begin(); i != this->instances.end(); ++i) {
487 TriangleMesh m = raw_mesh;
488 (*i)->transform_mesh(&m);
489 mesh.merge(m);
490 }
491 return mesh;
492 }
493
494 TriangleMesh
495 ModelObject::raw_mesh() const
496 {
497 TriangleMesh mesh;
498 for (ModelVolumePtrs::const_iterator v = this->volumes.begin(); v != this->volumes.end(); ++v) {
499 if ((*v)->modifier) continue;
500 mesh.merge((*v)->mesh);
501 }
502 return mesh;
503 }
504
505 BoundingBoxf3
506 ModelObject::raw_bounding_box() const
507 {
508 BoundingBoxf3 bb;
509 for (ModelVolumePtrs::const_iterator v = this->volumes.begin(); v != this->volumes.end(); ++v) {
510 if ((*v)->modifier) continue;
511 TriangleMesh mesh = (*v)->mesh;
512
513 if (this->instances.empty()) CONFESS("Can't call raw_bounding_box() with no instances");
514 this->instances.front()->transform_mesh(&mesh, true);
515
516 bb.merge(mesh.bounding_box());
517 }
518 return bb;
519 }
520
521 // this returns the bounding box of the *transformed* given instance
522 BoundingBoxf3
523 ModelObject::instance_bounding_box(size_t instance_idx) const
524 {
525 TriangleMesh mesh = this->raw_mesh();
526 this->instances[instance_idx]->transform_mesh(&mesh);
527 return mesh.bounding_box();
528 }
529
530 void
531 ModelObject::center_around_origin()
532 {
533 // calculate the displacements needed to
534 // center this object around the origin
535 BoundingBoxf3 bb = this->raw_mesh().bounding_box();
536
537 // first align to origin on XYZ
538 Vectorf3 vector(-bb.min.x, -bb.min.y, -bb.min.z);
539
540 // then center it on XY
541 Sizef3 size = bb.size();
542 vector.x -= size.x/2;
543 vector.y -= size.y/2;
544
545 this->translate(vector);
546 this->origin_translation.translate(vector);
547
548 if (!this->instances.empty()) {
549 for (ModelInstancePtrs::const_iterator i = this->instances.begin(); i != this->instances.end(); ++i) {
550 // apply rotation and scaling to vector as well before translating instance,
551 // in order to leave final position unaltered
552 Vectorf3 v = vector.negative();
553 v.rotate((*i)->rotation, (*i)->offset);
554 v.scale((*i)->scaling_factor);
555 (*i)->offset.translate(v.x, v.y);
556 }
557 this->invalidate_bounding_box();
558 }
559 }
560
561 void
562 ModelObject::translate(const Vectorf3 &vector)
563 {
564 this->translate(vector.x, vector.y, vector.z);
565 }
566
567 void
568 ModelObject::translate(coordf_t x, coordf_t y, coordf_t z)
569 {
570 for (ModelVolumePtrs::const_iterator v = this->volumes.begin(); v != this->volumes.end(); ++v) {
571 (*v)->mesh.translate(x, y, z);
572 }
573 if (this->_bounding_box_valid) this->_bounding_box.translate(x, y, z);
574 }
575
576 void
577 ModelObject::scale(const Pointf3 &versor)
578 {
579 for (ModelVolumePtrs::const_iterator v = this->volumes.begin(); v != this->volumes.end(); ++v) {
580 (*v)->mesh.scale(versor);
581 }
582
583 // reset origin translation since it doesn't make sense anymore
584 this->origin_translation = Pointf3(0,0,0);
585 this->invalidate_bounding_box();
586 }
587
588 void
589 ModelObject::rotate(float angle, const Axis &axis)
590 {
591 for (ModelVolumePtrs::const_iterator v = this->volumes.begin(); v != this->volumes.end(); ++v) {
592 (*v)->mesh.rotate(angle, axis);
593 }
594 this->origin_translation = Pointf3(0,0,0);
595 this->invalidate_bounding_box();
596 }
597
598 void
599 ModelObject::mirror(const Axis &axis)
600 {
601 for (ModelVolumePtrs::const_iterator v = this->volumes.begin(); v != this->volumes.end(); ++v) {
602 (*v)->mesh.mirror(axis);
603 }
604 this->origin_translation = Pointf3(0,0,0);
605 this->invalidate_bounding_box();
606 }
607
608 size_t
609 ModelObject::materials_count() const
610 {
611 std::set<t_model_material_id> material_ids;
612 for (ModelVolumePtrs::const_iterator v = this->volumes.begin(); v != this->volumes.end(); ++v) {
613 material_ids.insert((*v)->material_id());
614 }
615 return material_ids.size();
616 }
617
618 size_t
619 ModelObject::facets_count() const
620 {
621 size_t num = 0;
622 for (ModelVolumePtrs::const_iterator v = this->volumes.begin(); v != this->volumes.end(); ++v) {
623 if ((*v)->modifier) continue;
624 num += (*v)->mesh.stl.stats.number_of_facets;
625 }
626 return num;
627 }
628
629 bool
630 ModelObject::needed_repair() const
631 {
632 for (ModelVolumePtrs::const_iterator v = this->volumes.begin(); v != this->volumes.end(); ++v) {
633 if ((*v)->modifier) continue;
634 if ((*v)->mesh.needed_repair()) return true;
635 }
636 return false;
637 }
638
639 void
640 ModelObject::cut(coordf_t z, Model* model) const
641 {
642 // clone this one to duplicate instances, materials etc.
643 ModelObject* upper = model->add_object(*this);
644 ModelObject* lower = model->add_object(*this);
645 upper->clear_volumes();
646 lower->clear_volumes();
647
648 for (ModelVolumePtrs::const_iterator v = this->volumes.begin(); v != this->volumes.end(); ++v) {
649 ModelVolume* volume = *v;
650 if (volume->modifier) {
651 // don't cut modifiers
652 upper->add_volume(*volume);
653 lower->add_volume(*volume);
654 } else {
655 TriangleMeshSlicer tms(&volume->mesh);
656 TriangleMesh upper_mesh, lower_mesh;
657 // TODO: shouldn't we use object bounding box instead of per-volume bb?
658 tms.cut(z + volume->mesh.bounding_box().min.z, &upper_mesh, &lower_mesh);
659 upper_mesh.repair();
660 lower_mesh.repair();
661 upper_mesh.reset_repair_stats();
662 lower_mesh.reset_repair_stats();
663
664 if (upper_mesh.facets_count() > 0) {
665 ModelVolume* vol = upper->add_volume(upper_mesh);
666 vol->name = volume->name;
667 vol->config = volume->config;
668 vol->set_material(volume->material_id(), *volume->material());
669 }
670 if (lower_mesh.facets_count() > 0) {
671 ModelVolume* vol = lower->add_volume(lower_mesh);
672 vol->name = volume->name;
673 vol->config = volume->config;
674 vol->set_material(volume->material_id(), *volume->material());
675 }
676 }
677 }
678 }
679
680 void
681 ModelObject::split(ModelObjectPtrs* new_objects)
682 {
683 if (this->volumes.size() > 1) {
684 // We can't split meshes if there's more than one volume, because
685 // we can't group the resulting meshes by object afterwards
686 new_objects->push_back(this);
687 return;
688 }
689
690 ModelVolume* volume = this->volumes.front();
691 TriangleMeshPtrs meshptrs = volume->mesh.split();
692 for (TriangleMeshPtrs::iterator mesh = meshptrs.begin(); mesh != meshptrs.end(); ++mesh) {
693 (*mesh)->repair();
694
695 ModelObject* new_object = this->model->add_object(*this, false);
696 ModelVolume* new_volume = new_object->add_volume(**mesh);
697 new_volume->name = volume->name;
698 new_volume->config = volume->config;
699 new_volume->modifier = volume->modifier;
700 new_volume->material_id(volume->material_id());
701
702 new_objects->push_back(new_object);
703 delete *mesh;
704 }
705
706 return;
707 }
708
709
710 ModelVolume::ModelVolume(ModelObject* object, const TriangleMesh &mesh)
711 : mesh(mesh), modifier(false), object(object)
712 {}
713
714 ModelVolume::ModelVolume(ModelObject* object, const ModelVolume &other)
715 : name(other.name), mesh(other.mesh), config(other.config),
716 modifier(other.modifier), object(object)
717 {
718 this->material_id(other.material_id());
719 }
720
721 t_model_material_id
722 ModelVolume::material_id() const
723 {
724 return this->_material_id;
725 }
726
727 void
728 ModelVolume::material_id(t_model_material_id material_id)
729 {
730 this->_material_id = material_id;
731
732 // ensure this->_material_id references an existing material
733 (void)this->object->get_model()->add_material(material_id);
734 }
735
736 ModelMaterial*
737 ModelVolume::material() const
738 {
739 return this->object->get_model()->get_material(this->_material_id);
740 }
741
742 void
743 ModelVolume::set_material(t_model_material_id material_id, const ModelMaterial &material)
744 {
745 this->_material_id = material_id;
746 (void)this->object->get_model()->add_material(material_id, material);
747 }
748
749 ModelMaterial*
750 ModelVolume::assign_unique_material()
751 {
752 Model* model = this->get_object()->get_model();
753
754 // as material-id "0" is reserved by the AMF spec we start from 1
755 this->_material_id = 1 + model->materials.size(); // watchout for implicit cast
756 return model->add_material(this->_material_id);
757 }
758
759
760 ModelInstance::ModelInstance(ModelObject *object)
761 : rotation(0), scaling_factor(1), object(object)
762 {}
763
764 ModelInstance::ModelInstance(ModelObject *object, const ModelInstance &other)
765 : rotation(other.rotation), scaling_factor(other.scaling_factor), offset(other.offset), object(object)
766 {}
767
768 void
769 ModelInstance::transform_mesh(TriangleMesh* mesh, bool dont_translate) const
770 {
771 mesh->rotate_z(this->rotation); // rotate around mesh origin
772 mesh->scale(this->scaling_factor); // scale around mesh origin
773 if (!dont_translate)
774 mesh->translate(this->offset.x, this->offset.y, 0);
775 }
776
777 void
778 ModelInstance::transform_polygon(Polygon* polygon) const
779 {
780 polygon->rotate(this->rotation); // rotate around polygon origin
781 polygon->scale(this->scaling_factor); // scale around polygon origin
782 }
783
784 }
0 #ifndef slic3r_Model_hpp_
1 #define slic3r_Model_hpp_
2
3 #include "libslic3r.h"
4 #include "PrintConfig.hpp"
5 #include "Layer.hpp"
6 #include "Point.hpp"
7 #include "TriangleMesh.hpp"
8 #include <map>
9 #include <string>
10 #include <utility>
11 #include <vector>
12
13 namespace Slic3r {
14
15 class ModelInstance;
16 class ModelMaterial;
17 class ModelObject;
18 class ModelVolume;
19
20 typedef std::string t_model_material_id;
21 typedef std::string t_model_material_attribute;
22 typedef std::map<t_model_material_attribute,std::string> t_model_material_attributes;
23
24 typedef std::map<t_model_material_id,ModelMaterial*> ModelMaterialMap;
25 typedef std::vector<ModelObject*> ModelObjectPtrs;
26 typedef std::vector<ModelVolume*> ModelVolumePtrs;
27 typedef std::vector<ModelInstance*> ModelInstancePtrs;
28
29 // The print bed content.
30 // Description of a triangular model with multiple materials, multiple instances with various affine transformations
31 // and with multiple modifier meshes.
32 // A model groups multiple objects, each object having possibly multiple instances,
33 // all objects may share mutliple materials.
34 class Model
35 {
36 public:
37 // Materials are owned by a model and referenced by objects through t_model_material_id.
38 // Single material may be shared by multiple models.
39 ModelMaterialMap materials;
40 // Objects are owned by a model. Each model may have multiple instances, each instance having its own transformation (shift, scale, rotation).
41 ModelObjectPtrs objects;
42
43 Model();
44 Model(const Model &other);
45 Model& operator= (Model other);
46 void swap(Model &other);
47 ~Model();
48 ModelObject* add_object();
49 ModelObject* add_object(const ModelObject &other, bool copy_volumes = true);
50 void delete_object(size_t idx);
51 void clear_objects();
52
53 ModelMaterial* add_material(t_model_material_id material_id);
54 ModelMaterial* add_material(t_model_material_id material_id, const ModelMaterial &other);
55 ModelMaterial* get_material(t_model_material_id material_id);
56 void delete_material(t_model_material_id material_id);
57 void clear_materials();
58 bool has_objects_with_no_instances() const;
59 bool add_default_instances();
60 BoundingBoxf3 bounding_box() const;
61 void center_instances_around_point(const Pointf &point);
62 void align_instances_to_origin();
63 void translate(coordf_t x, coordf_t y, coordf_t z);
64 TriangleMesh mesh() const;
65 TriangleMesh raw_mesh() const;
66 bool _arrange(const Pointfs &sizes, coordf_t dist, const BoundingBoxf* bb, Pointfs &out) const;
67 bool arrange_objects(coordf_t dist, const BoundingBoxf* bb = NULL);
68 // Croaks if the duplicated objects do not fit the print bed.
69 void duplicate(size_t copies_num, coordf_t dist, const BoundingBoxf* bb = NULL);
70 void duplicate_objects(size_t copies_num, coordf_t dist, const BoundingBoxf* bb = NULL);
71 void duplicate_objects_grid(size_t x, size_t y, coordf_t dist);
72 };
73
74 // Material, which may be shared across multiple ModelObjects of a single Model.
75 class ModelMaterial
76 {
77 friend class Model;
78 public:
79 // Attributes are defined by the AMF file format, but they don't seem to be used by Slic3r for any purpose.
80 t_model_material_attributes attributes;
81 // Dynamic configuration storage for the object specific configuration values, overriding the global configuration.
82 DynamicPrintConfig config;
83
84 Model* get_model() const { return this->model; };
85 void apply(const t_model_material_attributes &attributes);
86
87 private:
88 // Parent, owning this material.
89 Model* model;
90
91 ModelMaterial(Model *model);
92 ModelMaterial(Model *model, const ModelMaterial &other);
93 };
94
95 // A printable object, possibly having multiple print volumes (each with its own set of parameters and materials),
96 // and possibly having multiple modifier volumes, each modifier volume with its set of parameters and materials.
97 // Each ModelObject may be instantiated mutliple times, each instance having different placement on the print bed,
98 // different rotation and different uniform scaling.
99 class ModelObject
100 {
101 friend class Model;
102 public:
103 std::string name;
104 std::string input_file;
105 // Instances of this ModelObject. Each instance defines a shift on the print bed, rotation around the Z axis and a uniform scaling.
106 // Instances are owned by this ModelObject.
107 ModelInstancePtrs instances;
108 // Printable and modifier volumes, each with its material ID and a set of override parameters.
109 // ModelVolumes are owned by this ModelObject.
110 ModelVolumePtrs volumes;
111 // Configuration parameters specific to a single ModelObject, overriding the global Slic3r settings.
112 DynamicPrintConfig config;
113 // Variation of a layer thickness for spans of Z coordinates.
114 t_layer_height_ranges layer_height_ranges;
115
116 /* This vector accumulates the total translation applied to the object by the
117 center_around_origin() method. Callers might want to apply the same translation
118 to new volumes before adding them to this object in order to preserve alignment
119 when user expects that. */
120 Pointf3 origin_translation;
121
122 // these should be private but we need to expose them via XS until all methods are ported
123 BoundingBoxf3 _bounding_box;
124 bool _bounding_box_valid;
125
126 Model* get_model() const { return this->model; };
127
128 ModelVolume* add_volume(const TriangleMesh &mesh);
129 ModelVolume* add_volume(const ModelVolume &volume);
130 void delete_volume(size_t idx);
131 void clear_volumes();
132
133 ModelInstance* add_instance();
134 ModelInstance* add_instance(const ModelInstance &instance);
135 void delete_instance(size_t idx);
136 void delete_last_instance();
137 void clear_instances();
138
139 BoundingBoxf3 bounding_box();
140 void invalidate_bounding_box();
141
142 TriangleMesh mesh() const;
143 TriangleMesh raw_mesh() const;
144 BoundingBoxf3 raw_bounding_box() const;
145 BoundingBoxf3 instance_bounding_box(size_t instance_idx) const;
146 void center_around_origin();
147 void translate(const Vectorf3 &vector);
148 void translate(coordf_t x, coordf_t y, coordf_t z);
149 void scale(const Pointf3 &versor);
150 void rotate(float angle, const Axis &axis);
151 void mirror(const Axis &axis);
152 size_t materials_count() const;
153 size_t facets_count() const;
154 bool needed_repair() const;
155 void cut(coordf_t z, Model* model) const;
156 void split(ModelObjectPtrs* new_objects);
157 void update_bounding_box(); // this is a private method but we expose it until we need to expose it via XS
158
159 private:
160 // Parent object, owning this ModelObject.
161 Model* model;
162
163 ModelObject(Model *model);
164 ModelObject(Model *model, const ModelObject &other, bool copy_volumes = true);
165 ModelObject& operator= (ModelObject other);
166 void swap(ModelObject &other);
167 ~ModelObject();
168 };
169
170 // An object STL, or a modifier volume, over which a different set of parameters shall be applied.
171 // ModelVolume instances are owned by a ModelObject.
172 class ModelVolume
173 {
174 friend class ModelObject;
175 public:
176 std::string name;
177 // The triangular model.
178 TriangleMesh mesh;
179 // Configuration parameters specific to an object model geometry or a modifier volume,
180 // overriding the global Slic3r settings and the ModelObject settings.
181 DynamicPrintConfig config;
182 // Is it an object to be printed, or a modifier volume?
183 bool modifier;
184
185 // A parent object owning this modifier volume.
186 ModelObject* get_object() const { return this->object; };
187 t_model_material_id material_id() const;
188 void material_id(t_model_material_id material_id);
189 ModelMaterial* material() const;
190 void set_material(t_model_material_id material_id, const ModelMaterial &material);
191
192 ModelMaterial* assign_unique_material();
193
194 private:
195 // Parent object owning this ModelVolume.
196 ModelObject* object;
197 t_model_material_id _material_id;
198
199 ModelVolume(ModelObject *object, const TriangleMesh &mesh);
200 ModelVolume(ModelObject *object, const ModelVolume &other);
201 };
202
203 // A single instance of a ModelObject.
204 // Knows the affine transformation of an object.
205 class ModelInstance
206 {
207 friend class ModelObject;
208 public:
209 double rotation; // Rotation around the Z axis, in radians around mesh center point
210 double scaling_factor;
211 Pointf offset; // in unscaled coordinates
212
213 ModelObject* get_object() const { return this->object; };
214
215 // To be called on an external mesh
216 void transform_mesh(TriangleMesh* mesh, bool dont_translate = false) const;
217 // To be called on an external polygon. It does not translate the polygon, only rotates and scales.
218 void transform_polygon(Polygon* polygon) const;
219
220 private:
221 // Parent object, owning this instance.
222 ModelObject* object;
223
224 ModelInstance(ModelObject *object);
225 ModelInstance(ModelObject *object, const ModelInstance &other);
226 };
227
228 }
229
230 #endif
0 #include "BoundingBox.hpp"
1 #include "MotionPlanner.hpp"
2 #include <limits> // for numeric_limits
3 #include <assert.h>
4
5 #include "boost/polygon/voronoi.hpp"
6 using boost::polygon::voronoi_builder;
7 using boost::polygon::voronoi_diagram;
8
9 namespace Slic3r {
10
11 MotionPlanner::MotionPlanner(const ExPolygons &islands)
12 : initialized(false)
13 {
14 ExPolygons expp;
15 for (ExPolygons::const_iterator island = islands.begin(); island != islands.end(); ++island)
16 island->simplify(SCALED_EPSILON, &expp);
17
18 for (ExPolygons::const_iterator island = expp.begin(); island != expp.end(); ++island)
19 this->islands.push_back(MotionPlannerEnv(*island));
20 }
21
22 MotionPlanner::~MotionPlanner()
23 {
24 for (std::vector<MotionPlannerGraph*>::iterator graph = this->graphs.begin(); graph != this->graphs.end(); ++graph)
25 delete *graph;
26 }
27
28 size_t
29 MotionPlanner::islands_count() const
30 {
31 return this->islands.size();
32 }
33
34 void
35 MotionPlanner::initialize()
36 {
37 if (this->initialized) return;
38 if (this->islands.empty()) return; // prevent initialization of empty BoundingBox
39
40 // loop through islands in order to create inner expolygons and collect their contours
41 Polygons outer_holes;
42 for (std::vector<MotionPlannerEnv>::iterator island = this->islands.begin(); island != this->islands.end(); ++island) {
43 // generate the internal env boundaries by shrinking the island
44 // we'll use these inner rings for motion planning (endpoints of the Voronoi-based
45 // graph, visibility check) in order to avoid moving too close to the boundaries
46 island->env = offset_ex(island->island, -MP_INNER_MARGIN);
47
48 // island contours are holes of our external environment
49 outer_holes.push_back(island->island.contour);
50 }
51
52 // generate outer contour as bounding box of everything
53 BoundingBox bb;
54 for (Polygons::const_iterator contour = outer_holes.begin(); contour != outer_holes.end(); ++contour)
55 bb.merge(contour->bounding_box());
56
57 // grow outer contour
58 Polygons contour = offset(bb.polygon(), +MP_OUTER_MARGIN*2);
59 assert(contour.size() == 1);
60
61 // make expolygon for outer environment
62 ExPolygons outer = diff_ex(contour, outer_holes);
63 assert(outer.size() == 1);
64 this->outer.island = outer.front();
65
66 this->outer.env = ExPolygonCollection(diff_ex(contour, offset(outer_holes, +MP_OUTER_MARGIN)));
67
68 this->graphs.resize(this->islands.size() + 1, NULL);
69 this->initialized = true;
70 }
71
72 const MotionPlannerEnv&
73 MotionPlanner::get_env(int island_idx) const
74 {
75 if (island_idx == -1) {
76 return this->outer;
77 } else {
78 return this->islands[island_idx];
79 }
80 }
81
82 Polyline
83 MotionPlanner::shortest_path(const Point &from, const Point &to)
84 {
85 // if we have an empty configuration space, return a straight move
86 if (this->islands.empty())
87 return Line(from, to);
88
89 // Are both points in the same island?
90 int island_idx = -1;
91 for (std::vector<MotionPlannerEnv>::const_iterator island = this->islands.begin(); island != this->islands.end(); ++island) {
92 if (island->island.contains(from) && island->island.contains(to)) {
93 // since both points are in the same island, is a direct move possible?
94 // if so, we avoid generating the visibility environment
95 if (island->island.contains(Line(from, to)))
96 return Line(from, to);
97
98 island_idx = island - this->islands.begin();
99 break;
100 }
101 }
102
103 // lazy generation of configuration space
104 this->initialize();
105
106 // get environment
107 MotionPlannerEnv env = this->get_env(island_idx);
108 if (env.env.expolygons.empty()) {
109 // if this environment is empty (probably because it's too small), perform straight move
110 // and avoid running the algorithms on empty dataset
111 return Line(from, to);
112 }
113
114 // Now check whether points are inside the environment.
115 Point inner_from = from;
116 Point inner_to = to;
117
118 if (island_idx == -1) {
119 // TODO: instead of using the nearest_env_point() logic, we should
120 // create a temporary graph where we connect 'from' and 'to' to the
121 // nodes which don't require more than one crossing, and let Dijkstra
122 // figure out the entire path - this should also replace the call to
123 // find_node() below
124 if (!env.island.contains(inner_from)) {
125 // Find the closest inner point to start from.
126 inner_from = env.nearest_env_point(from, to);
127 }
128 if (!env.island.contains(inner_to)) {
129 // Find the closest inner point to start from.
130 inner_to = env.nearest_env_point(to, inner_from);
131 }
132 }
133
134 // perform actual path search
135 MotionPlannerGraph* graph = this->init_graph(island_idx);
136 Polyline polyline = graph->shortest_path(graph->find_node(inner_from), graph->find_node(inner_to));
137
138 polyline.points.insert(polyline.points.begin(), from);
139 polyline.points.push_back(to);
140
141 {
142 // grow our environment slightly in order for simplify_by_visibility()
143 // to work best by considering moves on boundaries valid as well
144 ExPolygonCollection grown_env(offset_ex(env.env, +SCALED_EPSILON));
145
146 if (island_idx == -1) {
147 /* If 'from' or 'to' are not inside our env, they were connected using the
148 nearest_env_point() search which maybe produce ugly paths since it does not
149 include the endpoint in the Dijkstra search; the simplify_by_visibility()
150 call below will not work in many cases where the endpoint is not contained in
151 grown_env (whose contour was arbitrarily constructed with MP_OUTER_MARGIN,
152 which may not be enough for, say, including a skirt point). So we prune
153 the extra points manually. */
154 if (!grown_env.contains(from)) {
155 // delete second point while the line connecting first to third crosses the
156 // boundaries as many times as the current first to second
157 while (polyline.points.size() > 2 && intersection((Lines)Line(from, polyline.points[2]), grown_env).size() == 1) {
158 polyline.points.erase(polyline.points.begin() + 1);
159 }
160 }
161 if (!grown_env.contains(to)) {
162 while (polyline.points.size() > 2 && intersection((Lines)Line(*(polyline.points.end() - 3), to), grown_env).size() == 1) {
163 polyline.points.erase(polyline.points.end() - 2);
164 }
165 }
166 }
167
168 // remove unnecessary vertices
169 // Note: this is computationally intensive and does not look very necessary
170 // now that we prune the endpoints with the logic above,
171 // so we comment it for now until a good test case arises
172 //polyline.simplify_by_visibility(grown_env);
173
174 /*
175 SVG svg("shortest_path.svg");
176 svg.draw(grown_env.expolygons);
177 svg.arrows = false;
178 for (MotionPlannerGraph::adjacency_list_t::const_iterator it = graph->adjacency_list.begin(); it != graph->adjacency_list.end(); ++it) {
179 Point a = graph->nodes[it - graph->adjacency_list.begin()];
180 for (std::vector<MotionPlannerGraph::neighbor>::const_iterator n = it->begin(); n != it->end(); ++n) {
181 Point b = graph->nodes[n->target];
182 svg.draw(Line(a, b));
183 }
184 }
185 svg.arrows = true;
186 svg.draw(from);
187 svg.draw(inner_from, "red");
188 svg.draw(to);
189 svg.draw(inner_to, "red");
190 svg.draw(polyline, "red");
191 svg.Close();
192 */
193 }
194
195 return polyline;
196 }
197
198 MotionPlannerGraph*
199 MotionPlanner::init_graph(int island_idx)
200 {
201 if (this->graphs[island_idx + 1] == NULL) {
202 // if this graph doesn't exist, initialize it
203 MotionPlannerGraph* graph = this->graphs[island_idx + 1] = new MotionPlannerGraph();
204
205 /* We don't add polygon boundaries as graph edges, because we'd need to connect
206 them to the Voronoi-generated edges by recognizing coinciding nodes. */
207
208 typedef voronoi_diagram<double> VD;
209 VD vd;
210
211 // mapping between Voronoi vertices and graph nodes
212 typedef std::map<const VD::vertex_type*,size_t> t_vd_vertices;
213 t_vd_vertices vd_vertices;
214
215 // get boundaries as lines
216 MotionPlannerEnv env = this->get_env(island_idx);
217 Lines lines = env.env.lines();
218 boost::polygon::construct_voronoi(lines.begin(), lines.end(), &vd);
219
220 // traverse the Voronoi diagram and generate graph nodes and edges
221 for (VD::const_edge_iterator edge = vd.edges().begin(); edge != vd.edges().end(); ++edge) {
222 if (edge->is_infinite()) continue;
223
224 const VD::vertex_type* v0 = edge->vertex0();
225 const VD::vertex_type* v1 = edge->vertex1();
226 Point p0 = Point(v0->x(), v0->y());
227 Point p1 = Point(v1->x(), v1->y());
228
229 // skip edge if any of its endpoints is outside our configuration space
230 if (!env.island.contains_b(p0) || !env.island.contains_b(p1)) continue;
231
232 t_vd_vertices::const_iterator i_v0 = vd_vertices.find(v0);
233 size_t v0_idx;
234 if (i_v0 == vd_vertices.end()) {
235 graph->nodes.push_back(p0);
236 vd_vertices[v0] = v0_idx = graph->nodes.size()-1;
237 } else {
238 v0_idx = i_v0->second;
239 }
240
241 t_vd_vertices::const_iterator i_v1 = vd_vertices.find(v1);
242 size_t v1_idx;
243 if (i_v1 == vd_vertices.end()) {
244 graph->nodes.push_back(p1);
245 vd_vertices[v1] = v1_idx = graph->nodes.size()-1;
246 } else {
247 v1_idx = i_v1->second;
248 }
249
250 // Euclidean distance is used as weight for the graph edge
251 double dist = graph->nodes[v0_idx].distance_to(graph->nodes[v1_idx]);
252 graph->add_edge(v0_idx, v1_idx, dist);
253 }
254
255 return graph;
256 }
257 return this->graphs[island_idx + 1];
258 }
259
260 Point
261 MotionPlannerEnv::nearest_env_point(const Point &from, const Point &to) const
262 {
263 /* In order to ensure that the move between 'from' and the initial env point does
264 not violate any of the configuration space boundaries, we limit our search to
265 the points that satisfy this condition. */
266
267 /* Assume that this method is never called when 'env' contains 'from';
268 so 'from' is either inside a hole or outside all contours */
269
270 // get the points of the hole containing 'from', if any
271 Points pp;
272 for (ExPolygons::const_iterator ex = this->env.expolygons.begin(); ex != this->env.expolygons.end(); ++ex) {
273 for (Polygons::const_iterator h = ex->holes.begin(); h != ex->holes.end(); ++h) {
274 if (h->contains(from)) {
275 pp = *h;
276 }
277 }
278 if (!pp.empty()) break;
279 }
280
281 /* If 'from' is not inside a hole, it's outside of all contours, so take all
282 contours' points */
283 if (pp.empty()) {
284 for (ExPolygons::const_iterator ex = this->env.expolygons.begin(); ex != this->env.expolygons.end(); ++ex) {
285 Points contour_pp = ex->contour;
286 pp.insert(pp.end(), contour_pp.begin(), contour_pp.end());
287 }
288 }
289
290 /* Find the candidate result and check that it doesn't cross too many boundaries. */
291 while (pp.size() >= 2) {
292 // find the point in pp that is closest to both 'from' and 'to'
293 size_t result = from.nearest_waypoint_index(pp, to);
294
295 // as we assume 'from' is outside env, any node will require at least one crossing
296 if (intersection((Lines)Line(from, pp[result]), this->island).size() > 1) {
297 // discard result
298 pp.erase(pp.begin() + result);
299 } else {
300 return pp[result];
301 }
302 }
303
304 // if we're here, return last point if any (better than nothing)
305 if (!pp.empty()) {
306 return pp.front();
307 }
308
309 // if we have no points at all, then we have an empty environment and we
310 // make this method behave as a no-op (we shouldn't get here by the way)
311 return from;
312 }
313
314 void
315 MotionPlannerGraph::add_edge(size_t from, size_t to, double weight)
316 {
317 // extend adjacency list until this start node
318 if (this->adjacency_list.size() < from+1)
319 this->adjacency_list.resize(from+1);
320
321 this->adjacency_list[from].push_back(neighbor(to, weight));
322 }
323
324 size_t
325 MotionPlannerGraph::find_node(const Point &point) const
326 {
327 /*
328 for (Points::const_iterator p = this->nodes.begin(); p != this->nodes.end(); ++p) {
329 if (p->coincides_with(point)) return p - this->nodes.begin();
330 }
331 */
332 return point.nearest_point_index(this->nodes);
333 }
334
335 Polyline
336 MotionPlannerGraph::shortest_path(size_t from, size_t to)
337 {
338 // this prevents a crash in case for some reason we got here with an empty adjacency list
339 if (this->adjacency_list.empty()) return Polyline();
340
341 const weight_t max_weight = std::numeric_limits<weight_t>::infinity();
342
343 std::vector<weight_t> dist;
344 std::vector<node_t> previous;
345 {
346 // number of nodes
347 size_t n = this->adjacency_list.size();
348
349 // initialize dist and previous
350 dist.clear();
351 dist.resize(n, max_weight);
352 dist[from] = 0; // distance from 'from' to itself
353 previous.clear();
354 previous.resize(n, -1);
355
356 // initialize the Q with all nodes
357 std::set<node_t> Q;
358 for (node_t i = 0; i < n; ++i) Q.insert(i);
359
360 while (!Q.empty())
361 {
362 // get node in Q having the minimum dist ('from' in the first loop)
363 node_t u;
364 {
365 double min_dist = -1;
366 for (std::set<node_t>::const_iterator n = Q.begin(); n != Q.end(); ++n) {
367 if (dist[*n] < min_dist || min_dist == -1) {
368 u = *n;
369 min_dist = dist[*n];
370 }
371 }
372 }
373 Q.erase(u);
374
375 // stop searching if we reached our destination
376 if (u == to) break;
377
378 // Visit each edge starting from node u
379 const std::vector<neighbor> &neighbors = this->adjacency_list[u];
380 for (std::vector<neighbor>::const_iterator neighbor_iter = neighbors.begin();
381 neighbor_iter != neighbors.end();
382 ++neighbor_iter)
383 {
384 // neighbor node is v
385 node_t v = neighbor_iter->target;
386
387 // skip if we already visited this
388 if (Q.find(v) == Q.end()) continue;
389
390 // calculate total distance
391 weight_t alt = dist[u] + neighbor_iter->weight;
392
393 // if total distance through u is shorter than the previous
394 // distance (if any) between 'from' and 'v', replace it
395 if (alt < dist[v]) {
396 dist[v] = alt;
397 previous[v] = u;
398 }
399
400 }
401 }
402 }
403
404 Polyline polyline;
405 for (node_t vertex = to; vertex != -1; vertex = previous[vertex])
406 polyline.points.push_back(this->nodes[vertex]);
407 polyline.points.push_back(this->nodes[from]);
408 polyline.reverse();
409 return polyline;
410 }
411
412 }
0 #ifndef slic3r_MotionPlanner_hpp_
1 #define slic3r_MotionPlanner_hpp_
2
3 #include "libslic3r.h"
4 #include "ClipperUtils.hpp"
5 #include "ExPolygonCollection.hpp"
6 #include "Polyline.hpp"
7 #include <map>
8 #include <utility>
9 #include <vector>
10
11 #define MP_INNER_MARGIN scale_(1.0)
12 #define MP_OUTER_MARGIN scale_(2.0)
13
14 namespace Slic3r {
15
16 class MotionPlanner;
17
18 class MotionPlannerEnv
19 {
20 friend class MotionPlanner;
21
22 public:
23 ExPolygon island;
24 ExPolygonCollection env;
25 MotionPlannerEnv() {};
26 MotionPlannerEnv(const ExPolygon &island) : island(island) {};
27 Point nearest_env_point(const Point &from, const Point &to) const;
28 };
29
30 class MotionPlannerGraph
31 {
32 friend class MotionPlanner;
33
34 private:
35 typedef int node_t;
36 typedef double weight_t;
37 struct neighbor {
38 node_t target;
39 weight_t weight;
40 neighbor(node_t arg_target, weight_t arg_weight)
41 : target(arg_target), weight(arg_weight) { }
42 };
43 typedef std::vector< std::vector<neighbor> > adjacency_list_t;
44 adjacency_list_t adjacency_list;
45
46 public:
47 Points nodes;
48 //std::map<std::pair<size_t,size_t>, double> edges;
49 void add_edge(size_t from, size_t to, double weight);
50 size_t find_node(const Point &point) const;
51 Polyline shortest_path(size_t from, size_t to);
52 };
53
54 class MotionPlanner
55 {
56 public:
57 MotionPlanner(const ExPolygons &islands);
58 ~MotionPlanner();
59 Polyline shortest_path(const Point &from, const Point &to);
60 size_t islands_count() const;
61
62 private:
63 bool initialized;
64 std::vector<MotionPlannerEnv> islands;
65 MotionPlannerEnv outer;
66 std::vector<MotionPlannerGraph*> graphs;
67
68 void initialize();
69 MotionPlannerGraph* init_graph(int island_idx);
70 const MotionPlannerEnv& get_env(int island_idx) const;
71 };
72
73 }
74
75 #endif
0 #include "MultiPoint.hpp"
1 #include "BoundingBox.hpp"
2
3 namespace Slic3r {
4
5 MultiPoint::operator Points() const
6 {
7 return this->points;
8 }
9
10 void
11 MultiPoint::scale(double factor)
12 {
13 for (Points::iterator it = points.begin(); it != points.end(); ++it) {
14 (*it).scale(factor);
15 }
16 }
17
18 void
19 MultiPoint::translate(double x, double y)
20 {
21 for (Points::iterator it = points.begin(); it != points.end(); ++it) {
22 (*it).translate(x, y);
23 }
24 }
25
26 void
27 MultiPoint::translate(const Point &vector)
28 {
29 this->translate(vector.x, vector.y);
30 }
31
32 void
33 MultiPoint::rotate(double angle)
34 {
35 double s = sin(angle);
36 double c = cos(angle);
37 for (Points::iterator it = points.begin(); it != points.end(); ++it) {
38 double cur_x = (double)it->x;
39 double cur_y = (double)it->y;
40 it->x = (coord_t)round(c * cur_x - s * cur_y);
41 it->y = (coord_t)round(c * cur_y + s * cur_x);
42 }
43 }
44
45 void
46 MultiPoint::rotate(double angle, const Point &center)
47 {
48 double s = sin(angle);
49 double c = cos(angle);
50 for (Points::iterator it = points.begin(); it != points.end(); ++it) {
51 double dx = double(it->x - center.x);
52 double dy = double(it->y - center.y);
53 it->x = (coord_t)round(double(center.x) + c * dx - s * dy);
54 it->y = (coord_t)round(double(center.y) + c * dy + s * dx);
55 }
56 }
57
58 void
59 MultiPoint::reverse()
60 {
61 std::reverse(this->points.begin(), this->points.end());
62 }
63
64 Point
65 MultiPoint::first_point() const
66 {
67 return this->points.front();
68 }
69
70 double
71 MultiPoint::length() const
72 {
73 Lines lines = this->lines();
74 double len = 0;
75 for (Lines::iterator it = lines.begin(); it != lines.end(); ++it) {
76 len += it->length();
77 }
78 return len;
79 }
80
81 int
82 MultiPoint::find_point(const Point &point) const
83 {
84 for (Points::const_iterator it = this->points.begin(); it != this->points.end(); ++it) {
85 if (it->coincides_with(point)) return it - this->points.begin();
86 }
87 return -1; // not found
88 }
89
90 bool
91 MultiPoint::has_boundary_point(const Point &point) const
92 {
93 double dist = point.distance_to(point.projection_onto(*this));
94 return dist < SCALED_EPSILON;
95 }
96
97 BoundingBox
98 MultiPoint::bounding_box() const
99 {
100 return BoundingBox(this->points);
101 }
102
103 bool
104 MultiPoint::has_duplicate_points() const
105 {
106 for (size_t i = 1; i < points.size(); ++i)
107 if (points[i-1].coincides_with(points[i]))
108 return true;
109 return false;
110 }
111
112 bool
113 MultiPoint::remove_duplicate_points()
114 {
115 size_t j = 0;
116 for (size_t i = 1; i < points.size(); ++i) {
117 if (points[j].coincides_with(points[i])) {
118 // Just increase index i.
119 } else {
120 ++ j;
121 if (j < i)
122 points[j] = points[i];
123 }
124 }
125 if (++ j < points.size()) {
126 points.erase(points.begin() + j, points.end());
127 return true;
128 }
129 return false;
130 }
131
132 void
133 MultiPoint::append(const Point &point)
134 {
135 this->points.push_back(point);
136 }
137
138 void
139 MultiPoint::append(const Points &points)
140 {
141 this->append(points.begin(), points.end());
142 }
143
144 void
145 MultiPoint::append(const Points::const_iterator &begin, const Points::const_iterator &end)
146 {
147 this->points.insert(this->points.end(), begin, end);
148 }
149
150 bool
151 MultiPoint::intersection(const Line& line, Point* intersection) const
152 {
153 Lines lines = this->lines();
154 for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++it) {
155 if (it->intersection(line, intersection)) return true;
156 }
157 return false;
158 }
159
160 std::string
161 MultiPoint::dump_perl() const
162 {
163 std::ostringstream ret;
164 ret << "[";
165 for (Points::const_iterator p = this->points.begin(); p != this->points.end(); ++p) {
166 ret << p->dump_perl();
167 if (p != this->points.end()-1) ret << ",";
168 }
169 ret << "]";
170 return ret.str();
171 }
172
173 //FIXME This is very inefficient in term of memory use.
174 // The recursive algorithm shall run in place, not allocating temporary data in each recursion.
175 Points
176 MultiPoint::_douglas_peucker(const Points &points, const double tolerance)
177 {
178 assert(points.size() >= 2);
179 Points results;
180 double dmax = 0;
181 size_t index = 0;
182 Line full(points.front(), points.back());
183 for (Points::const_iterator it = points.begin() + 1; it != points.end(); ++it) {
184 // we use shortest distance, not perpendicular distance
185 double d = it->distance_to(full);
186 if (d > dmax) {
187 index = it - points.begin();
188 dmax = d;
189 }
190 }
191 if (dmax >= tolerance) {
192 Points dp0;
193 dp0.reserve(index + 1);
194 dp0.insert(dp0.end(), points.begin(), points.begin() + index + 1);
195 // Recursive call.
196 Points dp1 = MultiPoint::_douglas_peucker(dp0, tolerance);
197 results.reserve(results.size() + dp1.size() - 1);
198 results.insert(results.end(), dp1.begin(), dp1.end() - 1);
199
200 dp0.clear();
201 dp0.reserve(points.size() - index);
202 dp0.insert(dp0.end(), points.begin() + index, points.end());
203 // Recursive call.
204 dp1 = MultiPoint::_douglas_peucker(dp0, tolerance);
205 results.reserve(results.size() + dp1.size());
206 results.insert(results.end(), dp1.begin(), dp1.end());
207 } else {
208 results.push_back(points.front());
209 results.push_back(points.back());
210 }
211 return results;
212 }
213
214 BoundingBox get_extents(const MultiPoint &mp)
215 {
216 return BoundingBox(mp.points);
217 }
218
219 BoundingBox get_extents_rotated(const Points &points, double angle)
220 {
221 BoundingBox bbox;
222 if (! points.empty()) {
223 double s = sin(angle);
224 double c = cos(angle);
225 Points::const_iterator it = points.begin();
226 double cur_x = (double)it->x;
227 double cur_y = (double)it->y;
228 bbox.min.x = bbox.max.x = (coord_t)round(c * cur_x - s * cur_y);
229 bbox.min.y = bbox.max.y = (coord_t)round(c * cur_y + s * cur_x);
230 for (++it; it != points.end(); ++it) {
231 double cur_x = (double)it->x;
232 double cur_y = (double)it->y;
233 coord_t x = (coord_t)round(c * cur_x - s * cur_y);
234 coord_t y = (coord_t)round(c * cur_y + s * cur_x);
235 bbox.min.x = std::min(x, bbox.min.x);
236 bbox.min.y = std::min(y, bbox.min.y);
237 bbox.max.x = std::max(x, bbox.max.x);
238 bbox.max.y = std::max(y, bbox.max.y);
239 }
240 bbox.defined = true;
241 }
242 return bbox;
243 }
244
245 BoundingBox get_extents_rotated(const MultiPoint &mp, double angle)
246 {
247 return get_extents_rotated(mp.points, angle);
248 }
249
250 }
0 #ifndef slic3r_MultiPoint_hpp_
1 #define slic3r_MultiPoint_hpp_
2
3 #include "libslic3r.h"
4 #include <algorithm>
5 #include <vector>
6 #include "Line.hpp"
7 #include "Point.hpp"
8
9 namespace Slic3r {
10
11 class BoundingBox;
12
13 class MultiPoint
14 {
15 public:
16 Points points;
17
18 operator Points() const;
19 MultiPoint() {};
20 explicit MultiPoint(const Points &_points): points(_points) {};
21 void scale(double factor);
22 void translate(double x, double y);
23 void translate(const Point &vector);
24 void rotate(double angle);
25 void rotate(double angle, const Point &center);
26 void reverse();
27 Point first_point() const;
28 virtual Point last_point() const = 0;
29 virtual Lines lines() const = 0;
30 double length() const;
31 bool is_valid() const { return this->points.size() >= 2; }
32
33 int find_point(const Point &point) const;
34 bool has_boundary_point(const Point &point) const;
35 BoundingBox bounding_box() const;
36 // Return true if there are exact duplicates.
37 bool has_duplicate_points() const;
38 // Remove exact duplicates, return true if any duplicate has been removed.
39 bool remove_duplicate_points();
40 void append(const Point &point);
41 void append(const Points &points);
42 void append(const Points::const_iterator &begin, const Points::const_iterator &end);
43 bool intersection(const Line& line, Point* intersection) const;
44 std::string dump_perl() const;
45
46 static Points _douglas_peucker(const Points &points, const double tolerance);
47 };
48
49 extern BoundingBox get_extents(const MultiPoint &mp);
50 extern BoundingBox get_extents_rotated(const std::vector<Point> &points, double angle);
51 extern BoundingBox get_extents_rotated(const MultiPoint &mp, double angle);
52
53 } // namespace Slic3r
54
55 #endif
0 #include "PerimeterGenerator.hpp"
1 #include "ClipperUtils.hpp"
2 #include "ExtrusionEntityCollection.hpp"
3 #include <cmath>
4 #include <cassert>
5
6 namespace Slic3r {
7
8 void
9 PerimeterGenerator::process()
10 {
11 // other perimeters
12 this->_mm3_per_mm = this->perimeter_flow.mm3_per_mm();
13 coord_t pwidth = this->perimeter_flow.scaled_width();
14 coord_t pspacing = this->perimeter_flow.scaled_spacing();
15
16 // external perimeters
17 this->_ext_mm3_per_mm = this->ext_perimeter_flow.mm3_per_mm();
18 coord_t ext_pwidth = this->ext_perimeter_flow.scaled_width();
19 coord_t ext_pspacing = this->ext_perimeter_flow.scaled_spacing();
20 coord_t ext_pspacing2 = this->ext_perimeter_flow.scaled_spacing(this->perimeter_flow);
21
22 // overhang perimeters
23 this->_mm3_per_mm_overhang = this->overhang_flow.mm3_per_mm();
24
25 // solid infill
26 coord_t ispacing = this->solid_infill_flow.scaled_spacing();
27
28 // Calculate the minimum required spacing between two adjacent traces.
29 // This should be equal to the nominal flow spacing but we experiment
30 // with some tolerance in order to avoid triggering medial axis when
31 // some squishing might work. Loops are still spaced by the entire
32 // flow spacing; this only applies to collapsing parts.
33 // For ext_min_spacing we use the ext_pspacing calculated for two adjacent
34 // external loops (which is the correct way) instead of using ext_pspacing2
35 // which is the spacing between external and internal, which is not correct
36 // and would make the collapsing (thus the details resolution) dependent on
37 // internal flow which is unrelated.
38 coord_t min_spacing = pspacing * (1 - INSET_OVERLAP_TOLERANCE);
39 coord_t ext_min_spacing = ext_pspacing * (1 - INSET_OVERLAP_TOLERANCE);
40
41 // prepare grown lower layer slices for overhang detection
42 if (this->lower_slices != NULL && this->config->overhangs) {
43 // We consider overhang any part where the entire nozzle diameter is not supported by the
44 // lower layer, so we take lower slices and offset them by half the nozzle diameter used
45 // in the current layer
46 double nozzle_diameter = this->print_config->nozzle_diameter.get_at(this->config->perimeter_extruder-1);
47
48 this->_lower_slices_p = offset(*this->lower_slices, scale_(+nozzle_diameter/2));
49 }
50
51 // we need to process each island separately because we might have different
52 // extra perimeters for each one
53 for (Surfaces::const_iterator surface = this->slices->surfaces.begin();
54 surface != this->slices->surfaces.end(); ++surface) {
55 // detect how many perimeters must be generated for this island
56 signed short loop_number = this->config->perimeters + surface->extra_perimeters;
57 loop_number--; // 0-indexed loops
58
59 Polygons gaps;
60
61 Polygons last = surface->expolygon.simplify_p(SCALED_RESOLUTION);
62 if (loop_number >= 0) { // no loops = -1
63
64 std::vector<PerimeterGeneratorLoops> contours(loop_number+1); // depth => loops
65 std::vector<PerimeterGeneratorLoops> holes(loop_number+1); // depth => loops
66 ThickPolylines thin_walls;
67
68 // we loop one time more than needed in order to find gaps after the last perimeter was applied
69 for (signed short i = 0; i <= loop_number+1; ++i) { // outer loop is 0
70 Polygons offsets;
71 if (i == 0) {
72 // the minimum thickness of a single loop is:
73 // ext_width/2 + ext_spacing/2 + spacing/2 + width/2
74 if (this->config->thin_walls) {
75 offsets = offset2(
76 last,
77 -(ext_pwidth/2 + ext_min_spacing/2 - 1),
78 +(ext_min_spacing/2 - 1)
79 );
80 } else {
81 offsets = offset(last, -ext_pwidth/2);
82 }
83
84 // look for thin walls
85 if (this->config->thin_walls) {
86 Polygons diffpp = diff(
87 last,
88 offset(offsets, +ext_pwidth/2),
89 true // medial axis requires non-overlapping geometry
90 );
91
92 // the following offset2 ensures almost nothing in @thin_walls is narrower than $min_width
93 // (actually, something larger than that still may exist due to mitering or other causes)
94 coord_t min_width = scale_(this->ext_perimeter_flow.nozzle_diameter / 3);
95 ExPolygons expp = offset2_ex(diffpp, -min_width/2, +min_width/2);
96
97 // the maximum thickness of our thin wall area is equal to the minimum thickness of a single loop
98 for (ExPolygons::const_iterator ex = expp.begin(); ex != expp.end(); ++ex)
99 ex->medial_axis(ext_pwidth + ext_pspacing2, min_width, &thin_walls);
100
101 #ifdef DEBUG
102 printf(" " PRINTF_ZU " thin walls detected\n", thin_walls.size());
103 #endif
104
105 /*
106 if (false) {
107 require "Slic3r/SVG.pm";
108 Slic3r::SVG::output(
109 "medial_axis.svg",
110 no_arrows => 1,
111 #expolygons => \@expp,
112 polylines => \@thin_walls,
113 );
114 }
115 */
116 }
117 } else {
118 //FIXME Is this offset correct if the line width of the inner perimeters differs
119 // from the line width of the infill?
120 coord_t distance = (i == 1) ? ext_pspacing2 : pspacing;
121
122
123 //FIXME Vojtech: Why there is a special case for the thin walls?
124 // Gap fill is active all the time anyway and this is not the outer perimeter.
125 // if (this->config->thin_walls) {
126 if (false) {
127 offsets = offset2(
128 last,
129 -(distance + min_spacing/2 - 1),
130 +(min_spacing/2 - 1)
131 );
132 } else {
133 offsets = offset(
134 last,
135 -distance
136 );
137 }
138
139 // look for gaps
140 if (this->config->gap_fill_speed.value > 0 && this->config->fill_density.value > 0) {
141 // not using safety offset here would "detect" very narrow gaps
142 // (but still long enough to escape the area threshold) that gap fill
143 // won't be able to fill but we'd still remove from infill area
144 Polygons diff_pp = diff(
145 offset(last, -0.5*distance),
146 offset(offsets, +0.5*distance + 10) // safety offset
147 );
148 gaps.insert(gaps.end(), diff_pp.begin(), diff_pp.end());
149 }
150 }
151
152 if (offsets.empty()) break;
153 if (i > loop_number) break; // we were only looking for gaps this time
154
155 last = offsets;
156 for (Polygons::const_iterator polygon = offsets.begin(); polygon != offsets.end(); ++polygon) {
157 PerimeterGeneratorLoop loop(*polygon, i);
158 loop.is_contour = polygon->is_counter_clockwise();
159 if (loop.is_contour) {
160 contours[i].push_back(loop);
161 } else {
162 holes[i].push_back(loop);
163 }
164 }
165 }
166
167 // nest loops: holes first
168 for (signed short d = 0; d <= loop_number; ++d) {
169 PerimeterGeneratorLoops &holes_d = holes[d];
170
171 // loop through all holes having depth == d
172 for (signed short i = 0; i < holes_d.size(); ++i) {
173 const PerimeterGeneratorLoop &loop = holes_d[i];
174
175 // find the hole loop that contains this one, if any
176 for (signed short t = d+1; t <= loop_number; ++t) {
177 for (signed short j = 0; j < holes[t].size(); ++j) {
178 PerimeterGeneratorLoop &candidate_parent = holes[t][j];
179 if (candidate_parent.polygon.contains(loop.polygon.first_point())) {
180 candidate_parent.children.push_back(loop);
181 holes_d.erase(holes_d.begin() + i);
182 --i;
183 goto NEXT_LOOP;
184 }
185 }
186 }
187
188 // if no hole contains this hole, find the contour loop that contains it
189 for (signed short t = loop_number; t >= 0; --t) {
190 for (signed short j = 0; j < contours[t].size(); ++j) {
191 PerimeterGeneratorLoop &candidate_parent = contours[t][j];
192 if (candidate_parent.polygon.contains(loop.polygon.first_point())) {
193 candidate_parent.children.push_back(loop);
194 holes_d.erase(holes_d.begin() + i);
195 --i;
196 goto NEXT_LOOP;
197 }
198 }
199 }
200 NEXT_LOOP: ;
201 }
202 }
203
204 // nest contour loops
205 for (signed short d = loop_number; d >= 1; --d) {
206 PerimeterGeneratorLoops &contours_d = contours[d];
207
208 // loop through all contours having depth == d
209 for (signed short i = 0; i < contours_d.size(); ++i) {
210 const PerimeterGeneratorLoop &loop = contours_d[i];
211
212 // find the contour loop that contains it
213 for (signed short t = d-1; t >= 0; --t) {
214 for (signed short j = 0; j < contours[t].size(); ++j) {
215 PerimeterGeneratorLoop &candidate_parent = contours[t][j];
216 if (candidate_parent.polygon.contains(loop.polygon.first_point())) {
217 candidate_parent.children.push_back(loop);
218 contours_d.erase(contours_d.begin() + i);
219 --i;
220 goto NEXT_CONTOUR;
221 }
222 }
223 }
224
225 NEXT_CONTOUR: ;
226 }
227 }
228
229 // at this point, all loops should be in contours[0]
230
231 ExtrusionEntityCollection entities = this->_traverse_loops(contours.front(), thin_walls);
232
233 // if brim will be printed, reverse the order of perimeters so that
234 // we continue inwards after having finished the brim
235 // TODO: add test for perimeter order
236 if (this->config->external_perimeters_first
237 || (this->layer_id == 0 && this->print_config->brim_width.value > 0))
238 entities.reverse();
239
240 // append perimeters for this slice as a collection
241 if (!entities.empty())
242 this->loops->append(entities);
243 } // for each loop of an island
244
245 {
246 //FIXME how about the gaps?
247 // Calculate the region of surface->expolygon covered by the perimeters and their gap fills.
248 // The perimeters will later be used to calculate the object skin.
249 ExPolygons expp = diff_ex((Polygons)surface->expolygon, last, true);
250 for (ExPolygons::const_iterator ex = expp.begin(); ex != expp.end(); ++ex)
251 this->perimeter_surfaces->surfaces.push_back(Surface(stPerimeter, *ex));
252 }
253
254 // fill gaps
255 if (!gaps.empty()) {
256 /*
257 SVG svg("gaps.svg");
258 svg.draw(union_ex(gaps));
259 svg.Close();
260 */
261
262 // collapse
263 double min = 0.2*pwidth * (1 - INSET_OVERLAP_TOLERANCE);
264 double max = 2*pspacing;
265 ExPolygons gaps_ex = diff_ex(
266 offset2(gaps, -min/2, +min/2),
267 offset2(gaps, -max/2, +max/2),
268 true
269 );
270
271 ThickPolylines polylines;
272 for (ExPolygons::const_iterator ex = gaps_ex.begin(); ex != gaps_ex.end(); ++ex)
273 ex->medial_axis(max, min, &polylines);
274
275 if (!polylines.empty()) {
276 ExtrusionEntityCollection gap_fill = this->_variable_width(polylines,
277 erGapFill, this->solid_infill_flow);
278
279 this->gap_fill->append(gap_fill.entities);
280
281 /* Make sure we don't infill narrow parts that are already gap-filled
282 (we only consider this surface's gaps to reduce the diff() complexity).
283 Growing actual extrusions ensures that gaps not filled by medial axis
284 are not subtracted from fill surfaces (they might be too short gaps
285 that medial axis skips but infill might join with other infill regions
286 and use zigzag). */
287 //FIXME Vojtech: This grows by a rounded extrusion width, not by line spacing,
288 // therefore it may cover the area, but no the volume.
289 last = diff(last, gap_fill.polygons_covered_by_width(10.f));
290 }
291 }
292
293 // create one more offset to be used as boundary for fill
294 // we offset by half the perimeter spacing (to get to the actual infill boundary)
295 // and then we offset back and forth by half the infill spacing to only consider the
296 // non-collapsing regions
297 coord_t inset = 0;
298 if (loop_number == 0) {
299 // one loop
300 inset += ext_pspacing2/2;
301 } else if (loop_number > 0) {
302 // two or more loops
303 inset += pspacing/2;
304 }
305
306 // only apply infill overlap if we actually have one perimeter
307 if (inset > 0)
308 inset -= this->config->get_abs_value("infill_overlap", inset + ispacing/2);
309
310 {
311 ExPolygons expp = union_ex(last);
312
313 // simplify infill contours according to resolution
314 Polygons pp;
315 for (ExPolygons::const_iterator ex = expp.begin(); ex != expp.end(); ++ex)
316 ex->simplify_p(SCALED_RESOLUTION, &pp);
317
318 // collapse too narrow infill areas
319 coord_t min_perimeter_infill_spacing = ispacing * (1 - INSET_OVERLAP_TOLERANCE);
320 expp = offset2_ex(
321 pp,
322 -inset -min_perimeter_infill_spacing/2,
323 +min_perimeter_infill_spacing/2
324 );
325
326 // append infill areas to fill_surfaces
327 for (ExPolygons::const_iterator ex = expp.begin(); ex != expp.end(); ++ex)
328 this->fill_surfaces->surfaces.push_back(Surface(stInternal, *ex)); // use a bogus surface type
329 }
330 } // for each island
331 }
332
333 ExtrusionEntityCollection
334 PerimeterGenerator::_traverse_loops(const PerimeterGeneratorLoops &loops,
335 ThickPolylines &thin_walls) const
336 {
337 // loops is an arrayref of ::Loop objects
338 // turn each one into an ExtrusionLoop object
339 ExtrusionEntityCollection coll;
340 for (PerimeterGeneratorLoops::const_iterator loop = loops.begin();
341 loop != loops.end(); ++loop) {
342 bool is_external = loop->is_external();
343
344 ExtrusionRole role;
345 ExtrusionLoopRole loop_role;
346 role = is_external ? erExternalPerimeter : erPerimeter;
347 if (loop->is_internal_contour()) {
348 // Note that we set loop role to ContourInternalPerimeter
349 // also when loop is both internal and external (i.e.
350 // there's only one contour loop).
351 loop_role = elrContourInternalPerimeter;
352 } else {
353 loop_role = elrDefault;
354 }
355
356 // detect overhanging/bridging perimeters
357 ExtrusionPaths paths;
358 if (this->config->overhangs && this->layer_id > 0
359 && !(this->object_config->support_material && this->object_config->support_material_contact_distance.value == 0)) {
360 // get non-overhang paths by intersecting this loop with the grown lower slices
361 {
362 Polylines polylines;
363 intersection((Polygons)loop->polygon, this->_lower_slices_p, &polylines);
364
365 for (Polylines::const_iterator polyline = polylines.begin(); polyline != polylines.end(); ++polyline) {
366 ExtrusionPath path(role);
367 path.polyline = *polyline;
368 path.mm3_per_mm = is_external ? this->_ext_mm3_per_mm : this->_mm3_per_mm;
369 path.width = is_external ? this->ext_perimeter_flow.width : this->perimeter_flow.width;
370 path.height = this->layer_height;
371 paths.push_back(path);
372 }
373 }
374
375 // get overhang paths by checking what parts of this loop fall
376 // outside the grown lower slices (thus where the distance between
377 // the loop centerline and original lower slices is >= half nozzle diameter
378 {
379 Polylines polylines;
380 diff((Polygons)loop->polygon, this->_lower_slices_p, &polylines);
381
382 for (Polylines::const_iterator polyline = polylines.begin(); polyline != polylines.end(); ++polyline) {
383 ExtrusionPath path(erOverhangPerimeter);
384 path.polyline = *polyline;
385 path.mm3_per_mm = this->_mm3_per_mm_overhang;
386 path.width = this->overhang_flow.width;
387 path.height = this->overhang_flow.height;
388 paths.push_back(path);
389 }
390 }
391
392 // reapply the nearest point search for starting point
393 // We allow polyline reversal because Clipper may have randomly
394 // reversed polylines during clipping.
395 paths = ExtrusionEntityCollection(paths).chained_path();
396 } else {
397 ExtrusionPath path(role);
398 path.polyline = loop->polygon.split_at_first_point();
399 path.mm3_per_mm = is_external ? this->_ext_mm3_per_mm : this->_mm3_per_mm;
400 path.width = is_external ? this->ext_perimeter_flow.width : this->perimeter_flow.width;
401 path.height = this->layer_height;
402 paths.push_back(path);
403 }
404
405 coll.append(ExtrusionLoop(paths, loop_role));
406 }
407
408 // append thin walls to the nearest-neighbor search (only for first iteration)
409 if (!thin_walls.empty()) {
410 ExtrusionEntityCollection tw = this->_variable_width
411 (thin_walls, erExternalPerimeter, this->ext_perimeter_flow);
412
413 coll.append(tw.entities);
414 thin_walls.clear();
415 }
416
417 // sort entities into a new collection using a nearest-neighbor search,
418 // preserving the original indices which are useful for detecting thin walls
419 ExtrusionEntityCollection sorted_coll;
420 coll.chained_path(&sorted_coll, false, &sorted_coll.orig_indices);
421
422 // traverse children and build the final collection
423 ExtrusionEntityCollection entities;
424 for (std::vector<size_t>::const_iterator idx = sorted_coll.orig_indices.begin();
425 idx != sorted_coll.orig_indices.end();
426 ++idx) {
427
428 if (*idx >= loops.size()) {
429 // this is a thin wall
430 // let's get it from the sorted collection as it might have been reversed
431 size_t i = idx - sorted_coll.orig_indices.begin();
432 entities.append(*sorted_coll.entities[i]);
433 } else {
434 const PerimeterGeneratorLoop &loop = loops[*idx];
435 ExtrusionLoop eloop = *dynamic_cast<ExtrusionLoop*>(coll.entities[*idx]);
436
437 ExtrusionEntityCollection children = this->_traverse_loops(loop.children, thin_walls);
438 if (loop.is_contour) {
439 eloop.make_counter_clockwise();
440 entities.append(children.entities);
441 entities.append(eloop);
442 } else {
443 eloop.make_clockwise();
444 entities.append(eloop);
445 entities.append(children.entities);
446 }
447 }
448 }
449 return entities;
450 }
451
452 ExtrusionEntityCollection
453 PerimeterGenerator::_variable_width(const ThickPolylines &polylines, ExtrusionRole role, Flow flow) const
454 {
455 // this value determines granularity of adaptive width, as G-code does not allow
456 // variable extrusion within a single move; this value shall only affect the amount
457 // of segments, and any pruning shall be performed before we apply this tolerance
458 const double tolerance = scale_(0.05);
459
460 ExtrusionEntityCollection coll;
461 for (ThickPolylines::const_iterator p = polylines.begin(); p != polylines.end(); ++p) {
462 ExtrusionPaths paths;
463 ExtrusionPath path(role);
464 ThickLines lines = p->thicklines();
465
466 for (size_t i = 0; i < lines.size(); ++i) {
467 const ThickLine& line = lines[i];
468
469 const coordf_t line_len = line.length();
470 if (line_len < SCALED_EPSILON) continue;
471
472 double thickness_delta = fabs(line.a_width - line.b_width);
473 if (thickness_delta > tolerance) {
474 const unsigned short segments = ceil(thickness_delta / tolerance);
475 const coordf_t seg_len = line_len / segments;
476 Points pp;
477 std::vector<coordf_t> width;
478 {
479 pp.push_back(line.a);
480 width.push_back(line.a_width);
481 for (size_t j = 1; j < segments; ++j) {
482 pp.push_back(line.point_at(j*seg_len));
483
484 coordf_t w = line.a_width + (j*seg_len) * (line.b_width-line.a_width) / line_len;
485 width.push_back(w);
486 width.push_back(w);
487 }
488 pp.push_back(line.b);
489 width.push_back(line.b_width);
490
491 assert(pp.size() == segments + 1);
492 assert(width.size() == segments*2);
493 }
494
495 // delete this line and insert new ones
496 lines.erase(lines.begin() + i);
497 for (size_t j = 0; j < segments; ++j) {
498 ThickLine new_line(pp[j], pp[j+1]);
499 new_line.a_width = width[2*j];
500 new_line.b_width = width[2*j+1];
501 lines.insert(lines.begin() + i + j, new_line);
502 }
503
504 --i;
505 continue;
506 }
507
508 const double w = fmax(line.a_width, line.b_width);
509
510 if (path.polyline.points.empty()) {
511 path.polyline.append(line.a);
512 path.polyline.append(line.b);
513
514 flow.width = unscale(w);
515 #ifdef SLIC3R_DEBUG
516 printf(" filling %f gap\n", flow.width);
517 #endif
518 path.mm3_per_mm = flow.mm3_per_mm();
519 path.width = flow.width;
520 path.height = flow.height;
521 } else {
522 thickness_delta = fabs(scale_(flow.width) - w);
523 if (thickness_delta <= tolerance) {
524 // the width difference between this line and the current flow width is
525 // within the accepted tolerance
526
527 path.polyline.append(line.b);
528 } else {
529 // we need to initialize a new line
530 paths.push_back(path);
531 path = ExtrusionPath(role);
532 --i;
533 }
534 }
535 }
536 if (path.polyline.is_valid())
537 paths.push_back(path);
538
539 // append paths to collection
540 if (!paths.empty()) {
541 if (paths.front().first_point().coincides_with(paths.back().last_point())) {
542 coll.append(ExtrusionLoop(paths));
543 } else {
544 coll.append(paths);
545 }
546 }
547 }
548
549 return coll;
550 }
551
552 bool
553 PerimeterGeneratorLoop::is_internal_contour() const
554 {
555 if (this->is_contour) {
556 // an internal contour is a contour containing no other contours
557 for (std::vector<PerimeterGeneratorLoop>::const_iterator loop = this->children.begin();
558 loop != this->children.end(); ++loop) {
559 if (loop->is_contour) {
560 return false;
561 }
562 }
563 return true;
564 }
565 return false;
566 }
567
568 }
0 #ifndef slic3r_PerimeterGenerator_hpp_
1 #define slic3r_PerimeterGenerator_hpp_
2
3 #include "libslic3r.h"
4 #include <vector>
5 #include "ExPolygonCollection.hpp"
6 #include "Flow.hpp"
7 #include "Polygon.hpp"
8 #include "PrintConfig.hpp"
9 #include "SurfaceCollection.hpp"
10
11 namespace Slic3r {
12
13 // Hierarchy of perimeters.
14 class PerimeterGeneratorLoop {
15 public:
16 // Polygon of this contour.
17 Polygon polygon;
18 // Is it a contour or a hole?
19 // Contours are CCW oriented, holes are CW oriented.
20 bool is_contour;
21 // Depth in the hierarchy. External perimeter has depth = 0. An external perimeter could be both a contour and a hole.
22 unsigned short depth;
23 // Children contour, may be both CCW and CW oriented (outer contours or holes).
24 std::vector<PerimeterGeneratorLoop> children;
25
26 PerimeterGeneratorLoop(Polygon polygon, unsigned short depth)
27 : polygon(polygon), is_contour(false), depth(depth)
28 {};
29 // External perimeter. It may be CCW or CW oriented (outer contour or hole contour).
30 bool is_external() const { return this->depth == 0; }
31 // An island, which may have holes, but it does not have another internal island.
32 bool is_internal_contour() const;
33 };
34
35 typedef std::vector<PerimeterGeneratorLoop> PerimeterGeneratorLoops;
36
37 class PerimeterGenerator {
38 public:
39 // Inputs:
40 const SurfaceCollection* slices;
41 const ExPolygonCollection* lower_slices;
42 double layer_height;
43 int layer_id;
44 Flow perimeter_flow;
45 Flow ext_perimeter_flow;
46 Flow overhang_flow;
47 Flow solid_infill_flow;
48 PrintRegionConfig* config;
49 PrintObjectConfig* object_config;
50 PrintConfig* print_config;
51 // Outputs:
52 ExtrusionEntityCollection* loops;
53 ExtrusionEntityCollection* gap_fill;
54 SurfaceCollection* perimeter_surfaces;
55 SurfaceCollection* fill_surfaces;
56
57 PerimeterGenerator(
58 // Input:
59 const SurfaceCollection* slices,
60 double layer_height,
61 Flow flow,
62 PrintRegionConfig* config,
63 PrintObjectConfig* object_config,
64 PrintConfig* print_config,
65 // Output:
66 // Loops with the external thin walls
67 ExtrusionEntityCollection* loops,
68 // Gaps without the thin walls
69 ExtrusionEntityCollection* gap_fill,
70 // Perimeters including their gap fills
71 SurfaceCollection* perimeter_surfaces,
72 // Infills without the gap fills
73 SurfaceCollection* fill_surfaces)
74 : slices(slices), lower_slices(NULL), layer_height(layer_height),
75 layer_id(-1), perimeter_flow(flow), ext_perimeter_flow(flow),
76 overhang_flow(flow), solid_infill_flow(flow),
77 config(config), object_config(object_config), print_config(print_config),
78 loops(loops), gap_fill(gap_fill), perimeter_surfaces(perimeter_surfaces), fill_surfaces(fill_surfaces),
79 _ext_mm3_per_mm(-1), _mm3_per_mm(-1), _mm3_per_mm_overhang(-1)
80 {};
81 void process();
82
83 private:
84 double _ext_mm3_per_mm;
85 double _mm3_per_mm;
86 double _mm3_per_mm_overhang;
87 Polygons _lower_slices_p;
88
89 ExtrusionEntityCollection _traverse_loops(const PerimeterGeneratorLoops &loops,
90 ThickPolylines &thin_walls) const;
91 ExtrusionEntityCollection _variable_width
92 (const ThickPolylines &polylines, ExtrusionRole role, Flow flow) const;
93 };
94
95 }
96
97 #endif
0 #include "PlaceholderParser.hpp"
1 #include <cstring>
2 #include <ctime>
3 #include <iomanip>
4 #include <sstream>
5 #ifdef _MSC_VER
6 #include <stdlib.h> // provides **_environ
7 #else
8 #include <unistd.h> // provides **environ
9 #endif
10
11 #ifdef __APPLE__
12 #include <crt_externs.h>
13 #undef environ
14 #define environ (*_NSGetEnviron())
15 #else
16 #ifdef _MSC_VER
17 #define environ _environ
18 #else
19 extern char **environ;
20 #endif
21 #endif
22
23 namespace Slic3r {
24
25 PlaceholderParser::PlaceholderParser()
26 {
27 this->set("version", SLIC3R_VERSION);
28 this->apply_env_variables();
29 this->update_timestamp();
30 }
31
32 void
33 PlaceholderParser::update_timestamp()
34 {
35 time_t rawtime;
36 time(&rawtime);
37 struct tm* timeinfo = localtime(&rawtime);
38
39 {
40 std::ostringstream ss;
41 ss << (1900 + timeinfo->tm_year);
42 ss << std::setw(2) << std::setfill('0') << (1 + timeinfo->tm_mon);
43 ss << std::setw(2) << std::setfill('0') << timeinfo->tm_mday;
44 ss << "-";
45 ss << std::setw(2) << std::setfill('0') << timeinfo->tm_hour;
46 ss << std::setw(2) << std::setfill('0') << timeinfo->tm_min;
47 ss << std::setw(2) << std::setfill('0') << timeinfo->tm_sec;
48 this->set("timestamp", ss.str());
49 }
50 this->set("year", 1900 + timeinfo->tm_year);
51 this->set("month", 1 + timeinfo->tm_mon);
52 this->set("day", timeinfo->tm_mday);
53 this->set("hour", timeinfo->tm_hour);
54 this->set("minute", timeinfo->tm_min);
55 this->set("second", timeinfo->tm_sec);
56 }
57
58 void PlaceholderParser::apply_config(const DynamicPrintConfig &config)
59 {
60 t_config_option_keys opt_keys = config.keys();
61 for (t_config_option_keys::const_iterator i = opt_keys.begin(); i != opt_keys.end(); ++i) {
62 const t_config_option_key &opt_key = *i;
63 const ConfigOptionDef* def = config.def->get(opt_key);
64 if (def->multiline) continue;
65
66 const ConfigOption* opt = config.option(opt_key);
67 if (const ConfigOptionVectorBase* optv = dynamic_cast<const ConfigOptionVectorBase*>(opt)) {
68 // set placeholders for options with multiple values
69 // TODO: treat [bed_shape] as single, not multiple
70 this->set(opt_key, optv->vserialize());
71 } else if (const ConfigOptionPoint* optp = dynamic_cast<const ConfigOptionPoint*>(opt)) {
72 this->set(opt_key, optp->serialize());
73
74 Pointf val = *optp;
75 this->set(opt_key + "_X", val.x);
76 this->set(opt_key + "_Y", val.y);
77 } else {
78 // set single-value placeholders
79 this->set(opt_key, opt->serialize());
80 }
81 }
82 }
83
84 void
85 PlaceholderParser::apply_env_variables()
86 {
87 for (char** env = environ; *env; env++) {
88 if (strncmp(*env, "SLIC3R_", 7) == 0) {
89 std::stringstream ss(*env);
90 std::string key, value;
91 std::getline(ss, key, '=');
92 ss >> value;
93
94 this->set(key, value);
95 }
96 }
97 }
98
99 void
100 PlaceholderParser::set(const std::string &key, const std::string &value)
101 {
102 this->_single[key] = value;
103 this->_multiple.erase(key);
104 }
105
106 void
107 PlaceholderParser::set(const std::string &key, int value)
108 {
109 std::ostringstream ss;
110 ss << value;
111 this->set(key, ss.str());
112 }
113
114 void
115 PlaceholderParser::set(const std::string &key, std::vector<std::string> values)
116 {
117 if (values.empty()) {
118 this->_multiple.erase(key);
119 this->_single.erase(key);
120 } else {
121 this->_multiple[key] = values;
122 this->_single[key] = values.front();
123 }
124 }
125
126 std::string
127 PlaceholderParser::process(std::string str) const
128 {
129 // replace single options, like [foo]
130 for (t_strstr_map::const_iterator it = this->_single.begin(); it != this->_single.end(); ++it) {
131 std::stringstream ss;
132 ss << '[' << it->first << ']';
133 this->find_and_replace(str, ss.str(), it->second);
134 }
135
136 // replace multiple options like [foo_0] by looping until we have enough values
137 // or until a previous match was found (this handles non-existing indices reasonably
138 // without a regex)
139 for (t_strstrs_map::const_iterator it = this->_multiple.begin(); it != this->_multiple.end(); ++it) {
140 const std::vector<std::string> &values = it->second;
141 bool found = false;
142 for (size_t i = 0; (i < values.size()) || found; ++i) {
143 std::stringstream ss;
144 ss << '[' << it->first << '_' << i << ']';
145 if (i < values.size()) {
146 found = this->find_and_replace(str, ss.str(), values[i]);
147 } else {
148 found = this->find_and_replace(str, ss.str(), values.front());
149 }
150 }
151 }
152
153 return str;
154 }
155
156 bool
157 PlaceholderParser::find_and_replace(std::string &source, std::string const &find, std::string const &replace) const
158 {
159 bool found = false;
160 for (std::string::size_type i = 0; (i = source.find(find, i)) != std::string::npos; ) {
161 source.replace(i, find.length(), replace);
162 i += replace.length();
163 found = true;
164 }
165 return found;
166 }
167
168 }
0 #ifndef slic3r_PlaceholderParser_hpp_
1 #define slic3r_PlaceholderParser_hpp_
2
3 #include "libslic3r.h"
4 #include <map>
5 #include <string>
6 #include <vector>
7 #include "PrintConfig.hpp"
8
9
10 namespace Slic3r {
11
12 typedef std::map<std::string, std::string> t_strstr_map;
13 typedef std::map<std::string, std::vector<std::string> > t_strstrs_map;
14
15 class PlaceholderParser
16 {
17 public:
18 t_strstr_map _single;
19 t_strstrs_map _multiple;
20
21 PlaceholderParser();
22 void update_timestamp();
23 void apply_config(const DynamicPrintConfig &config);
24 void apply_env_variables();
25 void set(const std::string &key, const std::string &value);
26 void set(const std::string &key, int value);
27 void set(const std::string &key, std::vector<std::string> values);
28 std::string process(std::string str) const;
29
30 private:
31 bool find_and_replace(std::string &source, std::string const &find, std::string const &replace) const;
32 };
33
34 }
35
36 #endif
0 #include "Point.hpp"
1 #include "Line.hpp"
2 #include "MultiPoint.hpp"
3 #include <algorithm>
4 #include <cmath>
5
6 namespace Slic3r {
7
8 Point::Point(double x, double y)
9 {
10 this->x = lrint(x);
11 this->y = lrint(y);
12 }
13
14 bool
15 Point::operator==(const Point& rhs) const
16 {
17 return this->coincides_with(rhs);
18 }
19
20 std::string
21 Point::wkt() const
22 {
23 std::ostringstream ss;
24 ss << "POINT(" << this->x << " " << this->y << ")";
25 return ss.str();
26 }
27
28 std::string
29 Point::dump_perl() const
30 {
31 std::ostringstream ss;
32 ss << "[" << this->x << "," << this->y << "]";
33 return ss.str();
34 }
35
36 void
37 Point::scale(double factor)
38 {
39 this->x *= factor;
40 this->y *= factor;
41 }
42
43 void
44 Point::translate(double x, double y)
45 {
46 this->x += x;
47 this->y += y;
48 }
49
50 void
51 Point::translate(const Vector &vector)
52 {
53 this->translate(vector.x, vector.y);
54 }
55
56 void
57 Point::rotate(double angle)
58 {
59 double cur_x = (double)this->x;
60 double cur_y = (double)this->y;
61 double s = sin(angle);
62 double c = cos(angle);
63 this->x = (coord_t)round(c * cur_x - s * cur_y);
64 this->y = (coord_t)round(c * cur_y + s * cur_x);
65 }
66
67 void
68 Point::rotate(double angle, const Point &center)
69 {
70 double cur_x = (double)this->x;
71 double cur_y = (double)this->y;
72 double s = sin(angle);
73 double c = cos(angle);
74 double dx = cur_x - (double)center.x;
75 double dy = cur_y - (double)center.y;
76 this->x = (coord_t)round( (double)center.x + c * dx - s * dy );
77 this->y = (coord_t)round( (double)center.y + c * dy + s * dx );
78 }
79
80 bool
81 Point::coincides_with_epsilon(const Point &point) const
82 {
83 return std::abs(this->x - point.x) < SCALED_EPSILON && std::abs(this->y - point.y) < SCALED_EPSILON;
84 }
85
86 int
87 Point::nearest_point_index(const Points &points) const
88 {
89 PointConstPtrs p;
90 p.reserve(points.size());
91 for (Points::const_iterator it = points.begin(); it != points.end(); ++it)
92 p.push_back(&*it);
93 return this->nearest_point_index(p);
94 }
95
96 template<typename T>
97 inline T sqr(const T x)
98 {
99 return x * x;
100 }
101
102 int
103 Point::nearest_point_index(const PointConstPtrs &points) const
104 {
105 int idx = -1;
106 double distance = -1; // double because long is limited to 2147483647 on some platforms and it's not enough
107
108 for (PointConstPtrs::const_iterator it = points.begin(); it != points.end(); ++it) {
109 /* If the X distance of the candidate is > than the total distance of the
110 best previous candidate, we know we don't want it */
111 double d = sqr<double>(this->x - (*it)->x);
112 if (distance != -1 && d > distance) continue;
113
114 /* If the Y distance of the candidate is > than the total distance of the
115 best previous candidate, we know we don't want it */
116 d += sqr<double>(this->y - (*it)->y);
117 if (distance != -1 && d > distance) continue;
118
119 idx = it - points.begin();
120 distance = d;
121
122 if (distance < EPSILON) break;
123 }
124
125 return idx;
126 }
127
128 /* This method finds the point that is closest to both this point and the supplied one */
129 size_t
130 Point::nearest_waypoint_index(const Points &points, const Point &dest) const
131 {
132 size_t idx = -1;
133 double distance = -1; // double because long is limited to 2147483647 on some platforms and it's not enough
134
135 for (Points::const_iterator p = points.begin(); p != points.end(); ++p) {
136 // distance from this to candidate
137 double d = sqr<double>(this->x - p->x) + sqr<double>(this->y - p->y);
138
139 // distance from candidate to dest
140 d += sqr<double>(p->x - dest.x) + sqr<double>(p->y - dest.y);
141
142 // if the total distance is greater than current min distance, ignore it
143 if (distance != -1 && d > distance) continue;
144
145 idx = p - points.begin();
146 distance = d;
147
148 if (distance < EPSILON) break;
149 }
150
151 return idx;
152 }
153
154 int
155 Point::nearest_point_index(const PointPtrs &points) const
156 {
157 PointConstPtrs p;
158 p.reserve(points.size());
159 for (PointPtrs::const_iterator it = points.begin(); it != points.end(); ++it)
160 p.push_back(*it);
161 return this->nearest_point_index(p);
162 }
163
164 bool
165 Point::nearest_point(const Points &points, Point* point) const
166 {
167 int idx = this->nearest_point_index(points);
168 if (idx == -1) return false;
169 *point = points.at(idx);
170 return true;
171 }
172
173 bool
174 Point::nearest_waypoint(const Points &points, const Point &dest, Point* point) const
175 {
176 int idx = this->nearest_waypoint_index(points, dest);
177 if (idx == -1) return false;
178 *point = points.at(idx);
179 return true;
180 }
181
182 double
183 Point::distance_to(const Point &point) const
184 {
185 double dx = ((double)point.x - this->x);
186 double dy = ((double)point.y - this->y);
187 return sqrt(dx*dx + dy*dy);
188 }
189
190 /* distance to the closest point of line */
191 double
192 Point::distance_to(const Line &line) const
193 {
194 const double dx = line.b.x - line.a.x;
195 const double dy = line.b.y - line.a.y;
196
197 const double l2 = dx*dx + dy*dy; // avoid a sqrt
198 if (l2 == 0.0) return this->distance_to(line.a); // line.a == line.b case
199
200 // Consider the line extending the segment, parameterized as line.a + t (line.b - line.a).
201 // We find projection of this point onto the line.
202 // It falls where t = [(this-line.a) . (line.b-line.a)] / |line.b-line.a|^2
203 const double t = ((this->x - line.a.x) * dx + (this->y - line.a.y) * dy) / l2;
204 if (t < 0.0) return this->distance_to(line.a); // beyond the 'a' end of the segment
205 else if (t > 1.0) return this->distance_to(line.b); // beyond the 'b' end of the segment
206 Point projection(
207 line.a.x + t * dx,
208 line.a.y + t * dy
209 );
210 return this->distance_to(projection);
211 }
212
213 double
214 Point::perp_distance_to(const Line &line) const
215 {
216 if (line.a.coincides_with(line.b)) return this->distance_to(line.a);
217
218 double n = (double)(line.b.x - line.a.x) * (double)(line.a.y - this->y)
219 - (double)(line.a.x - this->x) * (double)(line.b.y - line.a.y);
220
221 return std::abs(n) / line.length();
222 }
223
224 /* Three points are a counter-clockwise turn if ccw > 0, clockwise if
225 * ccw < 0, and collinear if ccw = 0 because ccw is a determinant that
226 * gives the signed area of the triangle formed by p1, p2 and this point.
227 * In other words it is the 2D cross product of p1-p2 and p1-this, i.e.
228 * z-component of their 3D cross product.
229 * We return double because it must be big enough to hold 2*max(|coordinate|)^2
230 */
231 double
232 Point::ccw(const Point &p1, const Point &p2) const
233 {
234 return (double)(p2.x - p1.x)*(double)(this->y - p1.y) - (double)(p2.y - p1.y)*(double)(this->x - p1.x);
235 }
236
237 double
238 Point::ccw(const Line &line) const
239 {
240 return this->ccw(line.a, line.b);
241 }
242
243 // returns the CCW angle between this-p1 and this-p2
244 // i.e. this assumes a CCW rotation from p1 to p2 around this
245 double
246 Point::ccw_angle(const Point &p1, const Point &p2) const
247 {
248 double angle = atan2(p1.x - this->x, p1.y - this->y)
249 - atan2(p2.x - this->x, p2.y - this->y);
250
251 // we only want to return only positive angles
252 return angle <= 0 ? angle + 2*PI : angle;
253 }
254
255 Point
256 Point::projection_onto(const MultiPoint &poly) const
257 {
258 Point running_projection = poly.first_point();
259 double running_min = this->distance_to(running_projection);
260
261 Lines lines = poly.lines();
262 for (Lines::const_iterator line = lines.begin(); line != lines.end(); ++line) {
263 Point point_temp = this->projection_onto(*line);
264 if (this->distance_to(point_temp) < running_min) {
265 running_projection = point_temp;
266 running_min = this->distance_to(running_projection);
267 }
268 }
269 return running_projection;
270 }
271
272 Point
273 Point::projection_onto(const Line &line) const
274 {
275 if (line.a.coincides_with(line.b)) return line.a;
276
277 /*
278 (Ported from VisiLibity by Karl J. Obermeyer)
279 The projection of point_temp onto the line determined by
280 line_segment_temp can be represented as an affine combination
281 expressed in the form projection of
282 Point = theta*line_segment_temp.first + (1.0-theta)*line_segment_temp.second.
283 If theta is outside the interval [0,1], then one of the Line_Segment's endpoints
284 must be closest to calling Point.
285 */
286 double lx = (double)(line.b.x - line.a.x);
287 double ly = (double)(line.b.y - line.a.y);
288 double theta = ( (double)(line.b.x - this->x)*lx + (double)(line.b.y- this->y)*ly )
289 / ( sqr<double>(lx) + sqr<double>(ly) );
290
291 if (0.0 <= theta && theta <= 1.0)
292 return theta * line.a + (1.0-theta) * line.b;
293
294 // Else pick closest endpoint.
295 if (this->distance_to(line.a) < this->distance_to(line.b)) {
296 return line.a;
297 } else {
298 return line.b;
299 }
300 }
301
302 Point
303 Point::negative() const
304 {
305 return Point(-this->x, -this->y);
306 }
307
308 Vector
309 Point::vector_to(const Point &point) const
310 {
311 return Vector(point.x - this->x, point.y - this->y);
312 }
313
314 std::ostream&
315 operator<<(std::ostream &stm, const Pointf &pointf)
316 {
317 return stm << pointf.x << "," << pointf.y;
318 }
319
320 std::string
321 Pointf::wkt() const
322 {
323 std::ostringstream ss;
324 ss << "POINT(" << this->x << " " << this->y << ")";
325 return ss.str();
326 }
327
328 std::string
329 Pointf::dump_perl() const
330 {
331 std::ostringstream ss;
332 ss << "[" << this->x << "," << this->y << "]";
333 return ss.str();
334 }
335
336 void
337 Pointf::scale(double factor)
338 {
339 this->x *= factor;
340 this->y *= factor;
341 }
342
343 void
344 Pointf::translate(double x, double y)
345 {
346 this->x += x;
347 this->y += y;
348 }
349
350 void
351 Pointf::translate(const Vectorf &vector)
352 {
353 this->translate(vector.x, vector.y);
354 }
355
356 void
357 Pointf::rotate(double angle)
358 {
359 double cur_x = this->x;
360 double cur_y = this->y;
361 double s = sin(angle);
362 double c = cos(angle);
363 this->x = c * cur_x - s * cur_y;
364 this->y = c * cur_y + s * cur_x;
365 }
366
367 void
368 Pointf::rotate(double angle, const Pointf &center)
369 {
370 double cur_x = this->x;
371 double cur_y = this->y;
372 double s = sin(angle);
373 double c = cos(angle);
374 double dx = cur_x - center.x;
375 double dy = cur_y - center.y;
376 this->x = center.x + c * dx - s * dy;
377 this->y = center.y + c * dy + s * dx;
378 }
379
380 Pointf
381 Pointf::negative() const
382 {
383 return Pointf(-this->x, -this->y);
384 }
385
386 Vectorf
387 Pointf::vector_to(const Pointf &point) const
388 {
389 return Vectorf(point.x - this->x, point.y - this->y);
390 }
391
392 void
393 Pointf3::scale(double factor)
394 {
395 Pointf::scale(factor);
396 this->z *= factor;
397 }
398
399 void
400 Pointf3::translate(const Vectorf3 &vector)
401 {
402 this->translate(vector.x, vector.y, vector.z);
403 }
404
405 void
406 Pointf3::translate(double x, double y, double z)
407 {
408 Pointf::translate(x, y);
409 this->z += z;
410 }
411
412 double
413 Pointf3::distance_to(const Pointf3 &point) const
414 {
415 double dx = ((double)point.x - this->x);
416 double dy = ((double)point.y - this->y);
417 double dz = ((double)point.z - this->z);
418 return sqrt(dx*dx + dy*dy + dz*dz);
419 }
420
421 Pointf3
422 Pointf3::negative() const
423 {
424 return Pointf3(-this->x, -this->y, -this->z);
425 }
426
427 Vectorf3
428 Pointf3::vector_to(const Pointf3 &point) const
429 {
430 return Vectorf3(point.x - this->x, point.y - this->y, point.z - this->z);
431 }
432
433 }
0 #ifndef slic3r_Point_hpp_
1 #define slic3r_Point_hpp_
2
3 #include "libslic3r.h"
4 #include <vector>
5 #include <math.h>
6 #include <string>
7 #include <sstream>
8
9 namespace Slic3r {
10
11 class Line;
12 class Linef;
13 class MultiPoint;
14 class Point;
15 class Pointf;
16 class Pointf3;
17 typedef Point Vector;
18 typedef Pointf Vectorf;
19 typedef Pointf3 Vectorf3;
20 typedef std::vector<Point> Points;
21 typedef std::vector<Point*> PointPtrs;
22 typedef std::vector<const Point*> PointConstPtrs;
23 typedef std::vector<Pointf> Pointfs;
24 typedef std::vector<Pointf3> Pointf3s;
25
26 class Point
27 {
28 public:
29 coord_t x;
30 coord_t y;
31 Point(coord_t _x = 0, coord_t _y = 0): x(_x), y(_y) {};
32 Point(int _x, int _y): x(_x), y(_y) {};
33 Point(long long _x, long long _y): x(_x), y(_y) {}; // for Clipper
34 Point(double x, double y);
35 static Point new_scale(coordf_t x, coordf_t y) {
36 return Point(scale_(x), scale_(y));
37 };
38 bool operator==(const Point& rhs) const;
39 std::string wkt() const;
40 std::string dump_perl() const;
41 void scale(double factor);
42 void translate(double x, double y);
43 void translate(const Vector &vector);
44 void rotate(double angle);
45 void rotate(double angle, const Point &center);
46 Point rotated(double angle) const { Point res(*this); res.rotate(angle); return res; }
47 Point rotated(double angle, const Point &center) const { Point res(*this); res.rotate(angle, center); return res; }
48 bool coincides_with(const Point &point) const { return this->x == point.x && this->y == point.y; }
49 bool coincides_with_epsilon(const Point &point) const;
50 int nearest_point_index(const Points &points) const;
51 int nearest_point_index(const PointConstPtrs &points) const;
52 int nearest_point_index(const PointPtrs &points) const;
53 size_t nearest_waypoint_index(const Points &points, const Point &point) const;
54 bool nearest_point(const Points &points, Point* point) const;
55 bool nearest_waypoint(const Points &points, const Point &dest, Point* point) const;
56 double distance_to(const Point &point) const;
57 double distance_to(const Line &line) const;
58 double perp_distance_to(const Line &line) const;
59 double ccw(const Point &p1, const Point &p2) const;
60 double ccw(const Line &line) const;
61 double ccw_angle(const Point &p1, const Point &p2) const;
62 Point projection_onto(const MultiPoint &poly) const;
63 Point projection_onto(const Line &line) const;
64 Point negative() const;
65 Vector vector_to(const Point &point) const;
66 };
67
68 inline Point operator+(const Point& point1, const Point& point2) { return Point(point1.x + point2.x, point1.y + point2.y); }
69 inline Point operator-(const Point& point1, const Point& point2) { return Point(point1.x - point2.x, point1.y - point2.y); }
70 inline Point operator*(double scalar, const Point& point2) { return Point(scalar * point2.x, scalar * point2.y); }
71
72 class Point3 : public Point
73 {
74 public:
75 coord_t z;
76 explicit Point3(coord_t _x = 0, coord_t _y = 0, coord_t _z = 0): Point(_x, _y), z(_z) {};
77 };
78
79 std::ostream& operator<<(std::ostream &stm, const Pointf &pointf);
80
81 class Pointf
82 {
83 public:
84 coordf_t x;
85 coordf_t y;
86 explicit Pointf(coordf_t _x = 0, coordf_t _y = 0): x(_x), y(_y) {};
87 static Pointf new_unscale(coord_t x, coord_t y) {
88 return Pointf(unscale(x), unscale(y));
89 };
90 static Pointf new_unscale(const Point &p) {
91 return Pointf(unscale(p.x), unscale(p.y));
92 };
93 std::string wkt() const;
94 std::string dump_perl() const;
95 void scale(double factor);
96 void translate(double x, double y);
97 void translate(const Vectorf &vector);
98 void rotate(double angle);
99 void rotate(double angle, const Pointf &center);
100 Pointf negative() const;
101 Vectorf vector_to(const Pointf &point) const;
102 };
103
104 inline Pointf operator+(const Pointf& point1, const Pointf& point2) { return Pointf(point1.x + point2.x, point1.y + point2.y); }
105 inline Pointf operator-(const Pointf& point1, const Pointf& point2) { return Pointf(point1.x - point2.x, point1.y - point2.y); }
106 inline Pointf operator*(double scalar, const Pointf& point2) { return Pointf(scalar * point2.x, scalar * point2.y); }
107
108 class Pointf3 : public Pointf
109 {
110 public:
111 coordf_t z;
112 explicit Pointf3(coordf_t _x = 0, coordf_t _y = 0, coordf_t _z = 0): Pointf(_x, _y), z(_z) {};
113 static Pointf3 new_unscale(coord_t x, coord_t y, coord_t z) {
114 return Pointf3(unscale(x), unscale(y), unscale(z));
115 };
116 void scale(double factor);
117 void translate(const Vectorf3 &vector);
118 void translate(double x, double y, double z);
119 double distance_to(const Pointf3 &point) const;
120 Pointf3 negative() const;
121 Vectorf3 vector_to(const Pointf3 &point) const;
122 };
123
124 }
125
126 // start Boost
127 #include <boost/version.hpp>
128 #include <boost/polygon/polygon.hpp>
129 namespace boost { namespace polygon {
130 template <>
131 struct geometry_concept<coord_t> { typedef coordinate_concept type; };
132
133 /* Boost.Polygon already defines a specialization for coordinate_traits<long> as of 1.60:
134 https://github.com/boostorg/polygon/commit/0ac7230dd1f8f34cb12b86c8bb121ae86d3d9b97 */
135 #if BOOST_VERSION < 106000
136 template <>
137 struct coordinate_traits<coord_t> {
138 typedef coord_t coordinate_type;
139 typedef long double area_type;
140 typedef long long manhattan_area_type;
141 typedef unsigned long long unsigned_area_type;
142 typedef long long coordinate_difference;
143 typedef long double coordinate_distance;
144 };
145 #endif
146
147 template <>
148 struct geometry_concept<Point> { typedef point_concept type; };
149
150 template <>
151 struct point_traits<Point> {
152 typedef coord_t coordinate_type;
153
154 static inline coordinate_type get(const Point& point, orientation_2d orient) {
155 return (orient == HORIZONTAL) ? point.x : point.y;
156 }
157 };
158
159 template <>
160 struct point_mutable_traits<Point> {
161 typedef coord_t coordinate_type;
162 static inline void set(Point& point, orientation_2d orient, coord_t value) {
163 if (orient == HORIZONTAL)
164 point.x = value;
165 else
166 point.y = value;
167 }
168 static inline Point construct(coord_t x_value, coord_t y_value) {
169 Point retval;
170 retval.x = x_value;
171 retval.y = y_value;
172 return retval;
173 }
174 };
175 } }
176 // end Boost
177
178 #endif
0 #include "BoundingBox.hpp"
1 #include "ClipperUtils.hpp"
2 #include "Polygon.hpp"
3 #include "Polyline.hpp"
4
5 namespace Slic3r {
6
7 Polygon::operator Polygons() const
8 {
9 Polygons pp;
10 pp.push_back(*this);
11 return pp;
12 }
13
14 Polygon::operator Polyline() const
15 {
16 return this->split_at_first_point();
17 }
18
19 Point&
20 Polygon::operator[](Points::size_type idx)
21 {
22 return this->points[idx];
23 }
24
25 const Point&
26 Polygon::operator[](Points::size_type idx) const
27 {
28 return this->points[idx];
29 }
30
31 Point
32 Polygon::last_point() const
33 {
34 return this->points.front(); // last point == first point for polygons
35 }
36
37 Lines Polygon::lines() const
38 {
39 return to_lines(*this);
40 }
41
42 Polyline
43 Polygon::split_at_vertex(const Point &point) const
44 {
45 // find index of point
46 for (Points::const_iterator it = this->points.begin(); it != this->points.end(); ++it) {
47 if (it->coincides_with(point)) {
48 return this->split_at_index(it - this->points.begin());
49 }
50 }
51 CONFESS("Point not found");
52 return Polyline();
53 }
54
55 // Split a closed polygon into an open polyline, with the split point duplicated at both ends.
56 Polyline
57 Polygon::split_at_index(int index) const
58 {
59 Polyline polyline;
60 polyline.points.reserve(this->points.size() + 1);
61 for (Points::const_iterator it = this->points.begin() + index; it != this->points.end(); ++it)
62 polyline.points.push_back(*it);
63 for (Points::const_iterator it = this->points.begin(); it != this->points.begin() + index + 1; ++it)
64 polyline.points.push_back(*it);
65 return polyline;
66 }
67
68 // Split a closed polygon into an open polyline, with the split point duplicated at both ends.
69 Polyline
70 Polygon::split_at_first_point() const
71 {
72 return this->split_at_index(0);
73 }
74
75 Points
76 Polygon::equally_spaced_points(double distance) const
77 {
78 return this->split_at_first_point().equally_spaced_points(distance);
79 }
80
81 /*
82 int64_t Polygon::area2x() const
83 {
84 size_t n = poly.size();
85 if (n < 3)
86 return 0;
87
88 int64_t a = 0;
89 for (size_t i = 0, j = n - 1; i < n; ++i)
90 a += int64_t(poly[j].x + poly[i].x) * int64_t(poly[j].y - poly[i].y);
91 j = i;
92 }
93 return -a * 0.5;
94 }
95 */
96
97 double Polygon::area() const
98 {
99 size_t n = points.size();
100 if (n < 3)
101 return 0.;
102
103 double a = 0.;
104 for (size_t i = 0, j = n - 1; i < n; ++i) {
105 a += double(points[j].x + points[i].x) * double(points[i].y - points[j].y);
106 j = i;
107 }
108 return 0.5 * a;
109 }
110
111 bool
112 Polygon::is_counter_clockwise() const
113 {
114 ClipperLib::Path p;
115 Slic3rMultiPoint_to_ClipperPath(*this, &p);
116 return ClipperLib::Orientation(p);
117 }
118
119 bool
120 Polygon::is_clockwise() const
121 {
122 return !this->is_counter_clockwise();
123 }
124
125 bool
126 Polygon::make_counter_clockwise()
127 {
128 if (!this->is_counter_clockwise()) {
129 this->reverse();
130 return true;
131 }
132 return false;
133 }
134
135 bool
136 Polygon::make_clockwise()
137 {
138 if (this->is_counter_clockwise()) {
139 this->reverse();
140 return true;
141 }
142 return false;
143 }
144
145 bool
146 Polygon::is_valid() const
147 {
148 return this->points.size() >= 3;
149 }
150
151 // Does an unoriented polygon contain a point?
152 // Tested by counting intersections along a horizontal line.
153 bool
154 Polygon::contains(const Point &point) const
155 {
156 // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
157 bool result = false;
158 Points::const_iterator i = this->points.begin();
159 Points::const_iterator j = this->points.end() - 1;
160 for (; i != this->points.end(); j = i++) {
161 //FIXME this test is not numerically robust. Particularly, it does not handle horizontal segments at y == point.y well.
162 // Does the ray with y == point.y intersect this line segment?
163 #if 1
164 if ( ((i->y > point.y) != (j->y > point.y))
165 && ((double)point.x < (double)(j->x - i->x) * (double)(point.y - i->y) / (double)(j->y - i->y) + (double)i->x) )
166 result = !result;
167 #else
168 if ((i->y > point.y) != (j->y > point.y)) {
169 // Orientation predicated relative to i-th point.
170 double orient = (double)(point.x - i->x) * (double)(j->y - i->y) - (double)(point.y - i->y) * (double)(j->x - i->x);
171 if ((i->y > j->y) ? (orient > 0.) : (orient < 0.))
172 result = !result;
173 }
174 #endif
175 }
176 return result;
177 }
178
179 // this only works on CCW polygons as CW will be ripped out by Clipper's simplify_polygons()
180 Polygons
181 Polygon::simplify(double tolerance) const
182 {
183 // repeat first point at the end in order to apply Douglas-Peucker
184 // on the whole polygon
185 Points points = this->points;
186 points.push_back(points.front());
187 Polygon p(MultiPoint::_douglas_peucker(points, tolerance));
188 p.points.pop_back();
189
190 Polygons pp;
191 pp.push_back(p);
192 simplify_polygons(pp, &pp);
193 return pp;
194 }
195
196 void
197 Polygon::simplify(double tolerance, Polygons &polygons) const
198 {
199 Polygons pp = this->simplify(tolerance);
200 polygons.reserve(polygons.size() + pp.size());
201 polygons.insert(polygons.end(), pp.begin(), pp.end());
202 }
203
204 // Only call this on convex polygons or it will return invalid results
205 void
206 Polygon::triangulate_convex(Polygons* polygons) const
207 {
208 for (Points::const_iterator it = this->points.begin() + 2; it != this->points.end(); ++it) {
209 Polygon p;
210 p.points.reserve(3);
211 p.points.push_back(this->points.front());
212 p.points.push_back(*(it-1));
213 p.points.push_back(*it);
214
215 // this should be replaced with a more efficient call to a merge_collinear_segments() method
216 if (p.area() > 0) polygons->push_back(p);
217 }
218 }
219
220 // center of mass
221 Point
222 Polygon::centroid() const
223 {
224 double area_temp = this->area();
225 double x_temp = 0;
226 double y_temp = 0;
227
228 Polyline polyline = this->split_at_first_point();
229 for (Points::const_iterator point = polyline.points.begin(); point != polyline.points.end() - 1; ++point) {
230 x_temp += (double)( point->x + (point+1)->x ) * ( (double)point->x*(point+1)->y - (double)(point+1)->x*point->y );
231 y_temp += (double)( point->y + (point+1)->y ) * ( (double)point->x*(point+1)->y - (double)(point+1)->x*point->y );
232 }
233
234 return Point(x_temp/(6*area_temp), y_temp/(6*area_temp));
235 }
236
237 std::string
238 Polygon::wkt() const
239 {
240 std::ostringstream wkt;
241 wkt << "POLYGON((";
242 for (Points::const_iterator p = this->points.begin(); p != this->points.end(); ++p) {
243 wkt << p->x << " " << p->y;
244 if (p != this->points.end()-1) wkt << ",";
245 }
246 wkt << "))";
247 return wkt.str();
248 }
249
250 // find all concave vertices (i.e. having an internal angle greater than the supplied angle)
251 // (external = right side, thus we consider ccw orientation)
252 Points
253 Polygon::concave_points(double angle) const
254 {
255 Points points;
256 angle = 2*PI - angle;
257
258 // check whether first point forms a concave angle
259 if (this->points.front().ccw_angle(this->points.back(), *(this->points.begin()+1)) <= angle)
260 points.push_back(this->points.front());
261
262 // check whether points 1..(n-1) form concave angles
263 for (Points::const_iterator p = this->points.begin()+1; p != this->points.end()-1; ++p) {
264 if (p->ccw_angle(*(p-1), *(p+1)) <= angle) points.push_back(*p);
265 }
266
267 // check whether last point forms a concave angle
268 if (this->points.back().ccw_angle(*(this->points.end()-2), this->points.front()) <= angle)
269 points.push_back(this->points.back());
270
271 return points;
272 }
273
274 // find all convex vertices (i.e. having an internal angle smaller than the supplied angle)
275 // (external = right side, thus we consider ccw orientation)
276 Points
277 Polygon::convex_points(double angle) const
278 {
279 Points points;
280 angle = 2*PI - angle;
281
282 // check whether first point forms a convex angle
283 if (this->points.front().ccw_angle(this->points.back(), *(this->points.begin()+1)) >= angle)
284 points.push_back(this->points.front());
285
286 // check whether points 1..(n-1) form convex angles
287 for (Points::const_iterator p = this->points.begin()+1; p != this->points.end()-1; ++p) {
288 if (p->ccw_angle(*(p-1), *(p+1)) >= angle) points.push_back(*p);
289 }
290
291 // check whether last point forms a convex angle
292 if (this->points.back().ccw_angle(*(this->points.end()-2), this->points.front()) >= angle)
293 points.push_back(this->points.back());
294
295 return points;
296 }
297
298 BoundingBox get_extents(const Polygon &poly)
299 {
300 return poly.bounding_box();
301 }
302
303 BoundingBox get_extents(const Polygons &polygons)
304 {
305 BoundingBox bb;
306 if (! polygons.empty()) {
307 bb = get_extents(polygons.front());
308 for (size_t i = 1; i < polygons.size(); ++ i)
309 bb.merge(get_extents(polygons[i]));
310 }
311 return bb;
312 }
313
314 BoundingBox get_extents_rotated(const Polygon &poly, double angle)
315 {
316 return get_extents_rotated(poly.points, angle);
317 }
318
319 BoundingBox get_extents_rotated(const Polygons &polygons, double angle)
320 {
321 BoundingBox bb;
322 if (! polygons.empty()) {
323 bb = get_extents_rotated(polygons.front().points, angle);
324 for (size_t i = 1; i < polygons.size(); ++ i)
325 bb.merge(get_extents_rotated(polygons[i].points, angle));
326 }
327 return bb;
328 }
329
330 extern std::vector<BoundingBox> get_extents_vector(const Polygons &polygons)
331 {
332 std::vector<BoundingBox> out;
333 out.reserve(polygons.size());
334 for (Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++ it)
335 out.push_back(get_extents(*it));
336 return out;
337 }
338
339 static inline bool is_stick(const Point &p1, const Point &p2, const Point &p3)
340 {
341 Point v1 = p2 - p1;
342 Point v2 = p3 - p2;
343 int64_t dir = int64_t(v1.x) * int64_t(v2.x) + int64_t(v1.y) * int64_t(v2.y);
344 if (dir > 0)
345 // p3 does not turn back to p1. Do not remove p2.
346 return false;
347 double l2_1 = double(v1.x) * double(v1.x) + double(v1.y) * double(v1.y);
348 double l2_2 = double(v2.x) * double(v2.x) + double(v2.y) * double(v2.y);
349 if (dir == 0)
350 // p1, p2, p3 may make a perpendicular corner, or there is a zero edge length.
351 // Remove p2 if it is coincident with p1 or p2.
352 return l2_1 == 0 || l2_2 == 0;
353 // p3 turns back to p1 after p2. Are p1, p2, p3 collinear?
354 // Calculate distance from p3 to a segment (p1, p2) or from p1 to a segment(p2, p3),
355 // whichever segment is longer
356 double cross = double(v1.x) * double(v2.y) - double(v2.x) * double(v1.y);
357 double dist2 = cross * cross / std::max(l2_1, l2_2);
358 return dist2 < EPSILON * EPSILON;
359 }
360
361 bool remove_sticks(Polygon &poly)
362 {
363 bool modified = false;
364 size_t j = 1;
365 for (size_t i = 1; i + 1 < poly.points.size(); ++ i) {
366 if (! is_stick(poly[j-1], poly[i], poly[i+1])) {
367 // Keep the point.
368 if (j < i)
369 poly.points[j] = poly.points[i];
370 ++ j;
371 }
372 }
373 if (++ j < poly.points.size()) {
374 poly.points[j-1] = poly.points.back();
375 poly.points.erase(poly.points.begin() + j, poly.points.end());
376 modified = true;
377 }
378 while (poly.points.size() >= 3 && is_stick(poly.points[poly.points.size()-2], poly.points.back(), poly.points.front())) {
379 poly.points.pop_back();
380 modified = true;
381 }
382 while (poly.points.size() >= 3 && is_stick(poly.points.back(), poly.points.front(), poly.points[1]))
383 poly.points.erase(poly.points.begin());
384 return modified;
385 }
386
387 bool remove_sticks(Polygons &polys)
388 {
389 bool modified = false;
390 size_t j = 0;
391 for (size_t i = 0; i < polys.size(); ++ i) {
392 modified |= remove_sticks(polys[i]);
393 if (polys[i].points.size() >= 3) {
394 if (j < i)
395 std::swap(polys[i].points, polys[j].points);
396 ++ j;
397 }
398 }
399 if (j < polys.size())
400 polys.erase(polys.begin() + j, polys.end());
401 return modified;
402 }
403
404 bool remove_degenerate(Polygons &polys)
405 {
406 bool modified = false;
407 size_t j = 0;
408 for (size_t i = 0; i < polys.size(); ++ i) {
409 if (polys[i].points.size() >= 3) {
410 if (j < i)
411 std::swap(polys[i].points, polys[j].points);
412 ++ j;
413 } else
414 modified = true;
415 }
416 if (j < polys.size())
417 polys.erase(polys.begin() + j, polys.end());
418 return modified;
419 }
420
421 bool remove_small(Polygons &polys, double min_area)
422 {
423 bool modified = false;
424 size_t j = 0;
425 for (size_t i = 0; i < polys.size(); ++ i) {
426 if (std::abs(polys[i].area()) >= min_area) {
427 if (j < i)
428 std::swap(polys[i].points, polys[j].points);
429 ++ j;
430 } else
431 modified = true;
432 }
433 if (j < polys.size())
434 polys.erase(polys.begin() + j, polys.end());
435 return modified;
436 }
437
438 }
0 #ifndef slic3r_Polygon_hpp_
1 #define slic3r_Polygon_hpp_
2
3 #include "libslic3r.h"
4 #include <vector>
5 #include <string>
6 #include "Line.hpp"
7 #include "MultiPoint.hpp"
8 #include "Polyline.hpp"
9
10 namespace Slic3r {
11
12 class Polygon;
13 typedef std::vector<Polygon> Polygons;
14
15 class Polygon : public MultiPoint {
16 public:
17 operator Polygons() const;
18 operator Polyline() const;
19 Point& operator[](Points::size_type idx);
20 const Point& operator[](Points::size_type idx) const;
21
22 Polygon() {};
23 explicit Polygon(const Points &points): MultiPoint(points) {};
24 Point last_point() const;
25 virtual Lines lines() const;
26 Polyline split_at_vertex(const Point &point) const;
27 // Split a closed polygon into an open polyline, with the split point duplicated at both ends.
28 Polyline split_at_index(int index) const;
29 // Split a closed polygon into an open polyline, with the split point duplicated at both ends.
30 Polyline split_at_first_point() const;
31 Points equally_spaced_points(double distance) const;
32 double area() const;
33 bool is_counter_clockwise() const;
34 bool is_clockwise() const;
35 bool make_counter_clockwise();
36 bool make_clockwise();
37 bool is_valid() const;
38 // Does an unoriented polygon contain a point?
39 // Tested by counting intersections along a horizontal line.
40 bool contains(const Point &point) const;
41 Polygons simplify(double tolerance) const;
42 void simplify(double tolerance, Polygons &polygons) const;
43 void triangulate_convex(Polygons* polygons) const;
44 Point centroid() const;
45 std::string wkt() const;
46 Points concave_points(double angle = PI) const;
47 Points convex_points(double angle = PI) const;
48 };
49
50 extern BoundingBox get_extents(const Polygon &poly);
51 extern BoundingBox get_extents(const Polygons &polygons);
52 extern BoundingBox get_extents_rotated(const Polygon &poly, double angle);
53 extern BoundingBox get_extents_rotated(const Polygons &polygons, double angle);
54 extern std::vector<BoundingBox> get_extents_vector(const Polygons &polygons);
55
56 // Remove sticks (tentacles with zero area) from the polygon.
57 extern bool remove_sticks(Polygon &poly);
58 extern bool remove_sticks(Polygons &polys);
59
60 // Remove polygons with less than 3 edges.
61 extern bool remove_degenerate(Polygons &polys);
62 extern bool remove_small(Polygons &polys, double min_area);
63
64 // Append a vector of polygons at the end of another vector of polygons.
65 inline void polygons_append(Polygons &dst, const Polygons &src) { dst.insert(dst.end(), src.begin(), src.end()); }
66 #if SLIC3R_CPPVER >= 11
67 inline void polygons_append(Polygons &dst, Polygons &&src)
68 {
69 if (dst.empty())
70 dst = std::move(src);
71 else
72 std::move(std::begin(src), std::end(src), std::back_inserter(dst));
73 }
74 #endif
75
76 inline void polygons_rotate(Polygons &polys, double angle)
77 {
78 for (Polygons::iterator p = polys.begin(); p != polys.end(); ++p)
79 p->rotate(angle);
80 }
81
82 inline Lines to_lines(const Polygon &poly)
83 {
84 Lines lines;
85 lines.reserve(poly.points.size());
86 for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it)
87 lines.push_back(Line(*it, *(it + 1)));
88 lines.push_back(Line(poly.points.back(), poly.points.front()));
89 return lines;
90 }
91
92 inline Lines to_lines(const Polygons &polys)
93 {
94 size_t n_lines = 0;
95 for (size_t i = 0; i < polys.size(); ++ i)
96 n_lines += polys[i].points.size();
97 Lines lines;
98 lines.reserve(n_lines);
99 for (size_t i = 0; i < polys.size(); ++ i) {
100 const Polygon &poly = polys[i];
101 for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it)
102 lines.push_back(Line(*it, *(it + 1)));
103 lines.push_back(Line(poly.points.back(), poly.points.front()));
104 }
105 return lines;
106 }
107
108 inline Polylines to_polylines(const Polygons &polys)
109 {
110 Polylines polylines;
111 polylines.assign(polys.size(), Polyline());
112 size_t idx = 0;
113 for (Polygons::const_iterator it = polys.begin(); it != polys.end(); ++ it) {
114 Polyline &pl = polylines[idx ++];
115 pl.points = it->points;
116 pl.points.push_back(it->points.front());
117 }
118 assert(idx == polylines.size());
119 return polylines;
120 }
121
122 #if SLIC3R_CPPVER >= 11
123 inline Polylines to_polylines(Polygons &&polys)
124 {
125 Polylines polylines;
126 polylines.assign(polys.size(), Polyline());
127 size_t idx = 0;
128 for (Polygons::const_iterator it = polys.begin(); it != polys.end(); ++ it) {
129 Polyline &pl = polylines[idx ++];
130 pl.points = std::move(it->points);
131 pl.points.push_back(it->points.front());
132 }
133 assert(idx == polylines.size());
134 return polylines;
135 }
136 #endif
137
138 } // Slic3r
139
140 // start Boost
141 #include <boost/polygon/polygon.hpp>
142 namespace boost { namespace polygon {
143 template <>
144 struct geometry_concept<Polygon>{ typedef polygon_concept type; };
145
146 template <>
147 struct polygon_traits<Polygon> {
148 typedef coord_t coordinate_type;
149 typedef Points::const_iterator iterator_type;
150 typedef Point point_type;
151
152 // Get the begin iterator
153 static inline iterator_type begin_points(const Polygon& t) {
154 return t.points.begin();
155 }
156
157 // Get the end iterator
158 static inline iterator_type end_points(const Polygon& t) {
159 return t.points.end();
160 }
161
162 // Get the number of sides of the polygon
163 static inline std::size_t size(const Polygon& t) {
164 return t.points.size();
165 }
166
167 // Get the winding direction of the polygon
168 static inline winding_direction winding(const Polygon& t) {
169 return unknown_winding;
170 }
171 };
172
173 template <>
174 struct polygon_mutable_traits<Polygon> {
175 // expects stl style iterators
176 template <typename iT>
177 static inline Polygon& set_points(Polygon& polygon, iT input_begin, iT input_end) {
178 polygon.points.clear();
179 while (input_begin != input_end) {
180 polygon.points.push_back(Point());
181 boost::polygon::assign(polygon.points.back(), *input_begin);
182 ++input_begin;
183 }
184 // skip last point since Boost will set last point = first point
185 polygon.points.pop_back();
186 return polygon;
187 }
188 };
189
190 template <>
191 struct geometry_concept<Polygons> { typedef polygon_set_concept type; };
192
193 //next we map to the concept through traits
194 template <>
195 struct polygon_set_traits<Polygons> {
196 typedef coord_t coordinate_type;
197 typedef Polygons::const_iterator iterator_type;
198 typedef Polygons operator_arg_type;
199
200 static inline iterator_type begin(const Polygons& polygon_set) {
201 return polygon_set.begin();
202 }
203
204 static inline iterator_type end(const Polygons& polygon_set) {
205 return polygon_set.end();
206 }
207
208 //don't worry about these, just return false from them
209 static inline bool clean(const Polygons& polygon_set) { return false; }
210 static inline bool sorted(const Polygons& polygon_set) { return false; }
211 };
212
213 template <>
214 struct polygon_set_mutable_traits<Polygons> {
215 template <typename input_iterator_type>
216 static inline void set(Polygons& polygons, input_iterator_type input_begin, input_iterator_type input_end) {
217 polygons.assign(input_begin, input_end);
218 }
219 };
220 } }
221 // end Boost
222
223 #endif
0 #include "BoundingBox.hpp"
1 #include "Polyline.hpp"
2 #include "ExPolygon.hpp"
3 #include "ExPolygonCollection.hpp"
4 #include "Line.hpp"
5 #include "Polygon.hpp"
6 #include <iostream>
7 #include <utility>
8
9 namespace Slic3r {
10
11 Polyline::operator Polylines() const
12 {
13 Polylines polylines;
14 polylines.push_back(*this);
15 return polylines;
16 }
17
18 Polyline::operator Line() const
19 {
20 if (this->points.size() > 2) CONFESS("Can't convert polyline with more than two points to a line");
21 return Line(this->points.front(), this->points.back());
22 }
23
24 Point
25 Polyline::last_point() const
26 {
27 return this->points.back();
28 }
29
30 Point
31 Polyline::leftmost_point() const
32 {
33 Point p = this->points.front();
34 for (Points::const_iterator it = this->points.begin() + 1; it != this->points.end(); ++it) {
35 if (it->x < p.x) p = *it;
36 }
37 return p;
38 }
39
40 Lines
41 Polyline::lines() const
42 {
43 Lines lines;
44 if (this->points.size() >= 2) {
45 lines.reserve(this->points.size() - 1);
46 for (Points::const_iterator it = this->points.begin(); it != this->points.end()-1; ++it) {
47 lines.push_back(Line(*it, *(it + 1)));
48 }
49 }
50 return lines;
51 }
52
53 // removes the given distance from the end of the polyline
54 void
55 Polyline::clip_end(double distance)
56 {
57 while (distance > 0) {
58 Point last_point = this->last_point();
59 this->points.pop_back();
60 if (this->points.empty()) break;
61
62 double last_segment_length = last_point.distance_to(this->last_point());
63 if (last_segment_length <= distance) {
64 distance -= last_segment_length;
65 continue;
66 }
67
68 Line segment(last_point, this->last_point());
69 this->points.push_back(segment.point_at(distance));
70 distance = 0;
71 }
72 }
73
74 // removes the given distance from the start of the polyline
75 void
76 Polyline::clip_start(double distance)
77 {
78 this->reverse();
79 this->clip_end(distance);
80 if (this->points.size() >= 2) this->reverse();
81 }
82
83 void
84 Polyline::extend_end(double distance)
85 {
86 // relocate last point by extending the last segment by the specified length
87 Line line(
88 this->points.back(),
89 *(this->points.end() - 2)
90 );
91 this->points.back() = line.point_at(-distance);
92 }
93
94 void
95 Polyline::extend_start(double distance)
96 {
97 // relocate first point by extending the first segment by the specified length
98 this->points.front() = Line(this->points.front(), this->points[1]).point_at(-distance);
99 }
100
101 /* this method returns a collection of points picked on the polygon contour
102 so that they are evenly spaced according to the input distance */
103 Points
104 Polyline::equally_spaced_points(double distance) const
105 {
106 Points points;
107 points.push_back(this->first_point());
108 double len = 0;
109
110 for (Points::const_iterator it = this->points.begin() + 1; it != this->points.end(); ++it) {
111 double segment_length = it->distance_to(*(it-1));
112 len += segment_length;
113 if (len < distance) continue;
114
115 if (len == distance) {
116 points.push_back(*it);
117 len = 0;
118 continue;
119 }
120
121 double take = segment_length - (len - distance); // how much we take of this segment
122 Line segment(*(it-1), *it);
123 points.push_back(segment.point_at(take));
124 --it;
125 len = -take;
126 }
127 return points;
128 }
129
130 void
131 Polyline::simplify(double tolerance)
132 {
133 this->points = MultiPoint::_douglas_peucker(this->points, tolerance);
134 }
135
136 /* This method simplifies all *lines* contained in the supplied area */
137 template <class T>
138 void
139 Polyline::simplify_by_visibility(const T &area)
140 {
141 Points &pp = this->points;
142
143 size_t s = 0;
144 bool did_erase = false;
145 for (size_t i = s+2; i < pp.size(); i = s + 2) {
146 if (area.contains(Line(pp[s], pp[i]))) {
147 pp.erase(pp.begin() + s + 1, pp.begin() + i);
148 did_erase = true;
149 } else {
150 ++s;
151 }
152 }
153 if (did_erase)
154 this->simplify_by_visibility(area);
155 }
156 template void Polyline::simplify_by_visibility<ExPolygon>(const ExPolygon &area);
157 template void Polyline::simplify_by_visibility<ExPolygonCollection>(const ExPolygonCollection &area);
158
159 void
160 Polyline::split_at(const Point &point, Polyline* p1, Polyline* p2) const
161 {
162 if (this->points.empty()) return;
163
164 // find the line to split at
165 size_t line_idx = 0;
166 Point p = this->first_point();
167 double min = point.distance_to(p);
168 Lines lines = this->lines();
169 for (Lines::const_iterator line = lines.begin(); line != lines.end(); ++line) {
170 Point p_tmp = point.projection_onto(*line);
171 if (point.distance_to(p_tmp) < min) {
172 p = p_tmp;
173 min = point.distance_to(p);
174 line_idx = line - lines.begin();
175 }
176 }
177
178 // create first half
179 p1->points.clear();
180 for (Lines::const_iterator line = lines.begin(); line != lines.begin() + line_idx + 1; ++line) {
181 if (!line->a.coincides_with(p)) p1->points.push_back(line->a);
182 }
183 // we add point instead of p because they might differ because of numerical issues
184 // and caller might want to rely on point belonging to result polylines
185 p1->points.push_back(point);
186
187 // create second half
188 p2->points.clear();
189 p2->points.push_back(point);
190 for (Lines::const_iterator line = lines.begin() + line_idx; line != lines.end(); ++line) {
191 p2->points.push_back(line->b);
192 }
193 }
194
195 bool
196 Polyline::is_straight() const
197 {
198 /* Check that each segment's direction is equal to the line connecting
199 first point and last point. (Checking each line against the previous
200 one would cause the error to accumulate.) */
201 double dir = Line(this->first_point(), this->last_point()).direction();
202
203 Lines lines = this->lines();
204 for (Lines::const_iterator line = lines.begin(); line != lines.end(); ++line) {
205 if (!line->parallel_to(dir)) return false;
206 }
207 return true;
208 }
209
210 std::string
211 Polyline::wkt() const
212 {
213 std::ostringstream wkt;
214 wkt << "LINESTRING((";
215 for (Points::const_iterator p = this->points.begin(); p != this->points.end(); ++p) {
216 wkt << p->x << " " << p->y;
217 if (p != this->points.end()-1) wkt << ",";
218 }
219 wkt << "))";
220 return wkt.str();
221 }
222
223 BoundingBox get_extents(const Polyline &polyline)
224 {
225 return polyline.bounding_box();
226 }
227
228 BoundingBox get_extents(const Polylines &polylines)
229 {
230 BoundingBox bb;
231 if (! polylines.empty()) {
232 bb = polylines.front().bounding_box();
233 for (size_t i = 1; i < polylines.size(); ++ i)
234 bb.merge(polylines[i]);
235 }
236 return bb;
237 }
238
239 ThickLines
240 ThickPolyline::thicklines() const
241 {
242 ThickLines lines;
243 if (this->points.size() >= 2) {
244 lines.reserve(this->points.size() - 1);
245 for (size_t i = 0; i < this->points.size()-1; ++i) {
246 ThickLine line(this->points[i], this->points[i+1]);
247 line.a_width = this->width[2*i];
248 line.b_width = this->width[2*i+1];
249 lines.push_back(line);
250 }
251 }
252 return lines;
253 }
254
255 void
256 ThickPolyline::reverse()
257 {
258 Polyline::reverse();
259 std::reverse(this->width.begin(), this->width.end());
260 std::swap(this->endpoints.first, this->endpoints.second);
261 }
262
263 }
0 #ifndef slic3r_Polyline_hpp_
1 #define slic3r_Polyline_hpp_
2
3 #include "libslic3r.h"
4 #include "Line.hpp"
5 #include "MultiPoint.hpp"
6 #include <string>
7 #include <vector>
8
9 namespace Slic3r {
10
11 class Polyline;
12 class ThickPolyline;
13 typedef std::vector<Polyline> Polylines;
14 typedef std::vector<ThickPolyline> ThickPolylines;
15
16 class Polyline : public MultiPoint {
17 public:
18 operator Polylines() const;
19 operator Line() const;
20 Point last_point() const;
21 Point leftmost_point() const;
22 virtual Lines lines() const;
23 void clip_end(double distance);
24 void clip_start(double distance);
25 void extend_end(double distance);
26 void extend_start(double distance);
27 Points equally_spaced_points(double distance) const;
28 void simplify(double tolerance);
29 template <class T> void simplify_by_visibility(const T &area);
30 void split_at(const Point &point, Polyline* p1, Polyline* p2) const;
31 bool is_straight() const;
32 std::string wkt() const;
33 };
34
35 extern BoundingBox get_extents(const Polyline &polyline);
36 extern BoundingBox get_extents(const Polylines &polylines);
37
38 inline Lines to_lines(const Polyline &poly)
39 {
40 Lines lines;
41 if (poly.points.size() >= 2) {
42 lines.reserve(poly.points.size() - 1);
43 for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it)
44 lines.push_back(Line(*it, *(it + 1)));
45 }
46 return lines;
47 }
48
49 inline Lines to_lines(const Polylines &polys)
50 {
51 size_t n_lines = 0;
52 for (size_t i = 0; i < polys.size(); ++ i)
53 if (polys[i].points.size() > 1)
54 n_lines += polys[i].points.size() - 1;
55 Lines lines;
56 lines.reserve(n_lines);
57 for (size_t i = 0; i < polys.size(); ++ i) {
58 const Polyline &poly = polys[i];
59 for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it)
60 lines.push_back(Line(*it, *(it + 1)));
61 }
62 return lines;
63 }
64
65 class ThickPolyline : public Polyline {
66 public:
67 std::vector<coordf_t> width;
68 std::pair<bool,bool> endpoints;
69 ThickPolyline() : endpoints(std::make_pair(false, false)) {};
70 ThickLines thicklines() const;
71 void reverse();
72 };
73
74 }
75
76 #endif
0 #include "PolylineCollection.hpp"
1
2 namespace Slic3r {
3
4 struct Chaining
5 {
6 Point first;
7 Point last;
8 size_t idx;
9 };
10
11 #ifndef sqr
12 template<typename T>
13 inline T sqr(T x) { return x * x; }
14 #endif /* sqr */
15
16 template<typename T>
17 inline int nearest_point_index(const std::vector<Chaining> &pairs, const Point &start_near, bool no_reverse)
18 {
19 T dmin = std::numeric_limits<T>::max();
20 int idx = 0;
21 for (std::vector<Chaining>::const_iterator it = pairs.begin(); it != pairs.end(); ++it) {
22 T d = sqr(T(start_near.x - it->first.x));
23 if (d <= dmin) {
24 d += sqr(T(start_near.y - it->first.y));
25 if (d < dmin) {
26 idx = (it - pairs.begin()) * 2;
27 dmin = d;
28 if (dmin < EPSILON)
29 break;
30 }
31 }
32 if (! no_reverse) {
33 d = sqr(T(start_near.x - it->last.x));
34 if (d <= dmin) {
35 d += sqr(T(start_near.y - it->last.y));
36 if (d < dmin) {
37 idx = (it - pairs.begin()) * 2 + 1;
38 dmin = d;
39 if (dmin < EPSILON)
40 break;
41 }
42 }
43 }
44 }
45 return idx;
46 }
47
48 Polylines PolylineCollection::_chained_path_from(
49 const Polylines &src,
50 Point start_near,
51 bool no_reverse
52 #if SLIC3R_CPPVER >= 11
53 , bool move_from_src
54 #endif
55 )
56 {
57 std::vector<Chaining> endpoints;
58 endpoints.reserve(src.size());
59 for (size_t i = 0; i < src.size(); ++ i) {
60 Chaining c;
61 c.first = src[i].first_point();
62 if (! no_reverse)
63 c.last = src[i].last_point();
64 c.idx = i;
65 endpoints.push_back(c);
66 }
67 Polylines retval;
68 while (! endpoints.empty()) {
69 // find nearest point
70 int endpoint_index = nearest_point_index<double>(endpoints, start_near, no_reverse);
71 assert(endpoint_index >= 0 && endpoint_index < endpoints.size() * 2);
72 #if SLIC3R_CPPVER > 11
73 if (move_from_src) {
74 retval.push_back(std::move(src[endpoints[endpoint_index/2].idx]));
75 } else {
76 retval.push_back(src[endpoints[endpoint_index/2].idx]);
77 }
78 #else
79 retval.push_back(src[endpoints[endpoint_index/2].idx]);
80 #endif
81 if (endpoint_index & 1)
82 retval.back().reverse();
83 endpoints.erase(endpoints.begin() + endpoint_index/2);
84 start_near = retval.back().last_point();
85 }
86 return retval;
87 }
88
89 #if SLIC3R_CPPVER >= 11
90 Polylines PolylineCollection::chained_path(Polylines &&src, bool no_reverse)
91 {
92 return (src.empty() || src.front().points.empty()) ?
93 Polylines() :
94 _chained_path_from(src, src.front().first_point(), no_reverse, true);
95 }
96
97 Polylines PolylineCollection::chained_path_from(Polylines &&src, Point start_near, bool no_reverse)
98 {
99 return _chained_path_from(src, start_near, no_reverse, true);
100 }
101 #endif
102
103 Polylines PolylineCollection::chained_path(const Polylines &src, bool no_reverse)
104 {
105 return (src.empty() || src.front().points.empty()) ?
106 Polylines() :
107 _chained_path_from(src, src.front().first_point(), no_reverse
108 #if SLIC3R_CPPVER >= 11
109 , false
110 #endif
111 );
112 }
113
114 Polylines PolylineCollection::chained_path_from(const Polylines &src, Point start_near, bool no_reverse)
115 {
116 return _chained_path_from(src, start_near, no_reverse
117 #if SLIC3R_CPPVER >= 11
118 , false
119 #endif
120 );
121 }
122
123 Point PolylineCollection::leftmost_point(const Polylines &polylines)
124 {
125 if (polylines.empty()) CONFESS("leftmost_point() called on empty PolylineCollection");
126 Polylines::const_iterator it = polylines.begin();
127 Point p = it->leftmost_point();
128 for (++ it; it != polylines.end(); ++it) {
129 Point p2 = it->leftmost_point();
130 if (p2.x < p.x)
131 p = p2;
132 }
133 return p;
134 }
135
136 void
137 PolylineCollection::append(const Polylines &pp)
138 {
139 this->polylines.insert(this->polylines.end(), pp.begin(), pp.end());
140 }
141
142 } // namespace Slic3r
0 #ifndef slic3r_PolylineCollection_hpp_
1 #define slic3r_PolylineCollection_hpp_
2
3 #include "libslic3r.h"
4 #include "Polyline.hpp"
5
6 namespace Slic3r {
7
8 class PolylineCollection
9 {
10 static Polylines _chained_path_from(
11 const Polylines &src,
12 Point start_near,
13 bool no_reverse
14 #if SLIC3R_CPPVER >= 11
15 , bool move_from_src
16 #endif
17 );
18
19 public:
20 Polylines polylines;
21 void chained_path(PolylineCollection* retval, bool no_reverse = false) const
22 { retval->polylines = chained_path(this->polylines, no_reverse); }
23 void chained_path_from(Point start_near, PolylineCollection* retval, bool no_reverse = false) const
24 { retval->polylines = chained_path_from(this->polylines, start_near, no_reverse); }
25 Point leftmost_point() const
26 { return leftmost_point(polylines); }
27 void append(const Polylines &polylines);
28
29 static Point leftmost_point(const Polylines &polylines);
30 #if SLIC3R_CPPVER >= 11
31 static Polylines chained_path(Polylines &&src, bool no_reverse = false);
32 static Polylines chained_path_from(Polylines &&src, Point start_near, bool no_reverse = false);
33 #endif
34 static Polylines chained_path(const Polylines &src, bool no_reverse = false);
35 static Polylines chained_path_from(const Polylines &src, Point start_near, bool no_reverse = false);
36 };
37
38 }
39
40 #endif
0 #include "Print.hpp"
1 #include "BoundingBox.hpp"
2 #include "ClipperUtils.hpp"
3 #include "Flow.hpp"
4 #include "Geometry.hpp"
5 #include "SupportMaterial.hpp"
6 #include <algorithm>
7
8 namespace Slic3r {
9
10 template <class StepClass>
11 bool
12 PrintState<StepClass>::is_started(StepClass step) const
13 {
14 return this->started.find(step) != this->started.end();
15 }
16
17 template <class StepClass>
18 bool
19 PrintState<StepClass>::is_done(StepClass step) const
20 {
21 return this->done.find(step) != this->done.end();
22 }
23
24 template <class StepClass>
25 void
26 PrintState<StepClass>::set_started(StepClass step)
27 {
28 this->started.insert(step);
29 }
30
31 template <class StepClass>
32 void
33 PrintState<StepClass>::set_done(StepClass step)
34 {
35 this->done.insert(step);
36 }
37
38 template <class StepClass>
39 bool
40 PrintState<StepClass>::invalidate(StepClass step)
41 {
42 bool invalidated = this->started.erase(step) > 0;
43 this->done.erase(step);
44 return invalidated;
45 }
46
47 template class PrintState<PrintStep>;
48 template class PrintState<PrintObjectStep>;
49
50
51 Print::Print()
52 : total_used_filament(0),
53 total_extruded_volume(0)
54 {
55 }
56
57 Print::~Print()
58 {
59 clear_objects();
60 clear_regions();
61 }
62
63 void
64 Print::clear_objects()
65 {
66 for (int i = this->objects.size()-1; i >= 0; --i)
67 this->delete_object(i);
68
69 this->clear_regions();
70 }
71
72 PrintObject*
73 Print::get_object(size_t idx)
74 {
75 return objects.at(idx);
76 }
77
78 void
79 Print::delete_object(size_t idx)
80 {
81 PrintObjectPtrs::iterator i = this->objects.begin() + idx;
82
83 // before deleting object, invalidate all of its steps in order to
84 // invalidate all of the dependent ones in Print
85 (*i)->invalidate_all_steps();
86
87 // destroy object and remove it from our container
88 delete *i;
89 this->objects.erase(i);
90
91 // TODO: purge unused regions
92 }
93
94 void
95 Print::reload_object(size_t idx)
96 {
97 /* TODO: this method should check whether the per-object config and per-material configs
98 have changed in such a way that regions need to be rearranged or we can just apply
99 the diff and invalidate something. Same logic as apply_config()
100 For now we just re-add all objects since we haven't implemented this incremental logic yet.
101 This should also check whether object volumes (parts) have changed. */
102
103 // collect all current model objects
104 ModelObjectPtrs model_objects;
105 FOREACH_OBJECT(this, object) {
106 model_objects.push_back((*object)->model_object());
107 }
108
109 // remove our print objects
110 this->clear_objects();
111
112 // re-add model objects
113 for (ModelObjectPtrs::iterator it = model_objects.begin(); it != model_objects.end(); ++it) {
114 this->add_model_object(*it);
115 }
116 }
117
118 bool
119 Print::reload_model_instances()
120 {
121 bool invalidated = false;
122 FOREACH_OBJECT(this, object) {
123 if ((*object)->reload_model_instances()) invalidated = true;
124 }
125 return invalidated;
126 }
127
128 void
129 Print::clear_regions()
130 {
131 for (int i = this->regions.size()-1; i >= 0; --i)
132 this->delete_region(i);
133 }
134
135 PrintRegion*
136 Print::get_region(size_t idx)
137 {
138 return regions.at(idx);
139 }
140
141 PrintRegion*
142 Print::add_region()
143 {
144 PrintRegion *region = new PrintRegion(this);
145 regions.push_back(region);
146 return region;
147 }
148
149 void
150 Print::delete_region(size_t idx)
151 {
152 PrintRegionPtrs::iterator i = this->regions.begin() + idx;
153 delete *i;
154 this->regions.erase(i);
155 }
156
157 bool
158 Print::invalidate_state_by_config_options(const std::vector<t_config_option_key> &opt_keys)
159 {
160 std::set<PrintStep> steps;
161 std::set<PrintObjectStep> osteps;
162
163 // this method only accepts PrintConfig option keys
164 for (std::vector<t_config_option_key>::const_iterator opt_key = opt_keys.begin(); opt_key != opt_keys.end(); ++opt_key) {
165 if (*opt_key == "skirts"
166 || *opt_key == "skirt_height"
167 || *opt_key == "skirt_distance"
168 || *opt_key == "min_skirt_length"
169 || *opt_key == "ooze_prevention") {
170 steps.insert(psSkirt);
171 } else if (*opt_key == "brim_width") {
172 steps.insert(psBrim);
173 steps.insert(psSkirt);
174 } else if (*opt_key == "nozzle_diameter"
175 || *opt_key == "resolution") {
176 osteps.insert(posSlice);
177 } else if (*opt_key == "avoid_crossing_perimeters"
178 || *opt_key == "bed_shape"
179 || *opt_key == "bed_temperature"
180 || *opt_key == "bridge_acceleration"
181 || *opt_key == "bridge_fan_speed"
182 || *opt_key == "complete_objects"
183 || *opt_key == "cooling"
184 || *opt_key == "default_acceleration"
185 || *opt_key == "disable_fan_first_layers"
186 || *opt_key == "duplicate_distance"
187 || *opt_key == "end_gcode"
188 || *opt_key == "extruder_clearance_height"
189 || *opt_key == "extruder_clearance_radius"
190 || *opt_key == "extruder_offset"
191 || *opt_key == "extrusion_axis"
192 || *opt_key == "extrusion_multiplier"
193 || *opt_key == "fan_always_on"
194 || *opt_key == "fan_below_layer_time"
195 || *opt_key == "filament_diameter"
196 || *opt_key == "first_layer_acceleration"
197 || *opt_key == "first_layer_bed_temperature"
198 || *opt_key == "first_layer_speed"
199 || *opt_key == "first_layer_temperature"
200 || *opt_key == "gcode_arcs"
201 || *opt_key == "gcode_comments"
202 || *opt_key == "gcode_flavor"
203 || *opt_key == "infill_acceleration"
204 || *opt_key == "infill_first"
205 || *opt_key == "layer_gcode"
206 || *opt_key == "min_fan_speed"
207 || *opt_key == "max_fan_speed"
208 || *opt_key == "min_print_speed"
209 || *opt_key == "notes"
210 || *opt_key == "only_retract_when_crossing_perimeters"
211 || *opt_key == "output_filename_format"
212 || *opt_key == "perimeter_acceleration"
213 || *opt_key == "post_process"
214 || *opt_key == "pressure_advance"
215 || *opt_key == "retract_before_travel"
216 || *opt_key == "retract_layer_change"
217 || *opt_key == "retract_length"
218 || *opt_key == "retract_length_toolchange"
219 || *opt_key == "retract_lift"
220 || *opt_key == "retract_lift_above"
221 || *opt_key == "retract_lift_below"
222 || *opt_key == "retract_restart_extra"
223 || *opt_key == "retract_restart_extra_toolchange"
224 || *opt_key == "retract_speed"
225 || *opt_key == "slowdown_below_layer_time"
226 || *opt_key == "spiral_vase"
227 || *opt_key == "standby_temperature_delta"
228 || *opt_key == "start_gcode"
229 || *opt_key == "temperature"
230 || *opt_key == "threads"
231 || *opt_key == "toolchange_gcode"
232 || *opt_key == "travel_speed"
233 || *opt_key == "use_firmware_retraction"
234 || *opt_key == "use_relative_e_distances"
235 || *opt_key == "wipe"
236 || *opt_key == "z_offset"
237 || *opt_key == "max_volumetric_extrusion_rate_slope_negative"
238 || *opt_key == "max_volumetric_extrusion_rate_slope_positive") {
239 // these options only affect G-code export, so nothing to invalidate
240 } else if (*opt_key == "first_layer_extrusion_width") {
241 osteps.insert(posPerimeters);
242 osteps.insert(posInfill);
243 osteps.insert(posSupportMaterial);
244 steps.insert(psSkirt);
245 steps.insert(psBrim);
246 } else {
247 // for legacy, if we can't handle this option let's invalidate all steps
248 return this->invalidate_all_steps();
249 }
250 }
251
252 bool invalidated = false;
253 for (std::set<PrintStep>::const_iterator step = steps.begin(); step != steps.end(); ++step) {
254 if (this->invalidate_step(*step)) invalidated = true;
255 }
256 for (std::set<PrintObjectStep>::const_iterator ostep = osteps.begin(); ostep != osteps.end(); ++ostep) {
257 FOREACH_OBJECT(this, object) {
258 if ((*object)->invalidate_step(*ostep)) invalidated = true;
259 }
260 }
261
262 return invalidated;
263 }
264
265 bool
266 Print::invalidate_step(PrintStep step)
267 {
268 bool invalidated = this->state.invalidate(step);
269
270 // propagate to dependent steps
271 if (step == psSkirt) {
272 this->invalidate_step(psBrim);
273 }
274
275 return invalidated;
276 }
277
278 bool
279 Print::invalidate_all_steps()
280 {
281 // make a copy because when invalidating steps the iterators are not working anymore
282 std::set<PrintStep> steps = this->state.started;
283
284 bool invalidated = false;
285 for (std::set<PrintStep>::const_iterator step = steps.begin(); step != steps.end(); ++step) {
286 if (this->invalidate_step(*step)) invalidated = true;
287 }
288 return invalidated;
289 }
290
291 // returns true if an object step is done on all objects
292 // and there's at least one object
293 bool
294 Print::step_done(PrintObjectStep step) const
295 {
296 if (this->objects.empty()) return false;
297 FOREACH_OBJECT(this, object) {
298 if (!(*object)->state.is_done(step))
299 return false;
300 }
301 return true;
302 }
303
304 // returns 0-based indices of used extruders
305 std::set<size_t>
306 Print::object_extruders() const
307 {
308 std::set<size_t> extruders;
309
310 FOREACH_REGION(this, region) {
311 // these checks reflect the same logic used in the GUI for enabling/disabling
312 // extruder selection fields
313 if ((*region)->config.perimeters.value > 0 || this->config.brim_width.value > 0)
314 extruders.insert((*region)->config.perimeter_extruder - 1);
315
316 if ((*region)->config.fill_density.value > 0)
317 extruders.insert((*region)->config.infill_extruder - 1);
318
319 if ((*region)->config.top_solid_layers.value > 0 || (*region)->config.bottom_solid_layers.value > 0)
320 extruders.insert((*region)->config.solid_infill_extruder - 1);
321 }
322
323 return extruders;
324 }
325
326 // returns 0-based indices of used extruders
327 std::set<size_t>
328 Print::support_material_extruders() const
329 {
330 std::set<size_t> extruders;
331
332 FOREACH_OBJECT(this, object) {
333 if ((*object)->has_support_material()) {
334 extruders.insert((*object)->config.support_material_extruder - 1);
335 extruders.insert((*object)->config.support_material_interface_extruder - 1);
336 }
337 }
338
339 return extruders;
340 }
341
342 // returns 0-based indices of used extruders
343 std::set<size_t>
344 Print::extruders() const
345 {
346 std::set<size_t> extruders = this->object_extruders();
347
348 std::set<size_t> s_extruders = this->support_material_extruders();
349 extruders.insert(s_extruders.begin(), s_extruders.end());
350
351 return extruders;
352 }
353
354 void
355 Print::_simplify_slices(double distance)
356 {
357 FOREACH_OBJECT(this, object) {
358 FOREACH_LAYER(*object, layer) {
359 (*layer)->slices.simplify(distance);
360 FOREACH_LAYERREGION(*layer, layerm) {
361 (*layerm)->slices.simplify(distance);
362 }
363 }
364 }
365 }
366
367 double
368 Print::max_allowed_layer_height() const
369 {
370 std::vector<double> nozzle_diameter;
371
372 std::set<size_t> extruders = this->extruders();
373 for (std::set<size_t>::const_iterator e = extruders.begin(); e != extruders.end(); ++e) {
374 nozzle_diameter.push_back(this->config.nozzle_diameter.get_at(*e));
375 }
376
377 return *std::max_element(nozzle_diameter.begin(), nozzle_diameter.end());
378 }
379
380 /* Caller is responsible for supplying models whose objects don't collide
381 and have explicit instance positions */
382 void
383 Print::add_model_object(ModelObject* model_object, int idx)
384 {
385 DynamicPrintConfig object_config = model_object->config; // clone
386 object_config.normalize();
387
388 // initialize print object and store it at the given position
389 PrintObject* o;
390 {
391 BoundingBoxf3 bb = model_object->raw_bounding_box();
392 if (idx != -1) {
393 // replacing existing object
394 PrintObjectPtrs::iterator old_it = this->objects.begin() + idx;
395 // before deleting object, invalidate all of its steps in order to
396 // invalidate all of the dependent ones in Print
397 (*old_it)->invalidate_all_steps();
398 delete *old_it;
399
400 this->objects[idx] = o = new PrintObject(this, model_object, bb);
401 } else {
402 o = new PrintObject(this, model_object, bb);
403 objects.push_back(o);
404
405 // invalidate steps
406 this->invalidate_step(psSkirt);
407 this->invalidate_step(psBrim);
408 }
409 }
410
411 for (ModelVolumePtrs::const_iterator v_i = model_object->volumes.begin(); v_i != model_object->volumes.end(); ++v_i) {
412 size_t volume_id = v_i - model_object->volumes.begin();
413 ModelVolume* volume = *v_i;
414
415 // get the config applied to this volume
416 PrintRegionConfig config = this->_region_config_from_model_volume(*volume);
417
418 // find an existing print region with the same config
419 int region_id = -1;
420 for (PrintRegionPtrs::const_iterator region = this->regions.begin(); region != this->regions.end(); ++region) {
421 if (config.equals((*region)->config)) {
422 region_id = region - this->regions.begin();
423 break;
424 }
425 }
426
427 // if no region exists with the same config, create a new one
428 if (region_id == -1) {
429 PrintRegion* r = this->add_region();
430 r->config.apply(config);
431 region_id = this->regions.size() - 1;
432 }
433
434 // assign volume to region
435 o->add_region_volume(region_id, volume_id);
436 }
437
438 // apply config to print object
439 o->config.apply(this->default_object_config);
440 o->config.apply(object_config, true);
441 }
442
443 bool
444 Print::apply_config(DynamicPrintConfig config)
445 {
446 // we get a copy of the config object so we can modify it safely
447 config.normalize();
448
449 // apply variables to placeholder parser
450 this->placeholder_parser.apply_config(config);
451
452 bool invalidated = false;
453
454 // handle changes to print config
455 t_config_option_keys print_diff = this->config.diff(config);
456 if (!print_diff.empty()) {
457 this->config.apply(config, true);
458
459 if (this->invalidate_state_by_config_options(print_diff))
460 invalidated = true;
461 }
462
463 // handle changes to object config defaults
464 this->default_object_config.apply(config, true);
465 FOREACH_OBJECT(this, obj_ptr) {
466 // we don't assume that config contains a full ObjectConfig,
467 // so we base it on the current print-wise default
468 PrintObjectConfig new_config = this->default_object_config;
469 new_config.apply(config, true);
470
471 // we override the new config with object-specific options
472 {
473 DynamicPrintConfig model_object_config = (*obj_ptr)->model_object()->config;
474 model_object_config.normalize();
475 new_config.apply(model_object_config, true);
476 }
477
478 // check whether the new config is different from the current one
479 t_config_option_keys diff = (*obj_ptr)->config.diff(new_config);
480 if (!diff.empty()) {
481 (*obj_ptr)->config.apply(new_config, true);
482
483 if ((*obj_ptr)->invalidate_state_by_config_options(diff))
484 invalidated = true;
485 }
486 }
487
488 // handle changes to regions config defaults
489 this->default_region_config.apply(config, true);
490
491 // All regions now have distinct settings.
492 // Check whether applying the new region config defaults we'd get different regions.
493 bool rearrange_regions = false;
494 std::vector<PrintRegionConfig> other_region_configs;
495 FOREACH_REGION(this, it_r) {
496 size_t region_id = it_r - this->regions.begin();
497 PrintRegion* region = *it_r;
498
499 std::vector<PrintRegionConfig> this_region_configs;
500 FOREACH_OBJECT(this, it_o) {
501 PrintObject* object = *it_o;
502
503 std::vector<int> &region_volumes = object->region_volumes[region_id];
504 for (std::vector<int>::const_iterator volume_id = region_volumes.begin(); volume_id != region_volumes.end(); ++volume_id) {
505 ModelVolume* volume = object->model_object()->volumes.at(*volume_id);
506
507 PrintRegionConfig new_config = this->_region_config_from_model_volume(*volume);
508
509 for (std::vector<PrintRegionConfig>::iterator it = this_region_configs.begin(); it != this_region_configs.end(); ++it) {
510 // if the new config for this volume differs from the other
511 // volume configs currently associated to this region, it means
512 // the region subdivision does not make sense anymore
513 if (!it->equals(new_config)) {
514 rearrange_regions = true;
515 goto NEXT_REGION;
516 }
517 }
518 this_region_configs.push_back(new_config);
519
520 for (std::vector<PrintRegionConfig>::iterator it = other_region_configs.begin(); it != other_region_configs.end(); ++it) {
521 // if the new config for this volume equals any of the other
522 // volume configs that are not currently associated to this
523 // region, it means the region subdivision does not make
524 // sense anymore
525 if (it->equals(new_config)) {
526 rearrange_regions = true;
527 goto NEXT_REGION;
528 }
529 }
530
531 // if we're here and the new region config is different from the old
532 // one, we need to apply the new config and invalidate all objects
533 // (possible optimization: only invalidate objects using this region)
534 t_config_option_keys region_config_diff = region->config.diff(new_config);
535 if (!region_config_diff.empty()) {
536 region->config.apply(new_config);
537 FOREACH_OBJECT(this, o) {
538 if ((*o)->invalidate_state_by_config_options(region_config_diff))
539 invalidated = true;
540 }
541 }
542 }
543 }
544 other_region_configs.insert(other_region_configs.end(), this_region_configs.begin(), this_region_configs.end());
545
546 NEXT_REGION:
547 continue;
548 }
549
550 if (rearrange_regions) {
551 // the current subdivision of regions does not make sense anymore.
552 // we need to remove all objects and re-add them
553 ModelObjectPtrs model_objects;
554 FOREACH_OBJECT(this, o) {
555 model_objects.push_back((*o)->model_object());
556 }
557 this->clear_objects();
558 for (ModelObjectPtrs::iterator it = model_objects.begin(); it != model_objects.end(); ++it) {
559 this->add_model_object(*it);
560 }
561 invalidated = true;
562 }
563
564 return invalidated;
565 }
566
567 bool Print::has_infinite_skirt() const
568 {
569 return (this->config.skirt_height == -1 && this->config.skirts > 0)
570 || (this->config.ooze_prevention && this->extruders().size() > 1);
571 }
572
573 bool Print::has_skirt() const
574 {
575 return (this->config.skirt_height > 0 && this->config.skirts > 0)
576 || this->has_infinite_skirt();
577 }
578
579 std::string
580 Print::validate() const
581 {
582 if (this->config.complete_objects) {
583 // check horizontal clearance
584 {
585 Polygons a;
586 FOREACH_OBJECT(this, i_object) {
587 PrintObject* object = *i_object;
588
589 /* get convex hull of all meshes assigned to this print object
590 (this is the same as model_object()->raw_mesh.convex_hull()
591 but probably more efficient */
592 Polygon convex_hull;
593 {
594 Polygons mesh_convex_hulls;
595 for (size_t i = 0; i < this->regions.size(); ++i) {
596 for (std::vector<int>::const_iterator it = object->region_volumes[i].begin(); it != object->region_volumes[i].end(); ++it) {
597 Polygon hull = object->model_object()->volumes[*it]->mesh.convex_hull();
598 mesh_convex_hulls.push_back(hull);
599 }
600 }
601
602 // make a single convex hull for all of them
603 convex_hull = Slic3r::Geometry::convex_hull(mesh_convex_hulls);
604 }
605
606 // apply the same transformations we apply to the actual meshes when slicing them
607 object->model_object()->instances.front()->transform_polygon(&convex_hull);
608
609 // grow convex hull with the clearance margin
610 {
611 Polygons grown_hull;
612 offset(convex_hull, &grown_hull, scale_(this->config.extruder_clearance_radius.value)/2, 1, jtRound, scale_(0.1));
613 convex_hull = grown_hull.front();
614 }
615
616 // now we check that no instance of convex_hull intersects any of the previously checked object instances
617 for (Points::const_iterator copy = object->_shifted_copies.begin(); copy != object->_shifted_copies.end(); ++copy) {
618 Polygon p = convex_hull;
619 p.translate(*copy);
620 if (intersects(a, p))
621 return "Some objects are too close; your extruder will collide with them.";
622
623 union_(a, p, &a);
624 }
625 }
626 }
627
628 // check vertical clearance
629 {
630 std::vector<coord_t> object_height;
631 FOREACH_OBJECT(this, i_object) {
632 PrintObject* object = *i_object;
633 object_height.insert(object_height.end(), object->copies().size(), object->size.z);
634 }
635 std::sort(object_height.begin(), object_height.end());
636 // ignore the tallest *copy* (this is why we repeat height for all of them):
637 // it will be printed as last one so its height doesn't matter
638 object_height.pop_back();
639 if (!object_height.empty() && object_height.back() > scale_(this->config.extruder_clearance_height.value))
640 return "Some objects are too tall and cannot be printed without extruder collisions.";
641 }
642 } // end if (this->config.complete_objects)
643
644 if (this->config.spiral_vase) {
645 size_t total_copies_count = 0;
646 FOREACH_OBJECT(this, i_object) total_copies_count += (*i_object)->copies().size();
647 if (total_copies_count > 1)
648 return "The Spiral Vase option can only be used when printing a single object.";
649 if (this->regions.size() > 1)
650 return "The Spiral Vase option can only be used when printing single material objects.";
651 }
652
653 {
654 // find the smallest nozzle diameter
655 std::set<size_t> extruders = this->extruders();
656 if (extruders.empty())
657 return "The supplied settings will cause an empty print.";
658
659 std::set<double> nozzle_diameters;
660 for (std::set<size_t>::iterator it = extruders.begin(); it != extruders.end(); ++it)
661 nozzle_diameters.insert(this->config.nozzle_diameter.get_at(*it));
662 double min_nozzle_diameter = *std::min_element(nozzle_diameters.begin(), nozzle_diameters.end());
663
664 FOREACH_OBJECT(this, i_object) {
665 PrintObject* object = *i_object;
666
667 // validate first_layer_height
668 double first_layer_height = object->config.get_abs_value("first_layer_height");
669 double first_layer_min_nozzle_diameter;
670 if (object->config.raft_layers > 0) {
671 // if we have raft layers, only support material extruder is used on first layer
672 size_t first_layer_extruder = object->config.raft_layers == 1
673 ? object->config.support_material_interface_extruder-1
674 : object->config.support_material_extruder-1;
675 first_layer_min_nozzle_diameter = this->config.nozzle_diameter.get_at(first_layer_extruder);
676 } else {
677 // if we don't have raft layers, any nozzle diameter is potentially used in first layer
678 first_layer_min_nozzle_diameter = min_nozzle_diameter;
679 }
680 if (first_layer_height > first_layer_min_nozzle_diameter)
681 return "First layer height can't be greater than nozzle diameter";
682
683 // validate layer_height
684 if (object->config.layer_height.value > min_nozzle_diameter)
685 return "Layer height can't be greater than nozzle diameter";
686 }
687 }
688
689 return std::string();
690 }
691
692 // the bounding box of objects placed in copies position
693 // (without taking skirt/brim/support material into account)
694 BoundingBox
695 Print::bounding_box() const
696 {
697 BoundingBox bb;
698 FOREACH_OBJECT(this, object) {
699 for (Points::const_iterator copy = (*object)->_shifted_copies.begin(); copy != (*object)->_shifted_copies.end(); ++copy) {
700 bb.merge(*copy);
701
702 Point p = *copy;
703 p.translate((*object)->size);
704 bb.merge(p);
705 }
706 }
707 return bb;
708 }
709
710 // the total bounding box of extrusions, including skirt/brim/support material
711 // this methods needs to be called even when no steps were processed, so it should
712 // only use configuration values
713 BoundingBox
714 Print::total_bounding_box() const
715 {
716 // get objects bounding box
717 BoundingBox bb = this->bounding_box();
718
719 // we need to offset the objects bounding box by at least half the perimeters extrusion width
720 Flow perimeter_flow = this->objects.front()->get_layer(0)->get_region(0)->flow(frPerimeter);
721 double extra = perimeter_flow.width/2;
722
723 // consider support material
724 if (this->has_support_material()) {
725 extra = std::max(extra, SUPPORT_MATERIAL_MARGIN);
726 }
727
728 // consider brim and skirt
729 if (this->config.brim_width.value > 0) {
730 Flow brim_flow = this->brim_flow();
731 extra = std::max(extra, this->config.brim_width.value + brim_flow.width/2);
732 }
733 if (this->has_skirt()) {
734 int skirts = this->config.skirts.value;
735 if (skirts == 0 && this->has_infinite_skirt()) skirts = 1;
736 Flow skirt_flow = this->skirt_flow();
737 extra = std::max(
738 extra,
739 this->config.brim_width.value
740 + this->config.skirt_distance.value
741 + skirts * skirt_flow.spacing()
742 + skirt_flow.width/2
743 );
744 }
745
746 if (extra > 0)
747 bb.offset(scale_(extra));
748
749 return bb;
750 }
751
752 double
753 Print::skirt_first_layer_height() const
754 {
755 if (this->objects.empty()) CONFESS("skirt_first_layer_height() can't be called without PrintObjects");
756 return this->objects.front()->config.get_abs_value("first_layer_height");
757 }
758
759 Flow
760 Print::brim_flow() const
761 {
762 ConfigOptionFloatOrPercent width = this->config.first_layer_extrusion_width;
763 if (width.value == 0) width = this->regions.front()->config.perimeter_extrusion_width;
764
765 /* We currently use a random region's perimeter extruder.
766 While this works for most cases, we should probably consider all of the perimeter
767 extruders and take the one with, say, the smallest index.
768 The same logic should be applied to the code that selects the extruder during G-code
769 generation as well. */
770 return Flow::new_from_config_width(
771 frPerimeter,
772 width,
773 this->config.nozzle_diameter.get_at(this->regions.front()->config.perimeter_extruder-1),
774 this->skirt_first_layer_height(),
775 0
776 );
777 }
778
779 Flow
780 Print::skirt_flow() const
781 {
782 ConfigOptionFloatOrPercent width = this->config.first_layer_extrusion_width;
783 if (width.value == 0) width = this->regions.front()->config.perimeter_extrusion_width;
784
785 /* We currently use a random object's support material extruder.
786 While this works for most cases, we should probably consider all of the support material
787 extruders and take the one with, say, the smallest index;
788 The same logic should be applied to the code that selects the extruder during G-code
789 generation as well. */
790 return Flow::new_from_config_width(
791 frPerimeter,
792 width,
793 this->config.nozzle_diameter.get_at(this->objects.front()->config.support_material_extruder-1),
794 this->skirt_first_layer_height(),
795 0
796 );
797 }
798
799
800 PrintRegionConfig
801 Print::_region_config_from_model_volume(const ModelVolume &volume)
802 {
803 PrintRegionConfig config = this->default_region_config;
804 {
805 DynamicPrintConfig other_config = volume.get_object()->config;
806 other_config.normalize();
807 config.apply(other_config, true);
808 }
809 {
810 DynamicPrintConfig other_config = volume.config;
811 other_config.normalize();
812 config.apply(other_config, true);
813 }
814 if (!volume.material_id().empty()) {
815 DynamicPrintConfig material_config = volume.material()->config;
816 material_config.normalize();
817 config.apply(material_config, true);
818 }
819 return config;
820 }
821
822 bool
823 Print::has_support_material() const
824 {
825 FOREACH_OBJECT(this, object) {
826 if ((*object)->has_support_material()) return true;
827 }
828 return false;
829 }
830
831 /* This method assigns extruders to the volumes having a material
832 but not having extruders set in the volume config. */
833 void
834 Print::auto_assign_extruders(ModelObject* model_object) const
835 {
836 // only assign extruders if object has more than one volume
837 if (model_object->volumes.size() < 2) return;
838
839 size_t extruders = this->config.nozzle_diameter.values.size();
840 for (ModelVolumePtrs::const_iterator v = model_object->volumes.begin(); v != model_object->volumes.end(); ++v) {
841 if (!(*v)->material_id().empty()) {
842 //FIXME Vojtech: This assigns an extruder ID even to a modifier volume, if it has a material assigned.
843 size_t extruder_id = (v - model_object->volumes.begin()) + 1;
844 if (!(*v)->config.has("extruder"))
845 (*v)->config.opt<ConfigOptionInt>("extruder", true)->value = extruder_id;
846 }
847 }
848 }
849
850 }
0 #ifndef slic3r_Print_hpp_
1 #define slic3r_Print_hpp_
2
3 #include "libslic3r.h"
4 #include <set>
5 #include <vector>
6 #include <string>
7 #include "BoundingBox.hpp"
8 #include "Flow.hpp"
9 #include "PrintConfig.hpp"
10 #include "Point.hpp"
11 #include "Layer.hpp"
12 #include "Model.hpp"
13 #include "PlaceholderParser.hpp"
14
15
16 namespace Slic3r {
17
18 class Print;
19 class PrintObject;
20 class ModelObject;
21
22 // Print step IDs for keeping track of the print state.
23 enum PrintStep {
24 psSkirt, psBrim,
25 };
26 enum PrintObjectStep {
27 posSlice, posPerimeters, posPrepareInfill,
28 posInfill, posSupportMaterial,
29 };
30
31 // To be instantiated over PrintStep or PrintObjectStep enums.
32 template <class StepType>
33 class PrintState
34 {
35 public:
36 std::set<StepType> started, done;
37
38 bool is_started(StepType step) const;
39 bool is_done(StepType step) const;
40 void set_started(StepType step);
41 void set_done(StepType step);
42 bool invalidate(StepType step);
43 };
44
45 // A PrintRegion object represents a group of volumes to print
46 // sharing the same config (including the same assigned extruder(s))
47 class PrintRegion
48 {
49 friend class Print;
50
51 public:
52 PrintRegionConfig config;
53
54 Print* print();
55 Flow flow(FlowRole role, double layer_height, bool bridge, bool first_layer, double width, const PrintObject &object) const;
56
57 private:
58 Print* _print;
59
60 PrintRegion(Print* print);
61 ~PrintRegion();
62 };
63
64
65 typedef std::vector<Layer*> LayerPtrs;
66 typedef std::vector<SupportLayer*> SupportLayerPtrs;
67 class BoundingBoxf3; // TODO: for temporary constructor parameter
68
69 class PrintObject
70 {
71 friend class Print;
72
73 public:
74 // map of (vectors of volume ids), indexed by region_id
75 /* (we use map instead of vector so that we don't have to worry about
76 resizing it and the [] operator adds new items automagically) */
77 std::map< size_t,std::vector<int> > region_volumes;
78 PrintObjectConfig config;
79 t_layer_height_ranges layer_height_ranges;
80
81 // this is set to true when LayerRegion->slices is split in top/internal/bottom
82 // so that next call to make_perimeters() performs a union() before computing loops
83 bool typed_slices;
84
85 Point3 size; // XYZ in scaled coordinates
86
87 // scaled coordinates to add to copies (to compensate for the alignment
88 // operated when creating the object but still preserving a coherent API
89 // for external callers)
90 Point _copies_shift;
91
92 // Slic3r::Point objects in scaled G-code coordinates in our coordinates
93 Points _shifted_copies;
94
95 LayerPtrs layers;
96 SupportLayerPtrs support_layers;
97 PrintState<PrintObjectStep> state;
98
99 Print* print() { return this->_print; }
100 const Print* print() const { return this->_print; }
101 ModelObject* model_object() { return this->_model_object; }
102 const ModelObject* model_object() const { return this->_model_object; }
103
104 Points copies() const { return this->_copies; }
105 bool add_copy(const Pointf &point);
106 bool delete_last_copy();
107 bool delete_all_copies();
108 bool set_copies(const Points &points);
109 bool reload_model_instances();
110 BoundingBox bounding_box() const {
111 // since the object is aligned to origin, bounding box coincides with size
112 return BoundingBox(Point(0,0), this->size);
113 }
114
115 // adds region_id, too, if necessary
116 void add_region_volume(int region_id, int volume_id);
117
118 size_t total_layer_count() const;
119 size_t layer_count() const;
120 void clear_layers();
121 Layer* get_layer(int idx) { return this->layers.at(idx); }
122 const Layer* get_layer(int idx) const { return this->layers.at(idx); }
123
124 // print_z: top of the layer; slice_z: center of the layer.
125 Layer* add_layer(int id, coordf_t height, coordf_t print_z, coordf_t slice_z);
126 void delete_layer(int idx);
127
128 size_t support_layer_count() const;
129 void clear_support_layers();
130 SupportLayer* get_support_layer(int idx);
131 SupportLayer* add_support_layer(int id, coordf_t height, coordf_t print_z);
132 void delete_support_layer(int idx);
133
134 // methods for handling state
135 bool invalidate_state_by_config_options(const std::vector<t_config_option_key> &opt_keys);
136 bool invalidate_step(PrintObjectStep step);
137 bool invalidate_all_steps();
138
139 bool has_support_material() const;
140 void detect_surfaces_type();
141 void process_external_surfaces();
142 void discover_vertical_shells();
143 void bridge_over_infill();
144
145 private:
146 Print* _print;
147 ModelObject* _model_object;
148 Points _copies; // Slic3r::Point objects in scaled G-code coordinates
149
150 // TODO: call model_object->get_bounding_box() instead of accepting
151 // parameter
152 PrintObject(Print* print, ModelObject* model_object, const BoundingBoxf3 &modobj_bbox);
153 ~PrintObject() {}
154 };
155
156 typedef std::vector<PrintObject*> PrintObjectPtrs;
157 typedef std::vector<PrintRegion*> PrintRegionPtrs;
158
159 // The complete print tray with possibly multiple objects.
160 class Print
161 {
162 public:
163 PrintConfig config;
164 PrintObjectConfig default_object_config;
165 PrintRegionConfig default_region_config;
166 PrintObjectPtrs objects;
167 PrintRegionPtrs regions;
168 PlaceholderParser placeholder_parser;
169 // TODO: status_cb
170 double total_used_filament, total_extruded_volume;
171 std::map<size_t,float> filament_stats;
172 PrintState<PrintStep> state;
173
174 // ordered collections of extrusion paths to build skirt loops and brim
175 ExtrusionEntityCollection skirt, brim;
176
177 Print();
178 ~Print();
179
180 // methods for handling objects
181 void clear_objects();
182 PrintObject* get_object(size_t idx);
183 void delete_object(size_t idx);
184 void reload_object(size_t idx);
185 bool reload_model_instances();
186
187 // methods for handling regions
188 PrintRegion* get_region(size_t idx);
189 PrintRegion* add_region();
190
191 // methods for handling state
192 bool invalidate_state_by_config_options(const std::vector<t_config_option_key> &opt_keys);
193 bool invalidate_step(PrintStep step);
194 bool invalidate_all_steps();
195 bool step_done(PrintObjectStep step) const;
196
197 void add_model_object(ModelObject* model_object, int idx = -1);
198 bool apply_config(DynamicPrintConfig config);
199 bool has_infinite_skirt() const;
200 bool has_skirt() const;
201 // Returns an empty string if valid, otherwise returns an error message.
202 std::string validate() const;
203 BoundingBox bounding_box() const;
204 BoundingBox total_bounding_box() const;
205 double skirt_first_layer_height() const;
206 Flow brim_flow() const;
207 Flow skirt_flow() const;
208
209 std::set<size_t> object_extruders() const;
210 std::set<size_t> support_material_extruders() const;
211 std::set<size_t> extruders() const;
212 void _simplify_slices(double distance);
213 double max_allowed_layer_height() const;
214 bool has_support_material() const;
215 void auto_assign_extruders(ModelObject* model_object) const;
216
217 private:
218 void clear_regions();
219 void delete_region(size_t idx);
220 PrintRegionConfig _region_config_from_model_volume(const ModelVolume &volume);
221 };
222
223 #define FOREACH_BASE(type, container, iterator) for (type::const_iterator iterator = (container).begin(); iterator != (container).end(); ++iterator)
224 #define FOREACH_REGION(print, region) FOREACH_BASE(PrintRegionPtrs, (print)->regions, region)
225 #define FOREACH_OBJECT(print, object) FOREACH_BASE(PrintObjectPtrs, (print)->objects, object)
226 #define FOREACH_LAYER(object, layer) FOREACH_BASE(LayerPtrs, (object)->layers, layer)
227 #define FOREACH_LAYERREGION(layer, layerm) FOREACH_BASE(LayerRegionPtrs, (layer)->regions, layerm)
228
229 }
230
231 #endif
0 #include "PrintConfig.hpp"
1
2 namespace Slic3r {
3
4 PrintConfigDef::PrintConfigDef()
5 {
6 t_optiondef_map &Options = this->options;
7
8 ConfigOptionDef* def;
9
10 def = this->add("avoid_crossing_perimeters", coBool);
11 def->label = "Avoid crossing perimeters";
12 def->tooltip = "Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden extruders which suffer from oozing. This feature slows down both the print and the G-code generation.";
13 def->cli = "avoid-crossing-perimeters!";
14 def->default_value = new ConfigOptionBool(false);
15
16 def = this->add("bed_shape", coPoints);
17 def->label = "Bed shape";
18 {
19 ConfigOptionPoints* opt = new ConfigOptionPoints();
20 opt->values.push_back(Pointf(0,0));
21 opt->values.push_back(Pointf(200,0));
22 opt->values.push_back(Pointf(200,200));
23 opt->values.push_back(Pointf(0,200));
24 def->default_value = opt;
25 }
26
27 def = this->add("bed_temperature", coInt);
28 def->label = "Other layers";
29 def->tooltip = "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output.";
30 def->cli = "bed-temperature=i";
31 def->full_label = "Bed temperature";
32 def->min = 0;
33 def->max = 300;
34 def->default_value = new ConfigOptionInt(0);
35
36 def = this->add("before_layer_gcode", coString);
37 def->label = "Before layer change G-code";
38 def->tooltip = "This custom code is inserted at every layer change, right before the Z move. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z].";
39 def->cli = "before-layer-gcode=s";
40 def->multiline = true;
41 def->full_width = true;
42 def->height = 50;
43 def->default_value = new ConfigOptionString("");
44
45 def = this->add("bottom_solid_layers", coInt);
46 def->label = "Bottom";
47 def->category = "Layers and Perimeters";
48 def->tooltip = "Number of solid layers to generate on bottom surfaces.";
49 def->cli = "bottom-solid-layers=i";
50 def->full_label = "Bottom solid layers";
51 def->min = 0;
52 def->default_value = new ConfigOptionInt(3);
53
54 def = this->add("bridge_acceleration", coFloat);
55 def->label = "Bridge";
56 def->tooltip = "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges.";
57 def->sidetext = "mm/s²";
58 def->cli = "bridge-acceleration=f";
59 def->min = 0;
60 def->default_value = new ConfigOptionFloat(0);
61
62 def = this->add("bridge_fan_speed", coInt);
63 def->label = "Bridges fan speed";
64 def->tooltip = "This fan speed is enforced during all bridges and overhangs.";
65 def->sidetext = "%";
66 def->cli = "bridge-fan-speed=i";
67 def->min = 0;
68 def->max = 100;
69 def->default_value = new ConfigOptionInt(100);
70
71 def = this->add("bridge_flow_ratio", coFloat);
72 def->label = "Bridge flow ratio";
73 def->category = "Advanced";
74 def->tooltip = "This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates and prevent sagging, although default settings are usually good and you should experiment with cooling (use a fan) before tweaking this.";
75 def->cli = "bridge-flow-ratio=f";
76 def->min = 0;
77 def->default_value = new ConfigOptionFloat(1);
78
79 def = this->add("bridge_speed", coFloat);
80 def->label = "Bridges";
81 def->category = "Speed";
82 def->tooltip = "Speed for printing bridges.";
83 def->sidetext = "mm/s";
84 def->cli = "bridge-speed=f";
85 def->aliases.push_back("bridge_feed_rate");
86 def->min = 0;
87 def->default_value = new ConfigOptionFloat(60);
88
89 def = this->add("brim_width", coFloat);
90 def->label = "Brim width";
91 def->tooltip = "Horizontal width of the brim that will be printed around each object on the first layer.";
92 def->sidetext = "mm";
93 def->cli = "brim-width=f";
94 def->min = 0;
95 def->default_value = new ConfigOptionFloat(0);
96
97 def = this->add("complete_objects", coBool);
98 def->label = "Complete individual objects";
99 def->tooltip = "When printing multiple objects or copies, this feature will complete each object before moving onto next one (and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you from extruder collisions, but beware.";
100 def->cli = "complete-objects!";
101 def->default_value = new ConfigOptionBool(false);
102
103 def = this->add("cooling", coBool);
104 def->label = "Enable auto cooling";
105 def->tooltip = "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time.";
106 def->cli = "cooling!";
107 def->default_value = new ConfigOptionBool(true);
108
109 def = this->add("default_acceleration", coFloat);
110 def->label = "Default";
111 def->tooltip = "This is the acceleration your printer will be reset to after the role-specific acceleration values are used (perimeter/infill). Set zero to prevent resetting acceleration at all.";
112 def->sidetext = "mm/s²";
113 def->cli = "default-acceleration=f";
114 def->min = 0;
115 def->default_value = new ConfigOptionFloat(0);
116
117 def = this->add("disable_fan_first_layers", coInt);
118 def->label = "Disable fan for the first";
119 def->tooltip = "You can set this to a positive value to disable fan at all during the first layers, so that it does not make adhesion worse.";
120 def->sidetext = "layers";
121 def->cli = "disable-fan-first-layers=i";
122 def->min = 0;
123 def->max = 1000;
124 def->default_value = new ConfigOptionInt(3);
125
126 def = this->add("dont_support_bridges", coBool);
127 def->label = "Don't support bridges";
128 def->category = "Support material";
129 def->tooltip = "Experimental option for preventing support material from being generated under bridged areas.";
130 def->cli = "dont-support-bridges!";
131 def->default_value = new ConfigOptionBool(true);
132
133 def = this->add("duplicate_distance", coFloat);
134 def->label = "Distance between copies";
135 def->tooltip = "Distance used for the auto-arrange feature of the plater.";
136 def->sidetext = "mm";
137 def->cli = "duplicate-distance=f";
138 def->aliases.push_back("multiply_distance");
139 def->min = 0;
140 def->default_value = new ConfigOptionFloat(6);
141
142 def = this->add("end_gcode", coString);
143 def->label = "End G-code";
144 def->tooltip = "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all Slic3r settings.";
145 def->cli = "end-gcode=s";
146 def->multiline = true;
147 def->full_width = true;
148 def->height = 120;
149 def->default_value = new ConfigOptionString("M104 S0 ; turn off temperature\nG28 X0 ; home X axis\nM84 ; disable motors\n");
150
151 def = this->add("ensure_vertical_shell_thickness", coBool);
152 def->label = "Ensure vertical shell thickness";
153 def->category = "Layers and Perimeters";
154 def->tooltip = "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers).";
155 def->cli = "ensure-vertical-shell-thickness!";
156 def->default_value = new ConfigOptionBool(false);
157
158 def = this->add("external_fill_pattern", coEnum);
159 def->label = "Top/bottom fill pattern";
160 def->category = "Infill";
161 def->tooltip = "Fill pattern for top/bottom infill. This only affects the external visible layer, and not its adjacent solid shells.";
162 def->cli = "external-fill-pattern|solid-fill-pattern=s";
163 def->enum_keys_map = ConfigOptionEnum<InfillPattern>::get_enum_values();
164 def->enum_values.push_back("rectilinear");
165 def->enum_values.push_back("concentric");
166 def->enum_values.push_back("hilbertcurve");
167 def->enum_values.push_back("archimedeanchords");
168 def->enum_values.push_back("octagramspiral");
169 def->enum_labels.push_back("Rectilinear");
170 def->enum_labels.push_back("Concentric");
171 def->enum_labels.push_back("Hilbert Curve");
172 def->enum_labels.push_back("Archimedean Chords");
173 def->enum_labels.push_back("Octagram Spiral");
174 def->aliases.push_back("solid_fill_pattern");
175 def->default_value = new ConfigOptionEnum<InfillPattern>(ipRectilinear);
176
177 def = this->add("external_perimeter_extrusion_width", coFloatOrPercent);
178 def->label = "External perimeters";
179 def->category = "Extrusion Width";
180 def->tooltip = "Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, an automatic value will be used that maximizes accuracy of the external visible surfaces. If expressed as percentage (for example 200%) it will be computed over layer height.";
181 def->sidetext = "mm or % (leave 0 for default)";
182 def->cli = "external-perimeter-extrusion-width=s";
183 def->default_value = new ConfigOptionFloatOrPercent(0, false);
184
185 def = this->add("external_perimeter_speed", coFloatOrPercent);
186 def->label = "External perimeters";
187 def->category = "Speed";
188 def->tooltip = "This separate setting will affect the speed of external perimeters (the visible ones). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto.";
189 def->sidetext = "mm/s or %";
190 def->cli = "external-perimeter-speed=s";
191 def->ratio_over = "perimeter_speed";
192 def->min = 0;
193 def->default_value = new ConfigOptionFloatOrPercent(50, true);
194
195 def = this->add("external_perimeters_first", coBool);
196 def->label = "External perimeters first";
197 def->category = "Layers and Perimeters";
198 def->tooltip = "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order.";
199 def->cli = "external-perimeters-first!";
200 def->default_value = new ConfigOptionBool(false);
201
202 def = this->add("extra_perimeters", coBool);
203 def->label = "Extra perimeters if needed";
204 def->category = "Layers and Perimeters";
205 def->tooltip = "Add more perimeters when needed for avoiding gaps in sloping walls.";
206 def->cli = "extra-perimeters!";
207 def->default_value = new ConfigOptionBool(true);
208
209 def = this->add("extruder", coInt);
210 def->gui_type = "i_enum_open";
211 def->label = "Extruder";
212 def->category = "Extruders";
213 def->tooltip = "The extruder to use (unless more specific extruder settings are specified).";
214 def->cli = "extruder=i";
215 def->min = 0; // 0 = inherit defaults
216 def->enum_labels.push_back("default"); // override label for item 0
217 def->enum_labels.push_back("1");
218 def->enum_labels.push_back("2");
219 def->enum_labels.push_back("3");
220 def->enum_labels.push_back("4");
221
222 def = this->add("extruder_clearance_height", coFloat);
223 def->label = "Height";
224 def->tooltip = "Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the extruder can peek before colliding with other printed objects.";
225 def->sidetext = "mm";
226 def->cli = "extruder-clearance-height=f";
227 def->min = 0;
228 def->default_value = new ConfigOptionFloat(20);
229
230 def = this->add("extruder_clearance_radius", coFloat);
231 def->label = "Radius";
232 def->tooltip = "Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest value for safety. This setting is used to check for collisions and to display the graphical preview in the plater.";
233 def->sidetext = "mm";
234 def->cli = "extruder-clearance-radius=f";
235 def->min = 0;
236 def->default_value = new ConfigOptionFloat(20);
237
238 def = this->add("extruder_offset", coPoints);
239 def->label = "Extruder offset";
240 def->tooltip = "If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This option lets you specify the displacement of each extruder with respect to the first one. It expects positive coordinates (they will be subtracted from the XY coordinate).";
241 def->sidetext = "mm";
242 def->cli = "extruder-offset=s@";
243 {
244 ConfigOptionPoints* opt = new ConfigOptionPoints();
245 opt->values.push_back(Pointf(0,0));
246 def->default_value = opt;
247 }
248
249 def = this->add("extrusion_axis", coString);
250 def->label = "Extrusion axis";
251 def->tooltip = "Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use A).";
252 def->cli = "extrusion-axis=s";
253 def->default_value = new ConfigOptionString("E");
254
255 def = this->add("extrusion_multiplier", coFloats);
256 def->label = "Extrusion multiplier";
257 def->tooltip = "This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change this more, check filament diameter and your firmware E steps.";
258 def->cli = "extrusion-multiplier=f@";
259 {
260 ConfigOptionFloats* opt = new ConfigOptionFloats();
261 opt->values.push_back(1);
262 def->default_value = opt;
263 }
264
265 def = this->add("extrusion_width", coFloatOrPercent);
266 def->label = "Default extrusion width";
267 def->category = "Extrusion Width";
268 def->tooltip = "Set this to a non-zero value to set a manual extrusion width. If left to zero, Slic3r calculates a width automatically. If expressed as percentage (for example: 230%) it will be computed over layer height.";
269 def->sidetext = "mm or % (leave 0 for auto)";
270 def->cli = "extrusion-width=s";
271 def->default_value = new ConfigOptionFloatOrPercent(0, false);
272
273 def = this->add("fan_always_on", coBool);
274 def->label = "Keep fan always on";
275 def->tooltip = "If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful for PLA, harmful for ABS.";
276 def->cli = "fan-always-on!";
277 def->default_value = new ConfigOptionBool(false);
278
279 def = this->add("fan_below_layer_time", coInt);
280 def->label = "Enable fan if layer print time is below";
281 def->tooltip = "If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be calculated by interpolating the minimum and maximum speeds.";
282 def->sidetext = "approximate seconds";
283 def->cli = "fan-below-layer-time=i";
284 def->width = 60;
285 def->min = 0;
286 def->max = 1000;
287 def->default_value = new ConfigOptionInt(60);
288
289 def = this->add("filament_colour", coStrings);
290 def->label = "Color";
291 def->tooltip = "This is only used in the Slic3r interface as a visual help.";
292 def->cli = "filament-color=s@";
293 def->gui_type = "color";
294 {
295 ConfigOptionStrings* opt = new ConfigOptionStrings();
296 opt->values.push_back("#FFFFFF");
297 def->default_value = opt;
298 }
299
300 def = this->add("filament_notes", coStrings);
301 def->label = "Filament notes";
302 def->tooltip = "You can put your notes regarding the filament here.";
303 def->cli = "filament-notes=s@";
304 def->multiline = true;
305 def->full_width = true;
306 def->height = 130;
307 {
308 ConfigOptionStrings* opt = new ConfigOptionStrings();
309 opt->values.push_back("");
310 def->default_value = opt;
311 }
312
313 def = this->add("filament_max_volumetric_speed", coFloats);
314 def->label = "Max volumetric speed";
315 def->tooltip = "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit.";
316 def->sidetext = "mm³/s";
317 def->cli = "filament-max-volumetric-speed=f@";
318 def->min = 0;
319 {
320 ConfigOptionFloats* opt = new ConfigOptionFloats();
321 opt->values.push_back(0.f);
322 def->default_value = opt;
323 }
324
325 def = this->add("filament_diameter", coFloats);
326 def->label = "Diameter";
327 def->tooltip = "Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average.";
328 def->sidetext = "mm";
329 def->cli = "filament-diameter=f@";
330 def->min = 0;
331 {
332 ConfigOptionFloats* opt = new ConfigOptionFloats();
333 opt->values.push_back(3);
334 def->default_value = opt;
335 }
336
337 def = this->add("filament_settings_id", coString);
338 def->default_value = new ConfigOptionString("");
339
340 def = this->add("fill_angle", coFloat);
341 def->label = "Fill angle";
342 def->category = "Infill";
343 def->tooltip = "Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled using the best direction Slic3r can detect, so this setting does not affect them.";
344 def->sidetext = "°";
345 def->cli = "fill-angle=i";
346 def->min = 0;
347 def->max = 359;
348 def->default_value = new ConfigOptionFloat(45);
349
350 def = this->add("fill_density", coPercent);
351 def->gui_type = "f_enum_open";
352 def->gui_flags = "show_value";
353 def->label = "Fill density";
354 def->category = "Infill";
355 def->tooltip = "Density of internal infill, expressed in the range 0% - 100%.";
356 def->sidetext = "%";
357 def->cli = "fill-density=s";
358 def->min = 0;
359 def->max = 100;
360 def->enum_values.push_back("0");
361 def->enum_values.push_back("5");
362 def->enum_values.push_back("10");
363 def->enum_values.push_back("15");
364 def->enum_values.push_back("20");
365 def->enum_values.push_back("25");
366 def->enum_values.push_back("30");
367 def->enum_values.push_back("40");
368 def->enum_values.push_back("50");
369 def->enum_values.push_back("60");
370 def->enum_values.push_back("70");
371 def->enum_values.push_back("80");
372 def->enum_values.push_back("90");
373 def->enum_values.push_back("100");
374 def->enum_labels.push_back("0%");
375 def->enum_labels.push_back("5%");
376 def->enum_labels.push_back("10%");
377 def->enum_labels.push_back("15%");
378 def->enum_labels.push_back("20%");
379 def->enum_labels.push_back("25%");
380 def->enum_labels.push_back("30%");
381 def->enum_labels.push_back("40%");
382 def->enum_labels.push_back("50%");
383 def->enum_labels.push_back("60%");
384 def->enum_labels.push_back("70%");
385 def->enum_labels.push_back("80%");
386 def->enum_labels.push_back("90%");
387 def->enum_labels.push_back("100%");
388 def->default_value = new ConfigOptionPercent(20);
389
390 def = this->add("fill_pattern", coEnum);
391 def->label = "Fill pattern";
392 def->category = "Infill";
393 def->tooltip = "Fill pattern for general low-density infill.";
394 def->cli = "fill-pattern=s";
395 def->enum_keys_map = ConfigOptionEnum<InfillPattern>::get_enum_values();
396 def->enum_values.push_back("rectilinear");
397 def->enum_values.push_back("grid");
398 def->enum_values.push_back("triangles");
399 def->enum_values.push_back("stars");
400 def->enum_values.push_back("cubic");
401 def->enum_values.push_back("line");
402 def->enum_values.push_back("concentric");
403 def->enum_values.push_back("honeycomb");
404 def->enum_values.push_back("3dhoneycomb");
405 def->enum_values.push_back("hilbertcurve");
406 def->enum_values.push_back("archimedeanchords");
407 def->enum_values.push_back("octagramspiral");
408 def->enum_labels.push_back("Rectilinear");
409 def->enum_labels.push_back("Grid");
410 def->enum_labels.push_back("Triangles");
411 def->enum_labels.push_back("Stars");
412 def->enum_labels.push_back("Cubic");
413 def->enum_labels.push_back("Line");
414 def->enum_labels.push_back("Concentric");
415 def->enum_labels.push_back("Honeycomb");
416 def->enum_labels.push_back("3D Honeycomb");
417 def->enum_labels.push_back("Hilbert Curve");
418 def->enum_labels.push_back("Archimedean Chords");
419 def->enum_labels.push_back("Octagram Spiral");
420 def->default_value = new ConfigOptionEnum<InfillPattern>(ipHoneycomb);
421
422 def = this->add("first_layer_acceleration", coFloat);
423 def->label = "First layer";
424 def->tooltip = "This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for first layer.";
425 def->sidetext = "mm/s²";
426 def->cli = "first-layer-acceleration=f";
427 def->min = 0;
428 def->default_value = new ConfigOptionFloat(0);
429
430 def = this->add("first_layer_bed_temperature", coInt);
431 def->label = "First layer";
432 def->tooltip = "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output.";
433 def->cli = "first-layer-bed-temperature=i";
434 def->max = 0;
435 def->max = 300;
436 def->default_value = new ConfigOptionInt(0);
437
438 def = this->add("first_layer_extrusion_width", coFloatOrPercent);
439 def->label = "First layer";
440 def->category = "Extrusion Width";
441 def->tooltip = "Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over first layer height. If set to zero, it will use the Default Extrusion Width.";
442 def->sidetext = "mm or % (leave 0 for default)";
443 def->cli = "first-layer-extrusion-width=s";
444 def->ratio_over = "first_layer_height";
445 def->default_value = new ConfigOptionFloatOrPercent(200, true);
446
447 def = this->add("first_layer_height", coFloatOrPercent);
448 def->label = "First layer height";
449 def->category = "Layers and Perimeters";
450 def->tooltip = "When printing with very low layer heights, you might still want to print a thicker bottom layer to improve adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a percentage (for example: 150%) over the default layer height.";
451 def->sidetext = "mm or %";
452 def->cli = "first-layer-height=s";
453 def->ratio_over = "layer_height";
454 def->default_value = new ConfigOptionFloatOrPercent(0.35, false);
455
456 def = this->add("first_layer_speed", coFloatOrPercent);
457 def->label = "First layer speed";
458 def->tooltip = "If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds.";
459 def->sidetext = "mm/s or %";
460 def->cli = "first-layer-speed=s";
461 def->min = 0;
462 def->default_value = new ConfigOptionFloatOrPercent(30, false);
463
464 def = this->add("first_layer_temperature", coInts);
465 def->label = "First layer";
466 def->tooltip = "Extruder temperature for first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output file.";
467 def->cli = "first-layer-temperature=i@";
468 def->min = 0;
469 def->max = 500;
470 {
471 ConfigOptionInts* opt = new ConfigOptionInts();
472 opt->values.push_back(200);
473 def->default_value = opt;
474 }
475
476 def = this->add("gap_fill_speed", coFloat);
477 def->label = "Gap fill";
478 def->category = "Speed";
479 def->tooltip = "Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and resonance issues. Set zero to disable gaps filling.";
480 def->sidetext = "mm/s";
481 def->cli = "gap-fill-speed=f";
482 def->min = 0;
483 def->default_value = new ConfigOptionFloat(20);
484
485 def = this->add("gcode_arcs", coBool);
486 def->label = "Use native G-code arcs";
487 def->tooltip = "This experimental feature tries to detect arcs from segments and generates G2/G3 arc commands instead of multiple straight G1 commands.";
488 def->cli = "gcode-arcs!";
489 def->default_value = new ConfigOptionBool(0);
490
491 def = this->add("gcode_comments", coBool);
492 def->label = "Verbose G-code";
493 def->tooltip = "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down.";
494 def->cli = "gcode-comments!";
495 def->default_value = new ConfigOptionBool(0);
496
497 def = this->add("gcode_flavor", coEnum);
498 def->label = "G-code flavor";
499 def->tooltip = "Some G/M-code commands, including temperature control and others, are not universal. Set this option to your printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents Slic3r from exporting any extrusion value at all.";
500 def->cli = "gcode-flavor=s";
501 def->enum_keys_map = ConfigOptionEnum<GCodeFlavor>::get_enum_values();
502 def->enum_values.push_back("reprap");
503 def->enum_values.push_back("teacup");
504 def->enum_values.push_back("makerware");
505 def->enum_values.push_back("sailfish");
506 def->enum_values.push_back("mach3");
507 def->enum_values.push_back("machinekit");
508 def->enum_values.push_back("no-extrusion");
509 def->enum_labels.push_back("RepRap (Marlin/Sprinter/Repetier)");
510 def->enum_labels.push_back("Teacup");
511 def->enum_labels.push_back("MakerWare (MakerBot)");
512 def->enum_labels.push_back("Sailfish (MakerBot)");
513 def->enum_labels.push_back("Mach3/LinuxCNC");
514 def->enum_labels.push_back("Machinekit");
515 def->enum_labels.push_back("No extrusion");
516 def->default_value = new ConfigOptionEnum<GCodeFlavor>(gcfRepRap);
517
518 def = this->add("infill_acceleration", coFloat);
519 def->label = "Infill";
520 def->tooltip = "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill.";
521 def->sidetext = "mm/s²";
522 def->cli = "infill-acceleration=f";
523 def->min = 0;
524 def->default_value = new ConfigOptionFloat(0);
525
526 def = this->add("infill_every_layers", coInt);
527 def->label = "Combine infill every";
528 def->category = "Infill";
529 def->tooltip = "This feature allows to combine infill and speed up your print by extruding thicker infill layers while preserving thin perimeters, thus accuracy.";
530 def->sidetext = "layers";
531 def->cli = "infill-every-layers=i";
532 def->full_label = "Combine infill every n layers";
533 def->min = 1;
534 def->default_value = new ConfigOptionInt(1);
535
536 def = this->add("infill_extruder", coInt);
537 def->label = "Infill extruder";
538 def->category = "Extruders";
539 def->tooltip = "The extruder to use when printing infill.";
540 def->cli = "infill-extruder=i";
541 def->min = 1;
542 def->default_value = new ConfigOptionInt(1);
543
544 def = this->add("infill_extrusion_width", coFloatOrPercent);
545 def->label = "Infill";
546 def->category = "Extrusion Width";
547 def->tooltip = "Set this to a non-zero value to set a manual extrusion width for infill. You may want to use fatter extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) it will be computed over layer height.";
548 def->sidetext = "mm or % (leave 0 for default)";
549 def->cli = "infill-extrusion-width=s";
550 def->default_value = new ConfigOptionFloatOrPercent(0, false);
551
552 def = this->add("infill_first", coBool);
553 def->label = "Infill before perimeters";
554 def->tooltip = "This option will switch the print order of perimeters and infill, making the latter first.";
555 def->cli = "infill-first!";
556 def->default_value = new ConfigOptionBool(false);
557
558 def = this->add("infill_only_where_needed", coBool);
559 def->label = "Only infill where needed";
560 def->category = "Infill";
561 def->tooltip = "This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal support material). If enabled, slows down the G-code generation due to the multiple checks involved.";
562 def->cli = "infill-only-where-needed!";
563 def->default_value = new ConfigOptionBool(false);
564
565 def = this->add("infill_overlap", coFloatOrPercent);
566 def->label = "Infill/perimeters overlap";
567 def->category = "Advanced";
568 def->tooltip = "This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is calculated over perimeter extrusion width.";
569 def->sidetext = "mm or %";
570 def->cli = "infill-overlap=s";
571 def->ratio_over = "perimeter_extrusion_width";
572 def->default_value = new ConfigOptionFloatOrPercent(15, true);
573
574 def = this->add("infill_speed", coFloat);
575 def->label = "Infill";
576 def->category = "Speed";
577 def->tooltip = "Speed for printing the internal fill. Set to zero for auto.";
578 def->sidetext = "mm/s";
579 def->cli = "infill-speed=f";
580 def->aliases.push_back("print_feed_rate");
581 def->aliases.push_back("infill_feed_rate");
582 def->min = 0;
583 def->default_value = new ConfigOptionFloat(80);
584
585 def = this->add("interface_shells", coBool);
586 def->label = "Interface shells";
587 def->tooltip = "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material.";
588 def->cli = "interface-shells!";
589 def->category = "Layers and Perimeters";
590 def->default_value = new ConfigOptionBool(false);
591
592 def = this->add("layer_gcode", coString);
593 def->label = "After layer change G-code";
594 def->tooltip = "This custom code is inserted at every layer change, right after the Z move and before the extruder moves to the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z].";
595 def->cli = "after-layer-gcode|layer-gcode=s";
596 def->multiline = true;
597 def->full_width = true;
598 def->height = 50;
599 def->default_value = new ConfigOptionString("");
600
601 def = this->add("layer_height", coFloat);
602 def->label = "Layer height";
603 def->category = "Layers and Perimeters";
604 def->tooltip = "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print.";
605 def->sidetext = "mm";
606 def->cli = "layer-height=f";
607 def->min = 0;
608 def->default_value = new ConfigOptionFloat(0.3);
609
610 def = this->add("max_fan_speed", coInt);
611 def->label = "Max";
612 def->tooltip = "This setting represents the maximum speed of your fan.";
613 def->sidetext = "%";
614 def->cli = "max-fan-speed=i";
615 def->min = 0;
616 def->max = 100;
617 def->default_value = new ConfigOptionInt(100);
618
619 def = this->add("max_print_speed", coFloat);
620 def->label = "Max print speed";
621 def->tooltip = "When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant extruder pressure. This experimental setting is used to set the highest print speed you want to allow.";
622 def->sidetext = "mm/s";
623 def->cli = "max-print-speed=f";
624 def->min = 1;
625 def->default_value = new ConfigOptionFloat(80);
626
627 def = this->add("max_volumetric_speed", coFloat);
628 def->label = "Max volumetric speed";
629 def->tooltip = "This experimental setting is used to set the maximum volumetric speed your extruder supports.";
630 def->sidetext = "mm³/s";
631 def->cli = "max-volumetric-speed=f";
632 def->min = 0;
633 def->default_value = new ConfigOptionFloat(0);
634
635 def = this->add("max_volumetric_extrusion_rate_slope_positive", coFloat);
636 def->label = "Max volumetric slope positive";
637 def->tooltip = "This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate "
638 "of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds.";
639 def->sidetext = "mm³/s²";
640 def->cli = "max-volumetric-extrusion-rate-slope-positive=f";
641 def->min = 0;
642 def->default_value = new ConfigOptionFloat(0);
643
644 def = this->add("max_volumetric_extrusion_rate_slope_negative", coFloat);
645 def->label = "Max volumetric slope negative";
646 def->tooltip = "This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate "
647 "of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds.";
648 def->sidetext = "mm³/s²";
649 def->cli = "max-volumetric-extrusion-rate-slope-negative=f";
650 def->min = 0;
651 def->default_value = new ConfigOptionFloat(0);
652
653 def = this->add("min_fan_speed", coInt);
654 def->label = "Min";
655 def->tooltip = "This setting represents the minimum PWM your fan needs to work.";
656 def->sidetext = "%";
657 def->cli = "min-fan-speed=i";
658 def->min = 0;
659 def->max = 100;
660 def->default_value = new ConfigOptionInt(35);
661
662 def = this->add("min_print_speed", coFloat);
663 def->label = "Min print speed";
664 def->tooltip = "Slic3r will not scale speed down below this speed.";
665 def->sidetext = "mm/s";
666 def->cli = "min-print-speed=f";
667 def->min = 0;
668 def->default_value = new ConfigOptionFloat(10);
669
670 def = this->add("min_skirt_length", coFloat);
671 def->label = "Minimum extrusion length";
672 def->tooltip = "Generate no less than the number of skirt loops required to consume the specified amount of filament on the bottom layer. For multi-extruder machines, this minimum applies to each extruder.";
673 def->sidetext = "mm";
674 def->cli = "min-skirt-length=f";
675 def->min = 0;
676 def->default_value = new ConfigOptionFloat(0);
677
678 def = this->add("notes", coString);
679 def->label = "Configuration notes";
680 def->tooltip = "You can put here your personal notes. This text will be added to the G-code header comments.";
681 def->cli = "notes=s";
682 def->multiline = true;
683 def->full_width = true;
684 def->height = 130;
685 def->default_value = new ConfigOptionString("");
686
687 def = this->add("nozzle_diameter", coFloats);
688 def->label = "Nozzle diameter";
689 def->tooltip = "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)";
690 def->sidetext = "mm";
691 def->cli = "nozzle-diameter=f@";
692 {
693 ConfigOptionFloats* opt = new ConfigOptionFloats();
694 opt->values.push_back(0.5);
695 def->default_value = opt;
696 }
697
698 def = this->add("octoprint_apikey", coString);
699 def->label = "API Key";
700 def->tooltip = "Slic3r can upload G-code files to OctoPrint. This field should contain the API Key required for authentication.";
701 def->cli = "octoprint-apikey=s";
702 def->default_value = new ConfigOptionString("");
703
704 def = this->add("octoprint_host", coString);
705 def->label = "Host or IP";
706 def->tooltip = "Slic3r can upload G-code files to OctoPrint. This field should contain the hostname or IP address of the OctoPrint instance.";
707 def->cli = "octoprint-host=s";
708 def->default_value = new ConfigOptionString("");
709
710 def = this->add("only_retract_when_crossing_perimeters", coBool);
711 def->label = "Only retract when crossing perimeters";
712 def->tooltip = "Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will be probably invisible).";
713 def->cli = "only-retract-when-crossing-perimeters!";
714 def->default_value = new ConfigOptionBool(true);
715
716 def = this->add("ooze_prevention", coBool);
717 def->label = "Enable";
718 def->tooltip = "This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall skirt automatically and move extruders outside such skirt when changing temperatures.";
719 def->cli = "ooze-prevention!";
720 def->default_value = new ConfigOptionBool(false);
721
722 def = this->add("output_filename_format", coString);
723 def->label = "Output filename format";
724 def->tooltip = "You can use all configuration options as variables inside this template. For example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base].";
725 def->cli = "output-filename-format=s";
726 def->full_width = true;
727 def->default_value = new ConfigOptionString("[input_filename_base].gcode");
728
729 def = this->add("overhangs", coBool);
730 def->label = "Detect bridging perimeters";
731 def->category = "Layers and Perimeters";
732 def->tooltip = "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan.";
733 def->cli = "overhangs!";
734 def->default_value = new ConfigOptionBool(true);
735
736 def = this->add("perimeter_acceleration", coFloat);
737 def->label = "Perimeters";
738 def->tooltip = "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters.";
739 def->sidetext = "mm/s²";
740 def->cli = "perimeter-acceleration=f";
741 def->default_value = new ConfigOptionFloat(0);
742
743 def = this->add("perimeter_extruder", coInt);
744 def->label = "Perimeter extruder";
745 def->category = "Extruders";
746 def->tooltip = "The extruder to use when printing perimeters and brim. First extruder is 1.";
747 def->cli = "perimeter-extruder=i";
748 def->aliases.push_back("perimeters_extruder");
749 def->min = 1;
750 def->default_value = new ConfigOptionInt(1);
751
752 def = this->add("perimeter_extrusion_width", coFloatOrPercent);
753 def->label = "Perimeters";
754 def->category = "Extrusion Width";
755 def->tooltip = "Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner extrudates to get more accurate surfaces. If expressed as percentage (for example 200%) it will be computed over layer height.";
756 def->sidetext = "mm or % (leave 0 for default)";
757 def->cli = "perimeter-extrusion-width=s";
758 def->aliases.push_back("perimeters_extrusion_width");
759 def->default_value = new ConfigOptionFloatOrPercent(0, false);
760
761 def = this->add("perimeter_speed", coFloat);
762 def->label = "Perimeters";
763 def->category = "Speed";
764 def->tooltip = "Speed for perimeters (contours, aka vertical shells). Set to zero for auto.";
765 def->sidetext = "mm/s";
766 def->cli = "perimeter-speed=f";
767 def->aliases.push_back("perimeter_feed_rate");
768 def->min = 0;
769 def->default_value = new ConfigOptionFloat(60);
770
771 def = this->add("perimeters", coInt);
772 def->label = "Perimeters";
773 def->category = "Layers and Perimeters";
774 def->tooltip = "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled.";
775 def->sidetext = "(minimum)";
776 def->cli = "perimeters=i";
777 def->aliases.push_back("perimeter_offsets");
778 def->min = 0;
779 def->default_value = new ConfigOptionInt(3);
780
781 def = this->add("post_process", coStrings);
782 def->label = "Post-processing scripts";
783 def->tooltip = "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables.";
784 def->cli = "post-process=s@";
785 def->gui_flags = "serialized";
786 def->multiline = true;
787 def->full_width = true;
788 def->height = 60;
789
790 def = this->add("print_settings_id", coString);
791 def->default_value = new ConfigOptionString("");
792
793 def = this->add("printer_settings_id", coString);
794 def->default_value = new ConfigOptionString("");
795
796 def = this->add("pressure_advance", coFloat);
797 def->label = "Pressure advance";
798 def->tooltip = "When set to a non-zero value, this experimental option enables pressure regulation. It's the K constant for the advance algorithm that pushes more or less filament upon speed changes. It's useful for Bowden-tube extruders. Reasonable values are in range 0-10.";
799 def->cli = "pressure-advance=f";
800 def->min = 0;
801 def->default_value = new ConfigOptionFloat(0);
802
803 def = this->add("raft_layers", coInt);
804 def->label = "Raft layers";
805 def->category = "Support material";
806 def->tooltip = "The object will be raised by this number of layers, and support material will be generated under it.";
807 def->sidetext = "layers";
808 def->cli = "raft-layers=i";
809 def->min = 0;
810 def->default_value = new ConfigOptionInt(0);
811
812 def = this->add("resolution", coFloat);
813 def->label = "Resolution";
814 def->tooltip = "Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable any simplification and use full resolution from input.";
815 def->sidetext = "mm";
816 def->cli = "resolution=f";
817 def->min = 0;
818 def->default_value = new ConfigOptionFloat(0);
819
820 def = this->add("retract_before_travel", coFloats);
821 def->label = "Minimum travel after retraction";
822 def->tooltip = "Retraction is not triggered when travel moves are shorter than this length.";
823 def->sidetext = "mm";
824 def->cli = "retract-before-travel=f@";
825 {
826 ConfigOptionFloats* opt = new ConfigOptionFloats();
827 opt->values.push_back(2);
828 def->default_value = opt;
829 }
830
831 def = this->add("retract_layer_change", coBools);
832 def->label = "Retract on layer change";
833 def->tooltip = "This flag enforces a retraction whenever a Z move is done.";
834 def->cli = "retract-layer-change!";
835 {
836 ConfigOptionBools* opt = new ConfigOptionBools();
837 opt->values.push_back(false);
838 def->default_value = opt;
839 }
840
841 def = this->add("retract_length", coFloats);
842 def->label = "Length";
843 def->full_label = "Retraction Length";
844 def->tooltip = "When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder).";
845 def->sidetext = "mm (zero to disable)";
846 def->cli = "retract-length=f@";
847 {
848 ConfigOptionFloats* opt = new ConfigOptionFloats();
849 opt->values.push_back(2);
850 def->default_value = opt;
851 }
852
853 def = this->add("retract_length_toolchange", coFloats);
854 def->label = "Length";
855 def->full_label = "Retraction Length (Toolchange)";
856 def->tooltip = "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder).";
857 def->sidetext = "mm (zero to disable)";
858 def->cli = "retract-length-toolchange=f@";
859 {
860 ConfigOptionFloats* opt = new ConfigOptionFloats();
861 opt->values.push_back(10);
862 def->default_value = opt;
863 }
864
865 def = this->add("retract_lift", coFloats);
866 def->label = "Lift Z";
867 def->tooltip = "If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using multiple extruders, only the setting for the first extruder will be considered.";
868 def->sidetext = "mm";
869 def->cli = "retract-lift=f@";
870 {
871 ConfigOptionFloats* opt = new ConfigOptionFloats();
872 opt->values.push_back(0);
873 def->default_value = opt;
874 }
875
876 def = this->add("retract_lift_above", coFloats);
877 def->label = "Above Z";
878 def->full_label = "Only lift Z above";
879 def->tooltip = "If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune this setting for skipping lift on the first layers.";
880 def->sidetext = "mm";
881 def->cli = "retract-lift-above=f@";
882 {
883 ConfigOptionFloats* opt = new ConfigOptionFloats();
884 opt->values.push_back(0);
885 def->default_value = opt;
886 }
887
888 def = this->add("retract_lift_below", coFloats);
889 def->label = "Below Z";
890 def->full_label = "Only lift Z below";
891 def->tooltip = "If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune this setting for limiting lift to the first layers.";
892 def->sidetext = "mm";
893 def->cli = "retract-lift-below=f@";
894 {
895 ConfigOptionFloats* opt = new ConfigOptionFloats();
896 opt->values.push_back(0);
897 def->default_value = opt;
898 }
899
900 def = this->add("retract_restart_extra", coFloats);
901 def->label = "Extra length on restart";
902 def->tooltip = "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed.";
903 def->sidetext = "mm";
904 def->cli = "retract-restart-extra=f@";
905 {
906 ConfigOptionFloats* opt = new ConfigOptionFloats();
907 opt->values.push_back(0);
908 def->default_value = opt;
909 }
910
911 def = this->add("retract_restart_extra_toolchange", coFloats);
912 def->label = "Extra length on restart";
913 def->tooltip = "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament.";
914 def->sidetext = "mm";
915 def->cli = "retract-restart-extra-toolchange=f@";
916 {
917 ConfigOptionFloats* opt = new ConfigOptionFloats();
918 opt->values.push_back(0);
919 def->default_value = opt;
920 }
921
922 def = this->add("retract_speed", coFloats);
923 def->label = "Speed";
924 def->full_label = "Retraction Speed";
925 def->tooltip = "The speed for retractions (it only applies to the extruder motor).";
926 def->sidetext = "mm/s";
927 def->cli = "retract-speed=f@";
928 {
929 ConfigOptionFloats* opt = new ConfigOptionFloats();
930 opt->values.push_back(40);
931 def->default_value = opt;
932 }
933
934 def = this->add("seam_position", coEnum);
935 def->label = "Seam position";
936 def->category = "Layers and perimeters";
937 def->tooltip = "Position of perimeters starting points.";
938 def->cli = "seam-position=s";
939 def->enum_keys_map = ConfigOptionEnum<SeamPosition>::get_enum_values();
940 def->enum_values.push_back("random");
941 def->enum_values.push_back("nearest");
942 def->enum_values.push_back("aligned");
943 // def->enum_values.push_back("preferred");
944 def->enum_labels.push_back("Random");
945 def->enum_labels.push_back("Nearest");
946 def->enum_labels.push_back("Aligned");
947 // def->enum_labels.push_back("Preferred Direction");
948 def->default_value = new ConfigOptionEnum<SeamPosition>(spAligned);
949
950 #if 0
951 def = this->add("seam_preferred_direction", coFloat);
952 // def->gui_type = "slider";
953 def->label = "Direction";
954 def->sidetext = "°";
955 def->full_label = "Preferred direction of the seam";
956 def->tooltip = "Seam preferred direction";
957 def->cli = "seam-preferred-direction=f";
958 def->min = 0;
959 def->max = 360;
960 def->default_value = new ConfigOptionFloat(0);
961
962 def = this->add("seam_preferred_direction_jitter", coFloat);
963 // def->gui_type = "slider";
964 def->label = "Jitter";
965 def->sidetext = "°";
966 def->full_label = "Seam preferred direction jitter";
967 def->tooltip = "Preferred direction of the seam - jitter";
968 def->cli = "seam-preferred-direction-jitter=f";
969 def->min = 0;
970 def->max = 360;
971 def->default_value = new ConfigOptionFloat(30);
972 #endif
973
974 def = this->add("serial_port", coString);
975 def->gui_type = "select_open";
976 def->label = "";
977 def->full_label = "Serial port";
978 def->tooltip = "USB/serial port for printer connection.";
979 def->cli = "serial-port=s";
980 def->width = 200;
981 def->default_value = new ConfigOptionString("");
982
983 def = this->add("serial_speed", coInt);
984 def->gui_type = "i_enum_open";
985 def->label = "Speed";
986 def->full_label = "Serial port speed";
987 def->tooltip = "Speed (baud) of USB/serial port for printer connection.";
988 def->cli = "serial-speed=i";
989 def->min = 1;
990 def->max = 300000;
991 def->enum_values.push_back("115200");
992 def->enum_values.push_back("250000");
993 def->default_value = new ConfigOptionInt(250000);
994
995 def = this->add("skirt_distance", coFloat);
996 def->label = "Distance from object";
997 def->tooltip = "Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim for better adhesion.";
998 def->sidetext = "mm";
999 def->cli = "skirt-distance=f";
1000 def->min = 0;
1001 def->default_value = new ConfigOptionFloat(6);
1002
1003 def = this->add("skirt_height", coInt);
1004 def->label = "Skirt height";
1005 def->tooltip = "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts.";
1006 def->sidetext = "layers";
1007 def->cli = "skirt-height=i";
1008 def->default_value = new ConfigOptionInt(1);
1009
1010 def = this->add("skirts", coInt);
1011 def->label = "Loops (minimum)";
1012 def->full_label = "Skirt Loops";
1013 def->tooltip = "Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be greater than the one configured here. Set this to zero to disable skirt completely.";
1014 def->cli = "skirts=i";
1015 def->min = 0;
1016 def->default_value = new ConfigOptionInt(1);
1017
1018 def = this->add("slowdown_below_layer_time", coInt);
1019 def->label = "Slow down if layer print time is below";
1020 def->tooltip = "If layer print time is estimated below this number of seconds, print moves speed will be scaled down to extend duration to this value.";
1021 def->sidetext = "approximate seconds";
1022 def->cli = "slowdown-below-layer-time=i";
1023 def->width = 60;
1024 def->min = 0;
1025 def->max = 1000;
1026 def->default_value = new ConfigOptionInt(5);
1027
1028 def = this->add("small_perimeter_speed", coFloatOrPercent);
1029 def->label = "Small perimeters";
1030 def->category = "Speed";
1031 def->tooltip = "This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto.";
1032 def->sidetext = "mm/s or %";
1033 def->cli = "small-perimeter-speed=s";
1034 def->ratio_over = "perimeter_speed";
1035 def->min = 0;
1036 def->default_value = new ConfigOptionFloatOrPercent(15, false);
1037
1038 def = this->add("solid_infill_below_area", coFloat);
1039 def->label = "Solid infill threshold area";
1040 def->category = "Infill";
1041 def->tooltip = "Force solid infill for regions having a smaller area than the specified threshold.";
1042 def->sidetext = "mm²";
1043 def->cli = "solid-infill-below-area=f";
1044 def->min = 0;
1045 def->default_value = new ConfigOptionFloat(70);
1046
1047 def = this->add("solid_infill_extruder", coInt);
1048 def->label = "Solid infill extruder";
1049 def->category = "Extruders";
1050 def->tooltip = "The extruder to use when printing solid infill.";
1051 def->cli = "solid-infill-extruder=i";
1052 def->min = 1;
1053 def->default_value = new ConfigOptionInt(1);
1054
1055 def = this->add("solid_infill_every_layers", coInt);
1056 def->label = "Solid infill every";
1057 def->category = "Infill";
1058 def->tooltip = "This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to combine according to nozzle diameter and layer height.";
1059 def->sidetext = "layers";
1060 def->cli = "solid-infill-every-layers=i";
1061 def->min = 0;
1062 def->default_value = new ConfigOptionInt(0);
1063
1064 def = this->add("solid_infill_extrusion_width", coFloatOrPercent);
1065 def->label = "Solid infill";
1066 def->category = "Extrusion Width";
1067 def->tooltip = "Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If expressed as percentage (for example 90%) it will be computed over layer height.";
1068 def->sidetext = "mm or % (leave 0 for default)";
1069 def->cli = "solid-infill-extrusion-width=s";
1070 def->default_value = new ConfigOptionFloatOrPercent(0, false);
1071
1072 def = this->add("solid_infill_speed", coFloatOrPercent);
1073 def->label = "Solid infill";
1074 def->category = "Speed";
1075 def->tooltip = "Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a percentage (for example: 80%) over the default infill speed above. Set to zero for auto.";
1076 def->sidetext = "mm/s or %";
1077 def->cli = "solid-infill-speed=s";
1078 def->ratio_over = "infill_speed";
1079 def->aliases.push_back("solid_infill_feed_rate");
1080 def->min = 0;
1081 def->default_value = new ConfigOptionFloatOrPercent(20, false);
1082
1083 def = this->add("solid_layers", coInt);
1084 def->label = "Solid layers";
1085 def->tooltip = "Number of solid layers to generate on top and bottom surfaces.";
1086 def->cli = "solid-layers=i";
1087 def->shortcut.push_back("top_solid_layers");
1088 def->shortcut.push_back("bottom_solid_layers");
1089 def->min = 0;
1090
1091 def = this->add("spiral_vase", coBool);
1092 def->label = "Spiral vase";
1093 def->tooltip = "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than an object.";
1094 def->cli = "spiral-vase!";
1095 def->default_value = new ConfigOptionBool(false);
1096
1097 def = this->add("standby_temperature_delta", coInt);
1098 def->label = "Temperature variation";
1099 def->tooltip = "Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped.";
1100 def->sidetext = "∆°C";
1101 def->cli = "standby-temperature-delta=i";
1102 def->min = -500;
1103 def->max = 500;
1104 def->default_value = new ConfigOptionInt(-5);
1105
1106 def = this->add("start_gcode", coString);
1107 def->label = "Start G-code";
1108 def->tooltip = "This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder just started heating, and before extruder has finished heating. If Slic3r detects M104 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want.";
1109 def->cli = "start-gcode=s";
1110 def->multiline = true;
1111 def->full_width = true;
1112 def->height = 120;
1113 def->default_value = new ConfigOptionString("G28 ; home all axes\nG1 Z5 F5000 ; lift nozzle\n");
1114
1115 def = this->add("support_material", coBool);
1116 def->label = "Generate support material";
1117 def->category = "Support material";
1118 def->tooltip = "Enable support material generation.";
1119 def->cli = "support-material!";
1120 def->default_value = new ConfigOptionBool(false);
1121
1122 def = this->add("support_material_angle", coInt);
1123 def->label = "Pattern angle";
1124 def->category = "Support material";
1125 def->tooltip = "Use this setting to rotate the support material pattern on the horizontal plane.";
1126 def->sidetext = "°";
1127 def->cli = "support-material-angle=i";
1128 def->min = 0;
1129 def->max = 359;
1130 def->default_value = new ConfigOptionInt(0);
1131
1132 def = this->add("support_material_buildplate_only", coBool);
1133 def->label = "Support on build plate only";
1134 def->category = "Support material";
1135 def->tooltip = "Only create support if it lies on a build plate. Don't create support on a print.";
1136 def->cli = "support-material-buildplate-only!";
1137 def->default_value = new ConfigOptionBool(false);
1138
1139 def = this->add("support_material_contact_distance", coFloat);
1140 def->gui_type = "f_enum_open";
1141 def->label = "Contact Z distance";
1142 def->category = "Support material";
1143 def->tooltip = "The vertical distance between object and support material interface. Setting this to 0 will also prevent Slic3r from using bridge flow and speed for the first object layer.";
1144 def->sidetext = "mm";
1145 def->cli = "support-material-contact-distance=f";
1146 def->min = 0;
1147 def->enum_values.push_back("0");
1148 def->enum_values.push_back("0.2");
1149 def->enum_labels.push_back("0 (soluble)");
1150 def->enum_labels.push_back("0.2 (detachable)");
1151 def->default_value = new ConfigOptionFloat(0.2);
1152
1153 def = this->add("support_material_enforce_layers", coInt);
1154 def->label = "Enforce support for the first";
1155 def->category = "Support material";
1156 def->tooltip = "Generate support material for the specified number of layers counting from bottom, regardless of whether normal support material is enabled or not and regardless of any angle threshold. This is useful for getting more adhesion of objects having a very thin or poor footprint on the build plate.";
1157 def->sidetext = "layers";
1158 def->cli = "support-material-enforce-layers=f";
1159 def->full_label = "Enforce support for the first n layers";
1160 def->min = 0;
1161 def->default_value = new ConfigOptionInt(0);
1162
1163 def = this->add("support_material_extruder", coInt);
1164 def->label = "Support material/raft/skirt extruder";
1165 def->category = "Extruders";
1166 def->tooltip = "The extruder to use when printing support material, raft and skirt.";
1167 def->cli = "support-material-extruder=i";
1168 def->min = 1;
1169 def->default_value = new ConfigOptionInt(1);
1170
1171 def = this->add("support_material_extrusion_width", coFloatOrPercent);
1172 def->label = "Support material";
1173 def->category = "Extrusion Width";
1174 def->tooltip = "Set this to a non-zero value to set a manual extrusion width for support material. If expressed as percentage (for example 90%) it will be computed over layer height.";
1175 def->sidetext = "mm or % (leave 0 for default)";
1176 def->cli = "support-material-extrusion-width=s";
1177 def->default_value = new ConfigOptionFloatOrPercent(0, false);
1178
1179 def = this->add("support_material_interface_extruder", coInt);
1180 def->label = "Support material/raft interface extruder";
1181 def->category = "Extruders";
1182 def->tooltip = "The extruder to use when printing support material interface. This affects raft too.";
1183 def->cli = "support-material-interface-extruder=i";
1184 def->min = 1;
1185 def->default_value = new ConfigOptionInt(1);
1186
1187 def = this->add("support_material_interface_layers", coInt);
1188 def->label = "Interface layers";
1189 def->category = "Support material";
1190 def->tooltip = "Number of interface layers to insert between the object(s) and support material.";
1191 def->sidetext = "layers";
1192 def->cli = "support-material-interface-layers=i";
1193 def->min = 0;
1194 def->default_value = new ConfigOptionInt(3);
1195
1196 def = this->add("support_material_interface_spacing", coFloat);
1197 def->label = "Interface pattern spacing";
1198 def->category = "Support material";
1199 def->tooltip = "Spacing between interface lines. Set zero to get a solid interface.";
1200 def->sidetext = "mm";
1201 def->cli = "support-material-interface-spacing=f";
1202 def->min = 0;
1203 def->default_value = new ConfigOptionFloat(0);
1204
1205 def = this->add("support_material_interface_speed", coFloatOrPercent);
1206 def->label = "Support material interface";
1207 def->category = "Support material";
1208 def->tooltip = "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed.";
1209 def->sidetext = "mm/s or %";
1210 def->cli = "support-material-interface-speed=s";
1211 def->ratio_over = "support_material_speed";
1212 def->min = 0;
1213 def->default_value = new ConfigOptionFloatOrPercent(100, true);
1214
1215 def = this->add("support_material_pattern", coEnum);
1216 def->label = "Pattern";
1217 def->category = "Support material";
1218 def->tooltip = "Pattern used to generate support material.";
1219 def->cli = "support-material-pattern=s";
1220 def->enum_keys_map = ConfigOptionEnum<SupportMaterialPattern>::get_enum_values();
1221 def->enum_values.push_back("rectilinear");
1222 def->enum_values.push_back("rectilinear-grid");
1223 def->enum_values.push_back("honeycomb");
1224 def->enum_values.push_back("pillars");
1225 def->enum_labels.push_back("rectilinear");
1226 def->enum_labels.push_back("rectilinear grid");
1227 def->enum_labels.push_back("honeycomb");
1228 def->enum_labels.push_back("pillars");
1229 def->default_value = new ConfigOptionEnum<SupportMaterialPattern>(smpPillars);
1230
1231 def = this->add("support_material_spacing", coFloat);
1232 def->label = "Pattern spacing";
1233 def->category = "Support material";
1234 def->tooltip = "Spacing between support material lines.";
1235 def->sidetext = "mm";
1236 def->cli = "support-material-spacing=f";
1237 def->min = 0;
1238 def->default_value = new ConfigOptionFloat(2.5);
1239
1240 def = this->add("support_material_speed", coFloat);
1241 def->label = "Support material";
1242 def->category = "Support material";
1243 def->tooltip = "Speed for printing support material.";
1244 def->sidetext = "mm/s";
1245 def->cli = "support-material-speed=f";
1246 def->min = 0;
1247 def->default_value = new ConfigOptionFloat(60);
1248
1249 def = this->add("support_material_threshold", coInt);
1250 def->label = "Overhang threshold";
1251 def->category = "Support material";
1252 def->tooltip = "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended).";
1253 def->sidetext = "°";
1254 def->cli = "support-material-threshold=i";
1255 def->min = 0;
1256 def->max = 90;
1257 def->default_value = new ConfigOptionInt(0);
1258
1259 def = this->add("support_material_with_sheath", coBool);
1260 def->label = "With sheath around the support";
1261 def->category = "Support material";
1262 def->tooltip = "Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but also more difficult to remove.";
1263 def->cli = "support-material-with-sheath!";
1264 def->default_value = new ConfigOptionBool(true);
1265
1266 def = this->add("temperature", coInts);
1267 def->label = "Other layers";
1268 def->tooltip = "Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands in the output.";
1269 def->cli = "temperature=i@";
1270 def->full_label = "Temperature";
1271 def->max = 0;
1272 def->max = 500;
1273 {
1274 ConfigOptionInts* opt = new ConfigOptionInts();
1275 opt->values.push_back(200);
1276 def->default_value = opt;
1277 }
1278
1279 def = this->add("thin_walls", coBool);
1280 def->label = "Detect thin walls";
1281 def->category = "Layers and Perimeters";
1282 def->tooltip = "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace).";
1283 def->cli = "thin-walls!";
1284 def->default_value = new ConfigOptionBool(true);
1285
1286 def = this->add("threads", coInt);
1287 def->label = "Threads";
1288 def->tooltip = "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors.";
1289 def->cli = "threads|j=i";
1290 def->readonly = true;
1291 def->min = 1;
1292 def->max = 16;
1293 def->default_value = new ConfigOptionInt(2);
1294
1295 def = this->add("toolchange_gcode", coString);
1296 def->label = "Tool change G-code";
1297 def->tooltip = "This custom code is inserted right before every extruder change. Note that you can use placeholder variables for all Slic3r settings as well as [previous_extruder] and [next_extruder].";
1298 def->cli = "toolchange-gcode=s";
1299 def->multiline = true;
1300 def->full_width = true;
1301 def->height = 50;
1302 def->default_value = new ConfigOptionString("");
1303
1304 def = this->add("top_infill_extrusion_width", coFloatOrPercent);
1305 def->label = "Top solid infill";
1306 def->category = "Extrusion Width";
1307 def->tooltip = "Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. If expressed as percentage (for example 90%) it will be computed over layer height.";
1308 def->sidetext = "mm or % (leave 0 for default)";
1309 def->cli = "top-infill-extrusion-width=s";
1310 def->default_value = new ConfigOptionFloatOrPercent(0, false);
1311
1312 def = this->add("top_solid_infill_speed", coFloatOrPercent);
1313 def->label = "Top solid infill";
1314 def->category = "Speed";
1315 def->tooltip = "Speed for printing top solid layers (it only applies to the uppermost external layers and not to their internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto.";
1316 def->sidetext = "mm/s or %";
1317 def->cli = "top-solid-infill-speed=s";
1318 def->ratio_over = "solid_infill_speed";
1319 def->min = 0;
1320 def->default_value = new ConfigOptionFloatOrPercent(15, false);
1321
1322 def = this->add("top_solid_layers", coInt);
1323 def->label = "Top";
1324 def->category = "Layers and Perimeters";
1325 def->tooltip = "Number of solid layers to generate on top surfaces.";
1326 def->cli = "top-solid-layers=i";
1327 def->full_label = "Top solid layers";
1328 def->min = 0;
1329 def->default_value = new ConfigOptionInt(3);
1330
1331 def = this->add("travel_speed", coFloat);
1332 def->label = "Travel";
1333 def->tooltip = "Speed for travel moves (jumps between distant extrusion points).";
1334 def->sidetext = "mm/s";
1335 def->cli = "travel-speed=f";
1336 def->aliases.push_back("travel_feed_rate");
1337 def->min = 1;
1338 def->default_value = new ConfigOptionFloat(130);
1339
1340 def = this->add("use_firmware_retraction", coBool);
1341 def->label = "Use firmware retraction";
1342 def->tooltip = "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin.";
1343 def->cli = "use-firmware-retraction!";
1344 def->default_value = new ConfigOptionBool(false);
1345
1346 def = this->add("use_relative_e_distances", coBool);
1347 def->label = "Use relative E distances";
1348 def->tooltip = "If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use absolute values.";
1349 def->cli = "use-relative-e-distances!";
1350 def->default_value = new ConfigOptionBool(false);
1351
1352 def = this->add("use_volumetric_e", coBool);
1353 def->label = "Use volumetric E";
1354 def->tooltip = "This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If your firmware doesn't already know filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin.";
1355 def->cli = "use-volumetric-e!";
1356 def->default_value = new ConfigOptionBool(false);
1357
1358 def = this->add("wipe", coBools);
1359 def->label = "Wipe while retracting";
1360 def->tooltip = "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders.";
1361 def->cli = "wipe!";
1362 {
1363 ConfigOptionBools* opt = new ConfigOptionBools();
1364 opt->values.push_back(false);
1365 def->default_value = opt;
1366 }
1367
1368 def = this->add("xy_size_compensation", coFloat);
1369 def->label = "XY Size Compensation";
1370 def->category = "Advanced";
1371 def->tooltip = "The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = outwards). This might be useful for fine-tuning hole sizes.";
1372 def->sidetext = "mm";
1373 def->cli = "xy-size-compensation=f";
1374 def->default_value = new ConfigOptionFloat(0);
1375
1376 def = this->add("z_offset", coFloat);
1377 def->label = "Z offset";
1378 def->tooltip = "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop).";
1379 def->sidetext = "mm";
1380 def->cli = "z-offset=f";
1381 def->default_value = new ConfigOptionFloat(0);
1382 }
1383
1384 PrintConfigDef print_config_def;
1385
1386 void
1387 DynamicPrintConfig::normalize() {
1388 if (this->has("extruder")) {
1389 int extruder = this->option("extruder")->getInt();
1390 this->erase("extruder");
1391 if (extruder != 0) {
1392 if (!this->has("infill_extruder"))
1393 this->option("infill_extruder", true)->setInt(extruder);
1394 if (!this->has("perimeter_extruder"))
1395 this->option("perimeter_extruder", true)->setInt(extruder);
1396 if (!this->has("support_material_extruder"))
1397 this->option("support_material_extruder", true)->setInt(extruder);
1398 if (!this->has("support_material_interface_extruder"))
1399 this->option("support_material_interface_extruder", true)->setInt(extruder);
1400 }
1401 }
1402
1403 if (!this->has("solid_infill_extruder") && this->has("infill_extruder"))
1404 this->option("solid_infill_extruder", true)->setInt(this->option("infill_extruder")->getInt());
1405
1406 if (this->has("spiral_vase") && this->opt<ConfigOptionBool>("spiral_vase", true)->value) {
1407 {
1408 // this should be actually done only on the spiral layers instead of all
1409 ConfigOptionBools* opt = this->opt<ConfigOptionBools>("retract_layer_change", true);
1410 opt->values.assign(opt->values.size(), false); // set all values to false
1411 }
1412 {
1413 this->opt<ConfigOptionInt>("perimeters", true)->value = 1;
1414 this->opt<ConfigOptionInt>("top_solid_layers", true)->value = 0;
1415 this->opt<ConfigOptionPercent>("fill_density", true)->value = 0;
1416 }
1417 }
1418 }
1419
1420 double
1421 PrintConfigBase::min_object_distance() const
1422 {
1423 double extruder_clearance_radius = this->option("extruder_clearance_radius")->getFloat();
1424 double duplicate_distance = this->option("duplicate_distance")->getFloat();
1425
1426 // min object distance is max(duplicate_distance, clearance_radius)
1427 return (this->option("complete_objects")->getBool() && extruder_clearance_radius > duplicate_distance)
1428 ? extruder_clearance_radius
1429 : duplicate_distance;
1430 }
1431
1432 }
0 // Configuration store of Slic3r.
1 //
2 // The configuration store is either static or dynamic.
3 // DynamicPrintConfig is used mainly at the user interface. while the StaticPrintConfig is used
4 // during the slicing and the g-code generation.
5 //
6 // The classes derived from StaticPrintConfig form a following hierarchy.
7 // Virtual inheritance is used for some of the parent objects.
8 //
9 // FullPrintConfig
10 // PrintObjectConfig
11 // PrintRegionConfig
12 // PrintConfig
13 // GCodeConfig
14 // HostConfig
15 //
16
17 #ifndef slic3r_PrintConfig_hpp_
18 #define slic3r_PrintConfig_hpp_
19
20 #include "libslic3r.h"
21 #include "Config.hpp"
22
23 #define OPT_PTR(KEY) if (opt_key == #KEY) return &this->KEY
24
25 namespace Slic3r {
26
27 enum GCodeFlavor {
28 gcfRepRap, gcfTeacup, gcfMakerWare, gcfSailfish, gcfMach3, gcfMachinekit, gcfNoExtrusion,
29 };
30
31 enum InfillPattern {
32 ipRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb,
33 ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral,
34 };
35
36 enum SupportMaterialPattern {
37 smpRectilinear, smpRectilinearGrid, smpHoneycomb, smpPillars,
38 };
39
40 enum SeamPosition {
41 spRandom, spNearest, spAligned //, spPreferred
42 };
43
44 template<> inline t_config_enum_values ConfigOptionEnum<GCodeFlavor>::get_enum_values() {
45 t_config_enum_values keys_map;
46 keys_map["reprap"] = gcfRepRap;
47 keys_map["teacup"] = gcfTeacup;
48 keys_map["makerware"] = gcfMakerWare;
49 keys_map["sailfish"] = gcfSailfish;
50 keys_map["mach3"] = gcfMach3;
51 keys_map["machinekit"] = gcfMachinekit;
52 keys_map["no-extrusion"] = gcfNoExtrusion;
53 return keys_map;
54 }
55
56 template<> inline t_config_enum_values ConfigOptionEnum<InfillPattern>::get_enum_values() {
57 t_config_enum_values keys_map;
58 keys_map["rectilinear"] = ipRectilinear;
59 keys_map["grid"] = ipGrid;
60 keys_map["triangles"] = ipTriangles;
61 keys_map["stars"] = ipStars;
62 keys_map["cubic"] = ipCubic;
63 keys_map["line"] = ipLine;
64 keys_map["concentric"] = ipConcentric;
65 keys_map["honeycomb"] = ipHoneycomb;
66 keys_map["3dhoneycomb"] = ip3DHoneycomb;
67 keys_map["hilbertcurve"] = ipHilbertCurve;
68 keys_map["archimedeanchords"] = ipArchimedeanChords;
69 keys_map["octagramspiral"] = ipOctagramSpiral;
70 return keys_map;
71 }
72
73 template<> inline t_config_enum_values ConfigOptionEnum<SupportMaterialPattern>::get_enum_values() {
74 t_config_enum_values keys_map;
75 keys_map["rectilinear"] = smpRectilinear;
76 keys_map["rectilinear-grid"] = smpRectilinearGrid;
77 keys_map["honeycomb"] = smpHoneycomb;
78 keys_map["pillars"] = smpPillars;
79 return keys_map;
80 }
81
82 template<> inline t_config_enum_values ConfigOptionEnum<SeamPosition>::get_enum_values() {
83 t_config_enum_values keys_map;
84 keys_map["random"] = spRandom;
85 keys_map["nearest"] = spNearest;
86 keys_map["aligned"] = spAligned;
87 // keys_map["preferred"] = spPreferred;
88 return keys_map;
89 }
90
91 // Defines each and every confiuration option of Slic3r, including the properties of the GUI dialogs.
92 // Does not store the actual values, but defines default values.
93 class PrintConfigDef : public ConfigDef
94 {
95 public:
96 PrintConfigDef();
97 };
98
99 // The one and only global definition of SLic3r configuration options.
100 // This definition is constant.
101 extern PrintConfigDef print_config_def;
102
103 // Slic3r configuration storage with print_config_def assigned.
104 class PrintConfigBase : public virtual ConfigBase
105 {
106 public:
107 PrintConfigBase() {
108 this->def = &print_config_def;
109 };
110
111 double min_object_distance() const;
112 };
113
114 // Slic3r dynamic configuration, used to override the configuration
115 // per object, per modification volume or per printing material.
116 // The dynamic configuration is also used to store user modifications of the print global parameters,
117 // so the modified configuration values may be diffed against the active configuration
118 // to invalidate the proper slicing resp. g-code generation processing steps.
119 // This object is mapped to Perl as Slic3r::Config.
120 class DynamicPrintConfig : public PrintConfigBase, public DynamicConfig
121 {
122 public:
123 DynamicPrintConfig() : PrintConfigBase(), DynamicConfig() {};
124 void normalize();
125 };
126
127
128 class StaticPrintConfig : public PrintConfigBase, public StaticConfig
129 {
130 public:
131 StaticPrintConfig() : PrintConfigBase(), StaticConfig() {};
132 };
133
134 // This object is mapped to Perl as Slic3r::Config::PrintObject.
135 class PrintObjectConfig : public virtual StaticPrintConfig
136 {
137 public:
138 ConfigOptionBool dont_support_bridges;
139 ConfigOptionFloatOrPercent extrusion_width;
140 ConfigOptionFloatOrPercent first_layer_height;
141 ConfigOptionBool infill_only_where_needed;
142 ConfigOptionBool interface_shells;
143 ConfigOptionFloat layer_height;
144 ConfigOptionInt raft_layers;
145 ConfigOptionEnum<SeamPosition> seam_position;
146 // ConfigOptionFloat seam_preferred_direction;
147 // ConfigOptionFloat seam_preferred_direction_jitter;
148 ConfigOptionBool support_material;
149 ConfigOptionInt support_material_angle;
150 ConfigOptionBool support_material_buildplate_only;
151 ConfigOptionFloat support_material_contact_distance;
152 ConfigOptionInt support_material_enforce_layers;
153 ConfigOptionInt support_material_extruder;
154 ConfigOptionFloatOrPercent support_material_extrusion_width;
155 ConfigOptionInt support_material_interface_extruder;
156 ConfigOptionInt support_material_interface_layers;
157 ConfigOptionFloat support_material_interface_spacing;
158 ConfigOptionFloatOrPercent support_material_interface_speed;
159 ConfigOptionEnum<SupportMaterialPattern> support_material_pattern;
160 ConfigOptionFloat support_material_spacing;
161 ConfigOptionFloat support_material_speed;
162 ConfigOptionInt support_material_threshold;
163 ConfigOptionBool support_material_with_sheath;
164 ConfigOptionFloat xy_size_compensation;
165
166 PrintObjectConfig(bool initialize = true) : StaticPrintConfig() {
167 if (initialize)
168 this->set_defaults();
169 }
170
171 virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) {
172 OPT_PTR(dont_support_bridges);
173 OPT_PTR(extrusion_width);
174 OPT_PTR(first_layer_height);
175 OPT_PTR(infill_only_where_needed);
176 OPT_PTR(interface_shells);
177 OPT_PTR(layer_height);
178 OPT_PTR(raft_layers);
179 OPT_PTR(seam_position);
180 // OPT_PTR(seam_preferred_direction);
181 // OPT_PTR(seam_preferred_direction_jitter);
182 OPT_PTR(support_material);
183 OPT_PTR(support_material_angle);
184 OPT_PTR(support_material_buildplate_only);
185 OPT_PTR(support_material_contact_distance);
186 OPT_PTR(support_material_enforce_layers);
187 OPT_PTR(support_material_extruder);
188 OPT_PTR(support_material_extrusion_width);
189 OPT_PTR(support_material_interface_extruder);
190 OPT_PTR(support_material_interface_layers);
191 OPT_PTR(support_material_interface_spacing);
192 OPT_PTR(support_material_interface_speed);
193 OPT_PTR(support_material_pattern);
194 OPT_PTR(support_material_spacing);
195 OPT_PTR(support_material_speed);
196 OPT_PTR(support_material_threshold);
197 OPT_PTR(support_material_with_sheath);
198 OPT_PTR(xy_size_compensation);
199
200 return NULL;
201 };
202 };
203
204 // This object is mapped to Perl as Slic3r::Config::PrintRegion.
205 class PrintRegionConfig : public virtual StaticPrintConfig
206 {
207 public:
208 ConfigOptionInt bottom_solid_layers;
209 ConfigOptionFloat bridge_flow_ratio;
210 ConfigOptionFloat bridge_speed;
211 ConfigOptionBool ensure_vertical_shell_thickness;
212 ConfigOptionEnum<InfillPattern> external_fill_pattern;
213 ConfigOptionFloatOrPercent external_perimeter_extrusion_width;
214 ConfigOptionFloatOrPercent external_perimeter_speed;
215 ConfigOptionBool external_perimeters_first;
216 ConfigOptionBool extra_perimeters;
217 ConfigOptionFloat fill_angle;
218 ConfigOptionPercent fill_density;
219 ConfigOptionEnum<InfillPattern> fill_pattern;
220 ConfigOptionFloat gap_fill_speed;
221 ConfigOptionInt infill_extruder;
222 ConfigOptionFloatOrPercent infill_extrusion_width;
223 ConfigOptionInt infill_every_layers;
224 ConfigOptionFloatOrPercent infill_overlap;
225 ConfigOptionFloat infill_speed;
226 ConfigOptionBool overhangs;
227 ConfigOptionInt perimeter_extruder;
228 ConfigOptionFloatOrPercent perimeter_extrusion_width;
229 ConfigOptionFloat perimeter_speed;
230 ConfigOptionInt perimeters;
231 ConfigOptionFloatOrPercent small_perimeter_speed;
232 ConfigOptionFloat solid_infill_below_area;
233 ConfigOptionInt solid_infill_extruder;
234 ConfigOptionFloatOrPercent solid_infill_extrusion_width;
235 ConfigOptionInt solid_infill_every_layers;
236 ConfigOptionFloatOrPercent solid_infill_speed;
237 ConfigOptionBool thin_walls;
238 ConfigOptionFloatOrPercent top_infill_extrusion_width;
239 ConfigOptionInt top_solid_layers;
240 ConfigOptionFloatOrPercent top_solid_infill_speed;
241
242 PrintRegionConfig(bool initialize = true) : StaticPrintConfig() {
243 if (initialize)
244 this->set_defaults();
245 }
246
247 virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) {
248 OPT_PTR(bottom_solid_layers);
249 OPT_PTR(bridge_flow_ratio);
250 OPT_PTR(bridge_speed);
251 OPT_PTR(ensure_vertical_shell_thickness);
252 OPT_PTR(external_fill_pattern);
253 OPT_PTR(external_perimeter_extrusion_width);
254 OPT_PTR(external_perimeter_speed);
255 OPT_PTR(external_perimeters_first);
256 OPT_PTR(extra_perimeters);
257 OPT_PTR(fill_angle);
258 OPT_PTR(fill_density);
259 OPT_PTR(fill_pattern);
260 OPT_PTR(gap_fill_speed);
261 OPT_PTR(infill_extruder);
262 OPT_PTR(infill_extrusion_width);
263 OPT_PTR(infill_every_layers);
264 OPT_PTR(infill_overlap);
265 OPT_PTR(infill_speed);
266 OPT_PTR(overhangs);
267 OPT_PTR(perimeter_extruder);
268 OPT_PTR(perimeter_extrusion_width);
269 OPT_PTR(perimeter_speed);
270 OPT_PTR(perimeters);
271 OPT_PTR(small_perimeter_speed);
272 OPT_PTR(solid_infill_below_area);
273 OPT_PTR(solid_infill_extruder);
274 OPT_PTR(solid_infill_extrusion_width);
275 OPT_PTR(solid_infill_every_layers);
276 OPT_PTR(solid_infill_speed);
277 OPT_PTR(thin_walls);
278 OPT_PTR(top_infill_extrusion_width);
279 OPT_PTR(top_solid_infill_speed);
280 OPT_PTR(top_solid_layers);
281
282 return NULL;
283 };
284 };
285
286 // This object is mapped to Perl as Slic3r::Config::GCode.
287 class GCodeConfig : public virtual StaticPrintConfig
288 {
289 public:
290 ConfigOptionString before_layer_gcode;
291 ConfigOptionString end_gcode;
292 ConfigOptionString extrusion_axis;
293 ConfigOptionFloats extrusion_multiplier;
294 ConfigOptionFloats filament_diameter;
295 ConfigOptionFloats filament_max_volumetric_speed;
296 ConfigOptionBool gcode_comments;
297 ConfigOptionEnum<GCodeFlavor> gcode_flavor;
298 ConfigOptionString layer_gcode;
299 ConfigOptionFloat max_print_speed;
300 ConfigOptionFloat max_volumetric_speed;
301 ConfigOptionFloat max_volumetric_extrusion_rate_slope_positive;
302 ConfigOptionFloat max_volumetric_extrusion_rate_slope_negative;
303 ConfigOptionFloat pressure_advance;
304 ConfigOptionFloats retract_length;
305 ConfigOptionFloats retract_length_toolchange;
306 ConfigOptionFloats retract_lift;
307 ConfigOptionFloats retract_lift_above;
308 ConfigOptionFloats retract_lift_below;
309 ConfigOptionFloats retract_restart_extra;
310 ConfigOptionFloats retract_restart_extra_toolchange;
311 ConfigOptionFloats retract_speed;
312 ConfigOptionString start_gcode;
313 ConfigOptionString toolchange_gcode;
314 ConfigOptionFloat travel_speed;
315 ConfigOptionBool use_firmware_retraction;
316 ConfigOptionBool use_relative_e_distances;
317 ConfigOptionBool use_volumetric_e;
318
319 GCodeConfig(bool initialize = true) : StaticPrintConfig() {
320 if (initialize)
321 this->set_defaults();
322 }
323
324 virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) {
325 OPT_PTR(before_layer_gcode);
326 OPT_PTR(end_gcode);
327 OPT_PTR(extrusion_axis);
328 OPT_PTR(extrusion_multiplier);
329 OPT_PTR(filament_diameter);
330 OPT_PTR(filament_max_volumetric_speed);
331 OPT_PTR(gcode_comments);
332 OPT_PTR(gcode_flavor);
333 OPT_PTR(layer_gcode);
334 OPT_PTR(max_print_speed);
335 OPT_PTR(max_volumetric_speed);
336 OPT_PTR(max_volumetric_extrusion_rate_slope_positive);
337 OPT_PTR(max_volumetric_extrusion_rate_slope_negative);
338 OPT_PTR(pressure_advance);
339 OPT_PTR(retract_length);
340 OPT_PTR(retract_length_toolchange);
341 OPT_PTR(retract_lift);
342 OPT_PTR(retract_lift_above);
343 OPT_PTR(retract_lift_below);
344 OPT_PTR(retract_restart_extra);
345 OPT_PTR(retract_restart_extra_toolchange);
346 OPT_PTR(retract_speed);
347 OPT_PTR(start_gcode);
348 OPT_PTR(toolchange_gcode);
349 OPT_PTR(travel_speed);
350 OPT_PTR(use_firmware_retraction);
351 OPT_PTR(use_relative_e_distances);
352 OPT_PTR(use_volumetric_e);
353
354 return NULL;
355 };
356
357 std::string get_extrusion_axis() const
358 {
359 if ((this->gcode_flavor.value == gcfMach3) || (this->gcode_flavor.value == gcfMachinekit)) {
360 return "A";
361 } else if (this->gcode_flavor.value == gcfNoExtrusion) {
362 return "";
363 } else {
364 return this->extrusion_axis.value;
365 }
366 };
367 };
368
369 // This object is mapped to Perl as Slic3r::Config::Print.
370 class PrintConfig : public GCodeConfig
371 {
372 public:
373 ConfigOptionBool avoid_crossing_perimeters;
374 ConfigOptionPoints bed_shape;
375 ConfigOptionInt bed_temperature;
376 ConfigOptionFloat bridge_acceleration;
377 ConfigOptionInt bridge_fan_speed;
378 ConfigOptionFloat brim_width;
379 ConfigOptionBool complete_objects;
380 ConfigOptionBool cooling;
381 ConfigOptionFloat default_acceleration;
382 ConfigOptionInt disable_fan_first_layers;
383 ConfigOptionFloat duplicate_distance;
384 ConfigOptionFloat extruder_clearance_height;
385 ConfigOptionFloat extruder_clearance_radius;
386 ConfigOptionPoints extruder_offset;
387 ConfigOptionBool fan_always_on;
388 ConfigOptionInt fan_below_layer_time;
389 ConfigOptionStrings filament_colour;
390 ConfigOptionStrings filament_notes;
391 ConfigOptionFloat first_layer_acceleration;
392 ConfigOptionInt first_layer_bed_temperature;
393 ConfigOptionFloatOrPercent first_layer_extrusion_width;
394 ConfigOptionFloatOrPercent first_layer_speed;
395 ConfigOptionInts first_layer_temperature;
396 ConfigOptionBool gcode_arcs;
397 ConfigOptionFloat infill_acceleration;
398 ConfigOptionBool infill_first;
399 ConfigOptionInt max_fan_speed;
400 ConfigOptionInt min_fan_speed;
401 ConfigOptionFloat min_print_speed;
402 ConfigOptionFloat min_skirt_length;
403 ConfigOptionString notes;
404 ConfigOptionFloats nozzle_diameter;
405 ConfigOptionBool only_retract_when_crossing_perimeters;
406 ConfigOptionBool ooze_prevention;
407 ConfigOptionString output_filename_format;
408 ConfigOptionFloat perimeter_acceleration;
409 ConfigOptionStrings post_process;
410 ConfigOptionFloat resolution;
411 ConfigOptionFloats retract_before_travel;
412 ConfigOptionBools retract_layer_change;
413 ConfigOptionFloat skirt_distance;
414 ConfigOptionInt skirt_height;
415 ConfigOptionInt skirts;
416 ConfigOptionInt slowdown_below_layer_time;
417 ConfigOptionBool spiral_vase;
418 ConfigOptionInt standby_temperature_delta;
419 ConfigOptionInts temperature;
420 ConfigOptionInt threads;
421 ConfigOptionBools wipe;
422 ConfigOptionFloat z_offset;
423
424 PrintConfig(bool initialize = true) : GCodeConfig(false) {
425 if (initialize)
426 this->set_defaults();
427 }
428
429 virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) {
430 OPT_PTR(avoid_crossing_perimeters);
431 OPT_PTR(bed_shape);
432 OPT_PTR(bed_temperature);
433 OPT_PTR(bridge_acceleration);
434 OPT_PTR(bridge_fan_speed);
435 OPT_PTR(brim_width);
436 OPT_PTR(complete_objects);
437 OPT_PTR(cooling);
438 OPT_PTR(default_acceleration);
439 OPT_PTR(disable_fan_first_layers);
440 OPT_PTR(duplicate_distance);
441 OPT_PTR(extruder_clearance_height);
442 OPT_PTR(extruder_clearance_radius);
443 OPT_PTR(extruder_offset);
444 OPT_PTR(fan_always_on);
445 OPT_PTR(fan_below_layer_time);
446 OPT_PTR(filament_colour);
447 OPT_PTR(filament_notes);
448 OPT_PTR(first_layer_acceleration);
449 OPT_PTR(first_layer_bed_temperature);
450 OPT_PTR(first_layer_extrusion_width);
451 OPT_PTR(first_layer_speed);
452 OPT_PTR(first_layer_temperature);
453 OPT_PTR(gcode_arcs);
454 OPT_PTR(infill_acceleration);
455 OPT_PTR(infill_first);
456 OPT_PTR(max_fan_speed);
457 OPT_PTR(min_fan_speed);
458 OPT_PTR(min_print_speed);
459 OPT_PTR(min_skirt_length);
460 OPT_PTR(notes);
461 OPT_PTR(nozzle_diameter);
462 OPT_PTR(only_retract_when_crossing_perimeters);
463 OPT_PTR(ooze_prevention);
464 OPT_PTR(output_filename_format);
465 OPT_PTR(perimeter_acceleration);
466 OPT_PTR(post_process);
467 OPT_PTR(resolution);
468 OPT_PTR(retract_before_travel);
469 OPT_PTR(retract_layer_change);
470 OPT_PTR(skirt_distance);
471 OPT_PTR(skirt_height);
472 OPT_PTR(skirts);
473 OPT_PTR(slowdown_below_layer_time);
474 OPT_PTR(spiral_vase);
475 OPT_PTR(standby_temperature_delta);
476 OPT_PTR(temperature);
477 OPT_PTR(threads);
478 OPT_PTR(wipe);
479 OPT_PTR(z_offset);
480
481 // look in parent class
482 ConfigOption* opt;
483 if ((opt = GCodeConfig::optptr(opt_key, create)) != NULL) return opt;
484
485 return NULL;
486 };
487 };
488
489 class HostConfig : public virtual StaticPrintConfig
490 {
491 public:
492 ConfigOptionString octoprint_host;
493 ConfigOptionString octoprint_apikey;
494 ConfigOptionString serial_port;
495 ConfigOptionInt serial_speed;
496
497 HostConfig(bool initialize = true) : StaticPrintConfig() {
498 if (initialize)
499 this->set_defaults();
500 }
501
502 virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) {
503 OPT_PTR(octoprint_host);
504 OPT_PTR(octoprint_apikey);
505 OPT_PTR(serial_port);
506 OPT_PTR(serial_speed);
507
508 return NULL;
509 };
510 };
511
512 // This object is mapped to Perl as Slic3r::Config::Full.
513 class FullPrintConfig
514 : public PrintObjectConfig, public PrintRegionConfig, public PrintConfig, public HostConfig
515 {
516 public:
517 FullPrintConfig(bool initialize = true) :
518 PrintObjectConfig(false),
519 PrintRegionConfig(false),
520 PrintConfig(false),
521 HostConfig(false)
522 {
523 if (initialize)
524 this->set_defaults();
525 }
526
527 virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) {
528 ConfigOption* opt;
529 if ((opt = PrintObjectConfig::optptr(opt_key, create)) != NULL) return opt;
530 if ((opt = PrintRegionConfig::optptr(opt_key, create)) != NULL) return opt;
531 if ((opt = PrintConfig::optptr(opt_key, create)) != NULL) return opt;
532 if ((opt = HostConfig::optptr(opt_key, create)) != NULL) return opt;
533 return NULL;
534 };
535 };
536
537 }
538
539 #endif
0 #include "Print.hpp"
1 #include "BoundingBox.hpp"
2 #include "ClipperUtils.hpp"
3 #include "Geometry.hpp"
4 #include "SVG.hpp"
5
6 namespace Slic3r {
7
8 PrintObject::PrintObject(Print* print, ModelObject* model_object, const BoundingBoxf3 &modobj_bbox)
9 : typed_slices(false),
10 _print(print),
11 _model_object(model_object)
12 {
13 // Compute the translation to be applied to our meshes so that we work with smaller coordinates
14 {
15 // Translate meshes so that our toolpath generation algorithms work with smaller
16 // XY coordinates; this translation is an optimization and not strictly required.
17 // A cloned mesh will be aligned to 0 before slicing in _slice_region() since we
18 // don't assume it's already aligned and we don't alter the original position in model.
19 // We store the XY translation so that we can place copies correctly in the output G-code
20 // (copies are expressed in G-code coordinates and this translation is not publicly exposed).
21 this->_copies_shift = Point(
22 scale_(modobj_bbox.min.x), scale_(modobj_bbox.min.y));
23
24 // Scale the object size and store it
25 Pointf3 size = modobj_bbox.size();
26 this->size = Point3(scale_(size.x), scale_(size.y), scale_(size.z));
27 }
28
29 this->reload_model_instances();
30 this->layer_height_ranges = model_object->layer_height_ranges;
31 }
32
33 bool
34 PrintObject::add_copy(const Pointf &point)
35 {
36 Points points = this->_copies;
37 points.push_back(Point::new_scale(point.x, point.y));
38 return this->set_copies(points);
39 }
40
41 bool
42 PrintObject::delete_last_copy()
43 {
44 Points points = this->_copies;
45 points.pop_back();
46 return this->set_copies(points);
47 }
48
49 bool
50 PrintObject::delete_all_copies()
51 {
52 Points points;
53 return this->set_copies(points);
54 }
55
56 bool
57 PrintObject::set_copies(const Points &points)
58 {
59 this->_copies = points;
60
61 // order copies with a nearest neighbor search and translate them by _copies_shift
62 this->_shifted_copies.clear();
63 this->_shifted_copies.reserve(points.size());
64
65 // order copies with a nearest-neighbor search
66 std::vector<Points::size_type> ordered_copies;
67 Slic3r::Geometry::chained_path(points, ordered_copies);
68
69 for (std::vector<Points::size_type>::const_iterator it = ordered_copies.begin(); it != ordered_copies.end(); ++it) {
70 Point copy = points[*it];
71 copy.translate(this->_copies_shift);
72 this->_shifted_copies.push_back(copy);
73 }
74
75 bool invalidated = false;
76 if (this->_print->invalidate_step(psSkirt)) invalidated = true;
77 if (this->_print->invalidate_step(psBrim)) invalidated = true;
78 return invalidated;
79 }
80
81 bool
82 PrintObject::reload_model_instances()
83 {
84 Points copies;
85 for (ModelInstancePtrs::const_iterator i = this->_model_object->instances.begin(); i != this->_model_object->instances.end(); ++i) {
86 copies.push_back(Point::new_scale((*i)->offset.x, (*i)->offset.y));
87 }
88 return this->set_copies(copies);
89 }
90
91 void
92 PrintObject::add_region_volume(int region_id, int volume_id)
93 {
94 region_volumes[region_id].push_back(volume_id);
95 }
96
97 /* This is the *total* layer count (including support layers)
98 this value is not supposed to be compared with Layer::id
99 since they have different semantics */
100 size_t
101 PrintObject::total_layer_count() const
102 {
103 return this->layer_count() + this->support_layer_count();
104 }
105
106 size_t
107 PrintObject::layer_count() const
108 {
109 return this->layers.size();
110 }
111
112 void
113 PrintObject::clear_layers()
114 {
115 for (int i = this->layers.size()-1; i >= 0; --i)
116 this->delete_layer(i);
117 }
118
119 Layer*
120 PrintObject::add_layer(int id, coordf_t height, coordf_t print_z, coordf_t slice_z)
121 {
122 Layer* layer = new Layer(id, this, height, print_z, slice_z);
123 layers.push_back(layer);
124 return layer;
125 }
126
127 void
128 PrintObject::delete_layer(int idx)
129 {
130 LayerPtrs::iterator i = this->layers.begin() + idx;
131 delete *i;
132 this->layers.erase(i);
133 }
134
135 size_t
136 PrintObject::support_layer_count() const
137 {
138 return this->support_layers.size();
139 }
140
141 void
142 PrintObject::clear_support_layers()
143 {
144 for (int i = this->support_layers.size()-1; i >= 0; --i)
145 this->delete_support_layer(i);
146 }
147
148 SupportLayer*
149 PrintObject::get_support_layer(int idx)
150 {
151 return this->support_layers.at(idx);
152 }
153
154 SupportLayer*
155 PrintObject::add_support_layer(int id, coordf_t height, coordf_t print_z)
156 {
157 SupportLayer* layer = new SupportLayer(id, this, height, print_z, -1);
158 support_layers.push_back(layer);
159 return layer;
160 }
161
162 void
163 PrintObject::delete_support_layer(int idx)
164 {
165 SupportLayerPtrs::iterator i = this->support_layers.begin() + idx;
166 delete *i;
167 this->support_layers.erase(i);
168 }
169
170 bool
171 PrintObject::invalidate_state_by_config_options(const std::vector<t_config_option_key> &opt_keys)
172 {
173 std::set<PrintObjectStep> steps;
174
175 // this method only accepts PrintObjectConfig and PrintRegionConfig option keys
176 for (std::vector<t_config_option_key>::const_iterator opt_key = opt_keys.begin(); opt_key != opt_keys.end(); ++opt_key) {
177 if (*opt_key == "perimeters"
178 || *opt_key == "extra_perimeters"
179 || *opt_key == "gap_fill_speed"
180 || *opt_key == "overhangs"
181 || *opt_key == "first_layer_extrusion_width"
182 || *opt_key == "perimeter_extrusion_width"
183 || *opt_key == "infill_overlap"
184 || *opt_key == "thin_walls"
185 || *opt_key == "external_perimeters_first") {
186 steps.insert(posPerimeters);
187 } else if (*opt_key == "layer_height"
188 || *opt_key == "first_layer_height"
189 || *opt_key == "xy_size_compensation"
190 || *opt_key == "raft_layers") {
191 steps.insert(posSlice);
192 } else if (*opt_key == "support_material"
193 || *opt_key == "support_material_angle"
194 || *opt_key == "support_material_extruder"
195 || *opt_key == "support_material_extrusion_width"
196 || *opt_key == "support_material_interface_layers"
197 || *opt_key == "support_material_interface_extruder"
198 || *opt_key == "support_material_interface_spacing"
199 || *opt_key == "support_material_interface_speed"
200 || *opt_key == "support_material_buildplate_only"
201 || *opt_key == "support_material_pattern"
202 || *opt_key == "support_material_spacing"
203 || *opt_key == "support_material_threshold"
204 || *opt_key == "support_material_with_sheath"
205 || *opt_key == "dont_support_bridges"
206 || *opt_key == "first_layer_extrusion_width") {
207 steps.insert(posSupportMaterial);
208 } else if (*opt_key == "interface_shells"
209 || *opt_key == "infill_only_where_needed"
210 || *opt_key == "infill_every_layers"
211 || *opt_key == "solid_infill_every_layers"
212 || *opt_key == "bottom_solid_layers"
213 || *opt_key == "top_solid_layers"
214 || *opt_key == "solid_infill_below_area"
215 || *opt_key == "infill_extruder"
216 || *opt_key == "solid_infill_extruder"
217 || *opt_key == "infill_extrusion_width"
218 || *opt_key == "ensure_vertical_shell_thickness") {
219 steps.insert(posPrepareInfill);
220 } else if (*opt_key == "external_fill_pattern"
221 || *opt_key == "external_fill_link_max_length"
222 || *opt_key == "fill_angle"
223 || *opt_key == "fill_pattern"
224 || *opt_key == "fill_link_max_length"
225 || *opt_key == "top_infill_extrusion_width"
226 || *opt_key == "first_layer_extrusion_width") {
227 steps.insert(posInfill);
228 } else if (*opt_key == "fill_density"
229 || *opt_key == "solid_infill_extrusion_width") {
230 steps.insert(posPerimeters);
231 steps.insert(posPrepareInfill);
232 } else if (*opt_key == "external_perimeter_extrusion_width"
233 || *opt_key == "perimeter_extruder") {
234 steps.insert(posPerimeters);
235 steps.insert(posSupportMaterial);
236 } else if (*opt_key == "bridge_flow_ratio") {
237 steps.insert(posPerimeters);
238 steps.insert(posInfill);
239 } else if (*opt_key == "seam_position"
240 || *opt_key == "seam_preferred_direction"
241 || *opt_key == "seam_preferred_direction_jitter"
242 || *opt_key == "support_material_speed"
243 || *opt_key == "bridge_speed"
244 || *opt_key == "external_perimeter_speed"
245 || *opt_key == "infill_speed"
246 || *opt_key == "perimeter_speed"
247 || *opt_key == "small_perimeter_speed"
248 || *opt_key == "solid_infill_speed"
249 || *opt_key == "top_solid_infill_speed") {
250 // these options only affect G-code export, so nothing to invalidate
251 } else {
252 // for legacy, if we can't handle this option let's invalidate all steps
253 return this->invalidate_all_steps();
254 }
255 }
256
257 bool invalidated = false;
258 for (std::set<PrintObjectStep>::const_iterator step = steps.begin(); step != steps.end(); ++step) {
259 if (this->invalidate_step(*step)) invalidated = true;
260 }
261
262 return invalidated;
263 }
264
265 bool
266 PrintObject::invalidate_step(PrintObjectStep step)
267 {
268 bool invalidated = this->state.invalidate(step);
269
270 // propagate to dependent steps
271 if (step == posPerimeters) {
272 this->invalidate_step(posPrepareInfill);
273 this->_print->invalidate_step(psSkirt);
274 this->_print->invalidate_step(psBrim);
275 } else if (step == posPrepareInfill) {
276 this->invalidate_step(posInfill);
277 } else if (step == posInfill) {
278 this->_print->invalidate_step(psSkirt);
279 this->_print->invalidate_step(psBrim);
280 } else if (step == posSlice) {
281 this->invalidate_step(posPerimeters);
282 this->invalidate_step(posSupportMaterial);
283 } else if (step == posSupportMaterial) {
284 this->_print->invalidate_step(psSkirt);
285 this->_print->invalidate_step(psBrim);
286 }
287
288 return invalidated;
289 }
290
291 bool
292 PrintObject::invalidate_all_steps()
293 {
294 // make a copy because when invalidating steps the iterators are not working anymore
295 std::set<PrintObjectStep> steps = this->state.started;
296
297 bool invalidated = false;
298 for (std::set<PrintObjectStep>::const_iterator step = steps.begin(); step != steps.end(); ++step) {
299 if (this->invalidate_step(*step)) invalidated = true;
300 }
301 return invalidated;
302 }
303
304 bool
305 PrintObject::has_support_material() const
306 {
307 return this->config.support_material
308 || this->config.raft_layers > 0
309 || this->config.support_material_enforce_layers > 0;
310 }
311
312 // This function analyzes slices of a region (SurfaceCollection slices).
313 // Each slice (instance of Surface) is analyzed, whether it is supported or whether it is the top surface.
314 // Initially all slices are of type S_TYPE_INTERNAL.
315 // Slices are compared against the top / bottom slices and regions and classified to the following groups:
316 // S_TYPE_TOP - Part of a region, which is not covered by any upper layer. This surface will be filled with a top solid infill.
317 // S_TYPE_BOTTOMBRIDGE - Part of a region, which is not fully supported, but it hangs in the air, or it hangs losely on a support or a raft.
318 // S_TYPE_BOTTOM - Part of a region, which is not supported by the same region, but it is supported either by another region, or by a soluble interface layer.
319 // S_TYPE_INTERNAL - Part of a region, which is supported by the same region type.
320 // If a part of a region is of S_TYPE_BOTTOM and S_TYPE_TOP, the S_TYPE_BOTTOM wins.
321 void PrintObject::detect_surfaces_type()
322 {
323 // Slic3r::debugf "Detecting solid surfaces...\n";
324 for (int idx_region = 0; idx_region < this->_print->regions.size(); ++ idx_region) {
325 // Fill in layerm->fill_surfaces by trimming the layerm->slices by the cummulative layerm->fill_surfaces.
326 for (int idx_layer = 0; idx_layer < int(this->layer_count()); ++ idx_layer) {
327 LayerRegion *layerm = this->layers[idx_layer]->get_region(idx_region);
328 layerm->slices_to_fill_surfaces_clipped();
329 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
330 layerm->export_region_fill_surfaces_to_svg_debug("1_detect_surfaces_type-initial");
331 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
332 }
333
334 for (int idx_layer = 0; idx_layer < int(this->layer_count()); ++ idx_layer) {
335 Layer *layer = this->layers[idx_layer];
336 LayerRegion *layerm = layer->get_region(idx_region);
337 // comparison happens against the *full* slices (considering all regions)
338 // unless internal shells are requested
339 Layer *upper_layer = idx_layer + 1 < this->layer_count() ? this->get_layer(idx_layer + 1) : NULL;
340 Layer *lower_layer = idx_layer > 0 ? this->get_layer(idx_layer - 1) : NULL;
341 // collapse very narrow parts (using the safety offset in the diff is not enough)
342 float offset = layerm->flow(frExternalPerimeter).scaled_width() / 10.f;
343
344 Polygons layerm_slices_surfaces = to_polygons(layerm->slices.surfaces);
345
346 // find top surfaces (difference between current surfaces
347 // of current layer and upper one)
348 Surfaces top;
349 if (upper_layer) {
350 // Config value $self->config->interface_shells is true, if a support is separated from the object
351 // by a soluble material (for example a PVA plastic).
352 Polygons upper_slices = this->config.interface_shells.value ?
353 to_polygons(upper_layer->get_region(idx_region)->slices.surfaces) :
354 to_polygons(upper_layer->slices);
355 surfaces_append(top,
356 offset2_ex(diff(layerm_slices_surfaces, upper_slices, true), -offset, offset),
357 stTop);
358 } else {
359 // if no upper layer, all surfaces of this one are solid
360 // we clone surfaces because we're going to clear the slices collection
361 top = layerm->slices.surfaces;
362 for (Surfaces::iterator it = top.begin(); it != top.end(); ++ it)
363 it->surface_type = stTop;
364 }
365
366 // find bottom surfaces (difference between current surfaces
367 // of current layer and lower one)
368 Surfaces bottom;
369 if (lower_layer) {
370 // If we have soluble support material, don't bridge. The overhang will be squished against a soluble layer separating
371 // the support from the print.
372 SurfaceType surface_type_bottom =
373 (this->config.support_material.value && this->config.support_material_contact_distance.value == 0) ?
374 stBottom : stBottomBridge;
375 // Any surface lying on the void is a true bottom bridge (an overhang)
376 surfaces_append(
377 bottom,
378 offset2_ex(
379 diff(layerm_slices_surfaces, to_polygons(lower_layer->slices), true),
380 -offset, offset),
381 surface_type_bottom);
382 // if user requested internal shells, we need to identify surfaces
383 // lying on other slices not belonging to this region
384 //FIXME Vojtech: config.internal_shells or config.interface_shells? Is it some legacy code?
385 // Why shall multiple regions over soluble support be treated specially?
386 if (this->config.interface_shells.value) {
387 // non-bridging bottom surfaces: any part of this layer lying
388 // on something else, excluding those lying on our own region
389 surfaces_append(
390 bottom,
391 offset2_ex(
392 diff(
393 intersection(layerm_slices_surfaces, to_polygons(lower_layer->slices)), // supported
394 to_polygons(lower_layer->get_region(idx_region)->slices.surfaces),
395 true),
396 -offset, offset),
397 stBottom);
398 }
399 } else {
400 // if no lower layer, all surfaces of this one are solid
401 // we clone surfaces because we're going to clear the slices collection
402 bottom = layerm->slices.surfaces;
403 // if we have raft layers, consider bottom layer as a bridge
404 // just like any other bottom surface lying on the void
405 SurfaceType surface_type_bottom =
406 (this->config.raft_layers.value > 0 && this->config.support_material_contact_distance.value > 0) ?
407 stBottomBridge : stBottom;
408 for (Surfaces::iterator it = bottom.begin(); it != bottom.end(); ++ it)
409 it->surface_type = surface_type_bottom;
410 }
411
412 // now, if the object contained a thin membrane, we could have overlapping bottom
413 // and top surfaces; let's do an intersection to discover them and consider them
414 // as bottom surfaces (to allow for bridge detection)
415 if (! top.empty() && ! bottom.empty()) {
416 // Polygons overlapping = intersection(to_polygons(top), to_polygons(bottom));
417 // Slic3r::debugf " layer %d contains %d membrane(s)\n", $layerm->layer->id, scalar(@$overlapping)
418 // if $Slic3r::debug;
419 Polygons top_polygons = to_polygons(STDMOVE(top));
420 top.clear();
421 surfaces_append(top,
422 #if 0
423 offset2_ex(diff(top_polygons, to_polygons(bottom), true), -offset, offset),
424 #else
425 diff_ex(top_polygons, to_polygons(bottom), false),
426 #endif
427 stTop);
428 }
429
430 // save surfaces to layer
431 layerm->slices.surfaces.clear();
432
433 // find internal surfaces (difference between top/bottom surfaces and others)
434 {
435 Polygons topbottom = to_polygons(top);
436 polygons_append(topbottom, to_polygons(bottom));
437 surfaces_append(layerm->slices.surfaces,
438 #if 0
439 offset2_ex(diff(layerm_slices_surfaces, topbottom, true), -offset, offset),
440 #else
441 diff_ex(layerm_slices_surfaces, topbottom, false),
442 #endif
443 stInternal);
444 }
445
446 surfaces_append(layerm->slices.surfaces, STDMOVE(top));
447 surfaces_append(layerm->slices.surfaces, STDMOVE(bottom));
448
449 // Slic3r::debugf " layer %d has %d bottom, %d top and %d internal surfaces\n",
450 // $layerm->layer->id, scalar(@bottom), scalar(@top), scalar(@internal) if $Slic3r::debug;
451
452 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
453 layerm->export_region_slices_to_svg_debug("detect_surfaces_type-final");
454 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
455 } // for each layer of a region
456
457 // Fill in layerm->fill_surfaces by trimming the layerm->slices by the cummulative layerm->fill_surfaces.
458 for (int idx_layer = 0; idx_layer < int(this->layer_count()); ++ idx_layer) {
459 LayerRegion *layerm = this->layers[idx_layer]->get_region(idx_region);
460 layerm->slices_to_fill_surfaces_clipped();
461 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
462 layerm->export_region_fill_surfaces_to_svg_debug("1_detect_surfaces_type-final");
463 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
464 } // for each layer of a region
465 } // for each $self->print->region_count
466 }
467
468 void
469 PrintObject::process_external_surfaces()
470 {
471 FOREACH_REGION(this->_print, region) {
472 size_t region_id = region - this->_print->regions.begin();
473
474 FOREACH_LAYER(this, layer_it) {
475 const Layer* lower_layer = (layer_it == this->layers.begin())
476 ? NULL
477 : *(layer_it-1);
478
479 (*layer_it)->get_region(region_id)->process_external_surfaces(lower_layer);
480 }
481 }
482 }
483
484 void
485 PrintObject::discover_vertical_shells()
486 {
487 for (size_t idx_region = 0; idx_region < this->_print->regions.size(); ++ idx_region) {
488 if (! this->_print->regions[idx_region]->config.ensure_vertical_shell_thickness.value)
489 continue;
490 for (size_t idx_layer = 0; idx_layer < this->layers.size(); ++ idx_layer) {
491 Layer *layer = this->layers[idx_layer];
492 LayerRegion *layerm = layer->get_region(idx_region);
493 Flow solid_infill_flow = layerm->flow(frSolidInfill);
494 coord_t infill_line_spacing = solid_infill_flow.scaled_spacing();
495 // Find a union of perimeters below / above this surface to guarantee a minimum shell thickness.
496 Polygons shell;
497 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
498 ExPolygons shell_ex;
499 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
500 float min_perimeter_infill_spacing = float(infill_line_spacing) * 1.05f;
501 if (1)
502 {
503 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
504 {
505 static size_t idx = 0;
506 SVG svg_cummulative(debug_out_path("discover_vertical_shells-perimeters-before-union-run%d.svg", idx), this->bounding_box());
507 for (int n = (int)idx_layer - layerm->region()->config.bottom_solid_layers + 1; n < (int)idx_layer + layerm->region()->config.top_solid_layers; ++ n) {
508 if (n < 0 || n >= (int)this->layers.size())
509 continue;
510 ExPolygons &expolys = this->layers[n]->perimeter_expolygons;
511 for (size_t i = 0; i < expolys.size(); ++ i) {
512 SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-run%d-layer%d-expoly%d.svg", idx, n, i), get_extents(expolys[i]));
513 svg.draw(expolys[i]);
514 svg.draw_outline(expolys[i].contour, "black", scale_(0.05));
515 svg.draw_outline(expolys[i].holes, "blue", scale_(0.05));
516 svg.Close();
517
518 svg_cummulative.draw(expolys[i]);
519 svg_cummulative.draw_outline(expolys[i].contour, "black", scale_(0.05));
520 svg_cummulative.draw_outline(expolys[i].holes, "blue", scale_(0.05));
521 }
522 }
523 ++ idx;
524 }
525 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
526 SurfaceType surfaces_bottom[2] = { stBottom, stBottomBridge };
527 for (int n = (int)idx_layer - layerm->region()->config.bottom_solid_layers + 1; n < (int)idx_layer + layerm->region()->config.top_solid_layers; ++ n)
528 if (n >= 0 && n < (int)this->layers.size()) {
529 Layer &neighbor_layer = *this->layers[n];
530 LayerRegion &neighbor_region = *neighbor_layer.get_region(int(idx_region));
531 polygons_append(shell, neighbor_layer.perimeter_expolygons.expolygons);
532 if (n > int(idx_layer)) {
533 // Collect top surfaces.
534 polygons_append(shell, offset(to_expolygons(neighbor_region.slices.filter_by_type(stTop)), min_perimeter_infill_spacing));
535 polygons_append(shell, offset(to_expolygons(neighbor_region.fill_surfaces.filter_by_type(stTop)), min_perimeter_infill_spacing));
536 }
537 else if (n < int(idx_layer)) {
538 // Collect bottom and bottom bridge surfaces.
539 polygons_append(shell, offset(to_expolygons(neighbor_region.slices.filter_by_types(surfaces_bottom, 2)), min_perimeter_infill_spacing));
540 polygons_append(shell, offset(to_expolygons(neighbor_region.fill_surfaces.filter_by_types(surfaces_bottom, 2)), min_perimeter_infill_spacing));
541 }
542 }
543 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
544 {
545 static size_t idx = 0;
546 SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-%d.svg", idx ++), get_extents(shell));
547 svg.draw(shell);
548 svg.draw_outline(shell, "black", scale_(0.05));
549 svg.Close();
550 }
551 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
552 shell = union_(shell, true);
553 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
554 shell_ex = union_ex(shell, true);
555 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
556 }
557
558 if (shell.empty())
559 continue;
560
561 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
562 {
563 static size_t idx = 0;
564 SVG svg(debug_out_path("discover_vertical_shells-perimeters-after-union-%d.svg", idx ++), get_extents(shell));
565 svg.draw(shell_ex);
566 svg.draw_outline(shell_ex, "black", "blue", scale_(0.05));
567 svg.Close();
568 }
569 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
570
571 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
572 {
573 static size_t idx = 0;
574 SVG svg(debug_out_path("discover_vertical_shells-internal-wshell-%d.svg", idx ++), get_extents(shell));
575 svg.draw(layerm->fill_surfaces.filter_by_type(stInternal), "yellow", 0.5);
576 svg.draw_outline(layerm->fill_surfaces.filter_by_type(stInternal), "black", "blue", scale_(0.05));
577 svg.draw(shell_ex, "blue", 0.5);
578 svg.draw_outline(shell_ex, "black", "blue", scale_(0.05));
579 svg.Close();
580 }
581 {
582 static size_t idx = 0;
583 SVG svg(debug_out_path("discover_vertical_shells-internalvoid-wshell-%d.svg", idx ++), get_extents(shell));
584 svg.draw(layerm->fill_surfaces.filter_by_type(stInternalVoid), "yellow", 0.5);
585 svg.draw_outline(layerm->fill_surfaces.filter_by_type(stInternalVoid), "black", "blue", scale_(0.05));
586 svg.draw(shell_ex, "blue", 0.5);
587 svg.draw_outline(shell_ex, "black", "blue", scale_(0.05));
588 svg.Close();
589 }
590 {
591 static size_t idx = 0;
592 SVG svg(debug_out_path("discover_vertical_shells-internalvoid-wshell-%d.svg", idx ++), get_extents(shell));
593 svg.draw(layerm->fill_surfaces.filter_by_type(stInternalVoid), "yellow", 0.5);
594 svg.draw_outline(layerm->fill_surfaces.filter_by_type(stInternalVoid), "black", "blue", scale_(0.05));
595 svg.draw(shell_ex, "blue", 0.5);
596 svg.draw_outline(shell_ex, "black", "blue", scale_(0.05));
597 svg.Close();
598 }
599 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
600
601 // Trim the shells region by the internal & internal void surfaces.
602 const SurfaceType surfaceTypesInternal[] = { stInternal, stInternalVoid, stInternalSolid };
603 const Polygons polygonsInternal = to_polygons(layerm->fill_surfaces.filter_by_types(surfaceTypesInternal, 2));
604 shell = intersection(shell, polygonsInternal, true);
605 if (shell.empty())
606 continue;
607
608 // Append the internal solids, so they will be merged with the new ones.
609 polygons_append(shell, to_polygons(layerm->fill_surfaces.filter_by_type(stInternalSolid)));
610
611 // These regions will be filled by a rectilinear full infill. Currently this type of infill
612 // only fills regions, which fit at least a single line. To avoid gaps in the sparse infill,
613 // make sure that this region does not contain parts narrower than the infill spacing width.
614 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
615 Polygons shell_before = shell;
616 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
617 #if 1
618 // Intentionally inflate a bit more than how much the region has been shrunk,
619 // so there will be some overlap between this solid infill and the other infill regions (mainly the sparse infill).
620 shell = offset2(shell, - 0.5f * min_perimeter_infill_spacing, 0.8f * min_perimeter_infill_spacing,
621 CLIPPER_OFFSET_SCALE, ClipperLib::jtSquare);
622 if (shell.empty())
623 continue;
624 #else
625 // Ensure each region is at least 3x infill line width wide, so it could be filled in.
626 // float margin = float(infill_line_spacing) * 3.f;
627 float margin = float(infill_line_spacing) * 1.5f;
628 // we use a higher miterLimit here to handle areas with acute angles
629 // in those cases, the default miterLimit would cut the corner and we'd
630 // get a triangle in $too_narrow; if we grow it below then the shell
631 // would have a different shape from the external surface and we'd still
632 // have the same angle, so the next shell would be grown even more and so on.
633 Polygons too_narrow = diff(shell, offset2(shell, -margin, margin, CLIPPER_OFFSET_SCALE, ClipperLib::jtMiter, 5.), true);
634 if (! too_narrow.empty()) {
635 // grow the collapsing parts and add the extra area to the neighbor layer
636 // as well as to our original surfaces so that we support this
637 // additional area in the next shell too
638 // make sure our grown surfaces don't exceed the fill area
639 polygons_append(shell, intersection(offset(too_narrow, margin), polygonsInternal));
640 }
641 #endif
642 ExPolygons new_internal_solid = intersection_ex(polygonsInternal, shell, false);
643 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
644 {
645 static size_t idx = 0;
646 SVG svg(debug_out_path("discover_vertical_shells-regularized-%d.svg", idx ++), get_extents(shell_before));
647 // Source shell.
648 svg.draw(union_ex(shell_before, true));
649 // Shell trimmed to the internal surfaces.
650 svg.draw_outline(union_ex(shell, true), "black", "blue", scale_(0.05));
651 // Regularized infill region.
652 svg.draw_outline(new_internal_solid, "red", "magenta", scale_(0.05));
653 svg.Close();
654 }
655 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
656
657 // Trim the internal & internalvoid by the shell.
658 Slic3r::ExPolygons new_internal = diff_ex(
659 to_polygons(layerm->fill_surfaces.filter_by_type(stInternal)),
660 shell,
661 false
662 );
663 Slic3r::ExPolygons new_internal_void = diff_ex(
664 to_polygons(layerm->fill_surfaces.filter_by_type(stInternalVoid)),
665 shell,
666 false
667 );
668
669 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
670 {
671 static size_t idx = 0;
672 SVG::export_expolygons(debug_out_path("discover_vertical_shells-new_internal-%d.svg", idx), get_extents(shell), new_internal, "black", "blue", scale_(0.05));
673 SVG::export_expolygons(debug_out_path("discover_vertical_shells-new_internal_void-%d.svg", idx), get_extents(shell), new_internal_void, "black", "blue", scale_(0.05));
674 SVG::export_expolygons(debug_out_path("discover_vertical_shells-new_internal_solid-%d.svg", idx), get_extents(shell), new_internal_solid, "black", "blue", scale_(0.05));
675 ++ idx;
676 }
677 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
678
679 // Assign resulting internal surfaces to layer.
680 const SurfaceType surfaceTypesKeep[] = { stTop, stBottom, stBottomBridge };
681 layerm->fill_surfaces.keep_types(surfaceTypesKeep, sizeof(surfaceTypesKeep)/sizeof(SurfaceType));
682 layerm->fill_surfaces.append(stInternal , new_internal);
683 layerm->fill_surfaces.append(stInternalVoid , new_internal_void);
684 layerm->fill_surfaces.append(stInternalSolid, new_internal_solid);
685
686 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
687 layerm->export_region_slices_to_svg_debug("4_discover_vertical_shells");
688 layerm->export_region_fill_surfaces_to_svg_debug("4_discover_vertical_shells");
689 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
690 } // for each layer
691 } // for each region
692 }
693
694 /* This method applies bridge flow to the first internal solid layer above
695 sparse infill */
696 void
697 PrintObject::bridge_over_infill()
698 {
699 FOREACH_REGION(this->_print, region) {
700 size_t region_id = region - this->_print->regions.begin();
701
702 // skip bridging in case there are no voids
703 if ((*region)->config.fill_density.value == 100) continue;
704
705 // get bridge flow
706 Flow bridge_flow = (*region)->flow(
707 frSolidInfill,
708 -1, // layer height, not relevant for bridge flow
709 true, // bridge
710 false, // first layer
711 -1, // custom width, not relevant for bridge flow
712 *this
713 );
714
715 FOREACH_LAYER(this, layer_it) {
716 // skip first layer
717 if (layer_it == this->layers.begin()) continue;
718
719 Layer* layer = *layer_it;
720 LayerRegion* layerm = layer->get_region(region_id);
721
722 // extract the stInternalSolid surfaces that might be transformed into bridges
723 Polygons internal_solid;
724 layerm->fill_surfaces.filter_by_type(stInternalSolid, &internal_solid);
725
726 // check whether the lower area is deep enough for absorbing the extra flow
727 // (for obvious physical reasons but also for preventing the bridge extrudates
728 // from overflowing in 3D preview)
729 ExPolygons to_bridge;
730 {
731 Polygons to_bridge_pp = internal_solid;
732
733 // iterate through lower layers spanned by bridge_flow
734 double bottom_z = layer->print_z - bridge_flow.height;
735 for (int i = (layer_it - this->layers.begin()) - 1; i >= 0; --i) {
736 const Layer* lower_layer = this->layers[i];
737
738 // stop iterating if layer is lower than bottom_z
739 if (lower_layer->print_z < bottom_z) break;
740
741 // iterate through regions and collect internal surfaces
742 Polygons lower_internal;
743 FOREACH_LAYERREGION(lower_layer, lower_layerm_it)
744 (*lower_layerm_it)->fill_surfaces.filter_by_type(stInternal, &lower_internal);
745
746 // intersect such lower internal surfaces with the candidate solid surfaces
747 to_bridge_pp = intersection(to_bridge_pp, lower_internal);
748 }
749
750 // there's no point in bridging too thin/short regions
751 //FIXME Vojtech: The offset2 function is not a geometric offset,
752 // therefore it may create 1) gaps, and 2) sharp corners, which are outside the original contour.
753 // The gaps will be filled by a separate region, which makes the infill less stable and it takes longer.
754 {
755 double min_width = bridge_flow.scaled_width() * 3;
756 to_bridge_pp = offset2(to_bridge_pp, -min_width, +min_width);
757 }
758
759 if (to_bridge_pp.empty()) continue;
760
761 // convert into ExPolygons
762 to_bridge = union_ex(to_bridge_pp);
763 }
764
765 #ifdef SLIC3R_DEBUG
766 printf("Bridging " PRINTF_ZU " internal areas at layer " PRINTF_ZU "\n", to_bridge.size(), layer->id());
767 #endif
768
769 // compute the remaning internal solid surfaces as difference
770 ExPolygons not_to_bridge = diff_ex(internal_solid, to_bridge, true);
771 to_bridge = intersection_ex(to_polygons(to_bridge), internal_solid, true);
772
773 // build the new collection of fill_surfaces
774 {
775 layerm->fill_surfaces.remove_type(stInternalSolid);
776
777 for (ExPolygons::const_iterator ex = to_bridge.begin(); ex != to_bridge.end(); ++ex)
778 layerm->fill_surfaces.surfaces.push_back(Surface(stInternalBridge, *ex));
779
780 for (ExPolygons::const_iterator ex = not_to_bridge.begin(); ex != not_to_bridge.end(); ++ex)
781 layerm->fill_surfaces.surfaces.push_back(Surface(stInternalSolid, *ex));
782 }
783
784 /*
785 # exclude infill from the layers below if needed
786 # see discussion at https://github.com/alexrj/Slic3r/issues/240
787 # Update: do not exclude any infill. Sparse infill is able to absorb the excess material.
788 if (0) {
789 my $excess = $layerm->extruders->{infill}->bridge_flow->width - $layerm->height;
790 for (my $i = $layer_id-1; $excess >= $self->get_layer($i)->height; $i--) {
791 Slic3r::debugf " skipping infill below those areas at layer %d\n", $i;
792 foreach my $lower_layerm (@{$self->get_layer($i)->regions}) {
793 my @new_surfaces = ();
794 # subtract the area from all types of surfaces
795 foreach my $group (@{$lower_layerm->fill_surfaces->group}) {
796 push @new_surfaces, map $group->[0]->clone(expolygon => $_),
797 @{diff_ex(
798 [ map $_->p, @$group ],
799 [ map @$_, @$to_bridge ],
800 )};
801 push @new_surfaces, map Slic3r::Surface->new(
802 expolygon => $_,
803 surface_type => S_TYPE_INTERNALVOID,
804 ), @{intersection_ex(
805 [ map $_->p, @$group ],
806 [ map @$_, @$to_bridge ],
807 )};
808 }
809 $lower_layerm->fill_surfaces->clear;
810 $lower_layerm->fill_surfaces->append($_) for @new_surfaces;
811 }
812
813 $excess -= $self->get_layer($i)->height;
814 }
815 }
816 */
817
818 #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
819 layerm->export_region_slices_to_svg_debug("7_bridge_over_infill");
820 layerm->export_region_fill_surfaces_to_svg_debug("7_bridge_over_infill");
821 #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
822 }
823 }
824 }
825
826 }
0 #include "Print.hpp"
1
2 namespace Slic3r {
3
4 PrintRegion::PrintRegion(Print* print)
5 : _print(print)
6 {
7 }
8
9 PrintRegion::~PrintRegion()
10 {
11 }
12
13 Print*
14 PrintRegion::print()
15 {
16 return this->_print;
17 }
18
19 Flow
20 PrintRegion::flow(FlowRole role, double layer_height, bool bridge, bool first_layer, double width, const PrintObject &object) const
21 {
22 ConfigOptionFloatOrPercent config_width;
23 if (width != -1) {
24 // use the supplied custom width, if any
25 config_width.value = width;
26 config_width.percent = false;
27 } else {
28 // otherwise, get extrusion width from configuration
29 // (might be an absolute value, or a percent value, or zero for auto)
30 if (first_layer && this->_print->config.first_layer_extrusion_width.value > 0) {
31 config_width = this->_print->config.first_layer_extrusion_width;
32 } else if (role == frExternalPerimeter) {
33 config_width = this->config.external_perimeter_extrusion_width;
34 } else if (role == frPerimeter) {
35 config_width = this->config.perimeter_extrusion_width;
36 } else if (role == frInfill) {
37 config_width = this->config.infill_extrusion_width;
38 } else if (role == frSolidInfill) {
39 config_width = this->config.solid_infill_extrusion_width;
40 } else if (role == frTopSolidInfill) {
41 config_width = this->config.top_infill_extrusion_width;
42 } else {
43 CONFESS("Unknown role");
44 }
45 }
46 if (config_width.value == 0) {
47 config_width = object.config.extrusion_width;
48 }
49
50 // get the configured nozzle_diameter for the extruder associated
51 // to the flow role requested
52 size_t extruder = 0; // 1-based
53 if (role == frPerimeter || role == frExternalPerimeter) {
54 extruder = this->config.perimeter_extruder;
55 } else if (role == frInfill) {
56 extruder = this->config.infill_extruder;
57 } else if (role == frSolidInfill || role == frTopSolidInfill) {
58 extruder = this->config.solid_infill_extruder;
59 } else {
60 CONFESS("Unknown role $role");
61 }
62 double nozzle_diameter = this->_print->config.nozzle_diameter.get_at(extruder-1);
63
64 return Flow::new_from_config_width(role, config_width, nozzle_diameter, layer_height, bridge ? (float)this->config.bridge_flow_ratio : 0.0);
65 }
66
67 }
0 #include "SVG.hpp"
1 #include <iostream>
2
3 #define COORD(x) ((float)unscale((x))*10)
4
5 namespace Slic3r {
6
7 bool SVG::open(const char* afilename)
8 {
9 this->filename = afilename;
10 this->f = fopen(afilename, "w");
11 if (this->f == NULL)
12 return false;
13 fprintf(this->f,
14 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
15 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n"
16 "<svg height=\"2000\" width=\"2000\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n"
17 " <marker id=\"endArrow\" markerHeight=\"8\" markerUnits=\"strokeWidth\" markerWidth=\"10\" orient=\"auto\" refX=\"1\" refY=\"5\" viewBox=\"0 0 10 10\">\n"
18 " <polyline fill=\"darkblue\" points=\"0,0 10,5 0,10 1,5\" />\n"
19 " </marker>\n"
20 );
21 return true;
22 }
23
24 bool SVG::open(const char* afilename, const BoundingBox &bbox, const coord_t bbox_offset, bool aflipY)
25 {
26 this->filename = afilename;
27 this->origin = bbox.min - Point(bbox_offset, bbox_offset);
28 this->flipY = aflipY;
29 this->f = ::fopen(afilename, "w");
30 if (f == NULL)
31 return false;
32 float w = COORD(bbox.max.x - bbox.min.x + 2 * bbox_offset);
33 float h = COORD(bbox.max.y - bbox.min.y + 2 * bbox_offset);
34 fprintf(this->f,
35 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
36 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n"
37 "<svg height=\"%f\" width=\"%f\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n"
38 " <marker id=\"endArrow\" markerHeight=\"8\" markerUnits=\"strokeWidth\" markerWidth=\"10\" orient=\"auto\" refX=\"1\" refY=\"5\" viewBox=\"0 0 10 10\">\n"
39 " <polyline fill=\"darkblue\" points=\"0,0 10,5 0,10 1,5\" />\n"
40 " </marker>\n",
41 h, w);
42 return true;
43 }
44
45 void
46 SVG::draw(const Line &line, std::string stroke, coordf_t stroke_width)
47 {
48 fprintf(this->f,
49 " <line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" style=\"stroke: %s; stroke-width: %f\"",
50 COORD(line.a.x - origin.x), COORD(line.a.y - origin.y), COORD(line.b.x - origin.x), COORD(line.b.y - origin.y), stroke.c_str(), (stroke_width == 0) ? 1.f : COORD(stroke_width));
51 if (this->arrows)
52 fprintf(this->f, " marker-end=\"url(#endArrow)\"");
53 fprintf(this->f, "/>\n");
54 }
55
56 void SVG::draw(const ThickLine &line, const std::string &fill, const std::string &stroke, coordf_t stroke_width)
57 {
58 Pointf dir(line.b.x-line.a.x, line.b.y-line.a.y);
59 Pointf perp(-dir.y, dir.x);
60 coordf_t len = sqrt(perp.x*perp.x + perp.y*perp.y);
61 coordf_t da = coordf_t(0.5)*line.a_width/len;
62 coordf_t db = coordf_t(0.5)*line.b_width/len;
63 fprintf(this->f,
64 " <polygon points=\"%f,%f %f,%f %f,%f %f,%f\" style=\"fill:%s; stroke: %s; stroke-width: %f\"/>\n",
65 COORD(line.a.x-da*perp.x-origin.x),
66 COORD(line.a.y-da*perp.y-origin.y),
67 COORD(line.b.x-db*perp.x-origin.x),
68 COORD(line.b.y-db*perp.y-origin.y),
69 COORD(line.b.x+db*perp.x-origin.x),
70 COORD(line.b.y+db*perp.y-origin.y),
71 COORD(line.a.x+da*perp.x-origin.x),
72 COORD(line.a.y+da*perp.y-origin.y),
73 fill.c_str(), stroke.c_str(),
74 (stroke_width == 0) ? 1.f : COORD(stroke_width));
75 }
76
77 void
78 SVG::draw(const Lines &lines, std::string stroke, coordf_t stroke_width)
79 {
80 for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++it)
81 this->draw(*it, stroke, stroke_width);
82 }
83
84 void
85 SVG::draw(const IntersectionLines &lines, std::string stroke)
86 {
87 for (IntersectionLines::const_iterator it = lines.begin(); it != lines.end(); ++it)
88 this->draw((Line)*it, stroke);
89 }
90
91 void
92 SVG::draw(const ExPolygon &expolygon, std::string fill, const float fill_opacity)
93 {
94 this->fill = fill;
95
96 std::string d;
97 Polygons pp = expolygon;
98 for (Polygons::const_iterator p = pp.begin(); p != pp.end(); ++p) {
99 d += this->get_path_d(*p, true) + " ";
100 }
101 this->path(d, true, 0, fill_opacity);
102 }
103
104 void
105 SVG::draw_outline(const ExPolygon &expolygon, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
106 {
107 draw_outline(expolygon.contour, stroke_outer, stroke_width);
108 for (Polygons::const_iterator it = expolygon.holes.begin(); it != expolygon.holes.end(); ++ it) {
109 draw_outline(*it, stroke_holes, stroke_width);
110 }
111 }
112
113 void
114 SVG::draw(const ExPolygons &expolygons, std::string fill, const float fill_opacity)
115 {
116 for (ExPolygons::const_iterator it = expolygons.begin(); it != expolygons.end(); ++it)
117 this->draw(*it, fill, fill_opacity);
118 }
119
120 void
121 SVG::draw_outline(const ExPolygons &expolygons, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
122 {
123 for (ExPolygons::const_iterator it = expolygons.begin(); it != expolygons.end(); ++ it)
124 draw_outline(*it, stroke_outer, stroke_holes, stroke_width);
125 }
126
127 void
128 SVG::draw(const Surface &surface, std::string fill, const float fill_opacity)
129 {
130 draw(surface.expolygon, fill, fill_opacity);
131 }
132
133 void
134 SVG::draw_outline(const Surface &surface, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
135 {
136 draw_outline(surface.expolygon, stroke_outer, stroke_holes, stroke_width);
137 }
138
139 void
140 SVG::draw(const Surfaces &surfaces, std::string fill, const float fill_opacity)
141 {
142 for (Surfaces::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it)
143 this->draw(*it, fill, fill_opacity);
144 }
145
146 void
147 SVG::draw_outline(const Surfaces &surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
148 {
149 for (Surfaces::const_iterator it = surfaces.begin(); it != surfaces.end(); ++ it)
150 draw_outline(*it, stroke_outer, stroke_holes, stroke_width);
151 }
152
153 void
154 SVG::draw(const SurfacesPtr &surfaces, std::string fill, const float fill_opacity)
155 {
156 for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it)
157 this->draw(*(*it), fill, fill_opacity);
158 }
159
160 void
161 SVG::draw_outline(const SurfacesPtr &surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
162 {
163 for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++ it)
164 draw_outline(*(*it), stroke_outer, stroke_holes, stroke_width);
165 }
166
167 void
168 SVG::draw(const Polygon &polygon, std::string fill)
169 {
170 this->fill = fill;
171 this->path(this->get_path_d(polygon, true), !fill.empty(), 0, 1.f);
172 }
173
174 void
175 SVG::draw(const Polygons &polygons, std::string fill)
176 {
177 for (Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++it)
178 this->draw(*it, fill);
179 }
180
181 void
182 SVG::draw(const Polyline &polyline, std::string stroke, coordf_t stroke_width)
183 {
184 this->stroke = stroke;
185 this->path(this->get_path_d(polyline, false), false, stroke_width, 1.f);
186 }
187
188 void
189 SVG::draw(const Polylines &polylines, std::string stroke, coordf_t stroke_width)
190 {
191 for (Polylines::const_iterator it = polylines.begin(); it != polylines.end(); ++it)
192 this->draw(*it, stroke, stroke_width);
193 }
194
195 void SVG::draw(const ThickLines &thicklines, const std::string &fill, const std::string &stroke, coordf_t stroke_width)
196 {
197 for (ThickLines::const_iterator it = thicklines.begin(); it != thicklines.end(); ++it)
198 this->draw(*it, fill, stroke, stroke_width);
199 }
200
201 void
202 SVG::draw(const ThickPolylines &polylines, const std::string &stroke, coordf_t stroke_width)
203 {
204 for (ThickPolylines::const_iterator it = polylines.begin(); it != polylines.end(); ++it)
205 this->draw((Polyline)*it, stroke, stroke_width);
206 }
207
208 void
209 SVG::draw(const ThickPolylines &thickpolylines, const std::string &fill, const std::string &stroke, coordf_t stroke_width)
210 {
211 for (ThickPolylines::const_iterator it = thickpolylines.begin(); it != thickpolylines.end(); ++ it)
212 draw(it->thicklines(), fill, stroke, stroke_width);
213 }
214
215 void
216 SVG::draw(const Point &point, std::string fill, coord_t iradius)
217 {
218 float radius = (iradius == 0) ? 3.f : COORD(iradius);
219 std::ostringstream svg;
220 svg << " <circle cx=\"" << COORD(point.x - origin.x) << "\" cy=\"" << COORD(point.y - origin.y)
221 << "\" r=\"" << radius << "\" "
222 << "style=\"stroke: none; fill: " << fill << "\" />";
223
224 fprintf(this->f, "%s\n", svg.str().c_str());
225 }
226
227 void
228 SVG::draw(const Points &points, std::string fill, coord_t radius)
229 {
230 for (Points::const_iterator it = points.begin(); it != points.end(); ++it)
231 this->draw(*it, fill, radius);
232 }
233
234 void
235 SVG::draw(const ClipperLib::Path &polygon, double scale, std::string stroke, coordf_t stroke_width)
236 {
237 this->stroke = stroke;
238 this->path(this->get_path_d(polygon, scale, true), false, stroke_width, 1.f);
239 }
240
241 void
242 SVG::draw(const ClipperLib::Paths &polygons, double scale, std::string stroke, coordf_t stroke_width)
243 {
244 for (ClipperLib::Paths::const_iterator it = polygons.begin(); it != polygons.end(); ++ it)
245 draw(*it, scale, stroke, stroke_width);
246 }
247
248 void
249 SVG::draw_outline(const Polygon &polygon, std::string stroke, coordf_t stroke_width)
250 {
251 this->stroke = stroke;
252 this->path(this->get_path_d(polygon, true), false, stroke_width, 1.f);
253 }
254
255 void
256 SVG::draw_outline(const Polygons &polygons, std::string stroke, coordf_t stroke_width)
257 {
258 for (Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++ it)
259 draw_outline(*it, stroke, stroke_width);
260 }
261
262 void
263 SVG::path(const std::string &d, bool fill, coordf_t stroke_width, const float fill_opacity)
264 {
265 float lineWidth = 0.f;
266 if (! fill)
267 lineWidth = (stroke_width == 0) ? 2.f : COORD(stroke_width);
268
269 fprintf(
270 this->f,
271 " <path d=\"%s\" style=\"fill: %s; stroke: %s; stroke-width: %f; fill-type: evenodd\" %s fill-opacity=\"%f\" />\n",
272 d.c_str(),
273 fill ? this->fill.c_str() : "none",
274 this->stroke.c_str(),
275 lineWidth,
276 (this->arrows && !fill) ? " marker-end=\"url(#endArrow)\"" : "",
277 fill_opacity
278 );
279 }
280
281 std::string
282 SVG::get_path_d(const MultiPoint &mp, bool closed) const
283 {
284 std::ostringstream d;
285 d << "M ";
286 for (Points::const_iterator p = mp.points.begin(); p != mp.points.end(); ++p) {
287 d << COORD(p->x - origin.x) << " ";
288 d << COORD(p->y - origin.y) << " ";
289 }
290 if (closed) d << "z";
291 return d.str();
292 }
293
294 std::string
295 SVG::get_path_d(const ClipperLib::Path &path, double scale, bool closed) const
296 {
297 std::ostringstream d;
298 d << "M ";
299 for (ClipperLib::Path::const_iterator p = path.begin(); p != path.end(); ++p) {
300 d << COORD(scale * p->X - origin.x) << " ";
301 d << COORD(scale * p->Y - origin.y) << " ";
302 }
303 if (closed) d << "z";
304 return d.str();
305 }
306
307 void SVG::draw_text(const Point &pt, const char *text, const char *color)
308 {
309 fprintf(this->f,
310 "<text x=\"%f\" y=\"%f\" font-family=\"sans-serif\" font-size=\"20px\" fill=\"%s\">%s</text>",
311 COORD(pt.x-origin.x),
312 COORD(pt.y-origin.y),
313 color, text);
314 }
315
316 void SVG::draw_legend(const Point &pt, const char *text, const char *color)
317 {
318 fprintf(this->f,
319 "<circle cx=\"%f\" cy=\"%f\" r=\"10\" fill=\"%s\"/>",
320 COORD(pt.x-origin.x),
321 COORD(pt.y-origin.y),
322 color);
323 fprintf(this->f,
324 "<text x=\"%f\" y=\"%f\" font-family=\"sans-serif\" font-size=\"10px\" fill=\"%s\">%s</text>",
325 COORD(pt.x-origin.x) + 20.f,
326 COORD(pt.y-origin.y),
327 "black", text);
328 }
329
330 void
331 SVG::Close()
332 {
333 fprintf(this->f, "</svg>\n");
334 fclose(this->f);
335 this->f = NULL;
336 // printf("SVG written to %s\n", this->filename.c_str());
337 }
338
339 void SVG::export_expolygons(const char *path, const BoundingBox &bbox, const Slic3r::ExPolygons &expolygons, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
340 {
341 SVG svg(path, bbox);
342 svg.draw(expolygons);
343 svg.draw_outline(expolygons, stroke_outer, stroke_holes, stroke_width);
344 svg.Close();
345 }
346
347 }
0 #ifndef slic3r_SVG_hpp_
1 #define slic3r_SVG_hpp_
2
3 #include "libslic3r.h"
4 #include "clipper.hpp"
5 #include "ExPolygon.hpp"
6 #include "Line.hpp"
7 #include "TriangleMesh.hpp"
8 #include "Surface.hpp"
9
10 namespace Slic3r {
11
12 class SVG
13 {
14 public:
15 bool arrows;
16 std::string fill, stroke;
17 Point origin;
18 bool flipY;
19
20 SVG(const char* afilename) :
21 arrows(false), fill("grey"), stroke("black"), filename(afilename), flipY(false)
22 { open(filename); }
23 SVG(const char* afilename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool aflipY = false) :
24 arrows(false), fill("grey"), stroke("black"), filename(afilename), origin(bbox.min - Point(bbox_offset, bbox_offset)), flipY(aflipY)
25 { open(filename, bbox, bbox_offset, aflipY); }
26 SVG(const std::string &filename) :
27 arrows(false), fill("grey"), stroke("black"), filename(filename), flipY(false)
28 { open(filename); }
29 SVG(const std::string &filename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool aflipY = false) :
30 arrows(false), fill("grey"), stroke("black"), filename(filename), origin(bbox.min - Point(bbox_offset, bbox_offset)), flipY(aflipY)
31 { open(filename, bbox, bbox_offset, aflipY); }
32 ~SVG() { if (f != NULL) Close(); }
33
34 bool open(const char* filename);
35 bool open(const char* filename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool flipY = false);
36 bool open(const std::string &filename)
37 { return open(filename.c_str()); }
38 bool open(const std::string &filename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool flipY = false)
39 { return open(filename.c_str(), bbox, bbox_offset, flipY); }
40
41 void draw(const Line &line, std::string stroke = "black", coordf_t stroke_width = 0);
42 void draw(const ThickLine &line, const std::string &fill, const std::string &stroke, coordf_t stroke_width = 0);
43 void draw(const Lines &lines, std::string stroke = "black", coordf_t stroke_width = 0);
44 void draw(const IntersectionLines &lines, std::string stroke = "black");
45
46 void draw(const ExPolygon &expolygon, std::string fill = "grey", const float fill_opacity=1.f);
47 void draw_outline(const ExPolygon &polygon, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
48 void draw(const ExPolygons &expolygons, std::string fill = "grey", const float fill_opacity=1.f);
49 void draw_outline(const ExPolygons &polygons, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
50
51 void draw(const Surface &surface, std::string fill = "grey", const float fill_opacity=1.f);
52 void draw_outline(const Surface &surface, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
53 void draw(const Surfaces &surfaces, std::string fill = "grey", const float fill_opacity=1.f);
54 void draw_outline(const Surfaces &surfaces, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
55 void draw(const SurfacesPtr &surfaces, std::string fill = "grey", const float fill_opacity=1.f);
56 void draw_outline(const SurfacesPtr &surfaces, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
57
58 void draw(const Polygon &polygon, std::string fill = "grey");
59 void draw_outline(const Polygon &polygon, std::string stroke = "black", coordf_t stroke_width = 0);
60 void draw(const Polygons &polygons, std::string fill = "grey");
61 void draw_outline(const Polygons &polygons, std::string stroke = "black", coordf_t stroke_width = 0);
62 void draw(const Polyline &polyline, std::string stroke = "black", coordf_t stroke_width = 0);
63 void draw(const Polylines &polylines, std::string stroke = "black", coordf_t stroke_width = 0);
64 void draw(const ThickLines &thicklines, const std::string &fill = "lime", const std::string &stroke = "black", coordf_t stroke_width = 0);
65 void draw(const ThickPolylines &polylines, const std::string &stroke = "black", coordf_t stroke_width = 0);
66 void draw(const ThickPolylines &thickpolylines, const std::string &fill, const std::string &stroke, coordf_t stroke_width);
67 void draw(const Point &point, std::string fill = "black", coord_t radius = 0);
68 void draw(const Points &points, std::string fill = "black", coord_t radius = 0);
69
70 // Support for rendering the ClipperLib paths
71 void draw(const ClipperLib::Path &polygon, double scale, std::string fill = "grey", coordf_t stroke_width = 0);
72 void draw(const ClipperLib::Paths &polygons, double scale, std::string fill = "grey", coordf_t stroke_width = 0);
73
74 void draw_text(const Point &pt, const char *text, const char *color);
75 void draw_legend(const Point &pt, const char *text, const char *color);
76
77 void Close();
78
79 private:
80 std::string filename;
81 FILE* f;
82
83 void path(const std::string &d, bool fill, coordf_t stroke_width, const float fill_opacity);
84 std::string get_path_d(const MultiPoint &mp, bool closed = false) const;
85 std::string get_path_d(const ClipperLib::Path &mp, double scale, bool closed = false) const;
86
87 public:
88 static void export_expolygons(const char *path, const BoundingBox &bbox, const Slic3r::ExPolygons &expolygons, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
89 static void export_expolygons(const std::string &path, const BoundingBox &bbox, const Slic3r::ExPolygons &expolygons, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0)
90 { export_expolygons(path.c_str(), bbox, expolygons, stroke_outer, stroke_holes, stroke_width); }
91 };
92
93 }
94
95 #endif
0 #include "ClipperUtils.hpp"
1 #include "ExtrusionEntityCollection.hpp"
2 #include "PerimeterGenerator.hpp"
3 #include "Print.hpp"
4 #include "Layer.hpp"
5 #include "SupportMaterial.hpp"
6 #include "Fill/FillBase.hpp"
7 #include "SVG.hpp"
8
9 #include <cmath>
10 #include <cassert>
11 #include <memory>
12
13 #define SLIC3R_DEBUG
14
15 namespace Slic3r {
16
17 // Increment used to reach MARGIN in steps to avoid trespassing thin objects
18 #define NUM_MARGIN_STEPS 3
19
20 // Dimensions of a tree-like structure to save material
21 #define PILLAR_SIZE (2.5)
22 #define PILLAR_SPACING 10
23
24 PrintObjectSupportMaterial::PrintObjectSupportMaterial(const PrintObject *object) :
25 m_object (object),
26 m_print_config (&object->print()->config),
27 m_object_config (&object->config),
28
29 m_first_layer_flow (Flow::new_from_config_width(
30 frSupportMaterial,
31 (object->print()->config.first_layer_extrusion_width.value > 0) ? object->print()->config.first_layer_extrusion_width : object->config.support_material_extrusion_width,
32 object->print()->config.nozzle_diameter.get_at(object->config.support_material_extruder-1),
33 object->config.get_abs_value("first_layer_height"),
34 false
35 )),
36 m_support_material_flow (Flow::new_from_config_width(
37 frSupportMaterial,
38 (object->config.support_material_extrusion_width.value > 0) ? object->config.support_material_extrusion_width : object->config.extrusion_width,
39 object->print()->config.nozzle_diameter.get_at(object->config.support_material_extruder-1),
40 object->config.layer_height.value,
41 false)),
42 m_support_material_interface_flow(Flow::new_from_config_width(
43 frSupportMaterialInterface,
44 (object->config.support_material_extrusion_width.value > 0) ? object->config.support_material_extrusion_width : object->config.extrusion_width,
45 object->print()->config.nozzle_diameter.get_at(object->config.support_material_interface_extruder-1),
46 object->config.layer_height.value,
47 false)),
48 m_soluble_interface (object->config.support_material_contact_distance.value == 0),
49
50 m_support_material_raft_base_flow(0, 0, 0, false),
51 m_support_material_raft_interface_flow(0, 0, 0, false),
52 m_support_material_raft_contact_flow(0, 0, 0, false),
53
54 m_has_raft (object->config.raft_layers.value > 0),
55 m_num_base_raft_layers (0),
56 m_num_interface_raft_layers (0),
57 m_num_contact_raft_layers (0),
58
59 // If set, the raft contact layer is laid with round strings, which are easily detachable
60 // from both the below and above layes.
61 // Otherwise a normal flow is used and the strings are squashed against the layer below,
62 // creating a firm bond with the layer below and making the interface top surface flat.
63 #if 1
64 // This is the standard Slic3r behavior.
65 m_raft_contact_layer_bridging(false),
66 m_object_1st_layer_bridging (true),
67 #else
68 // This is more akin to what Simplify3D or Zortrax do.
69 m_raft_contact_layer_bridging(true),
70 m_object_1st_layer_bridging (false),
71 #endif
72
73 m_raft_height (0.),
74 m_raft_base_height (0.),
75 m_raft_interface_height (0.),
76 m_raft_contact_height (0.),
77
78 // 50 mirons layer
79 m_support_layer_height_min (0.05),
80 m_support_layer_height_max (0.),
81 m_support_interface_layer_height_max(0.),
82
83 m_gap_extra_above (0.2),
84 m_gap_extra_below (0.2),
85 m_gap_xy (0.2),
86
87 // If enabled, the support layers will be synchronized with object layers.
88 // This does not prevent the support layers to be combined.
89 m_synchronize_support_layers_with_object(false),
90 // If disabled and m_synchronize_support_layers_with_object,
91 // the support layers will be synchronized with the object layers exactly, no layer will be combined.
92 m_combine_support_layers (true)
93 {
94 // Based on the raft style and size, initialize the raft layers and the 1st object layer attributes.
95
96 size_t num_raft_layers = m_object_config->raft_layers.value;
97
98 //FIXME better to draw thin strings, which are easier to remove from the object.
99 if (m_has_raft)
100 {
101 if (m_raft_contact_layer_bridging)
102 m_support_material_raft_contact_flow = Flow::new_from_spacing(
103 m_support_material_raft_interface_flow.spacing(),
104 m_support_material_raft_interface_flow.nozzle_diameter,
105 m_support_material_raft_interface_flow.height,
106 true);
107
108 if (m_raft_contact_layer_bridging && num_raft_layers == 1)
109 // The bridging contact layer will not bond to the bed well on its own.
110 // Ensure there is at least the 1st layer printed with a firm squash.
111 ++ num_raft_layers;
112
113 // Split the raft layers into a single contact layer
114 // and an equal number of interface and base layers,
115 // with m_num_interface_raft_layers >= m_num_base_raft_layers.
116 m_num_contact_raft_layers = 1;
117 m_num_interface_raft_layers = num_raft_layers / 2;
118 m_num_base_raft_layers = num_raft_layers - m_num_contact_raft_layers - m_num_interface_raft_layers;
119 assert(m_num_interface_raft_layers >= m_num_base_raft_layers);
120 assert(m_num_contact_raft_layers + m_num_base_raft_layers + m_num_interface_raft_layers == num_raft_layers);
121
122 m_raft_contact_height = m_num_contact_raft_layers * m_support_material_raft_contact_flow.height;
123 if (m_num_base_raft_layers > 0) {
124 m_raft_base_height = first_layer_height() + (m_num_base_raft_layers - 1) * m_support_material_raft_base_flow.height;
125 m_raft_interface_height = m_num_interface_raft_layers * m_support_material_raft_interface_flow.height;
126 } else if (m_num_interface_raft_layers > 0) {
127 m_raft_base_height = 0;
128 m_raft_interface_height = first_layer_height() + (m_num_interface_raft_layers - 1) * m_support_material_raft_interface_flow.height;
129 } else {
130 m_raft_base_height = 0;
131 m_raft_interface_height = 0;
132 }
133 m_raft_height = m_raft_base_height + m_raft_interface_height + m_raft_contact_height;
134
135 // Find the layer height of the 1st object layer.
136 if (m_object_1st_layer_bridging) {
137 // Use an average nozzle diameter.
138 std::set<size_t> extruders = m_object->print()->object_extruders();
139 coordf_t nozzle_dmr = 0;
140 for (std::set<size_t>::const_iterator it = extruders.begin(); it != extruders.end(); ++ it) {
141 nozzle_dmr += m_object->print()->config.nozzle_diameter.get_at(*it);
142 }
143 nozzle_dmr /= extruders.size();
144 m_object_1st_layer_height = nozzle_dmr;
145 } else {
146 m_object_1st_layer_height = m_object->config.layer_height.value;
147 for (t_layer_height_ranges::const_iterator it = m_object->layer_height_ranges.begin(); it != m_object->layer_height_ranges.end(); ++ it) {
148 if (m_object_1st_layer_height >= it->first.first && m_object_1st_layer_height <= it->first.second) {
149 m_object_1st_layer_height = it->second;
150 break;
151 }
152 }
153 }
154
155 m_object_1st_layer_gap = m_soluble_interface ? 0. : m_object_config->support_material_contact_distance.value;
156 m_object_1st_layer_print_z = m_raft_height + m_object_1st_layer_gap + m_object_1st_layer_height;
157 }
158 else
159 {
160 // No raft.
161 m_raft_contact_layer_bridging = false;
162 m_object_1st_layer_bridging = false;
163 m_object_1st_layer_height = m_first_layer_flow.height;
164 m_object_1st_layer_gap = 0;
165 m_object_1st_layer_print_z = m_object_1st_layer_height;
166 }
167 }
168
169 // Using the std::deque as an allocator.
170 inline PrintObjectSupportMaterial::MyLayer& layer_allocate(
171 std::deque<PrintObjectSupportMaterial::MyLayer> &layer_storage,
172 PrintObjectSupportMaterial::SupporLayerType layer_type)
173 {
174 layer_storage.push_back(PrintObjectSupportMaterial::MyLayer());
175 layer_storage.back().layer_type = layer_type;
176 return layer_storage.back();
177 }
178
179 inline void layers_append(PrintObjectSupportMaterial::MyLayersPtr &dst, const PrintObjectSupportMaterial::MyLayersPtr &src)
180 {
181 dst.insert(dst.end(), src.begin(), src.end());
182 }
183
184 // Compare layers lexicographically.
185 struct MyLayersPtrCompare
186 {
187 bool operator()(const PrintObjectSupportMaterial::MyLayer* layer1, const PrintObjectSupportMaterial::MyLayer* layer2) const {
188 return *layer1 < *layer2;
189 }
190 };
191
192 void PrintObjectSupportMaterial::generate(PrintObject &object)
193 {
194 coordf_t max_object_layer_height = 0.;
195 for (size_t i = 0; i < object.layer_count(); ++ i)
196 max_object_layer_height = std::max(max_object_layer_height, object.get_layer(i)->height);
197
198 if (m_support_layer_height_max == 0)
199 m_support_layer_height_max = std::max(max_object_layer_height, 0.75 * m_support_material_flow.nozzle_diameter);
200 if (m_support_interface_layer_height_max == 0)
201 m_support_interface_layer_height_max = std::max(max_object_layer_height, 0.75 * m_support_material_interface_flow.nozzle_diameter);
202
203 // Layer instances will be allocated by std::deque and they will be kept until the end of this function call.
204 // The layers will be referenced by various LayersPtr (of type std::vector<Layer*>)
205 MyLayerStorage layer_storage;
206
207 // Determine the top contact surfaces of the support, defined as:
208 // contact = overhangs - clearance + margin
209 // This method is responsible for identifying what contact surfaces
210 // should the support material expose to the object in order to guarantee
211 // that it will be effective, regardless of how it's built below.
212 // If raft is to be generated, the 1st top_contact layer will contain the 1st object layer silhouette without holes.
213 MyLayersPtr top_contacts = this->top_contact_layers(object, layer_storage);
214 if (top_contacts.empty())
215 // Nothing is supported, no supports are generated.
216 return;
217
218 #ifdef SLIC3R_DEBUG
219 static int iRun = 0;
220 iRun ++;
221 for (MyLayersPtr::const_iterator it = top_contacts.begin(); it != top_contacts.end(); ++ it) {
222 const MyLayer &layer = *(*it);
223 ::Slic3r::SVG svg(debug_out_path("support-top-contacts-%d-%lf.svg", iRun, layer.print_z), get_extents(layer.polygons));
224 Slic3r::ExPolygons expolys = union_ex(layer.polygons, false);
225 svg.draw(expolys);
226 }
227 #endif /* SLIC3R_DEBUG */
228
229 // Determine the bottom contact surfaces of the supports over the top surfaces of the object.
230 // Depending on whether the support is soluble or not, the contact layer thickness is decided.
231 MyLayersPtr bottom_contacts = this->bottom_contact_layers(object, top_contacts, layer_storage);
232
233 #ifdef SLIC3R_DEBUG
234 for (MyLayersPtr::const_iterator it = bottom_contacts.begin(); it != bottom_contacts.end(); ++ it) {
235 const MyLayer &layer = *(*it);
236 ::Slic3r::SVG svg(debug_out_path("support-bottom-contacts-%d-%lf.svg", iRun, layer.print_z), get_extents(layer.polygons));
237 Slic3r::ExPolygons expolys = union_ex(layer.polygons, false);
238 svg.draw(expolys);
239 }
240 #endif /* SLIC3R_DEBUG */
241
242 // Because the top and bottom contacts are thick slabs, they may overlap causing over extrusion
243 // and unwanted strong bonds to the object.
244 // Rather trim the top contacts by their overlapping bottom contacts to leave a gap instead of over extruding.
245 this->trim_top_contacts_by_bottom_contacts(object, bottom_contacts, top_contacts);
246
247 // Generate empty intermediate layers between the top / bottom support contact layers,
248 // The layers may or may not be synchronized with the object layers, depending on the configuration.
249 // For example, a single nozzle multi material printing will need to generate a waste tower, which in turn
250 // wastes less material, if there are as little layers as possible, therefore minimizing the material swaps.
251 MyLayersPtr intermediate_layers = this->raft_and_intermediate_support_layers(
252 object, bottom_contacts, top_contacts, layer_storage, max_object_layer_height);
253
254 // Fill in intermediate layers between the top / bottom support contact layers, trimmed by the object.
255 this->generate_base_layers(object, bottom_contacts, top_contacts, intermediate_layers);
256
257 #ifdef SLIC3R_DEBUG
258 for (MyLayersPtr::const_iterator it = intermediate_layers.begin(); it != intermediate_layers.end(); ++ it) {
259 const MyLayer &layer = *(*it);
260 ::Slic3r::SVG svg(debug_out_path("support-base-layers-%d-%lf.svg", iRun, layer.print_z), get_extents(layer.polygons));
261 Slic3r::ExPolygons expolys = union_ex(layer.polygons, false);
262 svg.draw(expolys);
263 }
264 #endif /* SLIC3R_DEBUG */
265
266 // If raft is to be generated, the 1st top_contact layer will contain the 1st object layer silhouette without holes.
267 // Add the bottom contacts to the raft, inflate the support bases.
268 // There is a contact layer below the 1st object layer in the bottom contacts.
269 // There is also a 1st intermediate layer containing bases of support columns.
270 // Extend the bases of the support columns and create the raft base.
271 Polygons raft = this->generate_raft_base(object, bottom_contacts, intermediate_layers);
272
273 /*
274 // If we wanted to apply some special logic to the first support layers lying on
275 // object's top surfaces this is the place to detect them
276 LayersSet shape;
277 if (m_objectconfig->support_material_pattern.value == smpPillars)
278 shape = this->generate_pillars_shape(contact, support_z);
279 */
280
281 // Propagate top / bottom contact layers to generate interface layers.
282 MyLayersPtr interface_layers = this->generate_interface_layers(
283 object, bottom_contacts, top_contacts, intermediate_layers, layer_storage);
284
285 #ifdef SLIC3R_DEBUG
286 for (MyLayersPtr::const_iterator it = interface_layers.begin(); it != interface_layers.end(); ++ it) {
287 const MyLayer &layer = *(*it);
288 ::Slic3r::SVG svg(debug_out_path("support-interface-layers-%d-%lf.svg", iRun, layer.print_z), get_extents(layer.polygons));
289 Slic3r::ExPolygons expolys = union_ex(layer.polygons, false);
290 svg.draw(expolys);
291 }
292 #endif /* SLIC3R_DEBUG */
293
294 /*
295 // Clip with the pillars.
296 if (! shape.empty()) {
297 this->clip_with_shape(interface, shape);
298 this->clip_with_shape(base, shape);
299 }
300 */
301
302 // Install support layers into the object.
303 MyLayersPtr layers_sorted;
304 layers_sorted.reserve(bottom_contacts.size() + top_contacts.size() + intermediate_layers.size() + interface_layers.size());
305 layers_append(layers_sorted, bottom_contacts);
306 layers_append(layers_sorted, top_contacts);
307 layers_append(layers_sorted, intermediate_layers);
308 layers_append(layers_sorted, interface_layers);
309 std::sort(layers_sorted.begin(), layers_sorted.end(), MyLayersPtrCompare());
310
311 int layer_id = 0;
312 for (int i = 0; i < int(layers_sorted.size());) {
313 // Find the last layer with the same print_z, find the minimum layer height of all.
314 int j = i + 1;
315 coordf_t height_min = layers_sorted[i]->height;
316 for (; j < layers_sorted.size() && layers_sorted[i]->print_z == layers_sorted[j]->print_z; ++ j)
317 height_min = std::min(height_min, layers_sorted[j]->height);
318 object.add_support_layer(layer_id, height_min, layers_sorted[i]->print_z);
319 if (layer_id > 0) {
320 SupportLayer *sl1 = object.support_layers[object.support_layer_count()-2];
321 SupportLayer *sl2 = object.support_layers.back();
322 sl1->upper_layer = sl2;
323 sl2->lower_layer = sl1;
324 }
325 i = j;
326 ++ layer_id;
327 }
328
329 // Generate the actual toolpaths and save them into each layer.
330 this->generate_toolpaths(object, raft, bottom_contacts, top_contacts, intermediate_layers, interface_layers);
331 }
332
333 void collect_region_slices_by_type(const Layer &layer, SurfaceType surface_type, Polygons &out)
334 {
335 // 1) Count the new polygons first.
336 size_t n_polygons_new = 0;
337 for (LayerRegionPtrs::const_iterator it_region = layer.regions.begin(); it_region != layer.regions.end(); ++ it_region) {
338 const LayerRegion &region = *(*it_region);
339 const SurfaceCollection &slices = region.slices;
340 for (Surfaces::const_iterator it = slices.surfaces.begin(); it != slices.surfaces.end(); ++ it) {
341 const Surface &surface = *it;
342 if (surface.surface_type == surface_type)
343 n_polygons_new += surface.expolygon.holes.size() + 1;
344 }
345 }
346
347 // 2) Collect the new polygons.
348 out.reserve(out.size() + n_polygons_new);
349 for (LayerRegionPtrs::const_iterator it_region = layer.regions.begin(); it_region != layer.regions.end(); ++ it_region) {
350 const LayerRegion &region = *(*it_region);
351 const SurfaceCollection &slices = region.slices;
352 for (Surfaces::const_iterator it = slices.surfaces.begin(); it != slices.surfaces.end(); ++ it) {
353 const Surface &surface = *it;
354 if (surface.surface_type == surface_type)
355 polygons_append(out, surface.expolygon);
356 }
357 }
358 }
359
360 Polygons collect_region_slices_by_type(const Layer &layer, SurfaceType surface_type)
361 {
362 Polygons out;
363 collect_region_slices_by_type(layer, surface_type, out);
364 return out;
365 }
366
367 // Collect outer contours of all expolygons in all layer region slices.
368 void collect_region_slices_outer(const Layer &layer, Polygons &out)
369 {
370 // 1) Count the new polygons first.
371 size_t n_polygons_new = 0;
372 for (LayerRegionPtrs::const_iterator it_region = layer.regions.begin(); it_region != layer.regions.end(); ++ it_region) {
373 const LayerRegion &region = *(*it_region);
374 n_polygons_new += region.slices.surfaces.size();
375 }
376
377 // 2) Collect the new polygons.
378 out.reserve(out.size() + n_polygons_new);
379 for (LayerRegionPtrs::const_iterator it_region = layer.regions.begin(); it_region != layer.regions.end(); ++ it_region) {
380 const LayerRegion &region = *(*it_region);
381 for (Surfaces::const_iterator it = region.slices.surfaces.begin(); it != region.slices.surfaces.end(); ++ it)
382 out.push_back(it->expolygon.contour);
383 }
384 }
385
386 // Collect outer contours of all expolygons in all layer region slices.
387 Polygons collect_region_slices_outer(const Layer &layer)
388 {
389 Polygons out;
390 collect_region_slices_outer(layer, out);
391 return out;
392 }
393
394 // Collect outer contours of all expolygons in all layer region slices.
395 void collect_slices_outer(const Layer &layer, Polygons &out)
396 {
397 out.reserve(out.size() + layer.slices.expolygons.size());
398 for (ExPolygons::const_iterator it = layer.slices.expolygons.begin(); it != layer.slices.expolygons.end(); ++ it)
399 out.push_back(it->contour);
400 }
401
402 // Collect outer contours of all expolygons in all layer region slices.
403 Polygons collect_slices_outer(const Layer &layer)
404 {
405 Polygons out;
406 collect_slices_outer(layer, out);
407 return out;
408 }
409
410 // Find the top contact surfaces of the support or the raft.
411 PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_layers(const PrintObject &object, MyLayerStorage &layer_storage) const
412 {
413 #ifdef SLIC3R_DEBUG
414 static int iRun = 0;
415 ++ iRun;
416 #endif /* SLIC3R_DEBUG */
417
418 // Output layers, sorte by top Z.
419 MyLayersPtr contact_out;
420
421 // If user specified a custom angle threshold, convert it to radians.
422 double threshold_rad = 0.;
423 if (m_object_config->support_material_threshold.value > 0) {
424 threshold_rad = M_PI * double(m_object_config->support_material_threshold.value + 1) / 180.; // +1 makes the threshold inclusive
425 // Slic3r::debugf "Threshold angle = %d°\n", rad2deg($threshold_rad);
426 }
427
428 // Build support on a build plate only? If so, then collect top surfaces into $buildplate_only_top_surfaces
429 // and subtract $buildplate_only_top_surfaces from the contact surfaces, so
430 // there is no contact surface supported by a top surface.
431 bool buildplate_only = m_object_config->support_material.value && m_object_config->support_material_buildplate_only.value;
432 Polygons buildplate_only_top_surfaces;
433
434 // Determine top contact areas.
435 for (size_t layer_id = 0; layer_id < object.layer_count(); ++ layer_id) {
436 // Note that layer_id < layer->id when raft_layers > 0 as the layer->id incorporates the raft layers.
437 // So layer_id == 0 means first object layer and layer->id == 0 means first print layer if there are no explicit raft layers.
438 if (this->has_raft()) {
439 if (! this->has_support() && layer_id > 0)
440 // If we are only going to generate raft. Just check for the 'overhangs' of the first object layer.
441 break;
442 // Check for the overhangs at any object layer including the 1st layer.
443 } else if (layer_id == 0) {
444 // No raft, 1st object layer cannot be supported by a support contact layer as it sticks directly to print bed.
445 continue;
446 }
447
448 const Layer &layer = *object.get_layer(layer_id);
449
450 if (buildplate_only) {
451 // Collect the top surfaces up to this layer and merge them.
452 Polygons projection_new = collect_region_slices_by_type(layer, stTop);
453 if (! projection_new.empty()) {
454 // Merge the new top surfaces with the preceding top surfaces.
455 // Apply the safety offset to the newly added polygons, so they will connect
456 // with the polygons collected before,
457 // but don't apply the safety offset during the union operation as it would
458 // inflate the polygons over and over.
459 projection_new = offset(projection_new, scale_(0.01));
460 polygons_append(buildplate_only_top_surfaces, projection_new);
461 buildplate_only_top_surfaces = union_(buildplate_only_top_surfaces, false); // don't apply the safety offset.
462 }
463 }
464
465 // Detect overhangs and contact areas needed to support them.
466 Polygons overhang_polygons;
467 Polygons contact_polygons;
468 if (layer_id == 0) {
469 // This is the first object layer, so the object is being printed on a raft and
470 // we're here just to get the object footprint for the raft.
471 // We only consider contours and discard holes to get a more continuous raft.
472 overhang_polygons = collect_slices_outer(layer);
473 // Extend by SUPPORT_MATERIAL_MARGIN, which is 1.5mm
474 contact_polygons = offset(overhang_polygons, scale_(SUPPORT_MATERIAL_MARGIN));
475 } else {
476 // Generate overhang / contact_polygons for non-raft layers.
477 const Layer &lower_layer = *object.get_layer(int(layer_id)-1);
478 for (LayerRegionPtrs::const_iterator it_layerm = layer.regions.begin(); it_layerm != layer.regions.end(); ++ it_layerm) {
479 const LayerRegion &layerm = *(*it_layerm);
480 // Extrusion width accounts for the roundings of the extrudates.
481 // It is the maximum widh of the extrudate.
482 coord_t fw = layerm.flow(frExternalPerimeter).scaled_width();
483 coordf_t lower_layer_offset =
484 (layer_id < m_object_config->support_material_enforce_layers.value) ?
485 // Enforce a full possible support, ignore the overhang angle.
486 0 :
487 (threshold_rad > 0. ?
488 // Overhang defined by an angle.
489 scale_(lower_layer.height * cos(threshold_rad) / sin(threshold_rad)) :
490 // Overhang defined by half the extrusion width.
491 0.5 * fw);
492 // Overhang polygons for this layer and region.
493 Polygons diff_polygons;
494 if (lower_layer_offset == 0.) {
495 // Support everything.
496 diff_polygons = diff(
497 (Polygons)layerm.slices,
498 (Polygons)lower_layer.slices);
499 } else {
500 // Get the regions needing a suport.
501 diff_polygons = diff(
502 (Polygons)layerm.slices,
503 offset((Polygons)lower_layer.slices, lower_layer_offset));
504 // Collapse very tiny spots.
505 diff_polygons = offset2(diff_polygons, -0.1*fw, +0.1*fw);
506 if (diff_polygons.empty())
507 continue;
508 // Offset the support regions back to a full overhang, restrict them to the full overhang.
509 diff_polygons = diff(intersection(offset(diff_polygons, lower_layer_offset), (Polygons)layerm.slices), (Polygons)lower_layer.slices);
510 }
511 if (diff_polygons.empty())
512 continue;
513
514 #ifdef SLIC3R_DEBUG
515 {
516 ::Slic3r::SVG svg(debug_out_path("support-top-contacts-raw-run%d-layer%d-region%d.svg", iRun, layer_id, it_layerm - layer.regions.begin()), get_extents(diff_polygons));
517 Slic3r::ExPolygons expolys = union_ex(diff_polygons, false);
518 svg.draw(expolys);
519 }
520 #endif /* SLIC3R_DEBUG */
521
522 if (m_object_config->dont_support_bridges) {
523 // compute the area of bridging perimeters
524 // Note: this is duplicate code from GCode.pm, we need to refactor
525
526 Polygons bridged_perimeters;
527 {
528 Flow bridge_flow = layerm.flow(frPerimeter, true);
529
530 coordf_t nozzle_diameter = m_print_config->nozzle_diameter.get_at(
531 layerm.region()->config.perimeter_extruder-1);
532 Polygons lower_grown_slices = offset((Polygons)lower_layer.slices, 0.5f*scale_(nozzle_diameter));
533
534 // TODO: split_at_first_point() could split a bridge mid-way
535 Polylines overhang_perimeters;
536 for (ExtrusionEntitiesPtr::const_iterator it_island = layerm.perimeters.entities.begin(); it_island != layerm.perimeters.entities.end(); ++ it_island) {
537 const ExtrusionEntityCollection *island = dynamic_cast<ExtrusionEntityCollection*>(*it_island);
538 assert(island != NULL);
539 for (size_t i = 0; i < island->entities.size(); ++ i) {
540 ExtrusionEntity *entity = island->entities[i];
541 ExtrusionLoop *loop = dynamic_cast<Slic3r::ExtrusionLoop*>(entity);
542 overhang_perimeters.push_back(loop ?
543 loop->as_polyline() :
544 dynamic_cast<const Slic3r::ExtrusionPath*>(entity)->polyline);
545 }
546 }
547
548 // workaround for Clipper bug, see Slic3r::Polygon::clip_as_polyline()
549 for (Polylines::iterator it = overhang_perimeters.begin(); it != overhang_perimeters.end(); ++ it)
550 it->points[0].x += 1;
551 diff(overhang_perimeters, lower_grown_slices, &overhang_perimeters);
552
553 // only consider straight overhangs
554 // only consider overhangs having endpoints inside layer's slices
555 // convert bridging polylines into polygons by inflating them with their thickness
556 // since we're dealing with bridges, we can't assume width is larger than spacing,
557 // so we take the largest value and also apply safety offset to be ensure no gaps
558 // are left in between
559 coordf_t w = std::max(bridge_flow.scaled_width(), bridge_flow.scaled_spacing());
560 for (Polylines::iterator it = overhang_perimeters.begin(); it != overhang_perimeters.end(); ++ it) {
561 if (it->is_straight()) {
562 it->extend_start(fw);
563 it->extend_end(fw);
564 if (layer.slices.contains(it->first_point()) && layer.slices.contains(it->last_point())) {
565 // Offset a polyline into a polygon.
566 Polylines tmp; tmp.push_back(*it);
567 Polygons out;
568 offset(tmp, &out, 0.5f * w + 10.f);
569 polygons_append(bridged_perimeters, out);
570 }
571 }
572 }
573 bridged_perimeters = union_(bridged_perimeters);
574 }
575
576 if (1) {
577 // remove the entire bridges and only support the unsupported edges
578 Polygons bridges;
579 for (Surfaces::const_iterator it = layerm.fill_surfaces.surfaces.begin(); it != layerm.fill_surfaces.surfaces.end(); ++ it)
580 if (it->surface_type == stBottomBridge && it->bridge_angle != -1)
581 polygons_append(bridges, it->expolygon);
582 polygons_append(bridged_perimeters, bridges);
583 diff_polygons = diff(diff_polygons, bridged_perimeters, true);
584
585 Polygons unsupported_bridge_polygons;
586 for (Polylines::const_iterator it = layerm.unsupported_bridge_edges.polylines.begin();
587 it != layerm.unsupported_bridge_edges.polylines.end(); ++ it) {
588 // Offset a polyline into a polygon.
589 Polylines tmp; tmp.push_back(*it);
590 Polygons out;
591 offset(tmp, &out, scale_(SUPPORT_MATERIAL_MARGIN));
592 polygons_append(unsupported_bridge_polygons, out);
593 }
594 polygons_append(diff_polygons, intersection(unsupported_bridge_polygons, bridges));
595 } else {
596 // just remove bridged areas
597 diff_polygons = diff(diff_polygons, layerm.bridged, true);
598 }
599 } // if (m_objconfig->dont_support_bridges)
600
601 if (buildplate_only) {
602 // Don't support overhangs above the top surfaces.
603 // This step is done before the contact surface is calculated by growing the overhang region.
604 diff_polygons = diff(diff_polygons, buildplate_only_top_surfaces);
605 }
606
607 if (diff_polygons.empty())
608 continue;
609
610 #ifdef SLIC3R_DEBUG
611 {
612 ::Slic3r::SVG svg(debug_out_path("support-top-contacts-filtered-run%d-layer%d-region%d.svg", iRun, layer_id, it_layerm - layer.regions.begin()), get_extents(diff_polygons));
613 Slic3r::ExPolygons expolys = union_ex(diff_polygons, false);
614 svg.draw(expolys);
615 }
616 #endif /* SLIC3R_DEBUG */
617
618 polygons_append(overhang_polygons, diff_polygons);
619
620 // Let's define the required contact area by using a max gap of half the upper
621 // extrusion width and extending the area according to the configured margin.
622 // We increment the area in steps because we don't want our support to overflow
623 // on the other side of the object (if it's very thin).
624 {
625 //FIMXE 1) Make the offset configurable, 2) Make the Z span configurable.
626 Polygons slices_margin = offset((Polygons)lower_layer.slices, float(0.5*fw));
627 if (buildplate_only) {
628 // Trim the inflated contact surfaces by the top surfaces as well.
629 polygons_append(slices_margin, buildplate_only_top_surfaces);
630 slices_margin = union_(slices_margin);
631 }
632 // Offset the contact polygons outside.
633 for (size_t i = 0; i < NUM_MARGIN_STEPS; ++ i) {
634 diff_polygons = diff(
635 offset(
636 diff_polygons,
637 SUPPORT_MATERIAL_MARGIN / NUM_MARGIN_STEPS,
638 CLIPPER_OFFSET_SCALE,
639 ClipperLib::jtRound,
640 // round mitter limit
641 scale_(0.05) * CLIPPER_OFFSET_SCALE),
642 slices_margin);
643 }
644 }
645 polygons_append(contact_polygons, diff_polygons);
646 } // for each layer.region
647 } // end of Generate overhang/contact_polygons for non-raft layers.
648
649 // now apply the contact areas to the layer were they need to be made
650 if (! contact_polygons.empty()) {
651 // get the average nozzle diameter used on this layer
652 MyLayer &new_layer = layer_allocate(layer_storage, sltTopContact);
653 new_layer.idx_object_layer_above = layer_id;
654 if (m_soluble_interface) {
655 // Align the contact surface height with a layer immediately below the supported layer.
656 new_layer.height = (layer_id > 0) ?
657 // Interface layer will be synchronized with the object.
658 object.get_layer(layer_id - 1)->height :
659 // Don't know the thickness of the raft layer yet.
660 0.;
661 new_layer.print_z = layer.print_z - layer.height;
662 new_layer.bottom_z = new_layer.print_z - new_layer.height;
663 } else {
664 // Contact layer will be printed with a normal flow, but
665 // it will support layers printed with a bridging flow.
666 //FIXME Probably printing with the bridge flow? How about the unsupported perimeters? Are they printed with the bridging flow?
667 // In the future we may switch to a normal extrusion flow for the supported bridges.
668 // Get the average nozzle diameter used on this layer.
669 coordf_t nozzle_dmr = 0.;
670 size_t n_nozzle_dmrs = 0;
671 for (LayerRegionPtrs::const_iterator it_region_ptr = layer.regions.begin(); it_region_ptr != layer.regions.end(); ++ it_region_ptr) {
672 const PrintRegion &region = *(*it_region_ptr)->region();
673 nozzle_dmr += m_print_config->nozzle_diameter.get_at(region.config.perimeter_extruder.value - 1);
674 nozzle_dmr += m_print_config->nozzle_diameter.get_at(region.config.infill_extruder.value - 1);
675 nozzle_dmr += m_print_config->nozzle_diameter.get_at(region.config.solid_infill_extruder.value - 1);
676 n_nozzle_dmrs += 3;
677 }
678 nozzle_dmr /= coordf_t(n_nozzle_dmrs);
679 new_layer.print_z = layer.print_z - nozzle_dmr - m_object_config->support_material_contact_distance;
680 // Don't know the height of the top contact layer yet. The top contact layer is printed with a normal flow and
681 // its height will be set adaptively later on.
682 new_layer.height = 0.;
683 new_layer.bottom_z = new_layer.print_z;
684 }
685
686 // Ignore this contact area if it's too low.
687 // Don't want to print a layer below the first layer height as it may not stick well.
688 //FIXME there may be a need for a single layer support, then one may decide to print it either as a bottom contact or a top contact
689 // and it may actually make sense to do it with a thinner layer than the first layer height.
690 if (new_layer.print_z < this->first_layer_height() + m_support_layer_height_min)
691 continue;
692
693 new_layer.polygons.swap(contact_polygons);
694 // Store the overhang polygons as the aux_polygons.
695 // The overhang polygons are used in the path generator for planning of the contact circles.
696 new_layer.aux_polygons = new Polygons();
697 new_layer.aux_polygons->swap(overhang_polygons);
698 contact_out.push_back(&new_layer);
699
700 if (0) {
701 // Slic3r::SVG::output("out\\contact_" . $contact_z . ".svg",
702 // green_expolygons => union_ex($buildplate_only_top_surfaces),
703 // blue_expolygons => union_ex(\@contact),
704 // red_expolygons => union_ex(\@overhang),
705 // );
706 }
707 }
708 }
709
710 return contact_out;
711 }
712
713 PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_contact_layers(
714 const PrintObject &object, const MyLayersPtr &top_contacts, MyLayerStorage &layer_storage) const
715 {
716 // find object top surfaces
717 // we'll use them to clip our support and detect where does it stick
718 MyLayersPtr bottom_contacts;
719 if (! m_object_config->support_material_buildplate_only.value && ! top_contacts.empty())
720 {
721 // Sum of unsupported contact areas above the current layer.print_z.
722 Polygons projection;
723 // Last top contact layer visited when collecting the projection of contact areas.
724 int contact_idx = int(top_contacts.size()) - 1;
725 for (int layer_id = int(object.total_layer_count()) - 2; layer_id >= 0; -- layer_id) {
726 const Layer &layer = *object.get_layer(layer_id);
727 Polygons top = collect_region_slices_by_type(layer, stTop);
728 if (top.empty())
729 continue;
730 // Collect projections of all contact areas above or at the same level as this top surface.
731 for (; contact_idx >= 0 && top_contacts[contact_idx]->print_z >= layer.print_z; -- contact_idx)
732 polygons_append(projection, top_contacts[contact_idx]->polygons);
733 // Now find whether any projection of the contact surfaces above layer.print_z not yet supported by any
734 // top surfaces above layer.print_z falls onto this top surface.
735 // touching are the contact surfaces supported exclusively by this top surfaaces.
736 Polygons touching = intersection(projection, top);
737 if (touching.empty())
738 continue;
739 // Allocate a new bottom contact layer.
740 MyLayer &layer_new = layer_allocate(layer_storage, sltBottomContact);
741 bottom_contacts.push_back(&layer_new);
742 // Grow top surfaces so that interface and support generation are generated
743 // with some spacing from object - it looks we don't need the actual
744 // top shapes so this can be done here
745 layer_new.height = m_soluble_interface ?
746 // Align the interface layer with the object's layer height.
747 object.get_layer(layer_id + 1)->height :
748 // Place a bridge flow interface layer over the top surface.
749 m_support_material_interface_flow.nozzle_diameter;
750 layer_new.print_z = layer.print_z + layer_new.height +
751 (m_soluble_interface ? 0. : m_object_config->support_material_contact_distance.value);
752 layer_new.bottom_z = layer.print_z;
753 layer_new.idx_object_layer_below = layer_id;
754 layer_new.bridging = ! m_soluble_interface;
755 //FIXME how much to inflate the top surface?
756 Polygons poly_new = offset(touching, float(m_support_material_flow.scaled_width()));
757 layer_new.polygons.swap(poly_new);
758 // Remove the areas that touched from the projection that will continue on next, lower, top surfaces.
759 projection = diff(projection, touching);
760 }
761 }
762 return bottom_contacts;
763 }
764
765 // Trim the top_contacts layers with the bottom_contacts layers if they overlap, so there would not be enough vertical space for both of them.
766 void PrintObjectSupportMaterial::trim_top_contacts_by_bottom_contacts(
767 const PrintObject &object, const MyLayersPtr &bottom_contacts, MyLayersPtr &top_contacts) const
768 {
769 size_t idx_top_first = 0;
770 // For all bottom contact layers:
771 for (size_t idx_bottom = 0; idx_bottom < bottom_contacts.size() && idx_top_first < top_contacts.size(); ++ idx_bottom) {
772 const MyLayer &layer_bottom = *bottom_contacts[idx_bottom];
773 // Find the first top layer overlapping with layer_bottom.
774 while (idx_top_first < top_contacts.size() && top_contacts[idx_top_first]->print_z <= layer_bottom.print_z - layer_bottom.height)
775 ++ idx_top_first;
776 // For all top contact layers overlapping with the thick bottom contact layer:
777 for (size_t idx_top = idx_top_first; idx_top < top_contacts.size(); ++ idx_top) {
778 MyLayer &layer_top = *top_contacts[idx_top];
779 coordf_t interface_z = m_soluble_interface ?
780 (layer_top.bottom_z + EPSILON) :
781 (layer_top.bottom_z - m_support_layer_height_min);
782 if (interface_z < layer_bottom.print_z) {
783 // Layers overlap. Trim layer_top with layer_bottom.
784 layer_top.polygons = diff(layer_top.polygons, layer_bottom.polygons);
785 } else
786 break;
787 }
788 }
789 }
790
791 PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_intermediate_support_layers(
792 const PrintObject &object,
793 const MyLayersPtr &bottom_contacts,
794 const MyLayersPtr &top_contacts,
795 MyLayerStorage &layer_storage,
796 const coordf_t max_object_layer_height) const
797 {
798 MyLayersPtr intermediate_layers;
799
800 // Collect and sort the extremes (bottoms of the top contacts and tops of the bottom contacts).
801 std::vector<LayerExtreme> extremes;
802 extremes.reserve(top_contacts.size() + bottom_contacts.size());
803 for (size_t i = 0; i < top_contacts.size(); ++ i)
804 // Bottoms of the top contact layers. In case of non-soluble supports,
805 // the top contact layer thickness is not known yet.
806 extremes.push_back(LayerExtreme(top_contacts[i], false));
807 for (size_t i = 0; i < bottom_contacts.size(); ++ i)
808 // Tops of the bottom contact layers.
809 extremes.push_back(LayerExtreme(bottom_contacts[i], true));
810 if (extremes.empty())
811 return intermediate_layers;
812 std::sort(extremes.begin(), extremes.end());
813
814 // Top of the 0th layer.
815 coordf_t top_z_0th = this->raft_base_height() + this->raft_interface_height();
816 assert(extremes.front().z() > top_z_0th && extremes.front().z() >= this->first_layer_height());
817
818 // Generate intermediate layers.
819 // The first intermediate layer is the same as the 1st layer if there is no raft,
820 // or the bottom of the first intermediate layer is aligned with the bottom of the raft contact layer.
821 // Intermediate layers are always printed with a normal etrusion flow (non-bridging).
822 for (size_t idx_extreme = 0; idx_extreme < extremes.size(); ++ idx_extreme) {
823 LayerExtreme *extr1 = (idx_extreme == 0) ? NULL : &extremes[idx_extreme-1];
824 coordf_t extr1z = (extr1 == NULL) ? top_z_0th : extr1->z();
825 LayerExtreme &extr2 = extremes[idx_extreme];
826 coordf_t extr2z = extr2.z();
827 coordf_t dist = extr2z - extr1z;
828 assert(dist > 0.);
829 // Insert intermediate layers.
830 size_t n_layers_extra = size_t(ceil(dist / m_support_layer_height_max));
831 coordf_t step = dist / coordf_t(n_layers_extra);
832 if (! m_soluble_interface && extr2.layer->layer_type == sltTopContact) {
833 assert(extr2.layer->height == 0.);
834 // This is a top interface layer, which does not have a height assigned yet. Do it now.
835 if (m_synchronize_support_layers_with_object) {
836 //FIXME
837 // Find the
838 }
839 extr2.layer->height = step;
840 extr2.layer->bottom_z = extr2.layer->print_z - step;
841 -- n_layers_extra;
842 if (extr2.layer->bottom_z < this->first_layer_height()) {
843 // Split the span into two layers: the top layer up to the first layer height,
844 // and the new intermediate layer below.
845 // 1) Adjust the bottom of this top layer.
846 assert(n_layers_extra == 0);
847 extr2.layer->bottom_z = extr2z = this->first_layer_height();
848 extr2.layer->height = extr2.layer->print_z - extr2.layer->bottom_z;
849 // 2) Insert a new intermediate layer.
850 MyLayer &layer_new = layer_allocate(layer_storage, stlIntermediate);
851 layer_new.bottom_z = extr1z;
852 layer_new.print_z = this->first_layer_height();
853 layer_new.height = layer_new.print_z - layer_new.bottom_z;
854 intermediate_layers.push_back(&layer_new);
855 continue;
856 }
857 }
858 if (n_layers_extra > 0 && extr1z + step < this->first_layer_height()) {
859 MyLayer &layer_new = layer_allocate(layer_storage, stlIntermediate);
860 layer_new.bottom_z = extr1z;
861 layer_new.print_z = extr1z = this->first_layer_height();
862 layer_new.height = layer_new.print_z - layer_new.bottom_z;
863 intermediate_layers.push_back(&layer_new);
864 dist = extr2z - extr1z;
865 assert(dist >= 0.);
866 n_layers_extra = size_t(ceil(dist / m_support_layer_height_max));
867 coordf_t step = dist / coordf_t(n_layers_extra);
868 }
869 for (size_t i = 0; i < n_layers_extra; ++ i) {
870 MyLayer &layer_new = layer_allocate(layer_storage, stlIntermediate);
871 layer_new.height = step;
872 layer_new.bottom_z = (i + 1 == n_layers_extra) ? extr2z : extr1z + i * step;
873 layer_new.print_z = layer_new.bottom_z + step;
874 intermediate_layers.push_back(&layer_new);
875 }
876 }
877
878 return intermediate_layers;
879 }
880
881 // At this stage there shall be intermediate_layers allocated between bottom_contacts and top_contacts, but they have no polygons assigned.
882 // Also the bottom/top_contacts shall have a thickness assigned already.
883 void PrintObjectSupportMaterial::generate_base_layers(
884 const PrintObject &object,
885 const MyLayersPtr &bottom_contacts,
886 const MyLayersPtr &top_contacts,
887 MyLayersPtr &intermediate_layers) const
888 {
889 if (top_contacts.empty())
890 // No top contacts -> no intermediate layers will be produced.
891 return;
892
893 // coordf_t fillet_radius_scaled = scale_(m_object_config->support_material_spacing);
894 //FIXME make configurable:
895 coordf_t overlap_extra_above = 0.01;
896 coordf_t overlap_extra_below = 0.01;
897
898 int idx_top_contact_above = int(top_contacts.size()) - 1;
899 int idx_top_contact_overlapping = int(top_contacts.size()) - 1;
900 int idx_bottom_contact_overlapping = int(bottom_contacts.size()) - 1;
901 for (int idx_intermediate = int(intermediate_layers.size()) - 1; idx_intermediate >= 0; -- idx_intermediate)
902 {
903 MyLayer &layer_intermediate = *intermediate_layers[idx_intermediate];
904
905 // New polygons for layer_intermediate.
906 Polygons polygons_new;
907
908 // Find a top_contact layer touching the layer_intermediate from above, if any, and collect its polygons into polygons_new.
909 while (idx_top_contact_above >= 0 && top_contacts[idx_top_contact_above]->bottom_z > layer_intermediate.print_z + EPSILON)
910 -- idx_top_contact_above;
911 if (idx_top_contact_above >= 0 && top_contacts[idx_top_contact_above]->print_z > layer_intermediate.print_z)
912 polygons_append(polygons_new, top_contacts[idx_top_contact_above]->polygons);
913
914 // Add polygons from the intermediate layer above.
915 if (idx_intermediate + 1 < int(intermediate_layers.size()))
916 polygons_append(polygons_new, intermediate_layers[idx_intermediate+1]->polygons);
917
918 // Polygons to trim polygons_new.
919 Polygons polygons_trimming;
920
921 // Find the first top_contact layer intersecting with this layer.
922 while (idx_top_contact_overlapping >= 0 &&
923 top_contacts[idx_top_contact_overlapping]->bottom_z > layer_intermediate.print_z + overlap_extra_above - EPSILON)
924 -- idx_top_contact_overlapping;
925 // Collect all the top_contact layer intersecting with this layer.
926 for (int i = idx_top_contact_overlapping; i >= 0; -- i) {
927 MyLayer &layer_top_overlapping = *top_contacts[i];
928 if (layer_top_overlapping.print_z < layer_intermediate.bottom_z - overlap_extra_below)
929 break;
930 polygons_append(polygons_trimming, layer_top_overlapping.polygons);
931 }
932
933 // Find the first bottom_contact layer intersecting with this layer.
934 while (idx_bottom_contact_overlapping >= 0 &&
935 bottom_contacts[idx_bottom_contact_overlapping]->bottom_z > layer_intermediate.print_z + overlap_extra_above - EPSILON)
936 -- idx_bottom_contact_overlapping;
937 // Collect all the top_contact layer intersecting with this layer.
938 for (int i = idx_bottom_contact_overlapping; i >= 0; -- i) {
939 MyLayer &layer_bottom_overlapping = *bottom_contacts[idx_bottom_contact_overlapping];
940 if (layer_bottom_overlapping.print_z < layer_intermediate.print_z - layer_intermediate.height - overlap_extra_below)
941 break;
942 polygons_append(polygons_trimming, layer_bottom_overlapping.polygons);
943 }
944
945 // Trim the polygons, store them.
946 if (polygons_trimming.empty())
947 layer_intermediate.polygons.swap(polygons_new);
948 else
949 layer_intermediate.polygons = diff(
950 polygons_new,
951 polygons_trimming,
952 true); // safety offset to merge the touching source polygons
953
954 /*
955 if (0) {
956 // Fillet the base polygons and trim them again with the top, interface and contact layers.
957 $base->{$i} = diff(
958 offset2(
959 $base->{$i},
960 $fillet_radius_scaled,
961 -$fillet_radius_scaled,
962 # Use a geometric offsetting for filleting.
963 CLIPPER_OFFSET_SCALE,
964 JT_ROUND,
965 0.2*$fillet_radius_scaled*CLIPPER_OFFSET_SCALE),
966 $trim_polygons,
967 false); // don't apply the safety offset.
968 }
969 */
970 }
971
972 #ifdef SLIC3R_DEBUG
973 static int iRun = 0;
974 iRun ++;
975 for (MyLayersPtr::const_iterator it = top_contacts.begin(); it != top_contacts.end(); ++ it) {
976 const MyLayer &layer = *(*it);
977 ::Slic3r::SVG svg(debug_out_path("support-intermediate-layers-untrimmed-%d-%lf.svg", iRun, layer.print_z), get_extents(layer.polygons));
978 Slic3r::ExPolygons expolys = union_ex(layer.polygons, false);
979 svg.draw(expolys);
980 }
981 #endif /* SLIC3R_DEBUG */
982
983 //FIXME This could be parallelized.
984 const coordf_t gap_extra_above = 0.1f;
985 const coordf_t gap_extra_below = 0.1f;
986 const coord_t gap_xy_scaled = m_support_material_flow.scaled_width();
987 size_t idx_object_layer_overlapping = 0;
988 // For all intermediate layers:
989 for (MyLayersPtr::iterator it_layer = intermediate_layers.begin(); it_layer != intermediate_layers.end(); ++ it_layer) {
990 MyLayer &layer_intermediate = *(*it_layer);
991 if (layer_intermediate.polygons.empty())
992 continue;
993 // Find the overlapping object layers including the extra above / below gap.
994 while (idx_object_layer_overlapping < object.layer_count() &&
995 object.get_layer(idx_object_layer_overlapping)->print_z < layer_intermediate.print_z - layer_intermediate.height - gap_extra_below + EPSILON)
996 ++ idx_object_layer_overlapping;
997 // Collect all the object layers intersecting with this layer.
998 Polygons polygons_trimming;
999 for (int i = idx_object_layer_overlapping; i < object.layer_count(); ++ i) {
1000 const Layer &object_layer = *object.get_layer(i);
1001 if (object_layer.print_z > layer_intermediate.print_z + gap_extra_above - EPSILON)
1002 break;
1003 polygons_append(polygons_trimming, (Polygons)object_layer.slices);
1004 }
1005
1006 // $layer->slices contains the full shape of layer, thus including
1007 // perimeter's width. $support contains the full shape of support
1008 // material, thus including the width of its foremost extrusion.
1009 // We leave a gap equal to a full extrusion width.
1010 layer_intermediate.polygons = diff(
1011 layer_intermediate.polygons,
1012 offset(polygons_trimming, gap_xy_scaled));
1013 }
1014 }
1015
1016 Polygons PrintObjectSupportMaterial::generate_raft_base(
1017 const PrintObject &object,
1018 const MyLayersPtr &bottom_contacts,
1019 MyLayersPtr &intermediate_layers) const
1020 {
1021 assert(! bottom_contacts.empty());
1022
1023 Polygons raft_polygons;
1024 #if 0
1025 const float inflate_factor = scale_(3.);
1026 if (this->has_raft()) {
1027 MyLayer &contacts = *bottom_contacts.front();
1028 MyLayer &columns_base = *intermediate_layers.front();
1029 if (m_num_base_raft_layers == 0 && m_num_interface_raft_layers == 0 && m_num_contact_raft_layers == 1) {
1030 // Having only the contact layer, which has the height of the 1st layer.
1031 // We are free to merge the contacts with the columns_base, they will be printed the same way.
1032 polygons_append(contacts.polygons, offset(columns_base.polygons, inflate_factor));
1033 contacts.polygons = union_(contacts.polygons);
1034 } else {
1035 // Having multiple raft layers.
1036 assert(m_num_interface_raft_layers > 0);
1037 // Extend the raft base by the bases of the support columns, add the raft contacts.
1038 raft_polygons = raft_interface_polygons;
1039 //FIXME make the offset configurable.
1040 polygons_append(raft_polygons, offset(columns_base.polygons, inflate_factor));
1041 raft_polygons = union_(raft_polygons);
1042 }
1043 } else {
1044 // No raft. The 1st intermediate layer contains the bases of the support columns.
1045 // Expand the polygons, but trim with the object.
1046 MyLayer &columns_base = *intermediate_layers.front();
1047 columns_base.polygons = diff(
1048 offset(columns_base.polygons, inflate_factor),
1049 offset(m_object->get_layer(0), safety_factor);
1050 }
1051 #endif
1052 return raft_polygons;
1053 }
1054
1055 // Convert some of the intermediate layers into top/bottom interface layers.
1056 PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_interface_layers(
1057 const PrintObject &object,
1058 const MyLayersPtr &bottom_contacts,
1059 const MyLayersPtr &top_contacts,
1060 MyLayersPtr &intermediate_layers,
1061 MyLayerStorage &layer_storage) const
1062 {
1063 // Old comment:
1064 // Compute interface area on this layer as diff of upper contact area
1065 // (or upper interface area) and layer slices.
1066 // This diff is responsible of the contact between support material and
1067 // the top surfaces of the object. We should probably offset the top
1068 // surfaces vertically before performing the diff, but this needs
1069 // investigation.
1070
1071 // my $area_threshold = $self->interface_flow->scaled_spacing ** 2;
1072
1073 MyLayersPtr interface_layers;
1074 // Contact layer is considered an interface layer, therefore run the following block only if support_material_interface_layers > 1.
1075 if (! intermediate_layers.empty() && m_object_config->support_material_interface_layers > 1) {
1076 // Index of the first top contact layer intersecting the current intermediate layer.
1077 size_t idx_top_contact_first = 0;
1078 // Index of the first bottom contact layer intersecting the current intermediate layer.
1079 size_t idx_bottom_contact_first = 0;
1080 // For all intermediate layers, collect top contact surfaces, which are not further than support_material_interface_layers.
1081 //FIXME this could be parallelized.
1082 for (size_t idx_intermediate_layer = 0; idx_intermediate_layer < intermediate_layers.size(); ++ idx_intermediate_layer) {
1083 MyLayer &intermediate_layer = *intermediate_layers[idx_intermediate_layer];
1084 // Top / bottom Z coordinate of a slab, over which we are collecting the top / bottom contact surfaces.
1085 coordf_t top_z = intermediate_layers[std::min<int>(intermediate_layers.size()-1, idx_intermediate_layer + m_object_config->support_material_interface_layers - 1)]->print_z;
1086 coordf_t bottom_z = intermediate_layers[std::max<int>(0, int(idx_intermediate_layer) - int(m_object_config->support_material_interface_layers) + 1)]->bottom_z;
1087 // Move idx_top_contact_first up until above the current print_z.
1088 while (idx_top_contact_first < top_contacts.size() && top_contacts[idx_top_contact_first]->print_z < intermediate_layer.print_z)
1089 ++ idx_top_contact_first;
1090 // Collect the top contact areas above this intermediate layer, below top_z.
1091 Polygons polygons_top_contact_projected;
1092 for (size_t idx_top_contact = idx_top_contact_first; idx_top_contact < top_contacts.size(); ++ idx_top_contact) {
1093 const MyLayer &top_contact_layer = *top_contacts[idx_top_contact];
1094 if (top_contact_layer.bottom_z - EPSILON > top_z)
1095 break;
1096 polygons_append(polygons_top_contact_projected, top_contact_layer.polygons);
1097 }
1098 // Move idx_bottom_contact_first up until touching bottom_z.
1099 while (idx_bottom_contact_first < bottom_contacts.size() && bottom_contacts[idx_bottom_contact_first]->print_z + EPSILON < bottom_z)
1100 ++ idx_bottom_contact_first;
1101 // Collect the top contact areas above this intermediate layer, below top_z.
1102 Polygons polygons_bottom_contact_projected;
1103 for (size_t idx_bottom_contact = idx_bottom_contact_first; idx_bottom_contact < bottom_contacts.size(); ++ idx_bottom_contact) {
1104 const MyLayer &bottom_contact_layer = *bottom_contacts[idx_bottom_contact];
1105 if (bottom_contact_layer.print_z - EPSILON > intermediate_layer.bottom_z)
1106 break;
1107 polygons_append(polygons_bottom_contact_projected, bottom_contact_layer.polygons);
1108 }
1109
1110 if (polygons_top_contact_projected.empty() && polygons_bottom_contact_projected.empty())
1111 continue;
1112
1113 // Insert a new layer into top_interface_layers.
1114 MyLayer &layer_new = layer_allocate(layer_storage,
1115 polygons_top_contact_projected.empty() ? sltBottomInterface : sltTopInterface);
1116 layer_new.print_z = intermediate_layer.print_z;
1117 layer_new.bottom_z = intermediate_layer.bottom_z;
1118 layer_new.height = intermediate_layer.height;
1119 layer_new.bridging = intermediate_layer.bridging;
1120 interface_layers.push_back(&layer_new);
1121
1122 polygons_append(polygons_top_contact_projected, polygons_bottom_contact_projected);
1123 polygons_top_contact_projected = union_(polygons_top_contact_projected, true);
1124 layer_new.polygons = intersection(intermediate_layer.polygons, polygons_top_contact_projected);
1125 //FIXME filter layer_new.polygons islands by a minimum area?
1126 // $interface_area = [ grep abs($_->area) >= $area_threshold, @$interface_area ];
1127 intermediate_layer.polygons = diff(intermediate_layer.polygons, polygons_top_contact_projected, false);
1128 }
1129 }
1130
1131 return interface_layers;
1132 }
1133
1134 void PrintObjectSupportMaterial::generate_toolpaths(
1135 const PrintObject &object,
1136 const Polygons &raft,
1137 const MyLayersPtr &bottom_contacts,
1138 const MyLayersPtr &top_contacts,
1139 const MyLayersPtr &intermediate_layers,
1140 const MyLayersPtr &interface_layers) const
1141 {
1142 // Shape of the top contact area.
1143 int n_contact_loops = 1;
1144 coordf_t circle_radius = 1.5 * m_support_material_interface_flow.scaled_width();
1145 coordf_t circle_distance = 3. * circle_radius;
1146 Polygon circle;
1147 circle.points.reserve(6);
1148 for (size_t i = 0; i < 6; ++ i) {
1149 double angle = double(i) * M_PI / 3.;
1150 circle.points.push_back(Point(circle_radius * cos(angle), circle_radius * sin(angle)));
1151 }
1152
1153 // Slic3r::debugf "Generating patterns\n";
1154
1155 // Prepare fillers.
1156 SupportMaterialPattern support_pattern = m_object_config->support_material_pattern;
1157 bool with_sheath = m_object_config->support_material_with_sheath;
1158 InfillPattern infill_pattern;
1159 std::vector<double> angles;
1160 angles.push_back(m_object_config->support_material_angle);
1161 switch (support_pattern) {
1162 case smpRectilinearGrid:
1163 angles.push_back(angles[0] + 90.);
1164 // fall through
1165 case smpRectilinear:
1166 infill_pattern = ipRectilinear;
1167 break;
1168 case smpHoneycomb:
1169 case smpPillars:
1170 infill_pattern = ipHoneycomb;
1171 break;
1172 }
1173 #if SLIC3R_CPPVER >= 11
1174 std::unique_ptr<Fill> filler_interface = std::unique_ptr<Fill>(Fill::new_from_type(ipRectilinear));
1175 std::unique_ptr<Fill> filler_support = std::unique_ptr<Fill>(Fill::new_from_type(infill_pattern));
1176 #else
1177 std::auto_ptr<Fill> filler_interface = std::auto_ptr<Fill>(Fill::new_from_type(ipRectilinear));
1178 std::auto_ptr<Fill> filler_support = std::auto_ptr<Fill>(Fill::new_from_type(infill_pattern));
1179 #endif
1180 {
1181 BoundingBox bbox_object = object.bounding_box();
1182 filler_interface->set_bounding_box(bbox_object);
1183 filler_support->set_bounding_box(bbox_object);
1184 }
1185
1186 coordf_t interface_angle = m_object_config->support_material_angle + 90.;
1187 coordf_t interface_spacing = m_object_config->support_material_interface_spacing.value + m_support_material_interface_flow.spacing();
1188 coordf_t interface_density = (interface_spacing == 0.) ? 1. : (m_support_material_interface_flow.spacing() / interface_spacing);
1189 coordf_t support_spacing = m_object_config->support_material_spacing.value + m_support_material_flow.spacing();
1190 coordf_t support_density = (support_spacing == 0.) ? 1. : (m_support_material_flow.spacing() / support_spacing);
1191
1192 //FIXME Parallelize the support generator:
1193 /*
1194 Slic3r::parallelize(
1195 threads => $self->print_config->threads,
1196 items => [ 0 .. n_$object.support_layers} ],
1197 thread_cb => sub {
1198 my $q = shift;
1199 while (defined (my $layer_id = $q->dequeue)) {
1200 $process_layer->($layer_id);
1201 }
1202 },
1203 no_threads_cb => sub {
1204 $process_layer->($_) for 0 .. n_{$object.support_layers};
1205 },
1206 );
1207 */
1208 // Indices of the 1st layer in their respective container at the support layer height.
1209 size_t idx_layer_bottom_contact = 0;
1210 size_t idx_layer_top_contact = 0;
1211 size_t idx_layer_intermediate = 0;
1212 size_t idx_layer_inteface = 0;
1213 for (size_t support_layer_id = 0; support_layer_id < object.support_layers.size(); ++ support_layer_id)
1214 {
1215 SupportLayer &support_layer = *object.support_layers[support_layer_id];
1216
1217 // Find polygons with the same print_z.
1218 Polygons bottom_contact_polygons;
1219 Polygons top_contact_polygons;
1220 Polygons base_polygons;
1221 Polygons interface_polygons;
1222
1223 // Increment the layer indices to find a layer at support_layer.print_z.
1224 for (; idx_layer_bottom_contact < bottom_contacts .size() && bottom_contacts [idx_layer_bottom_contact]->print_z < support_layer.print_z - EPSILON; ++ idx_layer_bottom_contact) ;
1225 for (; idx_layer_top_contact < top_contacts .size() && top_contacts [idx_layer_top_contact ]->print_z < support_layer.print_z - EPSILON; ++ idx_layer_top_contact ) ;
1226 for (; idx_layer_intermediate < intermediate_layers.size() && intermediate_layers[idx_layer_intermediate ]->print_z < support_layer.print_z - EPSILON; ++ idx_layer_intermediate ) ;
1227 for (; idx_layer_inteface < interface_layers .size() && interface_layers [idx_layer_inteface ]->print_z < support_layer.print_z - EPSILON; ++ idx_layer_inteface ) ;
1228 // Copy polygons from the layers.
1229 if (idx_layer_bottom_contact < bottom_contacts.size() && bottom_contacts[idx_layer_bottom_contact]->print_z < support_layer.print_z + EPSILON)
1230 bottom_contact_polygons = bottom_contacts[idx_layer_bottom_contact]->polygons;
1231 if (idx_layer_top_contact < top_contacts.size() && top_contacts[idx_layer_top_contact]->print_z < support_layer.print_z + EPSILON)
1232 top_contact_polygons = top_contacts[idx_layer_top_contact]->polygons;
1233 if (idx_layer_inteface < interface_layers.size() && interface_layers[idx_layer_inteface]->print_z < support_layer.print_z + EPSILON)
1234 interface_polygons = interface_layers[idx_layer_inteface]->polygons;
1235 if (idx_layer_intermediate < intermediate_layers.size() && intermediate_layers[idx_layer_intermediate]->print_z < support_layer.print_z + EPSILON)
1236 base_polygons = intermediate_layers[idx_layer_intermediate]->polygons;
1237
1238 // We redefine flows locally by applying this layer's height.
1239 Flow flow = m_support_material_flow;
1240 Flow interface_flow = m_support_material_interface_flow;
1241 flow.height = support_layer.height;
1242 interface_flow.height = support_layer.height;
1243
1244 /*
1245 if (1) {
1246 require "Slic3r/SVG.pm";
1247 Slic3r::SVG::output("out\\layer_" . $z . ".svg",
1248 blue_expolygons => union_ex($base),
1249 red_expolygons => union_ex($contact),
1250 green_expolygons => union_ex($interface),
1251 );
1252 }
1253 */
1254
1255 // Store inslands, over which the retract will be disabled.
1256 {
1257 Polygons polys(bottom_contact_polygons);
1258 polygons_append(polys, interface_polygons);
1259 polygons_append(polys, base_polygons);
1260 polygons_append(polys, top_contact_polygons);
1261 ExPolygons islands = union_ex(polys);
1262 support_layer.support_islands.expolygons.insert(support_layer.support_islands.expolygons.end(), islands.begin(), islands.end());
1263 }
1264
1265 Polygons contact_infill_polygons;
1266 if (! top_contact_polygons.empty())
1267 {
1268 // Having a top interface layer.
1269 if (m_object_config->support_material_interface_layers == 0)
1270 // If no interface layers were requested, we treat the contact layer exactly as a generic base layer.
1271 polygons_append(base_polygons, top_contact_polygons);
1272 else if (n_contact_loops == 0)
1273 // If no loops are allowed, we treat the contact layer exactly as a generic interface layer.
1274 polygons_append(interface_polygons, top_contact_polygons);
1275 else if (! top_contact_polygons.empty())
1276 {
1277 // Create loop paths and
1278 Polygons overhang_polygons = (top_contacts[idx_layer_top_contact]->aux_polygons == NULL) ?
1279 Polygons() :
1280 *top_contacts[idx_layer_top_contact]->aux_polygons;
1281
1282 // Generate the outermost loop.
1283 // Find centerline of the external loop (or any other kind of extrusions should the loop be skipped)
1284 top_contact_polygons = offset(top_contact_polygons, - 0.5 * interface_flow.scaled_width());
1285
1286 Polygons loops0;
1287 {
1288 // find centerline of the external loop of the contours
1289 // only consider the loops facing the overhang
1290 Polygons external_loops;
1291 // Positions of the loop centers.
1292 Polygons circles;
1293 {
1294 Polygons overhang_with_margin = offset(overhang_polygons, 0.5 * interface_flow.scaled_width());
1295 for (Polygons::const_iterator it_contact = top_contact_polygons.begin(); it_contact != top_contact_polygons.end(); ++ it_contact) {
1296 Polylines tmp;
1297 tmp.push_back(it_contact->split_at_first_point());
1298 if (! intersection(tmp, overhang_with_margin).empty()) {
1299 external_loops.push_back(*it_contact);
1300 Points positions_new = it_contact->equally_spaced_points(circle_distance);
1301 for (Points::const_iterator it_center = positions_new.begin(); it_center != positions_new.end(); ++ it_center) {
1302 circles.push_back(circle);
1303 Polygon &circle_new = circles.back();
1304 for (size_t i = 0; i < circle_new.points.size(); ++ i)
1305 circle_new.points[i].translate(*it_center);
1306 }
1307 }
1308 }
1309 }
1310 // Apply a pattern to the loop.
1311 loops0 = diff(external_loops, circles);
1312 }
1313
1314 Polylines loop_lines;
1315 {
1316 // make more loops
1317 Polygons loop_polygons = loops0;
1318 for (size_t i = 1; i < n_contact_loops; ++ i)
1319 polygons_append(loop_polygons,
1320 offset2(
1321 loops0,
1322 - int(i) * interface_flow.scaled_spacing() - 0.5 * interface_flow.scaled_spacing(),
1323 0.5 * interface_flow.scaled_spacing()));
1324 // clip such loops to the side oriented towards the object
1325 loop_lines.reserve(loop_polygons.size());
1326 for (Polygons::const_iterator it = loop_polygons.begin(); it != loop_polygons.end(); ++ it)
1327 loop_lines.push_back(it->split_at_first_point());
1328 loop_lines = intersection(loop_lines, offset(overhang_polygons, scale_(SUPPORT_MATERIAL_MARGIN)));
1329 }
1330
1331 // add the contact infill area to the interface area
1332 // note that growing loops by $circle_radius ensures no tiny
1333 // extrusions are left inside the circles; however it creates
1334 // a very large gap between loops and contact_infill_polygons, so maybe another
1335 // solution should be found to achieve both goals
1336 {
1337 Polygons loop_polygons;
1338 offset(loop_lines, &loop_polygons, circle_radius * 1.1);
1339 contact_infill_polygons = diff(top_contact_polygons, loop_polygons);
1340 }
1341
1342 // Transform loops into ExtrusionPath objects.
1343 for (Polylines::const_iterator it_polyline = loop_lines.begin(); it_polyline != loop_lines.end(); ++ it_polyline) {
1344 ExtrusionPath *extrusion_path = new ExtrusionPath(erSupportMaterialInterface);
1345 support_layer.support_interface_fills.entities.push_back(extrusion_path);
1346 extrusion_path->polyline = *it_polyline;
1347 extrusion_path->mm3_per_mm = interface_flow.mm3_per_mm();
1348 extrusion_path->width = interface_flow.width;
1349 extrusion_path->height = support_layer.height;
1350 }
1351 }
1352 }
1353
1354 // interface and contact infill
1355 if (! interface_polygons.empty() || ! contact_infill_polygons.empty()) {
1356 //FIXME When paralellizing, each thread shall have its own copy of the fillers.
1357 filler_interface->angle = interface_angle;
1358 filler_interface->spacing = interface_flow.spacing();
1359
1360 // find centerline of the external loop
1361 interface_polygons = offset2(interface_polygons, SCALED_EPSILON, - SCALED_EPSILON - 0.5 * interface_flow.scaled_width());
1362 // join regions by offsetting them to ensure they're merged
1363 polygons_append(interface_polygons, contact_infill_polygons);
1364 interface_polygons = offset(interface_polygons, SCALED_EPSILON);
1365
1366 // turn base support into interface when it's contained in our holes
1367 // (this way we get wider interface anchoring)
1368 {
1369 Polygons interface_polygons_new;
1370 interface_polygons_new.reserve(interface_polygons.size());
1371 for (Polygons::iterator it_polygon = interface_polygons.begin(); it_polygon != interface_polygons.end(); ++ it_polygon) {
1372 if (it_polygon->is_clockwise()) {
1373 Polygons hole;
1374 hole.push_back(*it_polygon);
1375 hole.back().make_counter_clockwise();
1376 if (diff(hole, base_polygons, true).empty())
1377 continue;
1378 }
1379 interface_polygons_new.push_back(Polygon());
1380 interface_polygons_new.back().points.swap(it_polygon->points);
1381 }
1382 interface_polygons.swap(interface_polygons_new);
1383 }
1384 base_polygons = diff(base_polygons, interface_polygons);
1385
1386 ExPolygons to_fill = union_ex(interface_polygons);
1387 for (ExPolygons::const_iterator it_expolygon = to_fill.begin(); it_expolygon != to_fill.end(); ++ it_expolygon) {
1388 Surface surface(stInternal, *it_expolygon);
1389 FillParams fill_params;
1390 fill_params.density = interface_density;
1391 fill_params.complete = true;
1392 Polylines polylines = filler_interface->fill_surface(&surface, fill_params);
1393 for (Polylines::const_iterator it_polyline = polylines.begin(); it_polyline != polylines.end(); ++ it_polyline) {
1394 ExtrusionPath *extrusion_path = new ExtrusionPath(erSupportMaterialInterface);
1395 support_layer.support_interface_fills.entities.push_back(extrusion_path);
1396 extrusion_path->polyline = *it_polyline;
1397 extrusion_path->mm3_per_mm = interface_flow.mm3_per_mm();
1398 extrusion_path->width = interface_flow.width;
1399 extrusion_path->height = support_layer.height;
1400 }
1401 }
1402 }
1403
1404 // support or flange
1405 if (! base_polygons.empty()) {
1406 //FIXME When paralellizing, each thread shall have its own copy of the fillers.
1407 Fill *filler = filler_support.get();
1408 filler->angle = angles[support_layer_id % angles.size()];
1409 // We don't use $base_flow->spacing because we need a constant spacing
1410 // value that guarantees that all layers are correctly aligned.
1411 filler->spacing = flow.spacing();
1412
1413 coordf_t density = support_density;
1414 Flow base_flow = flow;
1415
1416 // find centerline of the external loop/extrusions
1417 ExPolygons to_infill = offset2_ex(base_polygons, SCALED_EPSILON, - SCALED_EPSILON - 0.5*flow.scaled_width());
1418
1419 /*
1420 if (1) {
1421 require "Slic3r/SVG.pm";
1422 Slic3r::SVG::output("out\\to_infill_base" . $z . ".svg",
1423 red_expolygons => union_ex($contact),
1424 green_expolygons => union_ex($interface),
1425 blue_expolygons => $to_infill,
1426 );
1427 }
1428 */
1429
1430 if (support_layer_id == 0) {
1431 // Base flange.
1432 filler = filler_interface.get();
1433 filler->angle = m_object_config->support_material_angle + 90.;
1434 density = 0.5;
1435 base_flow = m_first_layer_flow;
1436 // use the proper spacing for first layer as we don't need to align
1437 // its pattern to the other layers
1438 //FIXME When paralellizing, each thread shall have its own copy of the fillers.
1439 filler->spacing = base_flow.spacing();
1440 } else if (with_sheath) {
1441 // Draw a perimeter all around the support infill. This makes the support stable, but difficult to remove.
1442 // TODO: use brim ordering algorithm
1443 Polygons to_infill_polygons = to_polygons(to_infill);
1444 for (Polygons::const_iterator it_polyline = to_infill_polygons.begin(); it_polyline != to_infill_polygons.end(); ++ it_polyline) {
1445 ExtrusionPath *extrusion_path = new ExtrusionPath(erSupportMaterial);
1446 support_layer.support_fills.entities.push_back(extrusion_path);
1447 extrusion_path->polyline = *it_polyline;
1448 extrusion_path->mm3_per_mm = flow.mm3_per_mm();
1449 extrusion_path->width = flow.width;
1450 extrusion_path->height = support_layer.height;
1451 }
1452 // TODO: use offset2_ex()
1453 to_infill = offset_ex(to_infill_polygons, - flow.scaled_spacing());
1454 }
1455
1456 for (ExPolygons::const_iterator it_expolygon = to_infill.begin(); it_expolygon != to_infill.end(); ++ it_expolygon) {
1457 Surface surface(stInternal, *it_expolygon);
1458 FillParams fill_params;
1459 fill_params.density = density;
1460 fill_params.complete = true;
1461 Polylines polylines = filler->fill_surface(&surface, fill_params);
1462 for (Polylines::const_iterator it_polyline = polylines.begin(); it_polyline != polylines.end(); ++ it_polyline) {
1463 ExtrusionPath *extrusion_path = new ExtrusionPath(erSupportMaterial);
1464 support_layer.support_fills.entities.push_back(extrusion_path);
1465 extrusion_path->polyline = *it_polyline;
1466 extrusion_path->mm3_per_mm = base_flow.mm3_per_mm();
1467 extrusion_path->width = base_flow.width;
1468 extrusion_path->height = support_layer.height;
1469 }
1470 }
1471 }
1472
1473 // support or flange
1474 if (! bottom_contact_polygons.empty()) {
1475 //FIXME When paralellizing, each thread shall have its own copy of the fillers.
1476 Fill *filler = filler_support.get();
1477 filler->angle = angles[support_layer_id % angles.size()];
1478 // We don't use $base_flow->spacing because we need a constant spacing
1479 // value that guarantees that all layers are correctly aligned.
1480 filler->spacing = flow.spacing();
1481
1482 coordf_t density = support_density;
1483 Flow base_flow = flow;
1484
1485 // find centerline of the external loop/extrusions
1486 ExPolygons to_infill = offset2_ex(base_polygons, SCALED_EPSILON, - SCALED_EPSILON - 0.5*flow.scaled_width());
1487
1488 /*
1489 if (1) {
1490 require "Slic3r/SVG.pm";
1491 Slic3r::SVG::output("out\\to_infill_base" . $z . ".svg",
1492 red_expolygons => union_ex($contact),
1493 green_expolygons => union_ex($interface),
1494 blue_expolygons => $to_infill,
1495 );
1496 }
1497 */
1498
1499 if (support_layer_id == 0) {
1500 // Base flange.
1501 filler = filler_interface.get();
1502 filler->angle = m_object_config->support_material_angle + 90.;
1503 density = 0.5;
1504 base_flow = m_first_layer_flow;
1505 // use the proper spacing for first layer as we don't need to align
1506 // its pattern to the other layers
1507 //FIXME When paralellizing, each thread shall have its own copy of the fillers.
1508 filler->spacing = base_flow.spacing();
1509 } else if (with_sheath) {
1510 // Draw a perimeter all around the support infill. This makes the support stable, but difficult to remove.
1511 // TODO: use brim ordering algorithm
1512 Polygons to_infill_polygons = to_polygons(to_infill);
1513 for (Polygons::const_iterator it_polyline = to_infill_polygons.begin(); it_polyline != to_infill_polygons.end(); ++ it_polyline) {
1514 ExtrusionPath *extrusion_path = new ExtrusionPath(erSupportMaterial);
1515 support_layer.support_fills.entities.push_back(extrusion_path);
1516 extrusion_path->polyline = *it_polyline;
1517 extrusion_path->mm3_per_mm = flow.mm3_per_mm();
1518 extrusion_path->width = flow.width;
1519 extrusion_path->height = support_layer.height;
1520 }
1521 // TODO: use offset2_ex()
1522 to_infill = offset_ex(to_infill_polygons, - flow.scaled_spacing());
1523 }
1524
1525 for (ExPolygons::const_iterator it_expolygon = to_infill.begin(); it_expolygon != to_infill.end(); ++ it_expolygon) {
1526 Surface surface(stInternal, *it_expolygon);
1527 FillParams fill_params;
1528 fill_params.density = density;
1529 fill_params.complete = true;
1530 Polylines polylines = filler->fill_surface(&surface, fill_params);
1531 for (Polylines::const_iterator it_polyline = polylines.begin(); it_polyline != polylines.end(); ++ it_polyline) {
1532 ExtrusionPath *extrusion_path = new ExtrusionPath(erSupportMaterial);
1533 support_layer.support_fills.entities.push_back(extrusion_path);
1534 extrusion_path->polyline = *it_polyline;
1535 extrusion_path->mm3_per_mm = base_flow.mm3_per_mm();
1536 extrusion_path->width = base_flow.width;
1537 extrusion_path->height = support_layer.height;
1538 }
1539 }
1540 }
1541
1542 /*
1543 if (0) {
1544 require "Slic3r/SVG.pm";
1545 Slic3r::SVG::output("islands_" . $z . ".svg",
1546 red_expolygons => union_ex($contact),
1547 green_expolygons => union_ex($interface),
1548 green_polylines => [ map $_->unpack->polyline, @{$layer->support_contact_fills} ],
1549 polylines => [ map $_->unpack->polyline, @{$layer->support_fills} ],
1550 );
1551 }
1552 */
1553 } // for each support_layer_id
1554 }
1555
1556 /*
1557 void PrintObjectSupportMaterial::clip_by_pillars(
1558 const PrintObject &object,
1559 LayersPtr &bottom_contacts,
1560 LayersPtr &top_contacts,
1561 LayersPtr &intermediate_contacts);
1562
1563 {
1564 // this prevents supplying an empty point set to BoundingBox constructor
1565 if (top_contacts.empty())
1566 return;
1567
1568 coord_t pillar_size = scale_(PILLAR_SIZE);
1569 coord_t pillar_spacing = scale_(PILLAR_SPACING);
1570
1571 // A regular grid of pillars, filling the 2D bounding box.
1572 Polygons grid;
1573 {
1574 // Rectangle with a side of 2.5x2.5mm.
1575 Polygon pillar;
1576 pillar.points.push_back(Point(0, 0));
1577 pillar.points.push_back(Point(pillar_size, 0));
1578 pillar.points.push_back(Point(pillar_size, pillar_size));
1579 pillar.points.push_back(Point(0, pillar_size));
1580
1581 // 2D bounding box of the projection of all contact polygons.
1582 BoundingBox bbox;
1583 for (LayersPtr::const_iterator it = top_contacts.begin(); it != top_contacts.end(); ++ it)
1584 bbox.merge(get_extents((*it)->polygons));
1585 grid.reserve(size_t(ceil(bb.size().x / pillar_spacing)) * size_t(ceil(bb.size().y / pillar_spacing)));
1586 for (coord_t x = bb.min.x; x <= bb.max.x - pillar_size; x += pillar_spacing) {
1587 for (coord_t y = bb.min.y; y <= bb.max.y - pillar_size; y += pillar_spacing) {
1588 grid.push_back(pillar);
1589 for (size_t i = 0; i < pillar.points.size(); ++ i)
1590 grid.back().points[i].translate(Point(x, y));
1591 }
1592 }
1593 }
1594
1595 // add pillars to every layer
1596 for my $i (0..n_support_z) {
1597 $shape->[$i] = [ @$grid ];
1598 }
1599
1600 // build capitals
1601 for my $i (0..n_support_z) {
1602 my $z = $support_z->[$i];
1603
1604 my $capitals = intersection(
1605 $grid,
1606 $contact->{$z} // [],
1607 );
1608
1609 // work on one pillar at time (if any) to prevent the capitals from being merged
1610 // but store the contact area supported by the capital because we need to make
1611 // sure nothing is left
1612 my $contact_supported_by_capitals = [];
1613 foreach my $capital (@$capitals) {
1614 // enlarge capital tops
1615 $capital = offset([$capital], +($pillar_spacing - $pillar_size)/2);
1616 push @$contact_supported_by_capitals, @$capital;
1617
1618 for (my $j = $i-1; $j >= 0; $j--) {
1619 my $jz = $support_z->[$j];
1620 $capital = offset($capital, -$self->interface_flow->scaled_width/2);
1621 last if !@$capitals;
1622 push @{ $shape->[$j] }, @$capital;
1623 }
1624 }
1625
1626 // Capitals will not generally cover the whole contact area because there will be
1627 // remainders. For now we handle this situation by projecting such unsupported
1628 // areas to the ground, just like we would do with a normal support.
1629 my $contact_not_supported_by_capitals = diff(
1630 $contact->{$z} // [],
1631 $contact_supported_by_capitals,
1632 );
1633 if (@$contact_not_supported_by_capitals) {
1634 for (my $j = $i-1; $j >= 0; $j--) {
1635 push @{ $shape->[$j] }, @$contact_not_supported_by_capitals;
1636 }
1637 }
1638 }
1639 }
1640
1641 sub clip_with_shape {
1642 my ($self, $support, $shape) = @_;
1643
1644 foreach my $i (keys %$support) {
1645 // don't clip bottom layer with shape so that we
1646 // can generate a continuous base flange
1647 // also don't clip raft layers
1648 next if $i == 0;
1649 next if $i < $self->object_config->raft_layers;
1650 $support->{$i} = intersection(
1651 $support->{$i},
1652 $shape->[$i],
1653 );
1654 }
1655 }
1656 */
1657
1658 } // namespace Slic3r
0 #ifndef slic3r_SupportMaterial_hpp_
1 #define slic3r_SupportMaterial_hpp_
2
3 #include "Flow.hpp"
4 #include "PrintConfig.hpp"
5
6 namespace Slic3r {
7
8 class PrintObject;
9 class PrintConfig;
10 class PrintObjectConfig;
11
12 // how much we extend support around the actual contact area
13 #define SUPPORT_MATERIAL_MARGIN 1.5
14
15 // This class manages raft and supports for a single PrintObject.
16 // Instantiated by Slic3r::Print::Object->_support_material()
17 // This class is instantiated before the slicing starts as Object.pm will query
18 // the parameters of the raft to determine the 1st layer height and thickness.
19 class PrintObjectSupportMaterial
20 {
21 public:
22 enum SupporLayerType {
23 sltUnknown = 0,
24 sltRaft,
25 stlFirstLayer,
26 sltBottomContact,
27 sltBottomInterface,
28 sltBase,
29 sltTopInterface,
30 sltTopContact,
31 // Some undecided type yet. It will turn into stlBase first, then it may turn into stlBottomInterface or stlTopInterface.
32 stlIntermediate,
33 };
34
35 class MyLayer
36 {
37 public:
38 MyLayer() :
39 layer_type(sltUnknown),
40 print_z(0.),
41 bottom_z(0.),
42 height(0.),
43 idx_object_layer_above(size_t(-1)),
44 idx_object_layer_below(size_t(-1)),
45 bridging(false),
46 aux_polygons(NULL)
47 {}
48
49 ~MyLayer()
50 {
51 delete aux_polygons;
52 aux_polygons = NULL;
53 }
54
55 bool operator==(const MyLayer &layer2) const {
56 return print_z == layer2.print_z && height == layer2.height && bridging == layer2.bridging;
57 }
58
59 bool operator<(const MyLayer &layer2) const {
60 if (print_z < layer2.print_z) {
61 return true;
62 } else if (print_z == layer2.print_z) {
63 if (height > layer2.height)
64 return true;
65 else if (height == layer2.height) {
66 return bridging < layer2.bridging;
67 } else
68 return false;
69 } else
70 return false;
71 }
72
73 SupporLayerType layer_type;
74 // Z used for printing in unscaled coordinates
75 coordf_t print_z;
76 // Bottom height of this layer. For soluble layers, bottom_z + height = print_z,
77 // otherwise bottom_z + gap + height = print_z.
78 coordf_t bottom_z;
79 // layer height in unscaled coordinates
80 coordf_t height;
81 // Index of a PrintObject layer_id supported by this layer. This will be set for top contact layers.
82 // If this is not a contact layer, it will be set to size_t(-1).
83 size_t idx_object_layer_above;
84 // Index of a PrintObject layer_id, which supports this layer. This will be set for bottom contact layers.
85 // If this is not a contact layer, it will be set to size_t(-1).
86 size_t idx_object_layer_below;
87 // Use a bridging flow when printing this support layer.
88 bool bridging;
89
90 // Polygons to be filled by the support pattern.
91 Polygons polygons;
92 // Currently for the contact layers only: Overhangs are stored here.
93 Polygons *aux_polygons;
94 };
95
96 struct LayerExtreme
97 {
98 LayerExtreme(MyLayer *alayer, bool ais_top) : layer(alayer), is_top(ais_top) {}
99 MyLayer *layer;
100 // top or bottom extreme
101 bool is_top;
102
103 coordf_t z() const { return is_top ? layer->print_z : layer->print_z - layer->height; }
104
105 bool operator<(const LayerExtreme &other) const { return z() < other.z(); }
106 };
107
108 /*
109 struct LayerPrintZ_Hash {
110 size_t operator()(const MyLayer &layer) const {
111 return std::hash<double>()(layer.print_z)^std::hash<double>()(layer.height)^size_t(layer.bridging);
112 }
113 };
114 */
115
116 typedef std::vector<MyLayer*> MyLayersPtr;
117 typedef std::deque<MyLayer> MyLayerStorage;
118
119 public:
120 PrintObjectSupportMaterial(const PrintObject *object);
121
122 // Height of the 1st layer is user configured as it is important for the print
123 // to stick to he print bed.
124 coordf_t first_layer_height() const { return m_object_config->first_layer_height.value; }
125
126 // Is raft enabled?
127 bool has_raft() const { return m_has_raft; }
128 // Has any support?
129 bool has_support() const { return m_object_config->support_material.value; }
130
131 // How many raft layers are there below the 1st object layer?
132 // The 1st object layer_id will be offsetted by this number.
133 size_t num_raft_layers() const { return m_object_config->raft_layers.value; }
134 // num_raft_layers() == num_raft_base_layers() + num_raft_interface_layers() + num_raft_contact_layers().
135 size_t num_raft_base_layers() const { return m_num_base_raft_layers; }
136 size_t num_raft_interface_layers() const { return m_num_interface_raft_layers; }
137 size_t num_raft_contact_layers() const { return m_num_contact_raft_layers; }
138
139 coordf_t raft_height() const { return m_raft_height; }
140 coordf_t raft_base_height() const { return m_raft_base_height; }
141 coordf_t raft_interface_height() const { return m_raft_interface_height; }
142 coordf_t raft_contact_height() const { return m_raft_contact_height; }
143 bool raft_bridging() const { return m_raft_contact_layer_bridging; }
144
145 // 1st layer of the object will be printed depeding on the raft settings.
146 coordf_t first_object_layer_print_z() const { return m_object_1st_layer_print_z; }
147 coordf_t first_object_layer_height() const { return m_object_1st_layer_height; }
148 coordf_t first_object_layer_gap() const { return m_object_1st_layer_gap; }
149 bool first_object_layer_bridging() const { return m_object_1st_layer_bridging; }
150
151 // Generate support material for the object.
152 // New support layers will be added to the object,
153 // with extrusion paths and islands filled in for each support layer.
154 void generate(PrintObject &object);
155
156 private:
157 // Generate top contact layers supporting overhangs.
158 // For a soluble interface material synchronize the layer heights with the object, otherwise leave the layer height undefined.
159 // If supports over bed surface only are requested, don't generate contact layers over an object.
160 MyLayersPtr top_contact_layers(const PrintObject &object, MyLayerStorage &layer_storage) const;
161
162 // Generate bottom contact layers supporting the top contact layers.
163 // For a soluble interface material synchronize the layer heights with the object,
164 // otherwise set the layer height to a bridging flow of a support interface nozzle.
165 MyLayersPtr bottom_contact_layers(const PrintObject &object, const MyLayersPtr &top_contacts, MyLayerStorage &layer_storage) const;
166
167 // Trim the top_contacts layers with the bottom_contacts layers if they overlap, so there would not be enough vertical space for both of them.
168 void trim_top_contacts_by_bottom_contacts(const PrintObject &object, const MyLayersPtr &bottom_contacts, MyLayersPtr &top_contacts) const;
169
170 // Generate raft layers and the intermediate support layers between the bottom contact and top contact surfaces.
171 MyLayersPtr raft_and_intermediate_support_layers(
172 const PrintObject &object,
173 const MyLayersPtr &bottom_contacts,
174 const MyLayersPtr &top_contacts,
175 MyLayerStorage &layer_storage,
176 const coordf_t max_object_layer_height) const;
177
178 void generate_base_layers(
179 const PrintObject &object,
180 const MyLayersPtr &bottom_contacts,
181 const MyLayersPtr &top_contacts,
182 MyLayersPtr &intermediate_layers) const;
183
184 Polygons generate_raft_base(
185 const PrintObject &object,
186 const MyLayersPtr &bottom_contacts,
187 MyLayersPtr &intermediate_layers) const;
188
189 MyLayersPtr generate_interface_layers(
190 const PrintObject &object,
191 const MyLayersPtr &bottom_contacts,
192 const MyLayersPtr &top_contacts,
193 MyLayersPtr &intermediate_layers,
194 MyLayerStorage &layer_storage) const;
195
196 /*
197 void generate_pillars_shape();
198 void clip_with_shape();
199 */
200
201 // Produce the actual G-code.
202 void generate_toolpaths(
203 const PrintObject &object,
204 const Polygons &raft,
205 const MyLayersPtr &bottom_contacts,
206 const MyLayersPtr &top_contacts,
207 const MyLayersPtr &intermediate_layers,
208 const MyLayersPtr &interface_layers) const;
209
210 const PrintObject *m_object;
211 const PrintConfig *m_print_config;
212 const PrintObjectConfig *m_object_config;
213
214 Flow m_first_layer_flow;
215 Flow m_support_material_flow;
216 Flow m_support_material_interface_flow;
217 bool m_soluble_interface;
218
219 Flow m_support_material_raft_base_flow;
220 Flow m_support_material_raft_interface_flow;
221 Flow m_support_material_raft_contact_flow;
222
223 bool m_has_raft;
224 size_t m_num_base_raft_layers;
225 size_t m_num_interface_raft_layers;
226 size_t m_num_contact_raft_layers;
227 // If set, the raft contact layer is laid with round strings, which are easily detachable
228 // from both the below and above layes.
229 // Otherwise a normal flow is used and the strings are squashed against the layer below,
230 // creating a firm bond with the layer below and making the interface top surface flat.
231 coordf_t m_raft_height;
232 coordf_t m_raft_base_height;
233 coordf_t m_raft_interface_height;
234 coordf_t m_raft_contact_height;
235 bool m_raft_contact_layer_bridging;
236
237 coordf_t m_object_1st_layer_print_z;
238 coordf_t m_object_1st_layer_height;
239 coordf_t m_object_1st_layer_gap;
240 bool m_object_1st_layer_bridging;
241
242 coordf_t m_object_layer_height_max;
243 coordf_t m_support_layer_height_min;
244 coordf_t m_support_layer_height_max;
245 coordf_t m_support_interface_layer_height_max;
246
247 coordf_t m_gap_extra_above;
248 coordf_t m_gap_extra_below;
249 coordf_t m_gap_xy;
250
251 // If enabled, the support layers will be synchronized with object layers.
252 // This does not prevent the support layers to be combined.
253 bool m_synchronize_support_layers_with_object;
254 // If disabled and m_synchronize_support_layers_with_object,
255 // the support layers will be synchronized with the object layers exactly, no layer will be combined.
256 bool m_combine_support_layers;
257 };
258
259 } // namespace Slic3r
260
261 #endif /* slic3r_SupportMaterial_hpp_ */
0 #include "BoundingBox.hpp"
1 #include "Surface.hpp"
2 #include "SVG.hpp"
3
4 namespace Slic3r {
5
6 Surface::operator Polygons() const
7 {
8 return this->expolygon;
9 }
10
11 double
12 Surface::area() const
13 {
14 return this->expolygon.area();
15 }
16
17 bool
18 Surface::is_solid() const
19 {
20 return this->surface_type == stTop
21 || this->surface_type == stBottom
22 || this->surface_type == stBottomBridge
23 || this->surface_type == stInternalSolid
24 || this->surface_type == stInternalBridge;
25 }
26
27 bool
28 Surface::is_external() const
29 {
30 return this->surface_type == stTop
31 || this->surface_type == stBottom
32 || this->surface_type == stBottomBridge;
33 }
34
35 bool
36 Surface::is_internal() const
37 {
38 return this->surface_type == stInternal
39 || this->surface_type == stInternalBridge
40 || this->surface_type == stInternalSolid
41 || this->surface_type == stInternalVoid;
42 }
43
44 bool
45 Surface::is_bottom() const
46 {
47 return this->surface_type == stBottom
48 || this->surface_type == stBottomBridge;
49 }
50
51 bool
52 Surface::is_bridge() const
53 {
54 return this->surface_type == stBottomBridge
55 || this->surface_type == stInternalBridge;
56 }
57
58 BoundingBox get_extents(const Surface &surface)
59 {
60 return get_extents(surface.expolygon.contour);
61 }
62
63 BoundingBox get_extents(const Surfaces &surfaces)
64 {
65 BoundingBox bbox;
66 if (! surfaces.empty()) {
67 bbox = get_extents(surfaces.front());
68 for (size_t i = 1; i < surfaces.size(); ++ i)
69 bbox.merge(get_extents(surfaces[i]));
70 }
71 return bbox;
72 }
73
74 BoundingBox get_extents(const SurfacesPtr &surfaces)
75 {
76 BoundingBox bbox;
77 if (! surfaces.empty()) {
78 bbox = get_extents(*surfaces.front());
79 for (size_t i = 1; i < surfaces.size(); ++ i)
80 bbox.merge(get_extents(*surfaces[i]));
81 }
82 return bbox;
83 }
84
85 const char* surface_type_to_color_name(const SurfaceType surface_type)
86 {
87 switch (surface_type) {
88 case stTop: return "rgb(255,0,0)"; // "red";
89 case stBottom: return "rgb(0,255,0)"; // "green";
90 case stBottomBridge: return "rgb(0,0,255)"; // "blue";
91 case stInternal: return "rgb(255,255,128)"; // yellow
92 case stInternalSolid: return "rgb(255,0,255)"; // magenta
93 case stInternalBridge: return "rgb(0,255,255)";
94 case stInternalVoid: return "rgb(128,128,128)";
95 case stPerimeter: return "rgb(128,0,0)"; // maroon
96 default: return "rgb(64,64,64)";
97 };
98 }
99
100 Point export_surface_type_legend_to_svg_box_size()
101 {
102 return Point(scale_(1.+10.*8.), scale_(3.));
103 }
104
105 void export_surface_type_legend_to_svg(SVG &svg, const Point &pos)
106 {
107 // 1st row
108 coord_t pos_x0 = pos.x + scale_(1.);
109 coord_t pos_x = pos_x0;
110 coord_t pos_y = pos.y + scale_(1.5);
111 coord_t step_x = scale_(10.);
112 svg.draw_legend(Point(pos_x, pos_y), "perimeter" , surface_type_to_color_name(stPerimeter));
113 pos_x += step_x;
114 svg.draw_legend(Point(pos_x, pos_y), "top" , surface_type_to_color_name(stTop));
115 pos_x += step_x;
116 svg.draw_legend(Point(pos_x, pos_y), "bottom" , surface_type_to_color_name(stBottom));
117 pos_x += step_x;
118 svg.draw_legend(Point(pos_x, pos_y), "bottom bridge" , surface_type_to_color_name(stBottomBridge));
119 pos_x += step_x;
120 svg.draw_legend(Point(pos_x, pos_y), "invalid" , surface_type_to_color_name(SurfaceType(-1)));
121 // 2nd row
122 pos_x = pos_x0;
123 pos_y = pos.y+scale_(2.8);
124 svg.draw_legend(Point(pos_x, pos_y), "internal" , surface_type_to_color_name(stInternal));
125 pos_x += step_x;
126 svg.draw_legend(Point(pos_x, pos_y), "internal solid" , surface_type_to_color_name(stInternalSolid));
127 pos_x += step_x;
128 svg.draw_legend(Point(pos_x, pos_y), "internal bridge", surface_type_to_color_name(stInternalBridge));
129 pos_x += step_x;
130 svg.draw_legend(Point(pos_x, pos_y), "internal void" , surface_type_to_color_name(stInternalVoid));
131 }
132
133 bool export_to_svg(const char *path, const Surfaces &surfaces, const float transparency)
134 {
135 BoundingBox bbox;
136 for (Surfaces::const_iterator surface = surfaces.begin(); surface != surfaces.end(); ++surface)
137 bbox.merge(get_extents(surface->expolygon));
138
139 SVG svg(path, bbox);
140 for (Surfaces::const_iterator surface = surfaces.begin(); surface != surfaces.end(); ++surface)
141 svg.draw(surface->expolygon, surface_type_to_color_name(surface->surface_type), transparency);
142 svg.Close();
143 return true;
144 }
145
146 }
0 #ifndef slic3r_Surface_hpp_
1 #define slic3r_Surface_hpp_
2
3 #include "libslic3r.h"
4 #include "ExPolygon.hpp"
5
6 namespace Slic3r {
7
8 enum SurfaceType {
9 // Top horizontal surface, visible from the top.
10 stTop,
11 // Bottom horizontal surface, visible from the bottom, printed with a normal extrusion flow.
12 stBottom,
13 // Bottom horizontal surface, visible from the bottom, unsupported, printed with a bridging extrusion flow.
14 stBottomBridge,
15 // Normal sparse infill.
16 stInternal,
17 // Full infill, supporting the top surfaces and/or defining the verticall wall thickness.
18 stInternalSolid,
19 // 1st layer of dense infill over sparse infill, printed with a bridging extrusion flow.
20 stInternalBridge,
21 // stInternal turns into void surfaces if the sparse infill is used for supports only,
22 // or if sparse infill layers get combined into a single layer.
23 stInternalVoid,
24 // Inner/outer perimeters.
25 stPerimeter
26 };
27
28 class Surface
29 {
30 public:
31 SurfaceType surface_type;
32 ExPolygon expolygon;
33 double thickness; // in mm
34 unsigned short thickness_layers; // in layers
35 double bridge_angle; // in radians, ccw, 0 = East, only 0+ (negative means undefined)
36 unsigned short extra_perimeters;
37
38 Surface(SurfaceType _surface_type, const ExPolygon &_expolygon)
39 : surface_type(_surface_type), expolygon(_expolygon),
40 thickness(-1), thickness_layers(1), bridge_angle(-1), extra_perimeters(0)
41 {};
42 Surface(const Surface &other, const ExPolygon &_expolygon)
43 : surface_type(other.surface_type), expolygon(_expolygon),
44 thickness(other.thickness), thickness_layers(other.thickness_layers), bridge_angle(other.bridge_angle), extra_perimeters(other.extra_perimeters)
45 {};
46 #if SLIC3R_CPPVER >= 11
47 Surface(SurfaceType _surface_type, const ExPolygon &&_expolygon)
48 : surface_type(_surface_type), expolygon(std::move(_expolygon)),
49 thickness(-1), thickness_layers(1), bridge_angle(-1), extra_perimeters(0)
50 {};
51 Surface(const Surface &other, const ExPolygon &&_expolygon)
52 : surface_type(other.surface_type), expolygon(std::move(_expolygon)),
53 thickness(other.thickness), thickness_layers(other.thickness_layers), bridge_angle(other.bridge_angle), extra_perimeters(other.extra_perimeters)
54 {};
55 #endif
56 operator Polygons() const;
57 double area() const;
58 bool empty() const { return expolygon.empty(); }
59 bool is_solid() const;
60 bool is_external() const;
61 bool is_internal() const;
62 bool is_bottom() const;
63 bool is_bridge() const;
64 };
65
66 typedef std::vector<Surface> Surfaces;
67 typedef std::vector<Surface*> SurfacesPtr;
68
69 inline Polygons to_polygons(const Surfaces &src)
70 {
71 size_t num = 0;
72 for (Surfaces::const_iterator it = src.begin(); it != src.end(); ++it)
73 num += it->expolygon.holes.size() + 1;
74 Polygons polygons;
75 polygons.reserve(num);
76 for (Surfaces::const_iterator it = src.begin(); it != src.end(); ++it) {
77 polygons.push_back(it->expolygon.contour);
78 for (Polygons::const_iterator ith = it->expolygon.holes.begin(); ith != it->expolygon.holes.end(); ++ith)
79 polygons.push_back(*ith);
80 }
81 return polygons;
82 }
83
84 inline Polygons to_polygons(const SurfacesPtr &src)
85 {
86 size_t num = 0;
87 for (SurfacesPtr::const_iterator it = src.begin(); it != src.end(); ++it)
88 num += (*it)->expolygon.holes.size() + 1;
89 Polygons polygons;
90 polygons.reserve(num);
91 for (SurfacesPtr::const_iterator it = src.begin(); it != src.end(); ++it) {
92 polygons.push_back((*it)->expolygon.contour);
93 for (Polygons::const_iterator ith = (*it)->expolygon.holes.begin(); ith != (*it)->expolygon.holes.end(); ++ith)
94 polygons.push_back(*ith);
95 }
96 return polygons;
97 }
98
99 inline ExPolygons to_expolygons(const SurfacesPtr &src)
100 {
101 ExPolygons expolygons;
102 expolygons.reserve(src.size());
103 for (SurfacesPtr::const_iterator it = src.begin(); it != src.end(); ++it)
104 expolygons.push_back((*it)->expolygon);
105 return expolygons;
106 }
107
108 // Count a nuber of polygons stored inside the vector of expolygons.
109 // Useful for allocating space for polygons when converting expolygons to polygons.
110 inline size_t number_polygons(const Surfaces &surfaces)
111 {
112 size_t n_polygons = 0;
113 for (Surfaces::const_iterator it = surfaces.begin(); it != surfaces.end(); ++ it)
114 n_polygons += it->expolygon.holes.size() + 1;
115 return n_polygons;
116 }
117 inline size_t number_polygons(const SurfacesPtr &surfaces)
118 {
119 size_t n_polygons = 0;
120 for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++ it)
121 n_polygons += (*it)->expolygon.holes.size() + 1;
122 return n_polygons;
123 }
124
125 // Append a vector of Surfaces at the end of another vector of polygons.
126 inline void polygons_append(Polygons &dst, const Surfaces &src)
127 {
128 dst.reserve(dst.size() + number_polygons(src));
129 for (Surfaces::const_iterator it = src.begin(); it != src.end(); ++ it) {
130 dst.push_back(it->expolygon.contour);
131 dst.insert(dst.end(), it->expolygon.holes.begin(), it->expolygon.holes.end());
132 }
133 }
134
135 #if SLIC3R_CPPVER >= 11
136 inline void polygons_append(Polygons &dst, Surfaces &&src)
137 {
138 dst.reserve(dst.size() + number_polygons(src));
139 for (Surfaces::const_iterator it = src.begin(); it != src.end(); ++ it) {
140 dst.push_back(std::move(it->expolygon.contour));
141 std::move(std::begin(it->expolygon.holes), std::end(it->expolygon.holes), std::back_inserter(dst));
142 }
143 }
144 #endif
145
146 // Append a vector of Surfaces at the end of another vector of polygons.
147 inline void polygons_append(Polygons &dst, const SurfacesPtr &src)
148 {
149 dst.reserve(dst.size() + number_polygons(src));
150 for (SurfacesPtr::const_iterator it = src.begin(); it != src.end(); ++ it) {
151 dst.push_back((*it)->expolygon.contour);
152 dst.insert(dst.end(), (*it)->expolygon.holes.begin(), (*it)->expolygon.holes.end());
153 }
154 }
155
156 #if SLIC3R_CPPVER >= 11
157 inline void polygons_append(Polygons &dst, SurfacesPtr &&src)
158 {
159 dst.reserve(dst.size() + number_polygons(src));
160 for (SurfacesPtr::const_iterator it = src.begin(); it != src.end(); ++ it) {
161 dst.push_back(std::move((*it)->expolygon.contour));
162 std::move(std::begin((*it)->expolygon.holes), std::end((*it)->expolygon.holes), std::back_inserter(dst));
163 }
164 }
165 #endif
166
167 // Append a vector of Surfaces at the end of another vector of polygons.
168 inline void surfaces_append(Surfaces &dst, const ExPolygons &src, SurfaceType surfaceType)
169 {
170 dst.reserve(dst.size() + src.size());
171 for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++ it)
172 dst.push_back(Surface(surfaceType, *it));
173 }
174 inline void surfaces_append(Surfaces &dst, const ExPolygons &src, const Surface &surfaceTempl)
175 {
176 dst.reserve(dst.size() + number_polygons(src));
177 for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++ it)
178 dst.push_back(Surface(surfaceTempl, *it));
179 }
180 inline void surfaces_append(Surfaces &dst, const Surfaces &src)
181 {
182 dst.insert(dst.end(), src.begin(), src.end());
183 }
184
185 #if SLIC3R_CPPVER >= 11
186 inline void surfaces_append(Surfaces &dst, ExPolygons &&src, SurfaceType surfaceType)
187 {
188 dst.reserve(dst.size() + src.size());
189 for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++ it)
190 dst.push_back(Surface(surfaceType, std::move(*it)));
191 }
192 inline void surfaces_append(Surfaces &dst, ExPolygons &&src, const Surface &surfaceTempl)
193 {
194 dst.reserve(dst.size() + number_polygons(src));
195 for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++ it)
196 dst.push_back(Surface(surfaceTempl, std::move(*it)));
197 }
198 inline void surfaces_append(Surfaces &dst, Surfaces &&src)
199 {
200 if (dst.empty())
201 dst = std::move(src);
202 else
203 std::move(std::begin(src), std::end(src), std::back_inserter(dst));
204 }
205 #endif
206
207 extern BoundingBox get_extents(const Surface &surface);
208 extern BoundingBox get_extents(const Surfaces &surfaces);
209 extern BoundingBox get_extents(const SurfacesPtr &surfaces);
210
211 inline bool surfaces_could_merge(const Surface &s1, const Surface &s2)
212 {
213 return
214 s1.surface_type == s2.surface_type &&
215 s1.thickness == s2.thickness &&
216 s1.thickness_layers == s2.thickness_layers &&
217 s1.bridge_angle == s2.bridge_angle;
218 }
219
220 class SVG;
221
222 extern const char* surface_type_to_color_name(const SurfaceType surface_type);
223 extern void export_surface_type_legend_to_svg(SVG &svg, const Point &pos);
224 extern Point export_surface_type_legend_to_svg_box_size();
225 extern bool export_to_svg(const char *path, const Surfaces &surfaces, const float transparency = 1.f);
226
227 }
228
229 #endif
0 #include "SurfaceCollection.hpp"
1 #include "BoundingBox.hpp"
2 #include "SVG.hpp"
3
4 #include <map>
5
6 namespace Slic3r {
7
8 SurfaceCollection::operator Polygons() const
9 {
10 Polygons polygons;
11 for (Surfaces::const_iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) {
12 Polygons surface_p = surface->expolygon;
13 polygons.insert(polygons.end(), surface_p.begin(), surface_p.end());
14 }
15 return polygons;
16 }
17
18 SurfaceCollection::operator ExPolygons() const
19 {
20 ExPolygons expp;
21 expp.reserve(this->surfaces.size());
22 for (Surfaces::const_iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) {
23 expp.push_back(surface->expolygon);
24 }
25 return expp;
26 }
27
28 void
29 SurfaceCollection::simplify(double tolerance)
30 {
31 Surfaces ss;
32 for (Surfaces::const_iterator it_s = this->surfaces.begin(); it_s != this->surfaces.end(); ++it_s) {
33 ExPolygons expp;
34 it_s->expolygon.simplify(tolerance, &expp);
35 for (ExPolygons::const_iterator it_e = expp.begin(); it_e != expp.end(); ++it_e) {
36 Surface s = *it_s;
37 s.expolygon = *it_e;
38 ss.push_back(s);
39 }
40 }
41 this->surfaces = ss;
42 }
43
44 /* group surfaces by common properties */
45 void
46 SurfaceCollection::group(std::vector<SurfacesPtr> *retval)
47 {
48 for (Surfaces::iterator it = this->surfaces.begin(); it != this->surfaces.end(); ++it) {
49 // find a group with the same properties
50 SurfacesPtr* group = NULL;
51 for (std::vector<SurfacesPtr>::iterator git = retval->begin(); git != retval->end(); ++git)
52 if (! git->empty() && surfaces_could_merge(*git->front(), *it)) {
53 group = &*git;
54 break;
55 }
56 // if no group with these properties exists, add one
57 if (group == NULL) {
58 retval->resize(retval->size() + 1);
59 group = &retval->back();
60 }
61 // append surface to group
62 group->push_back(&*it);
63 }
64 }
65
66 template <class T>
67 bool
68 SurfaceCollection::any_internal_contains(const T &item) const
69 {
70 for (Surfaces::const_iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) {
71 if (surface->is_internal() && surface->expolygon.contains(item)) return true;
72 }
73 return false;
74 }
75 template bool SurfaceCollection::any_internal_contains<Polyline>(const Polyline &item) const;
76
77 template <class T>
78 bool
79 SurfaceCollection::any_bottom_contains(const T &item) const
80 {
81 for (Surfaces::const_iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) {
82 if (surface->is_bottom() && surface->expolygon.contains(item)) return true;
83 }
84 return false;
85 }
86 template bool SurfaceCollection::any_bottom_contains<Polyline>(const Polyline &item) const;
87
88 SurfacesPtr
89 SurfaceCollection::filter_by_type(const SurfaceType type)
90 {
91 SurfacesPtr ss;
92 for (Surfaces::iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) {
93 if (surface->surface_type == type) ss.push_back(&*surface);
94 }
95 return ss;
96 }
97
98 SurfacesPtr
99 SurfaceCollection::filter_by_types(const SurfaceType *types, int ntypes)
100 {
101 SurfacesPtr ss;
102 for (Surfaces::iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) {
103 for (int i = 0; i < ntypes; ++ i) {
104 if (surface->surface_type == types[i]) {
105 ss.push_back(&*surface);
106 break;
107 }
108 }
109 }
110 return ss;
111 }
112
113 void
114 SurfaceCollection::filter_by_type(SurfaceType type, Polygons* polygons)
115 {
116 for (Surfaces::iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) {
117 if (surface->surface_type == type) {
118 Polygons pp = surface->expolygon;
119 polygons->insert(polygons->end(), pp.begin(), pp.end());
120 }
121 }
122 }
123
124 void
125 SurfaceCollection::keep_type(const SurfaceType type)
126 {
127 size_t j = 0;
128 for (size_t i = 0; i < surfaces.size(); ++ i) {
129 if (surfaces[i].surface_type == type) {
130 if (j < i)
131 std::swap(surfaces[i], surfaces[j]);
132 ++ j;
133 }
134 }
135 if (j < surfaces.size())
136 surfaces.erase(surfaces.begin() + j, surfaces.end());
137 }
138
139 void
140 SurfaceCollection::keep_types(const SurfaceType *types, int ntypes)
141 {
142 size_t j = 0;
143 for (size_t i = 0; i < surfaces.size(); ++ i) {
144 bool keep = false;
145 for (int k = 0; k < ntypes; ++ k) {
146 if (surfaces[i].surface_type == types[k]) {
147 keep = true;
148 break;
149 }
150 }
151 if (keep) {
152 if (j < i)
153 std::swap(surfaces[i], surfaces[j]);
154 ++ j;
155 }
156 }
157 if (j < surfaces.size())
158 surfaces.erase(surfaces.begin() + j, surfaces.end());
159 }
160
161 void
162 SurfaceCollection::remove_type(const SurfaceType type)
163 {
164 size_t j = 0;
165 for (size_t i = 0; i < surfaces.size(); ++ i) {
166 if (surfaces[i].surface_type != type) {
167 if (j < i)
168 std::swap(surfaces[i], surfaces[j]);
169 ++ j;
170 }
171 }
172 if (j < surfaces.size())
173 surfaces.erase(surfaces.begin() + j, surfaces.end());
174 }
175
176 void
177 SurfaceCollection::remove_types(const SurfaceType *types, int ntypes)
178 {
179 size_t j = 0;
180 for (size_t i = 0; i < surfaces.size(); ++ i) {
181 bool remove = false;
182 for (int k = 0; k < ntypes; ++ k) {
183 if (surfaces[i].surface_type == types[k]) {
184 remove = true;
185 break;
186 }
187 }
188 if (! remove) {
189 if (j < i)
190 std::swap(surfaces[i], surfaces[j]);
191 ++ j;
192 }
193 }
194 if (j < surfaces.size())
195 surfaces.erase(surfaces.begin() + j, surfaces.end());
196 }
197
198 void
199 SurfaceCollection::append(const SurfaceCollection &coll)
200 {
201 this->surfaces.insert(this->surfaces.end(), coll.surfaces.begin(), coll.surfaces.end());
202 }
203
204 void
205 SurfaceCollection::append(const SurfaceType surfaceType, const Slic3r::ExPolygons &expoly)
206 {
207 for (Slic3r::ExPolygons::const_iterator it = expoly.begin(); it != expoly.end(); ++ it)
208 this->surfaces.push_back(Slic3r::Surface(surfaceType, *it));
209 }
210
211 void SurfaceCollection::export_to_svg(const char *path, bool show_labels)
212 {
213 BoundingBox bbox;
214 for (Surfaces::const_iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface)
215 bbox.merge(get_extents(surface->expolygon));
216 Point legend_size = export_surface_type_legend_to_svg_box_size();
217 Point legend_pos(bbox.min.x, bbox.max.y);
218 bbox.merge(Point(std::max(bbox.min.x + legend_size.x, bbox.max.x), bbox.max.y + legend_size.y));
219
220 SVG svg(path, bbox);
221 const float transparency = 0.5f;
222 for (Surfaces::const_iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) {
223 svg.draw(surface->expolygon, surface_type_to_color_name(surface->surface_type), transparency);
224 if (show_labels) {
225 int idx = int(surface - this->surfaces.begin());
226 char label[64];
227 sprintf(label, "%d", idx);
228 svg.draw_text(surface->expolygon.contour.points.front(), label, "black");
229 }
230 }
231 export_surface_type_legend_to_svg(svg, legend_pos);
232 svg.Close();
233 }
234
235 }
0 #ifndef slic3r_SurfaceCollection_hpp_
1 #define slic3r_SurfaceCollection_hpp_
2
3 #include "libslic3r.h"
4 #include "Surface.hpp"
5 #include <vector>
6
7 namespace Slic3r {
8
9 class SurfaceCollection
10 {
11 public:
12 Surfaces surfaces;
13
14 SurfaceCollection() {};
15 SurfaceCollection(const Surfaces &_surfaces)
16 : surfaces(_surfaces) {};
17 operator Polygons() const;
18 operator ExPolygons() const;
19 void simplify(double tolerance);
20 void group(std::vector<SurfacesPtr> *retval);
21 template <class T> bool any_internal_contains(const T &item) const;
22 template <class T> bool any_bottom_contains(const T &item) const;
23 SurfacesPtr filter_by_type(const SurfaceType type);
24 SurfacesPtr filter_by_types(const SurfaceType *types, int ntypes);
25 void keep_type(const SurfaceType type);
26 void keep_types(const SurfaceType *types, int ntypes);
27 void remove_type(const SurfaceType type);
28 void remove_types(const SurfaceType *types, int ntypes);
29 void filter_by_type(SurfaceType type, Polygons* polygons);
30 void append(const SurfaceCollection &coll);
31 void append(const SurfaceType surfaceType, const ExPolygons &expoly);
32
33 // For debugging purposes:
34 void export_to_svg(const char *path, bool show_labels);
35 };
36
37 }
38
39 #endif
0 #include "TriangleMesh.hpp"
1 #include "ClipperUtils.hpp"
2 #include "Geometry.hpp"
3 #include <cmath>
4 #include <queue>
5 #include <deque>
6 #include <set>
7 #include <vector>
8 #include <map>
9 #include <utility>
10 #include <algorithm>
11 #include <math.h>
12 #include <assert.h>
13
14 #ifdef SLIC3R_DEBUG
15 // #define SLIC3R_TRIANGLEMESH_DEBUG
16 #include "SVG.hpp"
17 #endif
18
19 namespace Slic3r {
20
21 TriangleMesh::TriangleMesh()
22 : repaired(false)
23 {
24 stl_initialize(&this->stl);
25 }
26
27 TriangleMesh::TriangleMesh(const TriangleMesh &other)
28 : stl(other.stl), repaired(other.repaired)
29 {
30 this->stl.heads = NULL;
31 this->stl.tail = NULL;
32 this->stl.error = other.stl.error;
33 if (other.stl.facet_start != NULL) {
34 this->stl.facet_start = (stl_facet*)calloc(other.stl.stats.number_of_facets, sizeof(stl_facet));
35 std::copy(other.stl.facet_start, other.stl.facet_start + other.stl.stats.number_of_facets, this->stl.facet_start);
36 }
37 if (other.stl.neighbors_start != NULL) {
38 this->stl.neighbors_start = (stl_neighbors*)calloc(other.stl.stats.number_of_facets, sizeof(stl_neighbors));
39 std::copy(other.stl.neighbors_start, other.stl.neighbors_start + other.stl.stats.number_of_facets, this->stl.neighbors_start);
40 }
41 if (other.stl.v_indices != NULL) {
42 this->stl.v_indices = (v_indices_struct*)calloc(other.stl.stats.number_of_facets, sizeof(v_indices_struct));
43 std::copy(other.stl.v_indices, other.stl.v_indices + other.stl.stats.number_of_facets, this->stl.v_indices);
44 }
45 if (other.stl.v_shared != NULL) {
46 this->stl.v_shared = (stl_vertex*)calloc(other.stl.stats.shared_vertices, sizeof(stl_vertex));
47 std::copy(other.stl.v_shared, other.stl.v_shared + other.stl.stats.shared_vertices, this->stl.v_shared);
48 }
49 }
50
51 TriangleMesh& TriangleMesh::operator= (TriangleMesh other)
52 {
53 this->swap(other);
54 return *this;
55 }
56
57 void
58 TriangleMesh::swap(TriangleMesh &other)
59 {
60 std::swap(this->stl, other.stl);
61 std::swap(this->repaired, other.repaired);
62 std::swap(this->stl.facet_start, other.stl.facet_start);
63 std::swap(this->stl.neighbors_start, other.stl.neighbors_start);
64 std::swap(this->stl.v_indices, other.stl.v_indices);
65 std::swap(this->stl.v_shared, other.stl.v_shared);
66 }
67
68 TriangleMesh::~TriangleMesh() {
69 stl_close(&this->stl);
70 }
71
72 void
73 TriangleMesh::ReadSTLFile(char* input_file) {
74 stl_open(&stl, input_file);
75 }
76
77 void
78 TriangleMesh::write_ascii(char* output_file)
79 {
80 stl_write_ascii(&this->stl, output_file, "");
81 }
82
83 void
84 TriangleMesh::write_binary(char* output_file)
85 {
86 stl_write_binary(&this->stl, output_file, "");
87 }
88
89 void
90 TriangleMesh::repair() {
91 if (this->repaired) return;
92
93 // admesh fails when repairing empty meshes
94 if (this->stl.stats.number_of_facets == 0) return;
95
96 // checking exact
97 stl_check_facets_exact(&stl);
98 stl.stats.facets_w_1_bad_edge = (stl.stats.connected_facets_2_edge - stl.stats.connected_facets_3_edge);
99 stl.stats.facets_w_2_bad_edge = (stl.stats.connected_facets_1_edge - stl.stats.connected_facets_2_edge);
100 stl.stats.facets_w_3_bad_edge = (stl.stats.number_of_facets - stl.stats.connected_facets_1_edge);
101
102 // checking nearby
103 //int last_edges_fixed = 0;
104 float tolerance = stl.stats.shortest_edge;
105 float increment = stl.stats.bounding_diameter / 10000.0;
106 int iterations = 2;
107 if (stl.stats.connected_facets_3_edge < stl.stats.number_of_facets) {
108 for (int i = 0; i < iterations; i++) {
109 if (stl.stats.connected_facets_3_edge < stl.stats.number_of_facets) {
110 //printf("Checking nearby. Tolerance= %f Iteration=%d of %d...", tolerance, i + 1, iterations);
111 stl_check_facets_nearby(&stl, tolerance);
112 //printf(" Fixed %d edges.\n", stl.stats.edges_fixed - last_edges_fixed);
113 //last_edges_fixed = stl.stats.edges_fixed;
114 tolerance += increment;
115 } else {
116 break;
117 }
118 }
119 }
120
121 // remove_unconnected
122 if (stl.stats.connected_facets_3_edge < stl.stats.number_of_facets) {
123 stl_remove_unconnected_facets(&stl);
124 }
125
126 // fill_holes
127 if (stl.stats.connected_facets_3_edge < stl.stats.number_of_facets) {
128 stl_fill_holes(&stl);
129 stl_clear_error(&stl);
130 }
131
132 // normal_directions
133 stl_fix_normal_directions(&stl);
134
135 // normal_values
136 stl_fix_normal_values(&stl);
137
138 // always calculate the volume and reverse all normals if volume is negative
139 stl_calculate_volume(&stl);
140
141 // neighbors
142 stl_verify_neighbors(&stl);
143
144 this->repaired = true;
145 }
146
147 void
148 TriangleMesh::reset_repair_stats() {
149 this->stl.stats.degenerate_facets = 0;
150 this->stl.stats.edges_fixed = 0;
151 this->stl.stats.facets_removed = 0;
152 this->stl.stats.facets_added = 0;
153 this->stl.stats.facets_reversed = 0;
154 this->stl.stats.backwards_edges = 0;
155 this->stl.stats.normals_fixed = 0;
156 }
157
158 bool
159 TriangleMesh::needed_repair() const
160 {
161 return this->stl.stats.degenerate_facets > 0
162 || this->stl.stats.edges_fixed > 0
163 || this->stl.stats.facets_removed > 0
164 || this->stl.stats.facets_added > 0
165 || this->stl.stats.facets_reversed > 0
166 || this->stl.stats.backwards_edges > 0;
167 }
168
169 size_t
170 TriangleMesh::facets_count() const
171 {
172 return this->stl.stats.number_of_facets;
173 }
174
175 void
176 TriangleMesh::WriteOBJFile(char* output_file) {
177 stl_generate_shared_vertices(&stl);
178 stl_write_obj(&stl, output_file);
179 }
180
181 void TriangleMesh::scale(float factor)
182 {
183 stl_scale(&(this->stl), factor);
184 stl_invalidate_shared_vertices(&this->stl);
185 }
186
187 void TriangleMesh::scale(const Pointf3 &versor)
188 {
189 float fversor[3];
190 fversor[0] = versor.x;
191 fversor[1] = versor.y;
192 fversor[2] = versor.z;
193 stl_scale_versor(&this->stl, fversor);
194 stl_invalidate_shared_vertices(&this->stl);
195 }
196
197 void TriangleMesh::translate(float x, float y, float z)
198 {
199 stl_translate_relative(&(this->stl), x, y, z);
200 stl_invalidate_shared_vertices(&this->stl);
201 }
202
203 void TriangleMesh::rotate(float angle, const Axis &axis)
204 {
205 // admesh uses degrees
206 angle = Slic3r::Geometry::rad2deg(angle);
207
208 if (axis == X) {
209 stl_rotate_x(&(this->stl), angle);
210 } else if (axis == Y) {
211 stl_rotate_y(&(this->stl), angle);
212 } else if (axis == Z) {
213 stl_rotate_z(&(this->stl), angle);
214 }
215 stl_invalidate_shared_vertices(&this->stl);
216 }
217
218 void TriangleMesh::rotate_x(float angle)
219 {
220 this->rotate(angle, X);
221 }
222
223 void TriangleMesh::rotate_y(float angle)
224 {
225 this->rotate(angle, Y);
226 }
227
228 void TriangleMesh::rotate_z(float angle)
229 {
230 this->rotate(angle, Z);
231 }
232
233 void TriangleMesh::mirror(const Axis &axis)
234 {
235 if (axis == X) {
236 stl_mirror_yz(&this->stl);
237 } else if (axis == Y) {
238 stl_mirror_xz(&this->stl);
239 } else if (axis == Z) {
240 stl_mirror_xy(&this->stl);
241 }
242 stl_invalidate_shared_vertices(&this->stl);
243 }
244
245 void TriangleMesh::mirror_x()
246 {
247 this->mirror(X);
248 }
249
250 void TriangleMesh::mirror_y()
251 {
252 this->mirror(Y);
253 }
254
255 void TriangleMesh::mirror_z()
256 {
257 this->mirror(Z);
258 }
259
260 void TriangleMesh::align_to_origin()
261 {
262 this->translate(
263 -(this->stl.stats.min.x),
264 -(this->stl.stats.min.y),
265 -(this->stl.stats.min.z)
266 );
267 }
268
269 void TriangleMesh::rotate(double angle, Point* center)
270 {
271 this->translate(-center->x, -center->y, 0);
272 stl_rotate_z(&(this->stl), (float)angle);
273 this->translate(+center->x, +center->y, 0);
274 }
275
276 TriangleMeshPtrs
277 TriangleMesh::split() const
278 {
279 TriangleMeshPtrs meshes;
280 std::set<int> seen_facets;
281
282 // we need neighbors
283 if (!this->repaired) CONFESS("split() requires repair()");
284
285 // loop while we have remaining facets
286 while (1) {
287 // get the first facet
288 std::queue<int> facet_queue;
289 std::deque<int> facets;
290 for (int facet_idx = 0; facet_idx < this->stl.stats.number_of_facets; facet_idx++) {
291 if (seen_facets.find(facet_idx) == seen_facets.end()) {
292 // if facet was not seen put it into queue and start searching
293 facet_queue.push(facet_idx);
294 break;
295 }
296 }
297 if (facet_queue.empty()) break;
298
299 while (!facet_queue.empty()) {
300 int facet_idx = facet_queue.front();
301 facet_queue.pop();
302 if (seen_facets.find(facet_idx) != seen_facets.end()) continue;
303 facets.push_back(facet_idx);
304 for (int j = 0; j <= 2; j++) {
305 facet_queue.push(this->stl.neighbors_start[facet_idx].neighbor[j]);
306 }
307 seen_facets.insert(facet_idx);
308 }
309
310 TriangleMesh* mesh = new TriangleMesh;
311 meshes.push_back(mesh);
312 mesh->stl.stats.type = inmemory;
313 mesh->stl.stats.number_of_facets = facets.size();
314 mesh->stl.stats.original_num_facets = mesh->stl.stats.number_of_facets;
315 stl_clear_error(&mesh->stl);
316 stl_allocate(&mesh->stl);
317
318 int first = 1;
319 for (std::deque<int>::const_iterator facet = facets.begin(); facet != facets.end(); ++facet) {
320 mesh->stl.facet_start[facet - facets.begin()] = this->stl.facet_start[*facet];
321 stl_facet_stats(&mesh->stl, this->stl.facet_start[*facet], first);
322 first = 0;
323 }
324 }
325
326 return meshes;
327 }
328
329 void
330 TriangleMesh::merge(const TriangleMesh &mesh)
331 {
332 // reset stats and metadata
333 int number_of_facets = this->stl.stats.number_of_facets;
334 stl_invalidate_shared_vertices(&this->stl);
335 this->repaired = false;
336
337 // update facet count and allocate more memory
338 this->stl.stats.number_of_facets = number_of_facets + mesh.stl.stats.number_of_facets;
339 this->stl.stats.original_num_facets = this->stl.stats.number_of_facets;
340 stl_reallocate(&this->stl);
341
342 // copy facets
343 for (int i = 0; i < mesh.stl.stats.number_of_facets; i++) {
344 this->stl.facet_start[number_of_facets + i] = mesh.stl.facet_start[i];
345 }
346
347 // update size
348 stl_get_size(&this->stl);
349 }
350
351 /* this will return scaled ExPolygons */
352 ExPolygons
353 TriangleMesh::horizontal_projection() const
354 {
355 Polygons pp;
356 pp.reserve(this->stl.stats.number_of_facets);
357 for (int i = 0; i < this->stl.stats.number_of_facets; i++) {
358 stl_facet* facet = &this->stl.facet_start[i];
359 Polygon p;
360 p.points.resize(3);
361 p.points[0] = Point(facet->vertex[0].x / SCALING_FACTOR, facet->vertex[0].y / SCALING_FACTOR);
362 p.points[1] = Point(facet->vertex[1].x / SCALING_FACTOR, facet->vertex[1].y / SCALING_FACTOR);
363 p.points[2] = Point(facet->vertex[2].x / SCALING_FACTOR, facet->vertex[2].y / SCALING_FACTOR);
364 p.make_counter_clockwise(); // do this after scaling, as winding order might change while doing that
365 pp.push_back(p);
366 }
367
368 // the offset factor was tuned using groovemount.stl
369 offset(pp, &pp, 0.01 / SCALING_FACTOR);
370 ExPolygons retval;
371 union_(pp, &retval, true);
372 return retval;
373 }
374
375 Polygon
376 TriangleMesh::convex_hull()
377 {
378 this->require_shared_vertices();
379 Points pp;
380 pp.reserve(this->stl.stats.shared_vertices);
381 for (int i = 0; i < this->stl.stats.shared_vertices; i++) {
382 stl_vertex* v = &this->stl.v_shared[i];
383 pp.push_back(Point(v->x / SCALING_FACTOR, v->y / SCALING_FACTOR));
384 }
385 return Slic3r::Geometry::convex_hull(pp);
386 }
387
388 BoundingBoxf3
389 TriangleMesh::bounding_box() const
390 {
391 BoundingBoxf3 bb;
392 bb.min.x = this->stl.stats.min.x;
393 bb.min.y = this->stl.stats.min.y;
394 bb.min.z = this->stl.stats.min.z;
395 bb.max.x = this->stl.stats.max.x;
396 bb.max.y = this->stl.stats.max.y;
397 bb.max.z = this->stl.stats.max.z;
398 return bb;
399 }
400
401 void
402 TriangleMesh::require_shared_vertices()
403 {
404 if (!this->repaired) this->repair();
405 if (this->stl.v_shared == NULL) stl_generate_shared_vertices(&(this->stl));
406 }
407
408 void
409 TriangleMeshSlicer::slice(const std::vector<float> &z, std::vector<Polygons>* layers)
410 {
411 /*
412 This method gets called with a list of unscaled Z coordinates and outputs
413 a vector pointer having the same number of items as the original list.
414 Each item is a vector of polygons created by slicing our mesh at the
415 given heights.
416
417 This method should basically combine the behavior of the existing
418 Perl methods defined in lib/Slic3r/TriangleMesh.pm:
419
420 - analyze(): this creates the 'facets_edges' and the 'edges_facets'
421 tables (we don't need the 'edges' table)
422
423 - slice_facet(): this has to be done for each facet. It generates
424 intersection lines with each plane identified by the Z list.
425 The get_layer_range() binary search used to identify the Z range
426 of the facet is already ported to C++ (see Object.xsp)
427
428 - make_loops(): this has to be done for each layer. It creates polygons
429 from the lines generated by the previous step.
430
431 At the end, we free the tables generated by analyze() as we don't
432 need them anymore.
433 FUTURE: parallelize slice_facet() and make_loops()
434
435 NOTE: this method accepts a vector of floats because the mesh coordinate
436 type is float.
437 */
438
439 std::vector<IntersectionLines> lines(z.size());
440
441 for (int facet_idx = 0; facet_idx < this->mesh->stl.stats.number_of_facets; facet_idx++) {
442 stl_facet* facet = &this->mesh->stl.facet_start[facet_idx];
443
444 // find facet extents
445 float min_z = fminf(facet->vertex[0].z, fminf(facet->vertex[1].z, facet->vertex[2].z));
446 float max_z = fmaxf(facet->vertex[0].z, fmaxf(facet->vertex[1].z, facet->vertex[2].z));
447
448 #ifdef SLIC3R_TRIANGLEMESH_DEBUG
449 printf("\n==> FACET %d (%f,%f,%f - %f,%f,%f - %f,%f,%f):\n", facet_idx,
450 facet->vertex[0].x, facet->vertex[0].y, facet->vertex[0].z,
451 facet->vertex[1].x, facet->vertex[1].y, facet->vertex[1].z,
452 facet->vertex[2].x, facet->vertex[2].y, facet->vertex[2].z);
453 printf("z: min = %.2f, max = %.2f\n", min_z, max_z);
454 #endif
455
456 // find layer extents
457 std::vector<float>::const_iterator min_layer, max_layer;
458 min_layer = std::lower_bound(z.begin(), z.end(), min_z); // first layer whose slice_z is >= min_z
459 max_layer = std::upper_bound(z.begin() + (min_layer - z.begin()), z.end(), max_z) - 1; // last layer whose slice_z is <= max_z
460 #ifdef SLIC3R_TRIANGLEMESH_DEBUG
461 printf("layers: min = %d, max = %d\n", (int)(min_layer - z.begin()), (int)(max_layer - z.begin()));
462 #endif
463
464 for (std::vector<float>::const_iterator it = min_layer; it != max_layer + 1; ++it) {
465 std::vector<float>::size_type layer_idx = it - z.begin();
466 this->slice_facet(*it / SCALING_FACTOR, *facet, facet_idx, min_z, max_z, &lines[layer_idx]);
467 }
468 }
469
470 // v_scaled_shared could be freed here
471
472 // build loops
473 layers->resize(z.size());
474 for (std::vector<IntersectionLines>::iterator it = lines.begin(); it != lines.end(); ++it) {
475 size_t layer_idx = it - lines.begin();
476 #ifdef SLIC3R_TRIANGLEMESH_DEBUG
477 printf("Layer " PRINTF_ZU ":\n", layer_idx);
478 #endif
479 this->make_loops(*it, &(*layers)[layer_idx]);
480 }
481 }
482
483 void
484 TriangleMeshSlicer::slice(const std::vector<float> &z, std::vector<ExPolygons>* layers)
485 {
486 std::vector<Polygons> layers_p;
487 this->slice(z, &layers_p);
488
489 layers->resize(z.size());
490 for (std::vector<Polygons>::const_iterator loops = layers_p.begin(); loops != layers_p.end(); ++loops) {
491 #ifdef SLIC3R_TRIANGLEMESH_DEBUG
492 size_t layer_id = loops - layers_p.begin();
493 printf("Layer " PRINTF_ZU " (slice_z = %.2f):\n", layer_id, z[layer_id]);
494 #endif
495
496 this->make_expolygons(*loops, &(*layers)[ loops - layers_p.begin() ]);
497 }
498 }
499
500 void
501 TriangleMeshSlicer::slice_facet(float slice_z, const stl_facet &facet, const int &facet_idx, const float &min_z, const float &max_z, std::vector<IntersectionLine>* lines) const
502 {
503 std::vector<IntersectionPoint> points;
504 std::vector< std::vector<IntersectionPoint>::size_type > points_on_layer;
505 bool found_horizontal_edge = false;
506
507 /* reorder vertices so that the first one is the one with lowest Z
508 this is needed to get all intersection lines in a consistent order
509 (external on the right of the line) */
510 int i = 0;
511 if (facet.vertex[1].z == min_z) {
512 // vertex 1 has lowest Z
513 i = 1;
514 } else if (facet.vertex[2].z == min_z) {
515 // vertex 2 has lowest Z
516 i = 2;
517 }
518 for (int j = i; (j-i) < 3; j++) { // loop through facet edges
519 int edge_id = this->facets_edges[facet_idx][j % 3];
520 int a_id = this->mesh->stl.v_indices[facet_idx].vertex[j % 3];
521 int b_id = this->mesh->stl.v_indices[facet_idx].vertex[(j+1) % 3];
522 stl_vertex* a = &this->v_scaled_shared[a_id];
523 stl_vertex* b = &this->v_scaled_shared[b_id];
524
525 if (a->z == b->z && a->z == slice_z) {
526 // edge is horizontal and belongs to the current layer
527
528 stl_vertex &v0 = this->v_scaled_shared[ this->mesh->stl.v_indices[facet_idx].vertex[0] ];
529 stl_vertex &v1 = this->v_scaled_shared[ this->mesh->stl.v_indices[facet_idx].vertex[1] ];
530 stl_vertex &v2 = this->v_scaled_shared[ this->mesh->stl.v_indices[facet_idx].vertex[2] ];
531 IntersectionLine line;
532 if (min_z == max_z) {
533 line.edge_type = feHorizontal;
534 if (this->mesh->stl.facet_start[facet_idx].normal.z < 0) {
535 /* if normal points downwards this is a bottom horizontal facet so we reverse
536 its point order */
537 std::swap(a, b);
538 std::swap(a_id, b_id);
539 }
540 } else if (v0.z < slice_z || v1.z < slice_z || v2.z < slice_z) {
541 line.edge_type = feTop;
542 std::swap(a, b);
543 std::swap(a_id, b_id);
544 } else {
545 line.edge_type = feBottom;
546 }
547 line.a.x = a->x;
548 line.a.y = a->y;
549 line.b.x = b->x;
550 line.b.y = b->y;
551 line.a_id = a_id;
552 line.b_id = b_id;
553 lines->push_back(line);
554
555 found_horizontal_edge = true;
556
557 // if this is a top or bottom edge, we can stop looping through edges
558 // because we won't find anything interesting
559
560 if (line.edge_type != feHorizontal) return;
561 } else if (a->z == slice_z) {
562 IntersectionPoint point;
563 point.x = a->x;
564 point.y = a->y;
565 point.point_id = a_id;
566 points.push_back(point);
567 points_on_layer.push_back(points.size()-1);
568 } else if (b->z == slice_z) {
569 IntersectionPoint point;
570 point.x = b->x;
571 point.y = b->y;
572 point.point_id = b_id;
573 points.push_back(point);
574 points_on_layer.push_back(points.size()-1);
575 } else if ((a->z < slice_z && b->z > slice_z) || (b->z < slice_z && a->z > slice_z)) {
576 // edge intersects the current layer; calculate intersection
577
578 IntersectionPoint point;
579 point.x = b->x + (a->x - b->x) * (slice_z - b->z) / (a->z - b->z);
580 point.y = b->y + (a->y - b->y) * (slice_z - b->z) / (a->z - b->z);
581 point.edge_id = edge_id;
582 points.push_back(point);
583 }
584 }
585 if (found_horizontal_edge) return;
586
587 if (!points_on_layer.empty()) {
588 // we can't have only one point on layer because each vertex gets detected
589 // twice (once for each edge), and we can't have three points on layer because
590 // we assume this code is not getting called for horizontal facets
591 assert(points_on_layer.size() == 2);
592 assert( points[ points_on_layer[0] ].point_id == points[ points_on_layer[1] ].point_id );
593 if (points.size() < 3) return; // no intersection point, this is a V-shaped facet tangent to plane
594 points.erase( points.begin() + points_on_layer[1] );
595 }
596
597 if (!points.empty()) {
598 assert(points.size() == 2); // facets must intersect each plane 0 or 2 times
599 IntersectionLine line;
600 line.a = (Point)points[1];
601 line.b = (Point)points[0];
602 line.a_id = points[1].point_id;
603 line.b_id = points[0].point_id;
604 line.edge_a_id = points[1].edge_id;
605 line.edge_b_id = points[0].edge_id;
606 lines->push_back(line);
607 return;
608 }
609 }
610
611 void
612 TriangleMeshSlicer::make_loops(std::vector<IntersectionLine> &lines, Polygons* loops)
613 {
614 /*
615 SVG svg("lines.svg");
616 svg.draw(lines);
617 svg.Close();
618 */
619
620 // remove tangent edges
621 for (IntersectionLines::iterator line = lines.begin(); line != lines.end(); ++line) {
622 if (line->skip || line->edge_type == feNone) continue;
623
624 /* if the line is a facet edge, find another facet edge
625 having the same endpoints but in reverse order */
626 for (IntersectionLines::iterator line2 = line + 1; line2 != lines.end(); ++line2) {
627 if (line2->skip || line2->edge_type == feNone) continue;
628
629 // are these facets adjacent? (sharing a common edge on this layer)
630 if (line->a_id == line2->a_id && line->b_id == line2->b_id) {
631 line2->skip = true;
632
633 /* if they are both oriented upwards or downwards (like a 'V')
634 then we can remove both edges from this layer since it won't
635 affect the sliced shape */
636 /* if one of them is oriented upwards and the other is oriented
637 downwards, let's only keep one of them (it doesn't matter which
638 one since all 'top' lines were reversed at slicing) */
639 if (line->edge_type == line2->edge_type) {
640 line->skip = true;
641 break;
642 }
643 } else if (line->a_id == line2->b_id && line->b_id == line2->a_id) {
644 /* if this edge joins two horizontal facets, remove both of them */
645 if (line->edge_type == feHorizontal && line2->edge_type == feHorizontal) {
646 line->skip = true;
647 line2->skip = true;
648 break;
649 }
650 }
651 }
652 }
653
654 // build a map of lines by edge_a_id and a_id
655 std::vector<IntersectionLinePtrs> by_edge_a_id, by_a_id;
656 by_edge_a_id.resize(this->mesh->stl.stats.number_of_facets * 3);
657 by_a_id.resize(this->mesh->stl.stats.shared_vertices);
658 for (IntersectionLines::iterator line = lines.begin(); line != lines.end(); ++line) {
659 if (line->skip) continue;
660 if (line->edge_a_id != -1) by_edge_a_id[line->edge_a_id].push_back(&(*line));
661 if (line->a_id != -1) by_a_id[line->a_id].push_back(&(*line));
662 }
663
664 CYCLE: while (1) {
665 // take first spare line and start a new loop
666 IntersectionLine* first_line = NULL;
667 for (IntersectionLines::iterator line = lines.begin(); line != lines.end(); ++line) {
668 if (line->skip) continue;
669 first_line = &(*line);
670 break;
671 }
672 if (first_line == NULL) break;
673 first_line->skip = true;
674 IntersectionLinePtrs loop;
675 loop.push_back(first_line);
676
677 /*
678 printf("first_line edge_a_id = %d, edge_b_id = %d, a_id = %d, b_id = %d, a = %d,%d, b = %d,%d\n",
679 first_line->edge_a_id, first_line->edge_b_id, first_line->a_id, first_line->b_id,
680 first_line->a.x, first_line->a.y, first_line->b.x, first_line->b.y);
681 */
682
683 while (1) {
684 // find a line starting where last one finishes
685 IntersectionLine* next_line = NULL;
686 if (loop.back()->edge_b_id != -1) {
687 IntersectionLinePtrs &candidates = by_edge_a_id[loop.back()->edge_b_id];
688 for (IntersectionLinePtrs::iterator lineptr = candidates.begin(); lineptr != candidates.end(); ++lineptr) {
689 if ((*lineptr)->skip) continue;
690 next_line = *lineptr;
691 break;
692 }
693 }
694 if (next_line == NULL && loop.back()->b_id != -1) {
695 IntersectionLinePtrs &candidates = by_a_id[loop.back()->b_id];
696 for (IntersectionLinePtrs::iterator lineptr = candidates.begin(); lineptr != candidates.end(); ++lineptr) {
697 if ((*lineptr)->skip) continue;
698 next_line = *lineptr;
699 break;
700 }
701 }
702
703 if (next_line == NULL) {
704 // check whether we closed this loop
705 if ((loop.front()->edge_a_id != -1 && loop.front()->edge_a_id == loop.back()->edge_b_id)
706 || (loop.front()->a_id != -1 && loop.front()->a_id == loop.back()->b_id)) {
707 // loop is complete
708 Polygon p;
709 p.points.reserve(loop.size());
710 for (IntersectionLinePtrs::const_iterator lineptr = loop.begin(); lineptr != loop.end(); ++lineptr) {
711 p.points.push_back((*lineptr)->a);
712 }
713 loops->push_back(p);
714
715 #ifdef SLIC3R_TRIANGLEMESH_DEBUG
716 printf(" Discovered %s polygon of %d points\n", (p.is_counter_clockwise() ? "ccw" : "cw"), (int)p.points.size());
717 #endif
718
719 goto CYCLE;
720 }
721
722 // we can't close this loop!
723 //// push @failed_loops, [@loop];
724 //#ifdef SLIC3R_TRIANGLEMESH_DEBUG
725 printf(" Unable to close this loop having %d points\n", (int)loop.size());
726 //#endif
727 goto CYCLE;
728 }
729 /*
730 printf("next_line edge_a_id = %d, edge_b_id = %d, a_id = %d, b_id = %d, a = %d,%d, b = %d,%d\n",
731 next_line->edge_a_id, next_line->edge_b_id, next_line->a_id, next_line->b_id,
732 next_line->a.x, next_line->a.y, next_line->b.x, next_line->b.y);
733 */
734 loop.push_back(next_line);
735 next_line->skip = true;
736 }
737 }
738 }
739
740 class _area_comp {
741 public:
742 _area_comp(std::vector<double>* _aa) : abs_area(_aa) {};
743 bool operator() (const size_t &a, const size_t &b) {
744 return (*this->abs_area)[a] > (*this->abs_area)[b];
745 }
746
747 private:
748 std::vector<double>* abs_area;
749 };
750
751 void
752 TriangleMeshSlicer::make_expolygons_simple(std::vector<IntersectionLine> &lines, ExPolygons* slices)
753 {
754 Polygons loops;
755 this->make_loops(lines, &loops);
756
757 Polygons cw;
758 for (Polygons::const_iterator loop = loops.begin(); loop != loops.end(); ++loop) {
759 if (loop->area() >= 0) {
760 ExPolygon ex;
761 ex.contour = *loop;
762 slices->push_back(ex);
763 } else {
764 cw.push_back(*loop);
765 }
766 }
767
768 // assign holes to contours
769 for (Polygons::const_iterator loop = cw.begin(); loop != cw.end(); ++loop) {
770 int slice_idx = -1;
771 double current_contour_area = -1;
772 for (ExPolygons::iterator slice = slices->begin(); slice != slices->end(); ++slice) {
773 if (slice->contour.contains(loop->points.front())) {
774 double area = slice->contour.area();
775 if (area < current_contour_area || current_contour_area == -1) {
776 slice_idx = slice - slices->begin();
777 current_contour_area = area;
778 }
779 }
780 }
781 (*slices)[slice_idx].holes.push_back(*loop);
782 }
783 }
784
785 void
786 TriangleMeshSlicer::make_expolygons(const Polygons &loops, ExPolygons* slices)
787 {
788 /*
789 Input loops are not suitable for evenodd nor nonzero fill types, as we might get
790 two consecutive concentric loops having the same winding order - and we have to
791 respect such order. In that case, evenodd would create wrong inversions, and nonzero
792 would ignore holes inside two concentric contours.
793 So we're ordering loops and collapse consecutive concentric loops having the same
794 winding order.
795 TODO: find a faster algorithm for this, maybe with some sort of binary search.
796 If we computed a "nesting tree" we could also just remove the consecutive loops
797 having the same winding order, and remove the extra one(s) so that we could just
798 supply everything to offset() instead of performing several union/diff calls.
799
800 we sort by area assuming that the outermost loops have larger area;
801 the previous sorting method, based on $b->contains($a->[0]), failed to nest
802 loops correctly in some edge cases when original model had overlapping facets
803 */
804
805 std::vector<double> area;
806 std::vector<double> abs_area;
807 std::vector<size_t> sorted_area; // vector of indices
808 for (Polygons::const_iterator loop = loops.begin(); loop != loops.end(); ++loop) {
809 double a = loop->area();
810 area.push_back(a);
811 abs_area.push_back(std::fabs(a));
812 sorted_area.push_back(loop - loops.begin());
813 }
814
815 std::sort(sorted_area.begin(), sorted_area.end(), _area_comp(&abs_area)); // outer first
816
817 // we don't perform a safety offset now because it might reverse cw loops
818 Polygons p_slices;
819 for (std::vector<size_t>::const_iterator loop_idx = sorted_area.begin(); loop_idx != sorted_area.end(); ++loop_idx) {
820 /* we rely on the already computed area to determine the winding order
821 of the loops, since the Orientation() function provided by Clipper
822 would do the same, thus repeating the calculation */
823 Polygons::const_iterator loop = loops.begin() + *loop_idx;
824 if (area[*loop_idx] > +EPSILON) {
825 p_slices.push_back(*loop);
826 } else if (area[*loop_idx] < -EPSILON) {
827 diff(p_slices, *loop, &p_slices);
828 }
829 }
830
831 // perform a safety offset to merge very close facets (TODO: find test case for this)
832 double safety_offset = scale_(0.0499);
833 ExPolygons ex_slices;
834 offset2(p_slices, &ex_slices, +safety_offset, -safety_offset);
835
836 #ifdef SLIC3R_TRIANGLEMESH_DEBUG
837 size_t holes_count = 0;
838 for (ExPolygons::const_iterator e = ex_slices.begin(); e != ex_slices.end(); ++e) {
839 holes_count += e->holes.size();
840 }
841 printf(PRINTF_ZU " surface(s) having " PRINTF_ZU " holes detected from " PRINTF_ZU " polylines\n",
842 ex_slices.size(), holes_count, loops.size());
843 #endif
844
845 // append to the supplied collection
846 slices->insert(slices->end(), ex_slices.begin(), ex_slices.end());
847 }
848
849 void
850 TriangleMeshSlicer::make_expolygons(std::vector<IntersectionLine> &lines, ExPolygons* slices)
851 {
852 Polygons pp;
853 this->make_loops(lines, &pp);
854 this->make_expolygons(pp, slices);
855 }
856
857 void
858 TriangleMeshSlicer::cut(float z, TriangleMesh* upper, TriangleMesh* lower)
859 {
860 IntersectionLines upper_lines, lower_lines;
861
862 float scaled_z = scale_(z);
863 for (int facet_idx = 0; facet_idx < this->mesh->stl.stats.number_of_facets; facet_idx++) {
864 stl_facet* facet = &this->mesh->stl.facet_start[facet_idx];
865
866 // find facet extents
867 float min_z = fminf(facet->vertex[0].z, fminf(facet->vertex[1].z, facet->vertex[2].z));
868 float max_z = fmaxf(facet->vertex[0].z, fmaxf(facet->vertex[1].z, facet->vertex[2].z));
869
870 // intersect facet with cutting plane
871 IntersectionLines lines;
872 this->slice_facet(scaled_z, *facet, facet_idx, min_z, max_z, &lines);
873
874 // save intersection lines for generating correct triangulations
875 for (IntersectionLines::const_iterator it = lines.begin(); it != lines.end(); ++it) {
876 if (it->edge_type == feTop) {
877 lower_lines.push_back(*it);
878 } else if (it->edge_type == feBottom) {
879 upper_lines.push_back(*it);
880 } else if (it->edge_type != feHorizontal) {
881 lower_lines.push_back(*it);
882 upper_lines.push_back(*it);
883 }
884 }
885
886 if (min_z > z || (min_z == z && max_z > min_z)) {
887 // facet is above the cut plane and does not belong to it
888 if (upper != NULL) stl_add_facet(&upper->stl, facet);
889 } else if (max_z < z || (max_z == z && max_z > min_z)) {
890 // facet is below the cut plane and does not belong to it
891 if (lower != NULL) stl_add_facet(&lower->stl, facet);
892 } else if (min_z < z && max_z > z) {
893 // facet is cut by the slicing plane
894
895 // look for the vertex on whose side of the slicing plane there are no other vertices
896 int isolated_vertex;
897 if ( (facet->vertex[0].z > z) == (facet->vertex[1].z > z) ) {
898 isolated_vertex = 2;
899 } else if ( (facet->vertex[1].z > z) == (facet->vertex[2].z > z) ) {
900 isolated_vertex = 0;
901 } else {
902 isolated_vertex = 1;
903 }
904
905 // get vertices starting from the isolated one
906 stl_vertex* v0 = &facet->vertex[isolated_vertex];
907 stl_vertex* v1 = &facet->vertex[(isolated_vertex+1) % 3];
908 stl_vertex* v2 = &facet->vertex[(isolated_vertex+2) % 3];
909
910 // intersect v0-v1 and v2-v0 with cutting plane and make new vertices
911 stl_vertex v0v1, v2v0;
912 v0v1.x = v1->x + (v0->x - v1->x) * (z - v1->z) / (v0->z - v1->z);
913 v0v1.y = v1->y + (v0->y - v1->y) * (z - v1->z) / (v0->z - v1->z);
914 v0v1.z = z;
915 v2v0.x = v2->x + (v0->x - v2->x) * (z - v2->z) / (v0->z - v2->z);
916 v2v0.y = v2->y + (v0->y - v2->y) * (z - v2->z) / (v0->z - v2->z);
917 v2v0.z = z;
918
919 // build the triangular facet
920 stl_facet triangle;
921 triangle.normal = facet->normal;
922 triangle.vertex[0] = *v0;
923 triangle.vertex[1] = v0v1;
924 triangle.vertex[2] = v2v0;
925
926 // build the facets forming a quadrilateral on the other side
927 stl_facet quadrilateral[2];
928 quadrilateral[0].normal = facet->normal;
929 quadrilateral[0].vertex[0] = *v1;
930 quadrilateral[0].vertex[1] = *v2;
931 quadrilateral[0].vertex[2] = v0v1;
932 quadrilateral[1].normal = facet->normal;
933 quadrilateral[1].vertex[0] = *v2;
934 quadrilateral[1].vertex[1] = v2v0;
935 quadrilateral[1].vertex[2] = v0v1;
936
937 if (v0->z > z) {
938 if (upper != NULL) stl_add_facet(&upper->stl, &triangle);
939 if (lower != NULL) {
940 stl_add_facet(&lower->stl, &quadrilateral[0]);
941 stl_add_facet(&lower->stl, &quadrilateral[1]);
942 }
943 } else {
944 if (upper != NULL) {
945 stl_add_facet(&upper->stl, &quadrilateral[0]);
946 stl_add_facet(&upper->stl, &quadrilateral[1]);
947 }
948 if (lower != NULL) stl_add_facet(&lower->stl, &triangle);
949 }
950 }
951 }
952
953 // triangulate holes of upper mesh
954 if (upper != NULL) {
955 // compute shape of section
956 ExPolygons section;
957 this->make_expolygons_simple(upper_lines, &section);
958
959 // triangulate section
960 Polygons triangles;
961 for (ExPolygons::const_iterator expolygon = section.begin(); expolygon != section.end(); ++expolygon)
962 expolygon->triangulate_p2t(&triangles);
963
964 // convert triangles to facets and append them to mesh
965 for (Polygons::const_iterator polygon = triangles.begin(); polygon != triangles.end(); ++polygon) {
966 Polygon p = *polygon;
967 p.reverse();
968 stl_facet facet;
969 facet.normal.x = 0;
970 facet.normal.y = 0;
971 facet.normal.z = -1;
972 for (size_t i = 0; i <= 2; ++i) {
973 facet.vertex[i].x = unscale(p.points[i].x);
974 facet.vertex[i].y = unscale(p.points[i].y);
975 facet.vertex[i].z = z;
976 }
977 stl_add_facet(&upper->stl, &facet);
978 }
979 }
980
981 // triangulate holes of lower mesh
982 if (lower != NULL) {
983 // compute shape of section
984 ExPolygons section;
985 this->make_expolygons_simple(lower_lines, &section);
986
987 // triangulate section
988 Polygons triangles;
989 for (ExPolygons::const_iterator expolygon = section.begin(); expolygon != section.end(); ++expolygon)
990 expolygon->triangulate_p2t(&triangles);
991
992 // convert triangles to facets and append them to mesh
993 for (Polygons::const_iterator polygon = triangles.begin(); polygon != triangles.end(); ++polygon) {
994 stl_facet facet;
995 facet.normal.x = 0;
996 facet.normal.y = 0;
997 facet.normal.z = 1;
998 for (size_t i = 0; i <= 2; ++i) {
999 facet.vertex[i].x = unscale(polygon->points[i].x);
1000 facet.vertex[i].y = unscale(polygon->points[i].y);
1001 facet.vertex[i].z = z;
1002 }
1003 stl_add_facet(&lower->stl, &facet);
1004 }
1005 }
1006
1007
1008 stl_get_size(&(upper->stl));
1009 stl_get_size(&(lower->stl));
1010
1011 }
1012
1013 TriangleMeshSlicer::TriangleMeshSlicer(TriangleMesh* _mesh) : mesh(_mesh), v_scaled_shared(NULL)
1014 {
1015 // build a table to map a facet_idx to its three edge indices
1016 this->mesh->require_shared_vertices();
1017 typedef std::pair<int,int> t_edge;
1018 typedef std::vector<t_edge> t_edges; // edge_idx => a_id,b_id
1019 typedef std::map<t_edge,int> t_edges_map; // a_id,b_id => edge_idx
1020
1021 this->facets_edges.resize(this->mesh->stl.stats.number_of_facets);
1022
1023 {
1024 t_edges edges;
1025 // reserve() instad of resize() because otherwise we couldn't read .size() below to assign edge_idx
1026 edges.reserve(this->mesh->stl.stats.number_of_facets * 3); // number of edges = number of facets * 3
1027 t_edges_map edges_map;
1028 for (int facet_idx = 0; facet_idx < this->mesh->stl.stats.number_of_facets; facet_idx++) {
1029 this->facets_edges[facet_idx].resize(3);
1030 for (int i = 0; i <= 2; i++) {
1031 int a_id = this->mesh->stl.v_indices[facet_idx].vertex[i];
1032 int b_id = this->mesh->stl.v_indices[facet_idx].vertex[(i+1) % 3];
1033
1034 int edge_idx;
1035 t_edges_map::const_iterator my_edge = edges_map.find(std::make_pair(b_id,a_id));
1036 if (my_edge != edges_map.end()) {
1037 edge_idx = my_edge->second;
1038 } else {
1039 /* admesh can assign the same edge ID to more than two facets (which is
1040 still topologically correct), so we have to search for a duplicate of
1041 this edge too in case it was already seen in this orientation */
1042 my_edge = edges_map.find(std::make_pair(a_id,b_id));
1043
1044 if (my_edge != edges_map.end()) {
1045 edge_idx = my_edge->second;
1046 } else {
1047 // edge isn't listed in table, so we insert it
1048 edge_idx = edges.size();
1049 edges.push_back(std::make_pair(a_id,b_id));
1050 edges_map[ edges[edge_idx] ] = edge_idx;
1051 }
1052 }
1053 this->facets_edges[facet_idx][i] = edge_idx;
1054
1055 #ifdef SLIC3R_TRIANGLEMESH_DEBUG
1056 printf(" [facet %d, edge %d] a_id = %d, b_id = %d --> edge %d\n", facet_idx, i, a_id, b_id, edge_idx);
1057 #endif
1058 }
1059 }
1060 }
1061
1062 // clone shared vertices coordinates and scale them
1063 this->v_scaled_shared = (stl_vertex*)calloc(this->mesh->stl.stats.shared_vertices, sizeof(stl_vertex));
1064 std::copy(this->mesh->stl.v_shared, this->mesh->stl.v_shared + this->mesh->stl.stats.shared_vertices, this->v_scaled_shared);
1065 for (int i = 0; i < this->mesh->stl.stats.shared_vertices; i++) {
1066 this->v_scaled_shared[i].x /= SCALING_FACTOR;
1067 this->v_scaled_shared[i].y /= SCALING_FACTOR;
1068 this->v_scaled_shared[i].z /= SCALING_FACTOR;
1069 }
1070 }
1071
1072 TriangleMeshSlicer::~TriangleMeshSlicer()
1073 {
1074 if (this->v_scaled_shared != NULL) free(this->v_scaled_shared);
1075 }
1076
1077 }
0 #ifndef slic3r_TriangleMesh_hpp_
1 #define slic3r_TriangleMesh_hpp_
2
3 #include "libslic3r.h"
4 #include <admesh/stl.h>
5 #include <vector>
6 #include "BoundingBox.hpp"
7 #include "Line.hpp"
8 #include "Point.hpp"
9 #include "Polygon.hpp"
10 #include "ExPolygon.hpp"
11
12 namespace Slic3r {
13
14 class TriangleMesh;
15 class TriangleMeshSlicer;
16 typedef std::vector<TriangleMesh*> TriangleMeshPtrs;
17
18 class TriangleMesh
19 {
20 public:
21 TriangleMesh();
22 TriangleMesh(const TriangleMesh &other);
23 TriangleMesh& operator= (TriangleMesh other);
24 void swap(TriangleMesh &other);
25 ~TriangleMesh();
26 void ReadSTLFile(char* input_file);
27 void write_ascii(char* output_file);
28 void write_binary(char* output_file);
29 void repair();
30 void WriteOBJFile(char* output_file);
31 void scale(float factor);
32 void scale(const Pointf3 &versor);
33 void translate(float x, float y, float z);
34 void rotate(float angle, const Axis &axis);
35 void rotate_x(float angle);
36 void rotate_y(float angle);
37 void rotate_z(float angle);
38 void mirror(const Axis &axis);
39 void mirror_x();
40 void mirror_y();
41 void mirror_z();
42 void align_to_origin();
43 void rotate(double angle, Point* center);
44 TriangleMeshPtrs split() const;
45 void merge(const TriangleMesh &mesh);
46 ExPolygons horizontal_projection() const;
47 Polygon convex_hull();
48 BoundingBoxf3 bounding_box() const;
49 void reset_repair_stats();
50 bool needed_repair() const;
51 size_t facets_count() const;
52 stl_file stl;
53 bool repaired;
54
55 private:
56 void require_shared_vertices();
57 friend class TriangleMeshSlicer;
58 };
59
60 enum FacetEdgeType { feNone, feTop, feBottom, feHorizontal };
61
62 class IntersectionPoint : public Point
63 {
64 public:
65 int point_id;
66 int edge_id;
67 IntersectionPoint() : point_id(-1), edge_id(-1) {};
68 };
69
70 class IntersectionLine : public Line
71 {
72 public:
73 int a_id;
74 int b_id;
75 int edge_a_id;
76 int edge_b_id;
77 FacetEdgeType edge_type;
78 bool skip;
79 IntersectionLine() : a_id(-1), b_id(-1), edge_a_id(-1), edge_b_id(-1), edge_type(feNone), skip(false) {};
80 };
81 typedef std::vector<IntersectionLine> IntersectionLines;
82 typedef std::vector<IntersectionLine*> IntersectionLinePtrs;
83
84 class TriangleMeshSlicer
85 {
86 public:
87 TriangleMesh* mesh;
88 TriangleMeshSlicer(TriangleMesh* _mesh);
89 ~TriangleMeshSlicer();
90 void slice(const std::vector<float> &z, std::vector<Polygons>* layers);
91 void slice(const std::vector<float> &z, std::vector<ExPolygons>* layers);
92 void slice_facet(float slice_z, const stl_facet &facet, const int &facet_idx, const float &min_z, const float &max_z, std::vector<IntersectionLine>* lines) const;
93 void cut(float z, TriangleMesh* upper, TriangleMesh* lower);
94
95 private:
96 typedef std::vector< std::vector<int> > t_facets_edges;
97 t_facets_edges facets_edges;
98 stl_vertex* v_scaled_shared;
99 void make_loops(std::vector<IntersectionLine> &lines, Polygons* loops);
100 void make_expolygons(const Polygons &loops, ExPolygons* slices);
101 void make_expolygons_simple(std::vector<IntersectionLine> &lines, ExPolygons* slices);
102 void make_expolygons(std::vector<IntersectionLine> &lines, ExPolygons* slices);
103 };
104
105 }
106
107 #endif
0 #ifndef _libslic3r_h_
1 #define _libslic3r_h_
2
3 // this needs to be included early for MSVC (listing it in Build.PL is not enough)
4 #include <ostream>
5 #include <iostream>
6 #include <sstream>
7 #include <cstdio>
8 #include <stdint.h>
9 #include <stdarg.h>
10
11 #define SLIC3R_FORK_NAME "Slic3r Prusa Edition"
12 #define SLIC3R_VERSION "1.3.0-dev"
13
14 //FIXME This epsilon value is used for many non-related purposes:
15 // For a threshold of a squared Euclidean distance,
16 // for a trheshold in a difference of radians,
17 // for a threshold of a cross product of two non-normalized vectors etc.
18 #define EPSILON 1e-4
19 // Scaling factor for a conversion from coord_t to coordf_t: 10e-6
20 // This scaling generates a following fixed point representation with for a 32bit integer:
21 // 0..4294mm with 1nm resolution
22 // int32_t fits an interval of (-2147.48mm, +2147.48mm)
23 #define SCALING_FACTOR 0.000001
24 // RESOLUTION, SCALED_RESOLUTION: Used as an error threshold for a Douglas-Peucker polyline simplification algorithm.
25 #define RESOLUTION 0.0125
26 #define SCALED_RESOLUTION (RESOLUTION / SCALING_FACTOR)
27 #define PI 3.141592653589793238
28 // When extruding a closed loop, the loop is interrupted and shortened a bit to reduce the seam.
29 #define LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER 0.15
30 // Maximum perimeter length for the loop to apply the small perimeter speed.
31 #define SMALL_PERIMETER_LENGTH (6.5 / SCALING_FACTOR) * 2 * PI
32 #define INSET_OVERLAP_TOLERANCE 0.4
33 // 3mm ring around the top / bottom / bridging areas.
34 //FIXME This is quite a lot.
35 #define EXTERNAL_INFILL_MARGIN 3.
36 #define scale_(val) ((val) / SCALING_FACTOR)
37 #define unscale(val) ((val) * SCALING_FACTOR)
38 #define SCALED_EPSILON scale_(EPSILON)
39 typedef long coord_t;
40 typedef double coordf_t;
41
42 namespace Slic3r {
43
44 enum Axis { X=0, Y, Z };
45
46 }
47 using namespace Slic3r;
48
49 /* Implementation of CONFESS("foo"): */
50 #ifdef _MSC_VER
51 #define CONFESS(...) confess_at(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
52 #else
53 #define CONFESS(...) confess_at(__FILE__, __LINE__, __func__, __VA_ARGS__)
54 #endif
55 void confess_at(const char *file, int line, const char *func, const char *pat, ...);
56 /* End implementation of CONFESS("foo"): */
57
58 // Which C++ version is supported?
59 // For example, could optimized functions with move semantics be used?
60 #if __cplusplus==201402L
61 #define SLIC3R_CPPVER 14
62 #define STDMOVE(WHAT) std::move(WHAT)
63 #elif __cplusplus==201103L
64 #define SLIC3R_CPPVER 11
65 #define STDMOVE(WHAT) std::move(WHAT)
66 #else
67 #define SLIC3R_CPPVER 0
68 #define STDMOVE(WHAT) (WHAT)
69 #endif
70
71 #define SLIC3R_DEBUG_OUT_PATH_PREFIX "out/"
72
73 inline std::string debug_out_path(const char *name, ...)
74 {
75 char buffer[2048];
76 va_list args;
77 va_start(args, name);
78 std::vsprintf(buffer, name, args);
79 va_end(args);
80 return std::string(SLIC3R_DEBUG_OUT_PATH_PREFIX) + std::string(buffer);
81 }
82
83 #ifdef _MSC_VER
84 // Visual Studio older than 2015 does not support the prinf type specifier %zu. Use %Iu instead.
85 #define PRINTF_ZU "%Iu"
86 #else
87 #define PRINTF_ZU "%zu"
88 #endif
89
90 // Write slices as SVG images into out directory during the 2D processing of the slices.
91 // #define SLIC3R_DEBUG_SLICE_PROCESSING
92
93 #endif
0 #ifdef SLIC3R_HAS_BROKEN_CROAK
1
2 // Some Strawberry Perl builds (mainly the latest 64bit builds) have a broken mechanism
3 // for emiting Perl exception after handling a C++ exception. Perl interpreter
4 // simply hangs. Better to show a message box in that case and stop the application.
5
6 #include <stdarg.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10
11 #ifdef WIN32
12 #include <Windows.h>
13 #endif
14
15 void confess_at(const char *file, int line, const char *func, const char *format, ...)
16 {
17 char dest[1024*8];
18 va_list argptr;
19 va_start(argptr, format);
20 vsprintf(dest, format, argptr);
21 va_end(argptr);
22
23 char filelinefunc[1024*8];
24 sprintf(filelinefunc, "\r\nin function: %s\r\nfile: %s\r\nline: %d\r\n", func, file, line);
25 strcat(dest, filelinefunc);
26 strcat(dest, "\r\n Closing the application.\r\n");
27 #ifdef WIN32
28 ::MessageBoxA(NULL, dest, "Slic3r Prusa Edition", MB_OK | MB_ICONERROR);
29 #endif
30
31 // Give up.
32 printf(dest);
33 exit(-1);
34 }
35
36 #else
37
38 #include <xsinit.h>
39
40 void
41 confess_at(const char *file, int line, const char *func,
42 const char *pat, ...)
43 {
44 #ifdef SLIC3RXS
45 va_list args;
46 SV *error_sv = newSVpvf("Error in function %s at %s:%d: ", func,
47 file, line);
48
49 va_start(args, pat);
50 sv_vcatpvf(error_sv, pat, &args);
51 va_end(args);
52
53 sv_catpvn(error_sv, "\n\t", 2);
54
55 dSP;
56 ENTER;
57 SAVETMPS;
58 PUSHMARK(SP);
59 XPUSHs( sv_2mortal(error_sv) );
60 PUTBACK;
61 call_pv("Carp::confess", G_DISCARD);
62 FREETMPS;
63 LEAVE;
64 #endif
65 }
66
67 #endif
0 #ifdef SLIC3RXS
1 #include <xsinit.h>
2
3 namespace Slic3r {
4
5 REGISTER_CLASS(ExPolygon, "ExPolygon");
6 REGISTER_CLASS(ExPolygonCollection, "ExPolygon::Collection");
7 REGISTER_CLASS(Extruder, "Extruder");
8 REGISTER_CLASS(ExtrusionPath, "ExtrusionPath");
9 REGISTER_CLASS(ExtrusionLoop, "ExtrusionLoop");
10 // there is no ExtrusionLoop::Collection or ExtrusionEntity::Collection
11 REGISTER_CLASS(ExtrusionEntityCollection, "ExtrusionPath::Collection");
12 REGISTER_CLASS(ExtrusionSimulator, "ExtrusionSimulator");
13 REGISTER_CLASS(Filler, "Filler");
14 REGISTER_CLASS(Flow, "Flow");
15 REGISTER_CLASS(AvoidCrossingPerimeters, "GCode::AvoidCrossingPerimeters");
16 REGISTER_CLASS(OozePrevention, "GCode::OozePrevention");
17 REGISTER_CLASS(Wipe, "GCode::Wipe");
18 REGISTER_CLASS(GCode, "GCode");
19 REGISTER_CLASS(GCodeSender, "GCode::Sender");
20 REGISTER_CLASS(GCodeWriter, "GCode::Writer");
21 REGISTER_CLASS(GCodePressureEqualizer, "GCode::PressureEqualizer");
22 REGISTER_CLASS(Layer, "Layer");
23 REGISTER_CLASS(SupportLayer, "Layer::Support");
24 REGISTER_CLASS(LayerRegion, "Layer::Region");
25 REGISTER_CLASS(Line, "Line");
26 REGISTER_CLASS(Linef3, "Linef3");
27 REGISTER_CLASS(PerimeterGenerator, "Layer::PerimeterGenerator");
28 REGISTER_CLASS(PlaceholderParser, "GCode::PlaceholderParser");
29 REGISTER_CLASS(Polygon, "Polygon");
30 REGISTER_CLASS(Polyline, "Polyline");
31 REGISTER_CLASS(PolylineCollection, "Polyline::Collection");
32 REGISTER_CLASS(Print, "Print");
33 REGISTER_CLASS(PrintObject, "Print::Object");
34 REGISTER_CLASS(PrintRegion, "Print::Region");
35 REGISTER_CLASS(Model, "Model");
36 REGISTER_CLASS(ModelMaterial, "Model::Material");
37 REGISTER_CLASS(ModelObject, "Model::Object");
38 REGISTER_CLASS(ModelVolume, "Model::Volume");
39 REGISTER_CLASS(ModelInstance, "Model::Instance");
40 REGISTER_CLASS(MotionPlanner, "MotionPlanner");
41 REGISTER_CLASS(BoundingBox, "Geometry::BoundingBox");
42 REGISTER_CLASS(BoundingBoxf, "Geometry::BoundingBoxf");
43 REGISTER_CLASS(BoundingBoxf3, "Geometry::BoundingBoxf3");
44 REGISTER_CLASS(BridgeDetector, "BridgeDetector");
45 REGISTER_CLASS(Point, "Point");
46 REGISTER_CLASS(Point3, "Point3");
47 REGISTER_CLASS(Pointf, "Pointf");
48 REGISTER_CLASS(Pointf3, "Pointf3");
49 REGISTER_CLASS(DynamicPrintConfig, "Config");
50 REGISTER_CLASS(StaticPrintConfig, "Config::Static");
51 REGISTER_CLASS(PrintObjectConfig, "Config::PrintObject");
52 REGISTER_CLASS(PrintRegionConfig, "Config::PrintRegion");
53 REGISTER_CLASS(GCodeConfig, "Config::GCode");
54 REGISTER_CLASS(PrintConfig, "Config::Print");
55 REGISTER_CLASS(FullPrintConfig, "Config::Full");
56 REGISTER_CLASS(Surface, "Surface");
57 REGISTER_CLASS(SurfaceCollection, "Surface::Collection");
58 REGISTER_CLASS(PrintObjectSupportMaterial, "Print::SupportMaterial2");
59 REGISTER_CLASS(TriangleMesh, "TriangleMesh");
60 REGISTER_CLASS(GLVertexArray, "GUI::_3DScene::GLVertexArray");
61
62 SV*
63 ConfigBase__as_hash(ConfigBase* THIS) {
64 HV* hv = newHV();
65
66 t_config_option_keys opt_keys = THIS->keys();
67 for (t_config_option_keys::const_iterator it = opt_keys.begin(); it != opt_keys.end(); ++it)
68 (void)hv_store( hv, it->c_str(), it->length(), ConfigBase__get(THIS, *it), 0 );
69
70 return newRV_noinc((SV*)hv);
71 }
72
73 SV*
74 ConfigBase__get(ConfigBase* THIS, const t_config_option_key &opt_key) {
75 ConfigOption* opt = THIS->option(opt_key);
76 if (opt == NULL) return &PL_sv_undef;
77
78 const ConfigOptionDef* def = THIS->def->get(opt_key);
79 return ConfigOption_to_SV(*opt, *def);
80 }
81
82 SV*
83 ConfigOption_to_SV(const ConfigOption &opt, const ConfigOptionDef &def) {
84 if (def.type == coFloat) {
85 const ConfigOptionFloat* optv = dynamic_cast<const ConfigOptionFloat*>(&opt);
86 return newSVnv(optv->value);
87 } else if (def.type == coFloats) {
88 const ConfigOptionFloats* optv = dynamic_cast<const ConfigOptionFloats*>(&opt);
89 AV* av = newAV();
90 av_fill(av, optv->values.size()-1);
91 for (std::vector<double>::const_iterator it = optv->values.begin(); it != optv->values.end(); ++it)
92 av_store(av, it - optv->values.begin(), newSVnv(*it));
93 return newRV_noinc((SV*)av);
94 } else if (def.type == coPercent) {
95 const ConfigOptionPercent* optv = dynamic_cast<const ConfigOptionPercent*>(&opt);
96 return newSVnv(optv->value);
97 } else if (def.type == coInt) {
98 const ConfigOptionInt* optv = dynamic_cast<const ConfigOptionInt*>(&opt);
99 return newSViv(optv->value);
100 } else if (def.type == coInts) {
101 const ConfigOptionInts* optv = dynamic_cast<const ConfigOptionInts*>(&opt);
102 AV* av = newAV();
103 av_fill(av, optv->values.size()-1);
104 for (std::vector<int>::const_iterator it = optv->values.begin(); it != optv->values.end(); ++it)
105 av_store(av, it - optv->values.begin(), newSViv(*it));
106 return newRV_noinc((SV*)av);
107 } else if (def.type == coString) {
108 const ConfigOptionString* optv = dynamic_cast<const ConfigOptionString*>(&opt);
109 // we don't serialize() because that would escape newlines
110 return newSVpvn_utf8(optv->value.c_str(), optv->value.length(), true);
111 } else if (def.type == coStrings) {
112 const ConfigOptionStrings* optv = dynamic_cast<const ConfigOptionStrings*>(&opt);
113 AV* av = newAV();
114 av_fill(av, optv->values.size()-1);
115 for (std::vector<std::string>::const_iterator it = optv->values.begin(); it != optv->values.end(); ++it)
116 av_store(av, it - optv->values.begin(), newSVpvn_utf8(it->c_str(), it->length(), true));
117 return newRV_noinc((SV*)av);
118 } else if (def.type == coPoint) {
119 const ConfigOptionPoint* optv = dynamic_cast<const ConfigOptionPoint*>(&opt);
120 return perl_to_SV_clone_ref(optv->value);
121 } else if (def.type == coPoints) {
122 const ConfigOptionPoints* optv = dynamic_cast<const ConfigOptionPoints*>(&opt);
123 AV* av = newAV();
124 av_fill(av, optv->values.size()-1);
125 for (Pointfs::const_iterator it = optv->values.begin(); it != optv->values.end(); ++it)
126 av_store(av, it - optv->values.begin(), perl_to_SV_clone_ref(*it));
127 return newRV_noinc((SV*)av);
128 } else if (def.type == coBool) {
129 const ConfigOptionBool* optv = dynamic_cast<const ConfigOptionBool*>(&opt);
130 return newSViv(optv->value ? 1 : 0);
131 } else if (def.type == coBools) {
132 const ConfigOptionBools* optv = dynamic_cast<const ConfigOptionBools*>(&opt);
133 AV* av = newAV();
134 av_fill(av, optv->values.size()-1);
135 for (std::vector<bool>::const_iterator it = optv->values.begin(); it != optv->values.end(); ++it)
136 av_store(av, it - optv->values.begin(), newSViv(*it ? 1 : 0));
137 return newRV_noinc((SV*)av);
138 } else {
139 std::string serialized = opt.serialize();
140 return newSVpvn_utf8(serialized.c_str(), serialized.length(), true);
141 }
142 }
143
144 SV*
145 ConfigBase__get_at(ConfigBase* THIS, const t_config_option_key &opt_key, size_t i) {
146 ConfigOption* opt = THIS->option(opt_key);
147 if (opt == NULL) return &PL_sv_undef;
148
149 const ConfigOptionDef* def = THIS->def->get(opt_key);
150 if (def->type == coFloats) {
151 ConfigOptionFloats* optv = dynamic_cast<ConfigOptionFloats*>(opt);
152 return newSVnv(optv->get_at(i));
153 } else if (def->type == coInts) {
154 ConfigOptionInts* optv = dynamic_cast<ConfigOptionInts*>(opt);
155 return newSViv(optv->get_at(i));
156 } else if (def->type == coStrings) {
157 ConfigOptionStrings* optv = dynamic_cast<ConfigOptionStrings*>(opt);
158 // we don't serialize() because that would escape newlines
159 std::string val = optv->get_at(i);
160 return newSVpvn_utf8(val.c_str(), val.length(), true);
161 } else if (def->type == coPoints) {
162 ConfigOptionPoints* optv = dynamic_cast<ConfigOptionPoints*>(opt);
163 return perl_to_SV_clone_ref(optv->get_at(i));
164 } else if (def->type == coBools) {
165 ConfigOptionBools* optv = dynamic_cast<ConfigOptionBools*>(opt);
166 return newSViv(optv->get_at(i) ? 1 : 0);
167 } else {
168 return &PL_sv_undef;
169 }
170 }
171
172 bool
173 ConfigBase__set(ConfigBase* THIS, const t_config_option_key &opt_key, SV* value) {
174 ConfigOption* opt = THIS->option(opt_key, true);
175 if (opt == NULL) CONFESS("Trying to set non-existing option");
176
177 const ConfigOptionDef* def = THIS->def->get(opt_key);
178 if (def->type == coFloat) {
179 if (!looks_like_number(value)) return false;
180 ConfigOptionFloat* optv = dynamic_cast<ConfigOptionFloat*>(opt);
181 optv->value = SvNV(value);
182 } else if (def->type == coFloats) {
183 ConfigOptionFloats* optv = dynamic_cast<ConfigOptionFloats*>(opt);
184 std::vector<double> values;
185 AV* av = (AV*)SvRV(value);
186 const size_t len = av_len(av)+1;
187 for (size_t i = 0; i < len; i++) {
188 SV** elem = av_fetch(av, i, 0);
189 if (elem == NULL || !looks_like_number(*elem)) return false;
190 values.push_back(SvNV(*elem));
191 }
192 optv->values = values;
193 } else if (def->type == coInt) {
194 if (!looks_like_number(value)) return false;
195 ConfigOptionInt* optv = dynamic_cast<ConfigOptionInt*>(opt);
196 optv->value = SvIV(value);
197 } else if (def->type == coInts) {
198 ConfigOptionInts* optv = dynamic_cast<ConfigOptionInts*>(opt);
199 std::vector<int> values;
200 AV* av = (AV*)SvRV(value);
201 const size_t len = av_len(av)+1;
202 for (size_t i = 0; i < len; i++) {
203 SV** elem = av_fetch(av, i, 0);
204 if (elem == NULL || !looks_like_number(*elem)) return false;
205 values.push_back(SvIV(*elem));
206 }
207 optv->values = values;
208 } else if (def->type == coString) {
209 ConfigOptionString* optv = dynamic_cast<ConfigOptionString*>(opt);
210 optv->value = std::string(SvPV_nolen(value), SvCUR(value));
211 } else if (def->type == coStrings) {
212 ConfigOptionStrings* optv = dynamic_cast<ConfigOptionStrings*>(opt);
213 optv->values.clear();
214 AV* av = (AV*)SvRV(value);
215 const size_t len = av_len(av)+1;
216 for (size_t i = 0; i < len; i++) {
217 SV** elem = av_fetch(av, i, 0);
218 if (elem == NULL) return false;
219 optv->values.push_back(std::string(SvPV_nolen(*elem), SvCUR(*elem)));
220 }
221 } else if (def->type == coPoint) {
222 ConfigOptionPoint* optv = dynamic_cast<ConfigOptionPoint*>(opt);
223 return from_SV_check(value, &optv->value);
224 } else if (def->type == coPoints) {
225 ConfigOptionPoints* optv = dynamic_cast<ConfigOptionPoints*>(opt);
226 std::vector<Pointf> values;
227 AV* av = (AV*)SvRV(value);
228 const size_t len = av_len(av)+1;
229 for (size_t i = 0; i < len; i++) {
230 SV** elem = av_fetch(av, i, 0);
231 Pointf point;
232 if (elem == NULL || !from_SV_check(*elem, &point)) return false;
233 values.push_back(point);
234 }
235 optv->values = values;
236 } else if (def->type == coBool) {
237 ConfigOptionBool* optv = dynamic_cast<ConfigOptionBool*>(opt);
238 optv->value = SvTRUE(value);
239 } else if (def->type == coBools) {
240 ConfigOptionBools* optv = dynamic_cast<ConfigOptionBools*>(opt);
241 optv->values.clear();
242 AV* av = (AV*)SvRV(value);
243 const size_t len = av_len(av)+1;
244 for (size_t i = 0; i < len; i++) {
245 SV** elem = av_fetch(av, i, 0);
246 if (elem == NULL) return false;
247 optv->values.push_back(SvTRUE(*elem));
248 }
249 } else {
250 if (!opt->deserialize( std::string(SvPV_nolen(value)) )) return false;
251 }
252 return true;
253 }
254
255 /* This method is implemented as a workaround for this typemap bug:
256 https://rt.cpan.org/Public/Bug/Display.html?id=94110 */
257 bool
258 ConfigBase__set_deserialize(ConfigBase* THIS, const t_config_option_key &opt_key, SV* str) {
259 size_t len;
260 const char * c = SvPV(str, len);
261 std::string value(c, len);
262
263 return THIS->set_deserialize(opt_key, value);
264 }
265
266 void
267 ConfigBase__set_ifndef(ConfigBase* THIS, const t_config_option_key &opt_key, SV* value, bool deserialize)
268 {
269 if (!THIS->has(opt_key)) {
270 if (deserialize) {
271 ConfigBase__set_deserialize(THIS, opt_key, value);
272 } else {
273 ConfigBase__set(THIS, opt_key, value);
274 }
275 }
276 }
277
278 bool
279 StaticConfig__set(StaticConfig* THIS, const t_config_option_key &opt_key, SV* value) {
280 const ConfigOptionDef* optdef = THIS->def->get(opt_key);
281 if (!optdef->shortcut.empty()) {
282 for (std::vector<t_config_option_key>::const_iterator it = optdef->shortcut.begin(); it != optdef->shortcut.end(); ++it) {
283 if (!StaticConfig__set(THIS, *it, value)) return false;
284 }
285 return true;
286 }
287
288 return ConfigBase__set(THIS, opt_key, value);
289 }
290
291 SV* to_AV(ExPolygon* expolygon)
292 {
293 const unsigned int num_holes = expolygon->holes.size();
294 AV* av = newAV();
295 av_extend(av, num_holes); // -1 +1
296
297 av_store(av, 0, perl_to_SV_ref(expolygon->contour));
298
299 for (unsigned int i = 0; i < num_holes; i++) {
300 av_store(av, i+1, perl_to_SV_ref(expolygon->holes[i]));
301 }
302 return newRV_noinc((SV*)av);
303 }
304
305 SV* to_SV_pureperl(const ExPolygon* expolygon)
306 {
307 const unsigned int num_holes = expolygon->holes.size();
308 AV* av = newAV();
309 av_extend(av, num_holes); // -1 +1
310 av_store(av, 0, to_SV_pureperl(&expolygon->contour));
311 for (unsigned int i = 0; i < num_holes; i++) {
312 av_store(av, i+1, to_SV_pureperl(&expolygon->holes[i]));
313 }
314 return newRV_noinc((SV*)av);
315 }
316
317 void from_SV(SV* expoly_sv, ExPolygon* expolygon)
318 {
319 AV* expoly_av = (AV*)SvRV(expoly_sv);
320 const unsigned int num_polygons = av_len(expoly_av)+1;
321 expolygon->holes.resize(num_polygons-1);
322
323 SV** polygon_sv = av_fetch(expoly_av, 0, 0);
324 from_SV(*polygon_sv, &expolygon->contour);
325 for (unsigned int i = 0; i < num_polygons-1; i++) {
326 polygon_sv = av_fetch(expoly_av, i+1, 0);
327 from_SV(*polygon_sv, &expolygon->holes[i]);
328 }
329 }
330
331 void from_SV_check(SV* expoly_sv, ExPolygon* expolygon)
332 {
333 if (sv_isobject(expoly_sv) && (SvTYPE(SvRV(expoly_sv)) == SVt_PVMG)) {
334 if (!sv_isa(expoly_sv, perl_class_name(expolygon)) && !sv_isa(expoly_sv, perl_class_name_ref(expolygon)))
335 CONFESS("Not a valid %s object", perl_class_name(expolygon));
336 // a XS ExPolygon was supplied
337 *expolygon = *(ExPolygon *)SvIV((SV*)SvRV( expoly_sv ));
338 } else {
339 // a Perl arrayref was supplied
340 from_SV(expoly_sv, expolygon);
341 }
342 }
343
344 void from_SV(SV* line_sv, Line* THIS)
345 {
346 AV* line_av = (AV*)SvRV(line_sv);
347 from_SV_check(*av_fetch(line_av, 0, 0), &THIS->a);
348 from_SV_check(*av_fetch(line_av, 1, 0), &THIS->b);
349 }
350
351 void from_SV_check(SV* line_sv, Line* THIS)
352 {
353 if (sv_isobject(line_sv) && (SvTYPE(SvRV(line_sv)) == SVt_PVMG)) {
354 if (!sv_isa(line_sv, perl_class_name(THIS)) && !sv_isa(line_sv, perl_class_name_ref(THIS)))
355 CONFESS("Not a valid %s object", perl_class_name(THIS));
356 *THIS = *(Line*)SvIV((SV*)SvRV( line_sv ));
357 } else {
358 from_SV(line_sv, THIS);
359 }
360 }
361
362 SV* to_AV(Line* THIS)
363 {
364 AV* av = newAV();
365 av_extend(av, 1);
366
367 av_store(av, 0, perl_to_SV_ref(THIS->a));
368 av_store(av, 1, perl_to_SV_ref(THIS->b));
369
370 return newRV_noinc((SV*)av);
371 }
372
373 SV* to_SV_pureperl(const Line* THIS)
374 {
375 AV* av = newAV();
376 av_extend(av, 1);
377 av_store(av, 0, to_SV_pureperl(&THIS->a));
378 av_store(av, 1, to_SV_pureperl(&THIS->b));
379 return newRV_noinc((SV*)av);
380 }
381
382 void from_SV(SV* poly_sv, MultiPoint* THIS)
383 {
384 AV* poly_av = (AV*)SvRV(poly_sv);
385 const unsigned int num_points = av_len(poly_av)+1;
386 THIS->points.resize(num_points);
387
388 for (unsigned int i = 0; i < num_points; i++) {
389 SV** point_sv = av_fetch(poly_av, i, 0);
390 from_SV_check(*point_sv, &THIS->points[i]);
391 }
392 }
393
394 void from_SV_check(SV* poly_sv, MultiPoint* THIS)
395 {
396 if (sv_isobject(poly_sv) && (SvTYPE(SvRV(poly_sv)) == SVt_PVMG)) {
397 *THIS = *(MultiPoint*)SvIV((SV*)SvRV( poly_sv ));
398 } else {
399 from_SV(poly_sv, THIS);
400 }
401 }
402
403 SV* to_AV(MultiPoint* THIS)
404 {
405 const unsigned int num_points = THIS->points.size();
406 AV* av = newAV();
407 if (num_points > 0) av_extend(av, num_points-1);
408 for (unsigned int i = 0; i < num_points; i++) {
409 av_store(av, i, perl_to_SV_ref(THIS->points[i]));
410 }
411 return newRV_noinc((SV*)av);
412 }
413
414 SV* to_SV_pureperl(const MultiPoint* THIS)
415 {
416 const unsigned int num_points = THIS->points.size();
417 AV* av = newAV();
418 if (num_points > 0) av_extend(av, num_points-1);
419 for (unsigned int i = 0; i < num_points; i++) {
420 av_store(av, i, to_SV_pureperl(&THIS->points[i]));
421 }
422 return newRV_noinc((SV*)av);
423 }
424
425 void from_SV_check(SV* poly_sv, Polygon* THIS)
426 {
427 if (sv_isobject(poly_sv) && !sv_isa(poly_sv, perl_class_name(THIS)) && !sv_isa(poly_sv, perl_class_name_ref(THIS)))
428 CONFESS("Not a valid %s object", perl_class_name(THIS));
429
430 from_SV_check(poly_sv, (MultiPoint*)THIS);
431 }
432
433 void from_SV_check(SV* poly_sv, Polyline* THIS)
434 {
435 if (!sv_isa(poly_sv, perl_class_name(THIS)) && !sv_isa(poly_sv, perl_class_name_ref(THIS)))
436 CONFESS("Not a valid %s object", perl_class_name(THIS));
437
438 from_SV_check(poly_sv, (MultiPoint*)THIS);
439 }
440
441 SV* to_SV_pureperl(const Point* THIS)
442 {
443 AV* av = newAV();
444 av_fill(av, 1);
445 av_store(av, 0, newSViv(THIS->x));
446 av_store(av, 1, newSViv(THIS->y));
447 return newRV_noinc((SV*)av);
448 }
449
450 void from_SV(SV* point_sv, Point* point)
451 {
452 AV* point_av = (AV*)SvRV(point_sv);
453 // get a double from Perl and round it, otherwise
454 // it would get truncated
455 point->x = lrint(SvNV(*av_fetch(point_av, 0, 0)));
456 point->y = lrint(SvNV(*av_fetch(point_av, 1, 0)));
457 }
458
459 void from_SV_check(SV* point_sv, Point* point)
460 {
461 if (sv_isobject(point_sv) && (SvTYPE(SvRV(point_sv)) == SVt_PVMG)) {
462 if (!sv_isa(point_sv, perl_class_name(point)) && !sv_isa(point_sv, perl_class_name_ref(point)))
463 CONFESS("Not a valid %s object (got %s)", perl_class_name(point), HvNAME(SvSTASH(SvRV(point_sv))));
464 *point = *(Point*)SvIV((SV*)SvRV( point_sv ));
465 } else {
466 from_SV(point_sv, point);
467 }
468 }
469
470 SV* to_SV_pureperl(const Pointf* point)
471 {
472 AV* av = newAV();
473 av_fill(av, 1);
474 av_store(av, 0, newSVnv(point->x));
475 av_store(av, 1, newSVnv(point->y));
476 return newRV_noinc((SV*)av);
477 }
478
479 bool from_SV(SV* point_sv, Pointf* point)
480 {
481 AV* point_av = (AV*)SvRV(point_sv);
482 SV* sv_x = *av_fetch(point_av, 0, 0);
483 SV* sv_y = *av_fetch(point_av, 1, 0);
484 if (!looks_like_number(sv_x) || !looks_like_number(sv_y)) return false;
485
486 point->x = SvNV(sv_x);
487 point->y = SvNV(sv_y);
488 return true;
489 }
490
491 bool from_SV_check(SV* point_sv, Pointf* point)
492 {
493 if (sv_isobject(point_sv) && (SvTYPE(SvRV(point_sv)) == SVt_PVMG)) {
494 if (!sv_isa(point_sv, perl_class_name(point)) && !sv_isa(point_sv, perl_class_name_ref(point)))
495 CONFESS("Not a valid %s object (got %s)", perl_class_name(point), HvNAME(SvSTASH(SvRV(point_sv))));
496 *point = *(Pointf*)SvIV((SV*)SvRV( point_sv ));
497 return true;
498 } else {
499 return from_SV(point_sv, point);
500 }
501 }
502
503 void from_SV_check(SV* surface_sv, Surface* THIS)
504 {
505 if (!sv_isa(surface_sv, perl_class_name(THIS)) && !sv_isa(surface_sv, perl_class_name_ref(THIS)))
506 CONFESS("Not a valid %s object", perl_class_name(THIS));
507 // a XS Surface was supplied
508 *THIS = *(Surface *)SvIV((SV*)SvRV( surface_sv ));
509 }
510
511 SV* to_SV(TriangleMesh* THIS)
512 {
513 SV* sv = newSV(0);
514 sv_setref_pv( sv, perl_class_name(THIS), (void*)THIS );
515 return sv;
516 }
517
518 SV*
519 polynode_children_2_perl(const ClipperLib::PolyNode& node)
520 {
521 AV* av = newAV();
522 const int len = node.ChildCount();
523 if (len > 0) av_extend(av, len-1);
524 for (int i = 0; i < len; ++i) {
525 av_store(av, i, polynode2perl(*node.Childs[i]));
526 }
527 return (SV*)newRV_noinc((SV*)av);
528 }
529
530 SV*
531 polynode2perl(const ClipperLib::PolyNode& node)
532 {
533 HV* hv = newHV();
534 Slic3r::Polygon p;
535 ClipperPath_to_Slic3rMultiPoint(node.Contour, &p);
536 if (node.IsHole()) {
537 (void)hv_stores( hv, "hole", Slic3r::perl_to_SV_clone_ref(p) );
538 } else {
539 (void)hv_stores( hv, "outer", Slic3r::perl_to_SV_clone_ref(p) );
540 }
541 (void)hv_stores( hv, "children", polynode_children_2_perl(node) );
542 return (SV*)newRV_noinc((SV*)hv);
543 }
544
545 }
546 #endif
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 #include "shapes.h"
31 #include <iostream>
32
33 namespace p2t {
34
35 Triangle::Triangle(Point& a, Point& b, Point& c)
36 {
37 points_[0] = &a; points_[1] = &b; points_[2] = &c;
38 neighbors_[0] = NULL; neighbors_[1] = NULL; neighbors_[2] = NULL;
39 constrained_edge[0] = constrained_edge[1] = constrained_edge[2] = false;
40 delaunay_edge[0] = delaunay_edge[1] = delaunay_edge[2] = false;
41 interior_ = false;
42 }
43
44 // Update neighbor pointers
45 void Triangle::MarkNeighbor(Point* p1, Point* p2, Triangle* t)
46 {
47 if ((p1 == points_[2] && p2 == points_[1]) || (p1 == points_[1] && p2 == points_[2]))
48 neighbors_[0] = t;
49 else if ((p1 == points_[0] && p2 == points_[2]) || (p1 == points_[2] && p2 == points_[0]))
50 neighbors_[1] = t;
51 else if ((p1 == points_[0] && p2 == points_[1]) || (p1 == points_[1] && p2 == points_[0]))
52 neighbors_[2] = t;
53 else
54 assert(0);
55 }
56
57 // Exhaustive search to update neighbor pointers
58 void Triangle::MarkNeighbor(Triangle& t)
59 {
60 if (t.Contains(points_[1], points_[2])) {
61 neighbors_[0] = &t;
62 t.MarkNeighbor(points_[1], points_[2], this);
63 } else if (t.Contains(points_[0], points_[2])) {
64 neighbors_[1] = &t;
65 t.MarkNeighbor(points_[0], points_[2], this);
66 } else if (t.Contains(points_[0], points_[1])) {
67 neighbors_[2] = &t;
68 t.MarkNeighbor(points_[0], points_[1], this);
69 }
70 }
71
72 /**
73 * Clears all references to all other triangles and points
74 */
75 void Triangle::Clear()
76 {
77 Triangle *t;
78 for( int i=0; i<3; i++ )
79 {
80 t = neighbors_[i];
81 if( t != NULL )
82 {
83 t->ClearNeighbor( this );
84 }
85 }
86 ClearNeighbors();
87 points_[0]=points_[1]=points_[2] = NULL;
88 }
89
90 void Triangle::ClearNeighbor(const Triangle *triangle )
91 {
92 if( neighbors_[0] == triangle )
93 {
94 neighbors_[0] = NULL;
95 }
96 else if( neighbors_[1] == triangle )
97 {
98 neighbors_[1] = NULL;
99 }
100 else
101 {
102 neighbors_[2] = NULL;
103 }
104 }
105
106 void Triangle::ClearNeighbors()
107 {
108 neighbors_[0] = NULL;
109 neighbors_[1] = NULL;
110 neighbors_[2] = NULL;
111 }
112
113 void Triangle::ClearDelunayEdges()
114 {
115 delaunay_edge[0] = delaunay_edge[1] = delaunay_edge[2] = false;
116 }
117
118 Point* Triangle::OppositePoint(Triangle& t, const Point& p)
119 {
120 Point *cw = t.PointCW(p);
121 return PointCW(*cw);
122 }
123
124 // Legalized triangle by rotating clockwise around point(0)
125 void Triangle::Legalize(Point& point)
126 {
127 points_[1] = points_[0];
128 points_[0] = points_[2];
129 points_[2] = &point;
130 }
131
132 // Legalize triagnle by rotating clockwise around oPoint
133 void Triangle::Legalize(Point& opoint, Point& npoint)
134 {
135 if (&opoint == points_[0]) {
136 points_[1] = points_[0];
137 points_[0] = points_[2];
138 points_[2] = &npoint;
139 } else if (&opoint == points_[1]) {
140 points_[2] = points_[1];
141 points_[1] = points_[0];
142 points_[0] = &npoint;
143 } else if (&opoint == points_[2]) {
144 points_[0] = points_[2];
145 points_[2] = points_[1];
146 points_[1] = &npoint;
147 } else {
148 assert(0);
149 }
150 }
151
152 int Triangle::Index(const Point* p) const
153 {
154 if (p == points_[0]) {
155 return 0;
156 } else if (p == points_[1]) {
157 return 1;
158 } else if (p == points_[2]) {
159 return 2;
160 }
161 assert(0);
162 return -1;
163 }
164
165 int Triangle::EdgeIndex(const Point* p1, const Point* p2) const
166 {
167 if (points_[0] == p1) {
168 if (points_[1] == p2) {
169 return 2;
170 } else if (points_[2] == p2) {
171 return 1;
172 }
173 } else if (points_[1] == p1) {
174 if (points_[2] == p2) {
175 return 0;
176 } else if (points_[0] == p2) {
177 return 2;
178 }
179 } else if (points_[2] == p1) {
180 if (points_[0] == p2) {
181 return 1;
182 } else if (points_[1] == p2) {
183 return 0;
184 }
185 }
186 return -1;
187 }
188
189 void Triangle::MarkConstrainedEdge(int index)
190 {
191 constrained_edge[index] = true;
192 }
193
194 void Triangle::MarkConstrainedEdge(Edge& edge)
195 {
196 MarkConstrainedEdge(edge.p, edge.q);
197 }
198
199 // Mark edge as constrained
200 void Triangle::MarkConstrainedEdge(Point* p, Point* q)
201 {
202 if ((q == points_[0] && p == points_[1]) || (q == points_[1] && p == points_[0])) {
203 constrained_edge[2] = true;
204 } else if ((q == points_[0] && p == points_[2]) || (q == points_[2] && p == points_[0])) {
205 constrained_edge[1] = true;
206 } else if ((q == points_[1] && p == points_[2]) || (q == points_[2] && p == points_[1])) {
207 constrained_edge[0] = true;
208 }
209 }
210
211 // The point counter-clockwise to given point
212 Point* Triangle::PointCW(const Point& point)
213 {
214 if (&point == points_[0]) {
215 return points_[2];
216 } else if (&point == points_[1]) {
217 return points_[0];
218 } else if (&point == points_[2]) {
219 return points_[1];
220 }
221 assert(0);
222 return NULL;
223 }
224
225 // The point counter-clockwise to given point
226 Point* Triangle::PointCCW(const Point& point)
227 {
228 if (&point == points_[0]) {
229 return points_[1];
230 } else if (&point == points_[1]) {
231 return points_[2];
232 } else if (&point == points_[2]) {
233 return points_[0];
234 }
235 assert(0);
236 return NULL;
237 }
238
239 // The neighbor clockwise to given point
240 Triangle* Triangle::NeighborCW(const Point& point)
241 {
242 if (&point == points_[0]) {
243 return neighbors_[1];
244 } else if (&point == points_[1]) {
245 return neighbors_[2];
246 }
247 return neighbors_[0];
248 }
249
250 // The neighbor counter-clockwise to given point
251 Triangle* Triangle::NeighborCCW(const Point& point)
252 {
253 if (&point == points_[0]) {
254 return neighbors_[2];
255 } else if (&point == points_[1]) {
256 return neighbors_[0];
257 }
258 return neighbors_[1];
259 }
260
261 bool Triangle::GetConstrainedEdgeCCW(const Point& p) const
262 {
263 if (&p == points_[0]) {
264 return constrained_edge[2];
265 } else if (&p == points_[1]) {
266 return constrained_edge[0];
267 }
268 return constrained_edge[1];
269 }
270
271 bool Triangle::GetConstrainedEdgeCW(const Point& p) const
272 {
273 if (&p == points_[0]) {
274 return constrained_edge[1];
275 } else if (&p == points_[1]) {
276 return constrained_edge[2];
277 }
278 return constrained_edge[0];
279 }
280
281 void Triangle::SetConstrainedEdgeCCW(const Point& p, bool ce)
282 {
283 if (&p == points_[0]) {
284 constrained_edge[2] = ce;
285 } else if (&p == points_[1]) {
286 constrained_edge[0] = ce;
287 } else {
288 constrained_edge[1] = ce;
289 }
290 }
291
292 void Triangle::SetConstrainedEdgeCW(const Point& p, bool ce)
293 {
294 if (&p == points_[0]) {
295 constrained_edge[1] = ce;
296 } else if (&p == points_[1]) {
297 constrained_edge[2] = ce;
298 } else {
299 constrained_edge[0] = ce;
300 }
301 }
302
303 bool Triangle::GetDelunayEdgeCCW(const Point& p) const
304 {
305 if (&p == points_[0]) {
306 return delaunay_edge[2];
307 } else if (&p == points_[1]) {
308 return delaunay_edge[0];
309 }
310 return delaunay_edge[1];
311 }
312
313 bool Triangle::GetDelunayEdgeCW(const Point& p) const
314 {
315 if (&p == points_[0]) {
316 return delaunay_edge[1];
317 } else if (&p == points_[1]) {
318 return delaunay_edge[2];
319 }
320 return delaunay_edge[0];
321 }
322
323 void Triangle::SetDelunayEdgeCCW(const Point& p, bool e)
324 {
325 if (&p == points_[0]) {
326 delaunay_edge[2] = e;
327 } else if (&p == points_[1]) {
328 delaunay_edge[0] = e;
329 } else {
330 delaunay_edge[1] = e;
331 }
332 }
333
334 void Triangle::SetDelunayEdgeCW(const Point& p, bool e)
335 {
336 if (&p == points_[0]) {
337 delaunay_edge[1] = e;
338 } else if (&p == points_[1]) {
339 delaunay_edge[2] = e;
340 } else {
341 delaunay_edge[0] = e;
342 }
343 }
344
345 // The neighbor across to given point
346 Triangle& Triangle::NeighborAcross(const Point& opoint)
347 {
348 if (&opoint == points_[0]) {
349 return *neighbors_[0];
350 } else if (&opoint == points_[1]) {
351 return *neighbors_[1];
352 }
353 return *neighbors_[2];
354 }
355
356 void Triangle::DebugPrint()
357 {
358 using namespace std;
359 cout << points_[0]->x << "," << points_[0]->y << " ";
360 cout << points_[1]->x << "," << points_[1]->y << " ";
361 cout << points_[2]->x << "," << points_[2]->y << endl;
362 }
363
364 }
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 // Include guard
32 #ifndef SHAPES_H
33 #define SHAPES_H
34
35 #include <vector>
36 #include <cstddef>
37 #include <assert.h>
38 #include <cmath>
39
40 namespace p2t {
41
42 struct Edge;
43
44 struct Point {
45
46 double x, y;
47
48 /// Default constructor does nothing (for performance).
49 Point()
50 {
51 x = 0.0;
52 y = 0.0;
53 }
54
55 /// The edges this point constitutes an upper ending point
56 std::vector<Edge*> edge_list;
57
58 /// Construct using coordinates.
59 Point(double x, double y) : x(x), y(y) {}
60
61 /// Set this point to all zeros.
62 void set_zero()
63 {
64 x = 0.0;
65 y = 0.0;
66 }
67
68 /// Set this point to some specified coordinates.
69 void set(double x_, double y_)
70 {
71 x = x_;
72 y = y_;
73 }
74
75 /// Negate this point.
76 Point operator -() const
77 {
78 Point v;
79 v.set(-x, -y);
80 return v;
81 }
82
83 /// Add a point to this point.
84 void operator +=(const Point& v)
85 {
86 x += v.x;
87 y += v.y;
88 }
89
90 /// Subtract a point from this point.
91 void operator -=(const Point& v)
92 {
93 x -= v.x;
94 y -= v.y;
95 }
96
97 /// Multiply this point by a scalar.
98 void operator *=(double a)
99 {
100 x *= a;
101 y *= a;
102 }
103
104 /// Get the length of this point (the norm).
105 double Length() const
106 {
107 return sqrt(x * x + y * y);
108 }
109
110 /// Convert this point into a unit point. Returns the Length.
111 double Normalize()
112 {
113 const double len = Length();
114 x /= len;
115 y /= len;
116 return len;
117 }
118
119 };
120
121 // Represents a simple polygon's edge
122 struct Edge {
123
124 Point* p, *q;
125
126 /// Constructor
127 Edge(Point& p1, Point& p2) : p(&p1), q(&p2)
128 {
129 if (p1.y > p2.y) {
130 q = &p1;
131 p = &p2;
132 } else if (p1.y == p2.y) {
133 if (p1.x > p2.x) {
134 q = &p1;
135 p = &p2;
136 } else if (p1.x == p2.x) {
137 // Repeat points
138 assert(false);
139 }
140 }
141
142 q->edge_list.push_back(this);
143 }
144 };
145
146 // Triangle-based data structures are know to have better performance than quad-edge structures
147 // See: J. Shewchuk, "Triangle: Engineering a 2D Quality Mesh Generator and Delaunay Triangulator"
148 // "Triangulations in CGAL"
149 class Triangle {
150 public:
151
152 /// Constructor
153 Triangle(Point& a, Point& b, Point& c);
154
155 /// Flags to determine if an edge is a Constrained edge
156 bool constrained_edge[3];
157 /// Flags to determine if an edge is a Delauney edge
158 bool delaunay_edge[3];
159
160 Point* GetPoint(int index);
161 Point* PointCW(const Point& point);
162 Point* PointCCW(const Point& point);
163 Point* OppositePoint(Triangle& t, const Point& p);
164
165 Triangle* GetNeighbor(int index);
166 void MarkNeighbor(Point* p1, Point* p2, Triangle* t);
167 void MarkNeighbor(Triangle& t);
168
169 void MarkConstrainedEdge(int index);
170 void MarkConstrainedEdge(Edge& edge);
171 void MarkConstrainedEdge(Point* p, Point* q);
172
173 int Index(const Point* p) const;
174 int EdgeIndex(const Point* p1, const Point* p2) const;
175
176 Triangle* NeighborCW(const Point& point);
177 Triangle* NeighborCCW(const Point& point);
178 bool GetConstrainedEdgeCCW(const Point& p) const;
179 bool GetConstrainedEdgeCW(const Point& p) const;
180 void SetConstrainedEdgeCCW(const Point& p, bool ce);
181 void SetConstrainedEdgeCW(const Point& p, bool ce);
182 bool GetDelunayEdgeCCW(const Point& p) const;
183 bool GetDelunayEdgeCW(const Point& p) const;
184 void SetDelunayEdgeCCW(const Point& p, bool e);
185 void SetDelunayEdgeCW(const Point& p, bool e);
186
187 bool Contains(const Point* p) const;
188 bool Contains(const Edge& e) const;
189 bool Contains(const Point* p, const Point* q) const;
190 void Legalize(Point& point);
191 void Legalize(Point& opoint, Point& npoint);
192 /**
193 * Clears all references to all other triangles and points
194 */
195 void Clear();
196 void ClearNeighbor(const Triangle *triangle);
197 void ClearNeighbors();
198 void ClearDelunayEdges();
199
200 inline bool IsInterior() const;
201 inline void IsInterior(bool b);
202
203 Triangle& NeighborAcross(const Point& opoint);
204
205 void DebugPrint();
206
207 private:
208
209 /// Triangle points
210 Point* points_[3];
211 /// Neighbor list
212 Triangle* neighbors_[3];
213
214 /// Has this triangle been marked as an interior triangle?
215 bool interior_;
216 };
217
218 inline bool cmp(const Point* a, const Point* b)
219 {
220 if (a->y < b->y) {
221 return true;
222 } else if (a->y == b->y) {
223 // Make sure q is point with greater x value
224 if (a->x < b->x) {
225 return true;
226 }
227 }
228 return false;
229 }
230
231 /// Add two points_ component-wise.
232 inline Point operator +(const Point& a, const Point& b)
233 {
234 return Point(a.x + b.x, a.y + b.y);
235 }
236
237 /// Subtract two points_ component-wise.
238 inline Point operator -(const Point& a, const Point& b)
239 {
240 return Point(a.x - b.x, a.y - b.y);
241 }
242
243 /// Multiply point by scalar
244 inline Point operator *(double s, const Point& a)
245 {
246 return Point(s * a.x, s * a.y);
247 }
248
249 inline bool operator ==(const Point& a, const Point& b)
250 {
251 return a.x == b.x && a.y == b.y;
252 }
253
254 inline bool operator !=(const Point& a, const Point& b)
255 {
256 return !(a.x == b.x) && !(a.y == b.y);
257 }
258
259 /// Peform the dot product on two vectors.
260 inline double Dot(const Point& a, const Point& b)
261 {
262 return a.x * b.x + a.y * b.y;
263 }
264
265 /// Perform the cross product on two vectors. In 2D this produces a scalar.
266 inline double Cross(const Point& a, const Point& b)
267 {
268 return a.x * b.y - a.y * b.x;
269 }
270
271 /// Perform the cross product on a point and a scalar. In 2D this produces
272 /// a point.
273 inline Point Cross(const Point& a, double s)
274 {
275 return Point(s * a.y, -s * a.x);
276 }
277
278 /// Perform the cross product on a scalar and a point. In 2D this produces
279 /// a point.
280 inline Point Cross(double s, const Point& a)
281 {
282 return Point(-s * a.y, s * a.x);
283 }
284
285 inline Point* Triangle::GetPoint(int index)
286 {
287 return points_[index];
288 }
289
290 inline Triangle* Triangle::GetNeighbor(int index)
291 {
292 return neighbors_[index];
293 }
294
295 inline bool Triangle::Contains(const Point* p) const
296 {
297 return p == points_[0] || p == points_[1] || p == points_[2];
298 }
299
300 inline bool Triangle::Contains(const Edge& e) const
301 {
302 return Contains(e.p) && Contains(e.q);
303 }
304
305 inline bool Triangle::Contains(const Point* p, const Point* q) const
306 {
307 return Contains(p) && Contains(q);
308 }
309
310 inline bool Triangle::IsInterior() const
311 {
312 return interior_;
313 }
314
315 inline void Triangle::IsInterior(bool b)
316 {
317 interior_ = b;
318 }
319
320 }
321
322 #endif
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #ifndef UTILS_H
32 #define UTILS_H
33
34 // Otherwise #defines like M_PI are undeclared under Visual Studio
35 #define _USE_MATH_DEFINES
36
37 #include <exception>
38 #include <math.h>
39
40 namespace p2t {
41
42 const double PI_3div4 = 3 * M_PI / 4;
43 const double PI_div2 = 1.57079632679489661923;
44 const double EPSILON = 1e-12;
45
46 enum Orientation { CW, CCW, COLLINEAR };
47
48 /**
49 * Forumla to calculate signed area<br>
50 * Positive if CCW<br>
51 * Negative if CW<br>
52 * 0 if collinear<br>
53 * <pre>
54 * A[P1,P2,P3] = (x1*y2 - y1*x2) + (x2*y3 - y2*x3) + (x3*y1 - y3*x1)
55 * = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)
56 * </pre>
57 */
58 Orientation Orient2d(const Point& pa, const Point& pb, const Point& pc)
59 {
60 double detleft = (pa.x - pc.x) * (pb.y - pc.y);
61 double detright = (pa.y - pc.y) * (pb.x - pc.x);
62 double val = detleft - detright;
63 if (val > -EPSILON && val < EPSILON) {
64 return COLLINEAR;
65 } else if (val > 0) {
66 return CCW;
67 }
68 return CW;
69 }
70
71 /*
72 bool InScanArea(Point& pa, Point& pb, Point& pc, Point& pd)
73 {
74 double pdx = pd.x;
75 double pdy = pd.y;
76 double adx = pa.x - pdx;
77 double ady = pa.y - pdy;
78 double bdx = pb.x - pdx;
79 double bdy = pb.y - pdy;
80
81 double adxbdy = adx * bdy;
82 double bdxady = bdx * ady;
83 double oabd = adxbdy - bdxady;
84
85 if (oabd <= EPSILON) {
86 return false;
87 }
88
89 double cdx = pc.x - pdx;
90 double cdy = pc.y - pdy;
91
92 double cdxady = cdx * ady;
93 double adxcdy = adx * cdy;
94 double ocad = cdxady - adxcdy;
95
96 if (ocad <= EPSILON) {
97 return false;
98 }
99
100 return true;
101 }
102
103 */
104
105 bool InScanArea(const Point& pa, const Point& pb, const Point& pc, const Point& pd)
106 {
107 double oadb = (pa.x - pb.x)*(pd.y - pb.y) - (pd.x - pb.x)*(pa.y - pb.y);
108 if (oadb >= -EPSILON) {
109 return false;
110 }
111
112 double oadc = (pa.x - pc.x)*(pd.y - pc.y) - (pd.x - pc.x)*(pa.y - pc.y);
113 if (oadc <= EPSILON) {
114 return false;
115 }
116 return true;
117 }
118
119 }
120
121 #endif
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #ifndef POLY2TRI_H
32 #define POLY2TRI_H
33
34 #include "common/shapes.h"
35 #include "sweep/cdt.h"
36
37 #endif
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 #include "advancing_front.h"
31
32 namespace p2t {
33
34 AdvancingFront::AdvancingFront(Node& head, Node& tail)
35 {
36 head_ = &head;
37 tail_ = &tail;
38 search_node_ = &head;
39 }
40
41 Node* AdvancingFront::LocateNode(double x)
42 {
43 Node* node = search_node_;
44
45 if (x < node->value) {
46 while ((node = node->prev) != NULL) {
47 if (x >= node->value) {
48 search_node_ = node;
49 return node;
50 }
51 }
52 } else {
53 while ((node = node->next) != NULL) {
54 if (x < node->value) {
55 search_node_ = node->prev;
56 return node->prev;
57 }
58 }
59 }
60 return NULL;
61 }
62
63 Node* AdvancingFront::FindSearchNode(double x)
64 {
65 (void)x; // suppress compiler warnings "unused parameter 'x'"
66 // TODO: implement BST index
67 return search_node_;
68 }
69
70 Node* AdvancingFront::LocatePoint(const Point* point)
71 {
72 const double px = point->x;
73 Node* node = FindSearchNode(px);
74 const double nx = node->point->x;
75
76 if (px == nx) {
77 if (point != node->point) {
78 // We might have two nodes with same x value for a short time
79 if (point == node->prev->point) {
80 node = node->prev;
81 } else if (point == node->next->point) {
82 node = node->next;
83 } else {
84 assert(0);
85 }
86 }
87 } else if (px < nx) {
88 while ((node = node->prev) != NULL) {
89 if (point == node->point) {
90 break;
91 }
92 }
93 } else {
94 while ((node = node->next) != NULL) {
95 if (point == node->point)
96 break;
97 }
98 }
99 if(node) search_node_ = node;
100 return node;
101 }
102
103 AdvancingFront::~AdvancingFront()
104 {
105 }
106
107 }
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #ifndef ADVANCED_FRONT_H
32 #define ADVANCED_FRONT_H
33
34 #include "../common/shapes.h"
35
36 namespace p2t {
37
38 struct Node;
39
40 // Advancing front node
41 struct Node {
42 Point* point;
43 Triangle* triangle;
44
45 Node* next;
46 Node* prev;
47
48 double value;
49
50 Node(Point& p) : point(&p), triangle(NULL), next(NULL), prev(NULL), value(p.x)
51 {
52 }
53
54 Node(Point& p, Triangle& t) : point(&p), triangle(&t), next(NULL), prev(NULL), value(p.x)
55 {
56 }
57
58 };
59
60 // Advancing front
61 class AdvancingFront {
62 public:
63
64 AdvancingFront(Node& head, Node& tail);
65 // Destructor
66 ~AdvancingFront();
67
68 Node* head();
69 void set_head(Node* node);
70 Node* tail();
71 void set_tail(Node* node);
72 Node* search();
73 void set_search(Node* node);
74
75 /// Locate insertion point along advancing front
76 Node* LocateNode(double x);
77
78 Node* LocatePoint(const Point* point);
79
80 private:
81
82 Node* head_, *tail_, *search_node_;
83
84 Node* FindSearchNode(double x);
85 };
86
87 inline Node* AdvancingFront::head()
88 {
89 return head_;
90 }
91 inline void AdvancingFront::set_head(Node* node)
92 {
93 head_ = node;
94 }
95
96 inline Node* AdvancingFront::tail()
97 {
98 return tail_;
99 }
100 inline void AdvancingFront::set_tail(Node* node)
101 {
102 tail_ = node;
103 }
104
105 inline Node* AdvancingFront::search()
106 {
107 return search_node_;
108 }
109
110 inline void AdvancingFront::set_search(Node* node)
111 {
112 search_node_ = node;
113 }
114
115 }
116
117 #endif
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 #include "cdt.h"
31
32 namespace p2t {
33
34 CDT::CDT(const std::vector<Point*>& polyline)
35 {
36 sweep_context_ = new SweepContext(polyline);
37 sweep_ = new Sweep;
38 }
39
40 void CDT::AddHole(const std::vector<Point*>& polyline)
41 {
42 sweep_context_->AddHole(polyline);
43 }
44
45 void CDT::AddPoint(Point* point) {
46 sweep_context_->AddPoint(point);
47 }
48
49 void CDT::Triangulate()
50 {
51 sweep_->Triangulate(*sweep_context_);
52 }
53
54 std::vector<p2t::Triangle*> CDT::GetTriangles()
55 {
56 return sweep_context_->GetTriangles();
57 }
58
59 std::list<p2t::Triangle*> CDT::GetMap()
60 {
61 return sweep_context_->GetMap();
62 }
63
64 CDT::~CDT()
65 {
66 delete sweep_context_;
67 delete sweep_;
68 }
69
70 }
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #ifndef CDT_H
32 #define CDT_H
33
34 #include "advancing_front.h"
35 #include "sweep_context.h"
36 #include "sweep.h"
37
38 /**
39 *
40 * @author Mason Green <mason.green@gmail.com>
41 *
42 */
43
44 namespace p2t {
45
46 class CDT
47 {
48 public:
49
50 /**
51 * Constructor - add polyline with non repeating points
52 *
53 * @param polyline
54 */
55 CDT(const std::vector<Point*>& polyline);
56
57 /**
58 * Destructor - clean up memory
59 */
60 ~CDT();
61
62 /**
63 * Add a hole
64 *
65 * @param polyline
66 */
67 void AddHole(const std::vector<Point*>& polyline);
68
69 /**
70 * Add a steiner point
71 *
72 * @param point
73 */
74 void AddPoint(Point* point);
75
76 /**
77 * Triangulate - do this AFTER you've added the polyline, holes, and Steiner points
78 */
79 void Triangulate();
80
81 /**
82 * Get CDT triangles
83 */
84 std::vector<Triangle*> GetTriangles();
85
86 /**
87 * Get triangle map
88 */
89 std::list<Triangle*> GetMap();
90
91 private:
92
93 /**
94 * Internals
95 */
96
97 SweepContext* sweep_context_;
98 Sweep* sweep_;
99
100 };
101
102 }
103
104 #endif
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 #include <stdexcept>
31 #include "sweep.h"
32 #include "sweep_context.h"
33 #include "advancing_front.h"
34 #include "../common/utils.h"
35
36 namespace p2t {
37
38 // Triangulate simple polygon with holes
39 void Sweep::Triangulate(SweepContext& tcx)
40 {
41 tcx.InitTriangulation();
42 tcx.CreateAdvancingFront(nodes_);
43 // Sweep points; build mesh
44 SweepPoints(tcx);
45 // Clean up
46 FinalizationPolygon(tcx);
47 }
48
49 void Sweep::SweepPoints(SweepContext& tcx)
50 {
51 for (size_t i = 1; i < tcx.point_count(); i++) {
52 Point& point = *tcx.GetPoint(i);
53 Node* node = &PointEvent(tcx, point);
54 for (unsigned int i = 0; i < point.edge_list.size(); i++) {
55 EdgeEvent(tcx, point.edge_list[i], node);
56 }
57 }
58 }
59
60 void Sweep::FinalizationPolygon(SweepContext& tcx)
61 {
62 // Get an Internal triangle to start with
63 Triangle* t = tcx.front()->head()->next->triangle;
64 Point* p = tcx.front()->head()->next->point;
65 while (!t->GetConstrainedEdgeCW(*p)) {
66 t = t->NeighborCCW(*p);
67 }
68
69 // Collect interior triangles constrained by edges
70 tcx.MeshClean(*t);
71 }
72
73 Node& Sweep::PointEvent(SweepContext& tcx, Point& point)
74 {
75 Node& node = tcx.LocateNode(point);
76 Node& new_node = NewFrontTriangle(tcx, point, node);
77
78 // Only need to check +epsilon since point never have smaller
79 // x value than node due to how we fetch nodes from the front
80 if (point.x <= node.point->x + EPSILON) {
81 Fill(tcx, node);
82 }
83
84 //tcx.AddNode(new_node);
85
86 FillAdvancingFront(tcx, new_node);
87 return new_node;
88 }
89
90 void Sweep::EdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
91 {
92 tcx.edge_event.constrained_edge = edge;
93 tcx.edge_event.right = (edge->p->x > edge->q->x);
94
95 if (IsEdgeSideOfTriangle(*node->triangle, *edge->p, *edge->q)) {
96 return;
97 }
98
99 // For now we will do all needed filling
100 // TODO: integrate with flip process might give some better performance
101 // but for now this avoid the issue with cases that needs both flips and fills
102 FillEdgeEvent(tcx, edge, node);
103 EdgeEvent(tcx, *edge->p, *edge->q, node->triangle, *edge->q);
104 }
105
106 void Sweep::EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point)
107 {
108 if (IsEdgeSideOfTriangle(*triangle, ep, eq)) {
109 return;
110 }
111
112 Point* p1 = triangle->PointCCW(point);
113 Orientation o1 = Orient2d(eq, *p1, ep);
114 if (o1 == COLLINEAR) {
115 if( triangle->Contains(&eq, p1)) {
116 triangle->MarkConstrainedEdge(&eq, p1 );
117 // We are modifying the constraint maybe it would be better to
118 // not change the given constraint and just keep a variable for the new constraint
119 tcx.edge_event.constrained_edge->q = p1;
120 triangle = &triangle->NeighborAcross(point);
121 EdgeEvent( tcx, ep, *p1, triangle, *p1 );
122 } else {
123 std::runtime_error("EdgeEvent - collinear points not supported");
124 assert(0);
125 }
126 return;
127 }
128
129 Point* p2 = triangle->PointCW(point);
130 Orientation o2 = Orient2d(eq, *p2, ep);
131 if (o2 == COLLINEAR) {
132 if( triangle->Contains(&eq, p2)) {
133 triangle->MarkConstrainedEdge(&eq, p2 );
134 // We are modifying the constraint maybe it would be better to
135 // not change the given constraint and just keep a variable for the new constraint
136 tcx.edge_event.constrained_edge->q = p2;
137 triangle = &triangle->NeighborAcross(point);
138 EdgeEvent( tcx, ep, *p2, triangle, *p2 );
139 } else {
140 std::runtime_error("EdgeEvent - collinear points not supported");
141 assert(0);
142 }
143 return;
144 }
145
146 if (o1 == o2) {
147 // Need to decide if we are rotating CW or CCW to get to a triangle
148 // that will cross edge
149 if (o1 == CW) {
150 triangle = triangle->NeighborCCW(point);
151 } else{
152 triangle = triangle->NeighborCW(point);
153 }
154 EdgeEvent(tcx, ep, eq, triangle, point);
155 } else {
156 // This triangle crosses constraint so lets flippin start!
157 FlipEdgeEvent(tcx, ep, eq, triangle, point);
158 }
159 }
160
161 bool Sweep::IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq)
162 {
163 const int index = triangle.EdgeIndex(&ep, &eq);
164
165 if (index != -1) {
166 triangle.MarkConstrainedEdge(index);
167 Triangle* t = triangle.GetNeighbor(index);
168 if (t) {
169 t->MarkConstrainedEdge(&ep, &eq);
170 }
171 return true;
172 }
173 return false;
174 }
175
176 Node& Sweep::NewFrontTriangle(SweepContext& tcx, Point& point, Node& node)
177 {
178 Triangle* triangle = new Triangle(point, *node.point, *node.next->point);
179
180 triangle->MarkNeighbor(*node.triangle);
181 tcx.AddToMap(triangle);
182
183 Node* new_node = new Node(point);
184 nodes_.push_back(new_node);
185
186 new_node->next = node.next;
187 new_node->prev = &node;
188 node.next->prev = new_node;
189 node.next = new_node;
190
191 if (!Legalize(tcx, *triangle)) {
192 tcx.MapTriangleToNodes(*triangle);
193 }
194
195 return *new_node;
196 }
197
198 void Sweep::Fill(SweepContext& tcx, Node& node)
199 {
200 Triangle* triangle = new Triangle(*node.prev->point, *node.point, *node.next->point);
201
202 // TODO: should copy the constrained_edge value from neighbor triangles
203 // for now constrained_edge values are copied during the legalize
204 triangle->MarkNeighbor(*node.prev->triangle);
205 triangle->MarkNeighbor(*node.triangle);
206
207 tcx.AddToMap(triangle);
208
209 // Update the advancing front
210 node.prev->next = node.next;
211 node.next->prev = node.prev;
212
213 // If it was legalized the triangle has already been mapped
214 if (!Legalize(tcx, *triangle)) {
215 tcx.MapTriangleToNodes(*triangle);
216 }
217
218 }
219
220 void Sweep::FillAdvancingFront(SweepContext& tcx, Node& n)
221 {
222
223 // Fill right holes
224 Node* node = n.next;
225
226 while (node->next) {
227 // if HoleAngle exceeds 90 degrees then break.
228 if (LargeHole_DontFill(node)) break;
229 Fill(tcx, *node);
230 node = node->next;
231 }
232
233 // Fill left holes
234 node = n.prev;
235
236 while (node->prev) {
237 // if HoleAngle exceeds 90 degrees then break.
238 if (LargeHole_DontFill(node)) break;
239 Fill(tcx, *node);
240 node = node->prev;
241 }
242
243 // Fill right basins
244 if (n.next && n.next->next) {
245 const double angle = BasinAngle(n);
246 if (angle < PI_3div4) {
247 FillBasin(tcx, n);
248 }
249 }
250 }
251
252 // True if HoleAngle exceeds 90 degrees.
253 bool Sweep::LargeHole_DontFill(const Node* node) const {
254
255 const Node* nextNode = node->next;
256 const Node* prevNode = node->prev;
257 if (!AngleExceeds90Degrees(node->point, nextNode->point, prevNode->point))
258 return false;
259
260 // Check additional points on front.
261 const Node* next2Node = nextNode->next;
262 // "..Plus.." because only want angles on same side as point being added.
263 if ((next2Node != NULL) && !AngleExceedsPlus90DegreesOrIsNegative(node->point, next2Node->point, prevNode->point))
264 return false;
265
266 const Node* prev2Node = prevNode->prev;
267 // "..Plus.." because only want angles on same side as point being added.
268 if ((prev2Node != NULL) && !AngleExceedsPlus90DegreesOrIsNegative(node->point, nextNode->point, prev2Node->point))
269 return false;
270
271 return true;
272 }
273
274 bool Sweep::AngleExceeds90Degrees(const Point* origin, const Point* pa, const Point* pb) const {
275 const double angle = Angle(origin, pa, pb);
276 return ((angle > PI_div2) || (angle < -PI_div2));
277 }
278
279 bool Sweep::AngleExceedsPlus90DegreesOrIsNegative(const Point* origin, const Point* pa, const Point* pb) const {
280 const double angle = Angle(origin, pa, pb);
281 return (angle > PI_div2) || (angle < 0);
282 }
283
284 double Sweep::Angle(const Point* origin, const Point* pa, const Point* pb) const {
285 /* Complex plane
286 * ab = cosA +i*sinA
287 * ab = (ax + ay*i)(bx + by*i) = (ax*bx + ay*by) + i(ax*by-ay*bx)
288 * atan2(y,x) computes the principal value of the argument function
289 * applied to the complex number x+iy
290 * Where x = ax*bx + ay*by
291 * y = ax*by - ay*bx
292 */
293 const double px = origin->x;
294 const double py = origin->y;
295 const double ax = pa->x- px;
296 const double ay = pa->y - py;
297 const double bx = pb->x - px;
298 const double by = pb->y - py;
299 const double x = ax * by - ay * bx;
300 const double y = ax * bx + ay * by;
301 return atan2(x, y);
302 }
303
304 double Sweep::BasinAngle(const Node& node) const
305 {
306 const double ax = node.point->x - node.next->next->point->x;
307 const double ay = node.point->y - node.next->next->point->y;
308 return atan2(ay, ax);
309 }
310
311 double Sweep::HoleAngle(const Node& node) const
312 {
313 /* Complex plane
314 * ab = cosA +i*sinA
315 * ab = (ax + ay*i)(bx + by*i) = (ax*bx + ay*by) + i(ax*by-ay*bx)
316 * atan2(y,x) computes the principal value of the argument function
317 * applied to the complex number x+iy
318 * Where x = ax*bx + ay*by
319 * y = ax*by - ay*bx
320 */
321 const double ax = node.next->point->x - node.point->x;
322 const double ay = node.next->point->y - node.point->y;
323 const double bx = node.prev->point->x - node.point->x;
324 const double by = node.prev->point->y - node.point->y;
325 return atan2(ax * by - ay * bx, ax * bx + ay * by);
326 }
327
328 bool Sweep::Legalize(SweepContext& tcx, Triangle& t)
329 {
330 // To legalize a triangle we start by finding if any of the three edges
331 // violate the Delaunay condition
332 for (int i = 0; i < 3; i++) {
333 if (t.delaunay_edge[i])
334 continue;
335
336 Triangle* ot = t.GetNeighbor(i);
337
338 if (ot) {
339 Point* p = t.GetPoint(i);
340 Point* op = ot->OppositePoint(t, *p);
341 int oi = ot->Index(op);
342
343 // If this is a Constrained Edge or a Delaunay Edge(only during recursive legalization)
344 // then we should not try to legalize
345 if (ot->constrained_edge[oi] || ot->delaunay_edge[oi]) {
346 t.constrained_edge[i] = ot->constrained_edge[oi];
347 continue;
348 }
349
350 bool inside = Incircle(*p, *t.PointCCW(*p), *t.PointCW(*p), *op);
351
352 if (inside) {
353 // Lets mark this shared edge as Delaunay
354 t.delaunay_edge[i] = true;
355 ot->delaunay_edge[oi] = true;
356
357 // Lets rotate shared edge one vertex CW to legalize it
358 RotateTrianglePair(t, *p, *ot, *op);
359
360 // We now got one valid Delaunay Edge shared by two triangles
361 // This gives us 4 new edges to check for Delaunay
362
363 // Make sure that triangle to node mapping is done only one time for a specific triangle
364 bool not_legalized = !Legalize(tcx, t);
365 if (not_legalized) {
366 tcx.MapTriangleToNodes(t);
367 }
368
369 not_legalized = !Legalize(tcx, *ot);
370 if (not_legalized)
371 tcx.MapTriangleToNodes(*ot);
372
373 // Reset the Delaunay edges, since they only are valid Delaunay edges
374 // until we add a new triangle or point.
375 // XXX: need to think about this. Can these edges be tried after we
376 // return to previous recursive level?
377 t.delaunay_edge[i] = false;
378 ot->delaunay_edge[oi] = false;
379
380 // If triangle have been legalized no need to check the other edges since
381 // the recursive legalization will handles those so we can end here.
382 return true;
383 }
384 }
385 }
386 return false;
387 }
388
389 bool Sweep::Incircle(const Point& pa, const Point& pb, const Point& pc, const Point& pd) const
390 {
391 const double adx = pa.x - pd.x;
392 const double ady = pa.y - pd.y;
393 const double bdx = pb.x - pd.x;
394 const double bdy = pb.y - pd.y;
395
396 const double adxbdy = adx * bdy;
397 const double bdxady = bdx * ady;
398 const double oabd = adxbdy - bdxady;
399
400 if (oabd <= 0)
401 return false;
402
403 const double cdx = pc.x - pd.x;
404 const double cdy = pc.y - pd.y;
405
406 const double cdxady = cdx * ady;
407 const double adxcdy = adx * cdy;
408 const double ocad = cdxady - adxcdy;
409
410 if (ocad <= 0)
411 return false;
412
413 const double bdxcdy = bdx * cdy;
414 const double cdxbdy = cdx * bdy;
415
416 const double alift = adx * adx + ady * ady;
417 const double blift = bdx * bdx + bdy * bdy;
418 const double clift = cdx * cdx + cdy * cdy;
419
420 const double det = alift * (bdxcdy - cdxbdy) + blift * ocad + clift * oabd;
421
422 return det > 0;
423 }
424
425 void Sweep::RotateTrianglePair(Triangle& t, Point& p, Triangle& ot, Point& op) const
426 {
427 Triangle* n1, *n2, *n3, *n4;
428 n1 = t.NeighborCCW(p);
429 n2 = t.NeighborCW(p);
430 n3 = ot.NeighborCCW(op);
431 n4 = ot.NeighborCW(op);
432
433 bool ce1, ce2, ce3, ce4;
434 ce1 = t.GetConstrainedEdgeCCW(p);
435 ce2 = t.GetConstrainedEdgeCW(p);
436 ce3 = ot.GetConstrainedEdgeCCW(op);
437 ce4 = ot.GetConstrainedEdgeCW(op);
438
439 bool de1, de2, de3, de4;
440 de1 = t.GetDelunayEdgeCCW(p);
441 de2 = t.GetDelunayEdgeCW(p);
442 de3 = ot.GetDelunayEdgeCCW(op);
443 de4 = ot.GetDelunayEdgeCW(op);
444
445 t.Legalize(p, op);
446 ot.Legalize(op, p);
447
448 // Remap delaunay_edge
449 ot.SetDelunayEdgeCCW(p, de1);
450 t.SetDelunayEdgeCW(p, de2);
451 t.SetDelunayEdgeCCW(op, de3);
452 ot.SetDelunayEdgeCW(op, de4);
453
454 // Remap constrained_edge
455 ot.SetConstrainedEdgeCCW(p, ce1);
456 t.SetConstrainedEdgeCW(p, ce2);
457 t.SetConstrainedEdgeCCW(op, ce3);
458 ot.SetConstrainedEdgeCW(op, ce4);
459
460 // Remap neighbors
461 // XXX: might optimize the markNeighbor by keeping track of
462 // what side should be assigned to what neighbor after the
463 // rotation. Now mark neighbor does lots of testing to find
464 // the right side.
465 t.ClearNeighbors();
466 ot.ClearNeighbors();
467 if (n1) ot.MarkNeighbor(*n1);
468 if (n2) t.MarkNeighbor(*n2);
469 if (n3) t.MarkNeighbor(*n3);
470 if (n4) ot.MarkNeighbor(*n4);
471 t.MarkNeighbor(ot);
472 }
473
474 void Sweep::FillBasin(SweepContext& tcx, Node& node)
475 {
476 if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) {
477 tcx.basin.left_node = node.next->next;
478 } else {
479 tcx.basin.left_node = node.next;
480 }
481
482 // Find the bottom and right node
483 tcx.basin.bottom_node = tcx.basin.left_node;
484 while (tcx.basin.bottom_node->next
485 && tcx.basin.bottom_node->point->y >= tcx.basin.bottom_node->next->point->y) {
486 tcx.basin.bottom_node = tcx.basin.bottom_node->next;
487 }
488 if (tcx.basin.bottom_node == tcx.basin.left_node) {
489 // No valid basin
490 return;
491 }
492
493 tcx.basin.right_node = tcx.basin.bottom_node;
494 while (tcx.basin.right_node->next
495 && tcx.basin.right_node->point->y < tcx.basin.right_node->next->point->y) {
496 tcx.basin.right_node = tcx.basin.right_node->next;
497 }
498 if (tcx.basin.right_node == tcx.basin.bottom_node) {
499 // No valid basins
500 return;
501 }
502
503 tcx.basin.width = tcx.basin.right_node->point->x - tcx.basin.left_node->point->x;
504 tcx.basin.left_highest = tcx.basin.left_node->point->y > tcx.basin.right_node->point->y;
505
506 FillBasinReq(tcx, tcx.basin.bottom_node);
507 }
508
509 void Sweep::FillBasinReq(SweepContext& tcx, Node* node)
510 {
511 // if shallow stop filling
512 if (IsShallow(tcx, *node)) {
513 return;
514 }
515
516 Fill(tcx, *node);
517
518 if (node->prev == tcx.basin.left_node && node->next == tcx.basin.right_node) {
519 return;
520 } else if (node->prev == tcx.basin.left_node) {
521 Orientation o = Orient2d(*node->point, *node->next->point, *node->next->next->point);
522 if (o == CW) {
523 return;
524 }
525 node = node->next;
526 } else if (node->next == tcx.basin.right_node) {
527 Orientation o = Orient2d(*node->point, *node->prev->point, *node->prev->prev->point);
528 if (o == CCW) {
529 return;
530 }
531 node = node->prev;
532 } else {
533 // Continue with the neighbor node with lowest Y value
534 if (node->prev->point->y < node->next->point->y) {
535 node = node->prev;
536 } else {
537 node = node->next;
538 }
539 }
540
541 FillBasinReq(tcx, node);
542 }
543
544 bool Sweep::IsShallow(SweepContext& tcx, Node& node)
545 {
546 double height;
547
548 if (tcx.basin.left_highest) {
549 height = tcx.basin.left_node->point->y - node.point->y;
550 } else {
551 height = tcx.basin.right_node->point->y - node.point->y;
552 }
553
554 // if shallow stop filling
555 if (tcx.basin.width > height) {
556 return true;
557 }
558 return false;
559 }
560
561 void Sweep::FillEdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
562 {
563 if (tcx.edge_event.right) {
564 FillRightAboveEdgeEvent(tcx, edge, node);
565 } else {
566 FillLeftAboveEdgeEvent(tcx, edge, node);
567 }
568 }
569
570 void Sweep::FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
571 {
572 while (node->next->point->x < edge->p->x) {
573 // Check if next node is below the edge
574 if (Orient2d(*edge->q, *node->next->point, *edge->p) == CCW) {
575 FillRightBelowEdgeEvent(tcx, edge, *node);
576 } else {
577 node = node->next;
578 }
579 }
580 }
581
582 void Sweep::FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
583 {
584 if (node.point->x < edge->p->x) {
585 if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) {
586 // Concave
587 FillRightConcaveEdgeEvent(tcx, edge, node);
588 } else{
589 // Convex
590 FillRightConvexEdgeEvent(tcx, edge, node);
591 // Retry this one
592 FillRightBelowEdgeEvent(tcx, edge, node);
593 }
594 }
595 }
596
597 void Sweep::FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
598 {
599 Fill(tcx, *node.next);
600 if (node.next->point != edge->p) {
601 // Next above or below edge?
602 if (Orient2d(*edge->q, *node.next->point, *edge->p) == CCW) {
603 // Below
604 if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) {
605 // Next is concave
606 FillRightConcaveEdgeEvent(tcx, edge, node);
607 } else {
608 // Next is convex
609 }
610 }
611 }
612
613 }
614
615 void Sweep::FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
616 {
617 // Next concave or convex?
618 if (Orient2d(*node.next->point, *node.next->next->point, *node.next->next->next->point) == CCW) {
619 // Concave
620 FillRightConcaveEdgeEvent(tcx, edge, *node.next);
621 } else{
622 // Convex
623 // Next above or below edge?
624 if (Orient2d(*edge->q, *node.next->next->point, *edge->p) == CCW) {
625 // Below
626 FillRightConvexEdgeEvent(tcx, edge, *node.next);
627 } else{
628 // Above
629 }
630 }
631 }
632
633 void Sweep::FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
634 {
635 while (node->prev->point->x > edge->p->x) {
636 // Check if next node is below the edge
637 if (Orient2d(*edge->q, *node->prev->point, *edge->p) == CW) {
638 FillLeftBelowEdgeEvent(tcx, edge, *node);
639 } else {
640 node = node->prev;
641 }
642 }
643 }
644
645 void Sweep::FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
646 {
647 if (node.point->x > edge->p->x) {
648 if (Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) {
649 // Concave
650 FillLeftConcaveEdgeEvent(tcx, edge, node);
651 } else {
652 // Convex
653 FillLeftConvexEdgeEvent(tcx, edge, node);
654 // Retry this one
655 FillLeftBelowEdgeEvent(tcx, edge, node);
656 }
657 }
658 }
659
660 void Sweep::FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
661 {
662 // Next concave or convex?
663 if (Orient2d(*node.prev->point, *node.prev->prev->point, *node.prev->prev->prev->point) == CW) {
664 // Concave
665 FillLeftConcaveEdgeEvent(tcx, edge, *node.prev);
666 } else{
667 // Convex
668 // Next above or below edge?
669 if (Orient2d(*edge->q, *node.prev->prev->point, *edge->p) == CW) {
670 // Below
671 FillLeftConvexEdgeEvent(tcx, edge, *node.prev);
672 } else{
673 // Above
674 }
675 }
676 }
677
678 void Sweep::FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
679 {
680 Fill(tcx, *node.prev);
681 if (node.prev->point != edge->p) {
682 // Next above or below edge?
683 if (Orient2d(*edge->q, *node.prev->point, *edge->p) == CW) {
684 // Below
685 if (Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) {
686 // Next is concave
687 FillLeftConcaveEdgeEvent(tcx, edge, node);
688 } else{
689 // Next is convex
690 }
691 }
692 }
693
694 }
695
696 void Sweep::FlipEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* t, Point& p)
697 {
698 Triangle& ot = t->NeighborAcross(p);
699 Point& op = *ot.OppositePoint(*t, p);
700
701 if (&ot == NULL) {
702 // If we want to integrate the fillEdgeEvent do it here
703 // With current implementation we should never get here
704 //throw new RuntimeException( "[BUG:FIXME] FLIP failed due to missing triangle");
705 assert(0);
706 }
707
708 if (InScanArea(p, *t->PointCCW(p), *t->PointCW(p), op)) {
709 // Lets rotate shared edge one vertex CW
710 RotateTrianglePair(*t, p, ot, op);
711 tcx.MapTriangleToNodes(*t);
712 tcx.MapTriangleToNodes(ot);
713
714 if (p == eq && op == ep) {
715 if (eq == *tcx.edge_event.constrained_edge->q && ep == *tcx.edge_event.constrained_edge->p) {
716 t->MarkConstrainedEdge(&ep, &eq);
717 ot.MarkConstrainedEdge(&ep, &eq);
718 Legalize(tcx, *t);
719 Legalize(tcx, ot);
720 } else {
721 // XXX: I think one of the triangles should be legalized here?
722 }
723 } else {
724 Orientation o = Orient2d(eq, op, ep);
725 t = &NextFlipTriangle(tcx, (int)o, *t, ot, p, op);
726 FlipEdgeEvent(tcx, ep, eq, t, p);
727 }
728 } else {
729 Point& newP = NextFlipPoint(ep, eq, ot, op);
730 FlipScanEdgeEvent(tcx, ep, eq, *t, ot, newP);
731 EdgeEvent(tcx, ep, eq, t, p);
732 }
733 }
734
735 Triangle& Sweep::NextFlipTriangle(SweepContext& tcx, int o, Triangle& t, Triangle& ot, Point& p, Point& op)
736 {
737 if (o == CCW) {
738 // ot is not crossing edge after flip
739 int edge_index = ot.EdgeIndex(&p, &op);
740 ot.delaunay_edge[edge_index] = true;
741 Legalize(tcx, ot);
742 ot.ClearDelunayEdges();
743 return t;
744 }
745
746 // t is not crossing edge after flip
747 int edge_index = t.EdgeIndex(&p, &op);
748
749 t.delaunay_edge[edge_index] = true;
750 Legalize(tcx, t);
751 t.ClearDelunayEdges();
752 return ot;
753 }
754
755 Point& Sweep::NextFlipPoint(Point& ep, Point& eq, Triangle& ot, Point& op)
756 {
757 Orientation o2d = Orient2d(eq, op, ep);
758 if (o2d == CW) {
759 // Right
760 return *ot.PointCCW(op);
761 } else if (o2d == CCW) {
762 // Left
763 return *ot.PointCW(op);
764 }
765 throw std::runtime_error("[Unsupported] Opposing point on constrained edge");
766 }
767
768 void Sweep::FlipScanEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle& flip_triangle,
769 Triangle& t, Point& p)
770 {
771 Triangle& ot = t.NeighborAcross(p);
772 Point& op = *ot.OppositePoint(t, p);
773
774 if (&t.NeighborAcross(p) == NULL) {
775 // If we want to integrate the fillEdgeEvent do it here
776 // With current implementation we should never get here
777 //throw new RuntimeException( "[BUG:FIXME] FLIP failed due to missing triangle");
778 assert(0);
779 }
780
781 if (InScanArea(eq, *flip_triangle.PointCCW(eq), *flip_triangle.PointCW(eq), op)) {
782 // flip with new edge op->eq
783 FlipEdgeEvent(tcx, eq, op, &ot, op);
784 // TODO: Actually I just figured out that it should be possible to
785 // improve this by getting the next ot and op before the the above
786 // flip and continue the flipScanEdgeEvent here
787 // set new ot and op here and loop back to inScanArea test
788 // also need to set a new flip_triangle first
789 // Turns out at first glance that this is somewhat complicated
790 // so it will have to wait.
791 } else{
792 Point& newP = NextFlipPoint(ep, eq, ot, op);
793 FlipScanEdgeEvent(tcx, ep, eq, flip_triangle, ot, newP);
794 }
795 }
796
797 Sweep::~Sweep() {
798
799 // Clean up memory
800 for(size_t i = 0; i < nodes_.size(); i++) {
801 delete nodes_[i];
802 }
803
804 }
805
806 }
807
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 /**
31 * Sweep-line, Constrained Delauney Triangulation (CDT) See: Domiter, V. and
32 * Zalik, B.(2008)'Sweep-line algorithm for constrained Delaunay triangulation',
33 * International Journal of Geographical Information Science
34 *
35 * "FlipScan" Constrained Edge Algorithm invented by Thomas ?hl?n, thahlen@gmail.com
36 */
37
38 #ifndef SWEEP_H
39 #define SWEEP_H
40
41 #include <vector>
42
43 namespace p2t {
44
45 class SweepContext;
46 struct Node;
47 struct Point;
48 struct Edge;
49 class Triangle;
50
51 class Sweep
52 {
53 public:
54
55 /**
56 * Triangulate
57 *
58 * @param tcx
59 */
60 void Triangulate(SweepContext& tcx);
61
62 /**
63 * Destructor - clean up memory
64 */
65 ~Sweep();
66
67 private:
68
69 /**
70 * Start sweeping the Y-sorted point set from bottom to top
71 *
72 * @param tcx
73 */
74 void SweepPoints(SweepContext& tcx);
75
76 /**
77 * Find closes node to the left of the new point and
78 * create a new triangle. If needed new holes and basins
79 * will be filled to.
80 *
81 * @param tcx
82 * @param point
83 * @return
84 */
85 Node& PointEvent(SweepContext& tcx, Point& point);
86
87 /**
88 *
89 *
90 * @param tcx
91 * @param edge
92 * @param node
93 */
94 void EdgeEvent(SweepContext& tcx, Edge* edge, Node* node);
95
96 void EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point);
97
98 /**
99 * Creates a new front triangle and legalize it
100 *
101 * @param tcx
102 * @param point
103 * @param node
104 * @return
105 */
106 Node& NewFrontTriangle(SweepContext& tcx, Point& point, Node& node);
107
108 /**
109 * Adds a triangle to the advancing front to fill a hole.
110 * @param tcx
111 * @param node - middle node, that is the bottom of the hole
112 */
113 void Fill(SweepContext& tcx, Node& node);
114
115 /**
116 * Returns true if triangle was legalized
117 */
118 bool Legalize(SweepContext& tcx, Triangle& t);
119
120 /**
121 * <b>Requirement</b>:<br>
122 * 1. a,b and c form a triangle.<br>
123 * 2. a and d is know to be on opposite side of bc<br>
124 * <pre>
125 * a
126 * +
127 * / \
128 * / \
129 * b/ \c
130 * +-------+
131 * / d \
132 * / \
133 * </pre>
134 * <b>Fact</b>: d has to be in area B to have a chance to be inside the circle formed by
135 * a,b and c<br>
136 * d is outside B if orient2d(a,b,d) or orient2d(c,a,d) is CW<br>
137 * This preknowledge gives us a way to optimize the incircle test
138 * @param a - triangle point, opposite d
139 * @param b - triangle point
140 * @param c - triangle point
141 * @param d - point opposite a
142 * @return true if d is inside circle, false if on circle edge
143 */
144 bool Incircle(const Point& pa, const Point& pb, const Point& pc, const Point& pd) const;
145
146 /**
147 * Rotates a triangle pair one vertex CW
148 *<pre>
149 * n2 n2
150 * P +-----+ P +-----+
151 * | t /| |\ t |
152 * | / | | \ |
153 * n1| / |n3 n1| \ |n3
154 * | / | after CW | \ |
155 * |/ oT | | oT \|
156 * +-----+ oP +-----+
157 * n4 n4
158 * </pre>
159 */
160 void RotateTrianglePair(Triangle& t, Point& p, Triangle& ot, Point& op) const;
161
162 /**
163 * Fills holes in the Advancing Front
164 *
165 *
166 * @param tcx
167 * @param n
168 */
169 void FillAdvancingFront(SweepContext& tcx, Node& n);
170
171 // Decision-making about when to Fill hole.
172 // Contributed by ToolmakerSteve2
173 bool LargeHole_DontFill(const Node* node) const;
174 bool AngleExceeds90Degrees(const Point* origin, const Point* pa, const Point* pb) const;
175 bool AngleExceedsPlus90DegreesOrIsNegative(const Point* origin, const Point* pa, const Point* pb) const;
176 double Angle(const Point* origin, const Point* pa, const Point* pb) const;
177
178 /**
179 *
180 * @param node - middle node
181 * @return the angle between 3 front nodes
182 */
183 double HoleAngle(const Node& node) const;
184
185 /**
186 * The basin angle is decided against the horizontal line [1,0]
187 */
188 double BasinAngle(const Node& node) const;
189
190 /**
191 * Fills a basin that has formed on the Advancing Front to the right
192 * of given node.<br>
193 * First we decide a left,bottom and right node that forms the
194 * boundaries of the basin. Then we do a reqursive fill.
195 *
196 * @param tcx
197 * @param node - starting node, this or next node will be left node
198 */
199 void FillBasin(SweepContext& tcx, Node& node);
200
201 /**
202 * Recursive algorithm to fill a Basin with triangles
203 *
204 * @param tcx
205 * @param node - bottom_node
206 * @param cnt - counter used to alternate on even and odd numbers
207 */
208 void FillBasinReq(SweepContext& tcx, Node* node);
209
210 bool IsShallow(SweepContext& tcx, Node& node);
211
212 bool IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq);
213
214 void FillEdgeEvent(SweepContext& tcx, Edge* edge, Node* node);
215
216 void FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node);
217
218 void FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
219
220 void FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
221
222 void FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
223
224 void FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node);
225
226 void FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
227
228 void FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
229
230 void FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
231
232 void FlipEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* t, Point& p);
233
234 /**
235 * After a flip we have two triangles and know that only one will still be
236 * intersecting the edge. So decide which to contiune with and legalize the other
237 *
238 * @param tcx
239 * @param o - should be the result of an orient2d( eq, op, ep )
240 * @param t - triangle 1
241 * @param ot - triangle 2
242 * @param p - a point shared by both triangles
243 * @param op - another point shared by both triangles
244 * @return returns the triangle still intersecting the edge
245 */
246 Triangle& NextFlipTriangle(SweepContext& tcx, int o, Triangle& t, Triangle& ot, Point& p, Point& op);
247
248 /**
249 * When we need to traverse from one triangle to the next we need
250 * the point in current triangle that is the opposite point to the next
251 * triangle.
252 *
253 * @param ep
254 * @param eq
255 * @param ot
256 * @param op
257 * @return
258 */
259 Point& NextFlipPoint(Point& ep, Point& eq, Triangle& ot, Point& op);
260
261 /**
262 * Scan part of the FlipScan algorithm<br>
263 * When a triangle pair isn't flippable we will scan for the next
264 * point that is inside the flip triangle scan area. When found
265 * we generate a new flipEdgeEvent
266 *
267 * @param tcx
268 * @param ep - last point on the edge we are traversing
269 * @param eq - first point on the edge we are traversing
270 * @param flipTriangle - the current triangle sharing the point eq with edge
271 * @param t
272 * @param p
273 */
274 void FlipScanEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle& flip_triangle, Triangle& t, Point& p);
275
276 void FinalizationPolygon(SweepContext& tcx);
277
278 std::vector<Node*> nodes_;
279
280 };
281
282 }
283
284 #endif
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 #include "sweep_context.h"
31 #include <algorithm>
32 #include "advancing_front.h"
33
34 namespace p2t {
35
36 SweepContext::SweepContext(const std::vector<Point*>& polyline) : points_(polyline),
37 front_(0),
38 head_(0),
39 tail_(0),
40 af_head_(0),
41 af_middle_(0),
42 af_tail_(0)
43 {
44 InitEdges(points_);
45 }
46
47 void SweepContext::AddHole(const std::vector<Point*>& polyline)
48 {
49 InitEdges(polyline);
50 for(unsigned int i = 0; i < polyline.size(); i++) {
51 points_.push_back(polyline[i]);
52 }
53 }
54
55 void SweepContext::AddPoint(Point* point) {
56 points_.push_back(point);
57 }
58
59 std::vector<Triangle*> &SweepContext::GetTriangles()
60 {
61 return triangles_;
62 }
63
64 std::list<Triangle*> &SweepContext::GetMap()
65 {
66 return map_;
67 }
68
69 void SweepContext::InitTriangulation()
70 {
71 double xmax(points_[0]->x), xmin(points_[0]->x);
72 double ymax(points_[0]->y), ymin(points_[0]->y);
73
74 // Calculate bounds.
75 for (unsigned int i = 0; i < points_.size(); i++) {
76 Point& p = *points_[i];
77 if (p.x > xmax)
78 xmax = p.x;
79 if (p.x < xmin)
80 xmin = p.x;
81 if (p.y > ymax)
82 ymax = p.y;
83 if (p.y < ymin)
84 ymin = p.y;
85 }
86
87 double dx = kAlpha * (xmax - xmin);
88 double dy = kAlpha * (ymax - ymin);
89 head_ = new Point(xmax + dx, ymin - dy);
90 tail_ = new Point(xmin - dx, ymin - dy);
91
92 // Sort points along y-axis
93 std::sort(points_.begin(), points_.end(), cmp);
94
95 }
96
97 void SweepContext::InitEdges(const std::vector<Point*>& polyline)
98 {
99 size_t num_points = polyline.size();
100 for (size_t i = 0; i < num_points; i++) {
101 size_t j = i < num_points - 1 ? i + 1 : 0;
102 edge_list.push_back(new Edge(*polyline[i], *polyline[j]));
103 }
104 }
105
106 Point* SweepContext::GetPoint(size_t index)
107 {
108 return points_[index];
109 }
110
111 void SweepContext::AddToMap(Triangle* triangle)
112 {
113 map_.push_back(triangle);
114 }
115
116 Node& SweepContext::LocateNode(const Point& point)
117 {
118 // TODO implement search tree
119 return *front_->LocateNode(point.x);
120 }
121
122 void SweepContext::CreateAdvancingFront(const std::vector<Node*>& nodes)
123 {
124
125 (void) nodes;
126 // Initial triangle
127 Triangle* triangle = new Triangle(*points_[0], *tail_, *head_);
128
129 map_.push_back(triangle);
130
131 af_head_ = new Node(*triangle->GetPoint(1), *triangle);
132 af_middle_ = new Node(*triangle->GetPoint(0), *triangle);
133 af_tail_ = new Node(*triangle->GetPoint(2));
134 front_ = new AdvancingFront(*af_head_, *af_tail_);
135
136 // TODO: More intuitive if head is middles next and not previous?
137 // so swap head and tail
138 af_head_->next = af_middle_;
139 af_middle_->next = af_tail_;
140 af_middle_->prev = af_head_;
141 af_tail_->prev = af_middle_;
142 }
143
144 void SweepContext::RemoveNode(Node* node)
145 {
146 delete node;
147 }
148
149 void SweepContext::MapTriangleToNodes(Triangle& t)
150 {
151 for (int i = 0; i < 3; i++) {
152 if (!t.GetNeighbor(i)) {
153 Node* n = front_->LocatePoint(t.PointCW(*t.GetPoint(i)));
154 if (n)
155 n->triangle = &t;
156 }
157 }
158 }
159
160 void SweepContext::RemoveFromMap(Triangle* triangle)
161 {
162 map_.remove(triangle);
163 }
164
165 void SweepContext::MeshClean(Triangle& triangle)
166 {
167 std::vector<Triangle *> triangles;
168 triangles.push_back(&triangle);
169
170 while(!triangles.empty()){
171 Triangle *t = triangles.back();
172 triangles.pop_back();
173
174 if (t != NULL && !t->IsInterior()) {
175 t->IsInterior(true);
176 triangles_.push_back(t);
177 for (int i = 0; i < 3; i++) {
178 if (!t->constrained_edge[i])
179 triangles.push_back(t->GetNeighbor(i));
180 }
181 }
182 }
183 }
184
185 SweepContext::~SweepContext()
186 {
187
188 // Clean up memory
189
190 delete head_;
191 delete tail_;
192 delete front_;
193 delete af_head_;
194 delete af_middle_;
195 delete af_tail_;
196
197 typedef std::list<Triangle*> type_list;
198
199 for(type_list::iterator iter = map_.begin(); iter != map_.end(); ++iter) {
200 Triangle* ptr = *iter;
201 delete ptr;
202 }
203
204 for(unsigned int i = 0; i < edge_list.size(); i++) {
205 delete edge_list[i];
206 }
207
208 }
209
210 }
0 /*
1 * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
2 * http://code.google.com/p/poly2tri/
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * * Neither the name of Poly2Tri nor the names of its contributors may be
15 * used to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #ifndef SWEEP_CONTEXT_H
32 #define SWEEP_CONTEXT_H
33
34 #include <list>
35 #include <vector>
36 #include <cstddef>
37
38 namespace p2t {
39
40 // Inital triangle factor, seed triangle will extend 30% of
41 // PointSet width to both left and right.
42 const double kAlpha = 0.3;
43
44 struct Point;
45 class Triangle;
46 struct Node;
47 struct Edge;
48 class AdvancingFront;
49
50 class SweepContext {
51 public:
52
53 /// Constructor
54 SweepContext(const std::vector<Point*>& polyline);
55 /// Destructor
56 ~SweepContext();
57
58 void set_head(Point* p1);
59
60 Point* head() const;
61
62 void set_tail(Point* p1);
63
64 Point* tail() const;
65
66 size_t point_count() const;
67
68 Node& LocateNode(const Point& point);
69
70 void RemoveNode(Node* node);
71
72 void CreateAdvancingFront(const std::vector<Node*>& nodes);
73
74 /// Try to map a node to all sides of this triangle that don't have a neighbor
75 void MapTriangleToNodes(Triangle& t);
76
77 void AddToMap(Triangle* triangle);
78
79 Point* GetPoint(size_t index);
80
81 Point* GetPoints();
82
83 void RemoveFromMap(Triangle* triangle);
84
85 void AddHole(const std::vector<Point*>& polyline);
86
87 void AddPoint(Point* point);
88
89 AdvancingFront* front() const;
90
91 void MeshClean(Triangle& triangle);
92
93 std::vector<Triangle*> &GetTriangles();
94 std::list<Triangle*> &GetMap();
95
96 std::vector<Edge*> edge_list;
97
98 struct Basin {
99 Node* left_node;
100 Node* bottom_node;
101 Node* right_node;
102 double width;
103 bool left_highest;
104
105 Basin() : left_node(NULL), bottom_node(NULL), right_node(NULL), width(0.0), left_highest(false)
106 {
107 }
108
109 void Clear()
110 {
111 left_node = NULL;
112 bottom_node = NULL;
113 right_node = NULL;
114 width = 0.0;
115 left_highest = false;
116 }
117 };
118
119 struct EdgeEvent {
120 Edge* constrained_edge;
121 bool right;
122
123 EdgeEvent() : constrained_edge(NULL), right(false)
124 {
125 }
126 };
127
128 Basin basin;
129 EdgeEvent edge_event;
130
131 private:
132
133 friend class Sweep;
134
135 std::vector<Triangle*> triangles_;
136 std::list<Triangle*> map_;
137 std::vector<Point*> points_;
138
139 // Advancing front
140 AdvancingFront* front_;
141 // head point used with advancing front
142 Point* head_;
143 // tail point used with advancing front
144 Point* tail_;
145
146 Node *af_head_, *af_middle_, *af_tail_;
147
148 void InitTriangulation();
149 void InitEdges(const std::vector<Point*>& polyline);
150
151 };
152
153 inline AdvancingFront* SweepContext::front() const
154 {
155 return front_;
156 }
157
158 inline size_t SweepContext::point_count() const
159 {
160 return points_.size();
161 }
162
163 inline void SweepContext::set_head(Point* p1)
164 {
165 head_ = p1;
166 }
167
168 inline Point* SweepContext::head() const
169 {
170 return head_;
171 }
172
173 inline void SweepContext::set_tail(Point* p1)
174 {
175 tail_ = p1;
176 }
177
178 inline Point* SweepContext::tail() const
179 {
180 return tail_;
181 }
182
183 }
184
185 #endif
0 //Copyright (C) 2011 by Ivan Fratric
1 //
2 //Permission is hereby granted, free of charge, to any person obtaining a copy
3 //of this software and associated documentation files (the "Software"), to deal
4 //in the Software without restriction, including without limitation the rights
5 //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
6 //copies of the Software, and to permit persons to whom the Software is
7 //furnished to do so, subject to the following conditions:
8 //
9 //The above copyright notice and this permission notice shall be included in
10 //all copies or substantial portions of the Software.
11 //
12 //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13 //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15 //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16 //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17 //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
18 //THE SOFTWARE.
19
20
21 #include <stdio.h>
22 #include <string.h>
23 #include <math.h>
24 #include <list>
25 #include <algorithm>
26 #include <set>
27
28 using namespace std;
29
30 #include "polypartition.h"
31
32 #define TPPL_VERTEXTYPE_REGULAR 0
33 #define TPPL_VERTEXTYPE_START 1
34 #define TPPL_VERTEXTYPE_END 2
35 #define TPPL_VERTEXTYPE_SPLIT 3
36 #define TPPL_VERTEXTYPE_MERGE 4
37
38 TPPLPoly::TPPLPoly() {
39 hole = false;
40 numpoints = 0;
41 points = NULL;
42 }
43
44 TPPLPoly::~TPPLPoly() {
45 if(points) delete [] points;
46 }
47
48 void TPPLPoly::Clear() {
49 if(points) delete [] points;
50 hole = false;
51 numpoints = 0;
52 points = NULL;
53 }
54
55 void TPPLPoly::Init(long numpoints) {
56 Clear();
57 this->numpoints = numpoints;
58 points = new TPPLPoint[numpoints];
59 }
60
61 void TPPLPoly::Triangle(TPPLPoint &p1, TPPLPoint &p2, TPPLPoint &p3) {
62 Init(3);
63 points[0] = p1;
64 points[1] = p2;
65 points[2] = p3;
66 }
67
68 TPPLPoly::TPPLPoly(const TPPLPoly &src) {
69 hole = src.hole;
70 numpoints = src.numpoints;
71 points = new TPPLPoint[numpoints];
72 memcpy(points, src.points, numpoints*sizeof(TPPLPoint));
73 }
74
75 TPPLPoly& TPPLPoly::operator=(const TPPLPoly &src) {
76 if(&src != this) {
77 Clear();
78 hole = src.hole;
79 numpoints = src.numpoints;
80 points = new TPPLPoint[numpoints];
81 memcpy(points, src.points, numpoints*sizeof(TPPLPoint));
82 }
83 return *this;
84 }
85
86 int TPPLPoly::GetOrientation() const {
87 long i1,i2;
88 tppl_float area = 0;
89 for(i1=0; i1<numpoints; i1++) {
90 i2 = i1+1;
91 if(i2 == numpoints) i2 = 0;
92 area += points[i1].x * points[i2].y - points[i1].y * points[i2].x;
93 }
94 if(area>0) return TPPL_CCW;
95 if(area<0) return TPPL_CW;
96 return 0;
97 }
98
99 void TPPLPoly::SetOrientation(int orientation) {
100 int polyorientation = GetOrientation();
101 if(polyorientation&&(polyorientation!=orientation)) {
102 Invert();
103 }
104 }
105
106 void TPPLPoly::Invert() {
107 long i;
108 TPPLPoint *invpoints;
109
110 invpoints = new TPPLPoint[numpoints];
111 for(i=0;i<numpoints;i++) {
112 invpoints[i] = points[numpoints-i-1];
113 }
114
115 delete [] points;
116 points = invpoints;
117 }
118
119 TPPLPoint TPPLPartition::Normalize(const TPPLPoint &p) {
120 TPPLPoint r;
121 tppl_float n = sqrt(p.x*p.x + p.y*p.y);
122 if(n!=0) {
123 r = p/n;
124 } else {
125 r.x = 0;
126 r.y = 0;
127 }
128 return r;
129 }
130
131 tppl_float TPPLPartition::Distance(const TPPLPoint &p1, const TPPLPoint &p2) {
132 tppl_float dx,dy;
133 dx = p2.x - p1.x;
134 dy = p2.y - p1.y;
135 return(sqrt(dx*dx + dy*dy));
136 }
137
138 //checks if two lines intersect
139 int TPPLPartition::Intersects(TPPLPoint &p11, TPPLPoint &p12, TPPLPoint &p21, TPPLPoint &p22) {
140 if((p11.x == p21.x)&&(p11.y == p21.y)) return 0;
141 if((p11.x == p22.x)&&(p11.y == p22.y)) return 0;
142 if((p12.x == p21.x)&&(p12.y == p21.y)) return 0;
143 if((p12.x == p22.x)&&(p12.y == p22.y)) return 0;
144
145 TPPLPoint v1ort,v2ort,v;
146 tppl_float dot11,dot12,dot21,dot22;
147
148 v1ort.x = p12.y-p11.y;
149 v1ort.y = p11.x-p12.x;
150
151 v2ort.x = p22.y-p21.y;
152 v2ort.y = p21.x-p22.x;
153
154 v = p21-p11;
155 dot21 = v.x*v1ort.x + v.y*v1ort.y;
156 v = p22-p11;
157 dot22 = v.x*v1ort.x + v.y*v1ort.y;
158
159 v = p11-p21;
160 dot11 = v.x*v2ort.x + v.y*v2ort.y;
161 v = p12-p21;
162 dot12 = v.x*v2ort.x + v.y*v2ort.y;
163
164 if(dot11*dot12>0) return 0;
165 if(dot21*dot22>0) return 0;
166
167 return 1;
168 }
169
170 //removes holes from inpolys by merging them with non-holes
171 int TPPLPartition::RemoveHoles(list<TPPLPoly> *inpolys, list<TPPLPoly> *outpolys) {
172 list<TPPLPoly> polys;
173 list<TPPLPoly>::iterator holeiter,polyiter,iter,iter2;
174 long i,i2,holepointindex,polypointindex = 0;
175 TPPLPoint holepoint,polypoint,bestpolypoint;
176 TPPLPoint linep1,linep2;
177 TPPLPoint v1,v2;
178 TPPLPoly newpoly;
179 bool hasholes;
180 bool pointvisible;
181 bool pointfound;
182
183 //check for trivial case (no holes)
184 hasholes = false;
185 for(iter = inpolys->begin(); iter!=inpolys->end(); ++iter) {
186 if(iter->IsHole()) {
187 hasholes = true;
188 break;
189 }
190 }
191 if(!hasholes) {
192 for(iter = inpolys->begin(); iter!=inpolys->end(); ++iter) {
193 outpolys->push_back(*iter);
194 }
195 return 1;
196 }
197
198 polys = *inpolys;
199
200 while(1) {
201 //find the hole point with the largest x
202 hasholes = false;
203 for(iter = polys.begin(); iter!=polys.end(); ++iter) {
204 if(!iter->IsHole()) continue;
205
206 if(!hasholes) {
207 hasholes = true;
208 holeiter = iter;
209 holepointindex = 0;
210 }
211
212 for(i=0; i < iter->GetNumPoints(); i++) {
213 if(iter->GetPoint(i).x > holeiter->GetPoint(holepointindex).x) {
214 holeiter = iter;
215 holepointindex = i;
216 }
217 }
218 }
219 if(!hasholes) break;
220 holepoint = holeiter->GetPoint(holepointindex);
221
222 pointfound = false;
223 for(iter = polys.begin(); iter!=polys.end(); ++iter) {
224 if(iter->IsHole()) continue;
225 for(i=0; i < iter->GetNumPoints(); i++) {
226 if(iter->GetPoint(i).x <= holepoint.x) continue;
227 if(!InCone(iter->GetPoint((i+iter->GetNumPoints()-1)%(iter->GetNumPoints())),
228 iter->GetPoint(i),
229 iter->GetPoint((i+1)%(iter->GetNumPoints())),
230 holepoint))
231 continue;
232 polypoint = iter->GetPoint(i);
233 if(pointfound) {
234 v1 = Normalize(polypoint-holepoint);
235 v2 = Normalize(bestpolypoint-holepoint);
236 if(v2.x > v1.x) continue;
237 }
238 pointvisible = true;
239 for(iter2 = polys.begin(); iter2!=polys.end(); ++iter2) {
240 if(iter2->IsHole()) continue;
241 for(i2=0; i2 < iter2->GetNumPoints(); i2++) {
242 linep1 = iter2->GetPoint(i2);
243 linep2 = iter2->GetPoint((i2+1)%(iter2->GetNumPoints()));
244 if(Intersects(holepoint,polypoint,linep1,linep2)) {
245 pointvisible = false;
246 break;
247 }
248 }
249 if(!pointvisible) break;
250 }
251 if(pointvisible) {
252 pointfound = true;
253 bestpolypoint = polypoint;
254 polyiter = iter;
255 polypointindex = i;
256 }
257 }
258 }
259
260 if(!pointfound) return 0;
261
262 newpoly.Init(holeiter->GetNumPoints() + polyiter->GetNumPoints() + 2);
263 i2 = 0;
264 for(i=0;i<=polypointindex;i++) {
265 newpoly[i2] = polyiter->GetPoint(i);
266 i2++;
267 }
268 for(i=0;i<=holeiter->GetNumPoints();i++) {
269 newpoly[i2] = holeiter->GetPoint((i+holepointindex)%holeiter->GetNumPoints());
270 i2++;
271 }
272 for(i=polypointindex;i<polyiter->GetNumPoints();i++) {
273 newpoly[i2] = polyiter->GetPoint(i);
274 i2++;
275 }
276
277 polys.erase(holeiter);
278 polys.erase(polyiter);
279 polys.push_back(newpoly);
280 }
281
282 for(iter = polys.begin(); iter!=polys.end(); ++iter) {
283 outpolys->push_back(*iter);
284 }
285
286 return 1;
287 }
288
289 bool TPPLPartition::IsConvex(TPPLPoint& p1, TPPLPoint& p2, TPPLPoint& p3) {
290 tppl_float tmp;
291 tmp = (p3.y-p1.y)*(p2.x-p1.x)-(p3.x-p1.x)*(p2.y-p1.y);
292 if(tmp>0) return 1;
293 else return 0;
294 }
295
296 bool TPPLPartition::IsReflex(TPPLPoint& p1, TPPLPoint& p2, TPPLPoint& p3) {
297 tppl_float tmp;
298 tmp = (p3.y-p1.y)*(p2.x-p1.x)-(p3.x-p1.x)*(p2.y-p1.y);
299 if(tmp<0) return 1;
300 else return 0;
301 }
302
303 bool TPPLPartition::IsInside(TPPLPoint& p1, TPPLPoint& p2, TPPLPoint& p3, TPPLPoint &p) {
304 if(IsConvex(p1,p,p2)) return false;
305 if(IsConvex(p2,p,p3)) return false;
306 if(IsConvex(p3,p,p1)) return false;
307 return true;
308 }
309
310 bool TPPLPartition::InCone(TPPLPoint &p1, TPPLPoint &p2, TPPLPoint &p3, TPPLPoint &p) {
311 bool convex;
312
313 convex = IsConvex(p1,p2,p3);
314
315 if(convex) {
316 if(!IsConvex(p1,p2,p)) return false;
317 if(!IsConvex(p2,p3,p)) return false;
318 return true;
319 } else {
320 if(IsConvex(p1,p2,p)) return true;
321 if(IsConvex(p2,p3,p)) return true;
322 return false;
323 }
324 }
325
326 bool TPPLPartition::InCone(PartitionVertex *v, TPPLPoint &p) {
327 TPPLPoint p1,p2,p3;
328
329 p1 = v->previous->p;
330 p2 = v->p;
331 p3 = v->next->p;
332
333 return InCone(p1,p2,p3,p);
334 }
335
336 void TPPLPartition::UpdateVertexReflexity(PartitionVertex *v) {
337 PartitionVertex *v1,*v3;
338 v1 = v->previous;
339 v3 = v->next;
340 v->isConvex = !IsReflex(v1->p,v->p,v3->p);
341 }
342
343 void TPPLPartition::UpdateVertex(PartitionVertex *v, PartitionVertex *vertices, long numvertices) {
344 long i;
345 PartitionVertex *v1,*v3;
346 TPPLPoint vec1,vec3;
347
348 v1 = v->previous;
349 v3 = v->next;
350
351 v->isConvex = IsConvex(v1->p,v->p,v3->p);
352
353 vec1 = Normalize(v1->p - v->p);
354 vec3 = Normalize(v3->p - v->p);
355 v->angle = vec1.x*vec3.x + vec1.y*vec3.y;
356
357 if(v->isConvex) {
358 v->isEar = true;
359 for(i=0;i<numvertices;i++) {
360 if((vertices[i].p.x==v->p.x)&&(vertices[i].p.y==v->p.y)) continue;
361 if((vertices[i].p.x==v1->p.x)&&(vertices[i].p.y==v1->p.y)) continue;
362 if((vertices[i].p.x==v3->p.x)&&(vertices[i].p.y==v3->p.y)) continue;
363 if(IsInside(v1->p,v->p,v3->p,vertices[i].p)) {
364 v->isEar = false;
365 break;
366 }
367 }
368 } else {
369 v->isEar = false;
370 }
371 }
372
373 //triangulation by ear removal
374 int TPPLPartition::Triangulate_EC(TPPLPoly *poly, list<TPPLPoly> *triangles) {
375 long numvertices;
376 PartitionVertex *vertices;
377 PartitionVertex *ear;
378 TPPLPoly triangle;
379 long i,j;
380 bool earfound;
381
382 if(poly->GetNumPoints() < 3) return 0;
383 if(poly->GetNumPoints() == 3) {
384 triangles->push_back(*poly);
385 return 1;
386 }
387
388 numvertices = poly->GetNumPoints();
389
390 vertices = new PartitionVertex[numvertices];
391 for(i=0;i<numvertices;i++) {
392 vertices[i].isActive = true;
393 vertices[i].p = poly->GetPoint(i);
394 if(i==(numvertices-1)) vertices[i].next=&(vertices[0]);
395 else vertices[i].next=&(vertices[i+1]);
396 if(i==0) vertices[i].previous = &(vertices[numvertices-1]);
397 else vertices[i].previous = &(vertices[i-1]);
398 }
399 for(i=0;i<numvertices;i++) {
400 UpdateVertex(&vertices[i],vertices,numvertices);
401 }
402
403 for(i=0;i<numvertices-3;i++) {
404 earfound = false;
405 //find the most extruded ear
406 for(j=0;j<numvertices;j++) {
407 if(!vertices[j].isActive) continue;
408 if(!vertices[j].isEar) continue;
409 if(!earfound) {
410 earfound = true;
411 ear = &(vertices[j]);
412 } else {
413 if(vertices[j].angle > ear->angle) {
414 ear = &(vertices[j]);
415 }
416 }
417 }
418 if(!earfound) {
419 delete [] vertices;
420 return 0;
421 }
422
423 triangle.Triangle(ear->previous->p,ear->p,ear->next->p);
424 triangles->push_back(triangle);
425
426 ear->isActive = false;
427 ear->previous->next = ear->next;
428 ear->next->previous = ear->previous;
429
430 if(i==numvertices-4) break;
431
432 UpdateVertex(ear->previous,vertices,numvertices);
433 UpdateVertex(ear->next,vertices,numvertices);
434 }
435 for(i=0;i<numvertices;i++) {
436 if(vertices[i].isActive) {
437 triangle.Triangle(vertices[i].previous->p,vertices[i].p,vertices[i].next->p);
438 triangles->push_back(triangle);
439 break;
440 }
441 }
442
443 delete [] vertices;
444
445 return 1;
446 }
447
448 int TPPLPartition::Triangulate_EC(list<TPPLPoly> *inpolys, list<TPPLPoly> *triangles) {
449 list<TPPLPoly> outpolys;
450 list<TPPLPoly>::iterator iter;
451
452 if(!RemoveHoles(inpolys,&outpolys)) return 0;
453 for(iter=outpolys.begin();iter!=outpolys.end();++iter) {
454 if(!Triangulate_EC(&(*iter),triangles)) return 0;
455 }
456 return 1;
457 }
458
459 int TPPLPartition::ConvexPartition_HM(TPPLPoly *poly, list<TPPLPoly> *parts) {
460 list<TPPLPoly> triangles;
461 list<TPPLPoly>::iterator iter1,iter2;
462 TPPLPoly *poly1,*poly2;
463 TPPLPoly newpoly;
464 TPPLPoint d1,d2,p1,p2,p3;
465 long i11,i12,i21,i22,i13,i23,j,k;
466 bool isdiagonal;
467 long numreflex;
468
469 //check if the poly is already convex
470 numreflex = 0;
471 for(i11=0;i11<poly->GetNumPoints();i11++) {
472 if(i11==0) i12 = poly->GetNumPoints()-1;
473 else i12=i11-1;
474 if(i11==(poly->GetNumPoints()-1)) i13=0;
475 else i13=i11+1;
476 if(IsReflex(poly->GetPoint(i12),poly->GetPoint(i11),poly->GetPoint(i13))) {
477 numreflex = 1;
478 break;
479 }
480 }
481 if(numreflex == 0) {
482 parts->push_back(*poly);
483 return 1;
484 }
485
486 if(!Triangulate_EC(poly,&triangles)) return 0;
487
488 for(iter1 = triangles.begin(); iter1 != triangles.end(); ++iter1) {
489 poly1 = &(*iter1);
490 for(i11=0;i11<poly1->GetNumPoints();i11++) {
491 d1 = poly1->GetPoint(i11);
492 i12 = (i11+1)%(poly1->GetNumPoints());
493 d2 = poly1->GetPoint(i12);
494
495 isdiagonal = false;
496 for(iter2 = iter1; iter2 != triangles.end(); ++iter2) {
497 if(iter1 == iter2) continue;
498 poly2 = &(*iter2);
499
500 for(i21=0;i21<poly2->GetNumPoints();i21++) {
501 if((d2.x != poly2->GetPoint(i21).x)||(d2.y != poly2->GetPoint(i21).y)) continue;
502 i22 = (i21+1)%(poly2->GetNumPoints());
503 if((d1.x != poly2->GetPoint(i22).x)||(d1.y != poly2->GetPoint(i22).y)) continue;
504 isdiagonal = true;
505 break;
506 }
507 if(isdiagonal) break;
508 }
509
510 if(!isdiagonal) continue;
511
512 p2 = poly1->GetPoint(i11);
513 if(i11 == 0) i13 = poly1->GetNumPoints()-1;
514 else i13 = i11-1;
515 p1 = poly1->GetPoint(i13);
516 if(i22 == (poly2->GetNumPoints()-1)) i23 = 0;
517 else i23 = i22+1;
518 p3 = poly2->GetPoint(i23);
519
520 if(!IsConvex(p1,p2,p3)) continue;
521
522 p2 = poly1->GetPoint(i12);
523 if(i12 == (poly1->GetNumPoints()-1)) i13 = 0;
524 else i13 = i12+1;
525 p3 = poly1->GetPoint(i13);
526 if(i21 == 0) i23 = poly2->GetNumPoints()-1;
527 else i23 = i21-1;
528 p1 = poly2->GetPoint(i23);
529
530 if(!IsConvex(p1,p2,p3)) continue;
531
532 newpoly.Init(poly1->GetNumPoints()+poly2->GetNumPoints()-2);
533 k = 0;
534 for(j=i12;j!=i11;j=(j+1)%(poly1->GetNumPoints())) {
535 newpoly[k] = poly1->GetPoint(j);
536 k++;
537 }
538 for(j=i22;j!=i21;j=(j+1)%(poly2->GetNumPoints())) {
539 newpoly[k] = poly2->GetPoint(j);
540 k++;
541 }
542
543 triangles.erase(iter2);
544 *iter1 = newpoly;
545 poly1 = &(*iter1);
546 i11 = -1;
547
548 continue;
549 }
550 }
551
552 for(iter1 = triangles.begin(); iter1 != triangles.end(); ++iter1) {
553 parts->push_back(*iter1);
554 }
555
556 return 1;
557 }
558
559 int TPPLPartition::ConvexPartition_HM(list<TPPLPoly> *inpolys, list<TPPLPoly> *parts) {
560 list<TPPLPoly> outpolys;
561 list<TPPLPoly>::iterator iter;
562
563 if(!RemoveHoles(inpolys,&outpolys)) return 0;
564 for(iter=outpolys.begin();iter!=outpolys.end();++iter) {
565 if(!ConvexPartition_HM(&(*iter),parts)) return 0;
566 }
567 return 1;
568 }
569
570 //minimum-weight polygon triangulation by dynamic programming
571 //O(n^3) time complexity
572 //O(n^2) space complexity
573 int TPPLPartition::Triangulate_OPT(TPPLPoly *poly, list<TPPLPoly> *triangles) {
574 long i,j,k,gap,n;
575 DPState **dpstates;
576 TPPLPoint p1,p2,p3,p4;
577 long bestvertex;
578 tppl_float weight,minweight,d1,d2;
579 Diagonal diagonal,newdiagonal;
580 list<Diagonal> diagonals;
581 TPPLPoly triangle;
582 int ret = 1;
583
584 n = poly->GetNumPoints();
585 dpstates = new DPState *[n];
586 for(i=1;i<n;i++) {
587 dpstates[i] = new DPState[i];
588 }
589
590 //init states and visibility
591 for(i=0;i<(n-1);i++) {
592 p1 = poly->GetPoint(i);
593 for(j=i+1;j<n;j++) {
594 dpstates[j][i].visible = true;
595 dpstates[j][i].weight = 0;
596 dpstates[j][i].bestvertex = -1;
597 if(j!=(i+1)) {
598 p2 = poly->GetPoint(j);
599
600 //visibility check
601 if(i==0) p3 = poly->GetPoint(n-1);
602 else p3 = poly->GetPoint(i-1);
603 if(i==(n-1)) p4 = poly->GetPoint(0);
604 else p4 = poly->GetPoint(i+1);
605 if(!InCone(p3,p1,p4,p2)) {
606 dpstates[j][i].visible = false;
607 continue;
608 }
609
610 if(j==0) p3 = poly->GetPoint(n-1);
611 else p3 = poly->GetPoint(j-1);
612 if(j==(n-1)) p4 = poly->GetPoint(0);
613 else p4 = poly->GetPoint(j+1);
614 if(!InCone(p3,p2,p4,p1)) {
615 dpstates[j][i].visible = false;
616 continue;
617 }
618
619 for(k=0;k<n;k++) {
620 p3 = poly->GetPoint(k);
621 if(k==(n-1)) p4 = poly->GetPoint(0);
622 else p4 = poly->GetPoint(k+1);
623 if(Intersects(p1,p2,p3,p4)) {
624 dpstates[j][i].visible = false;
625 break;
626 }
627 }
628 }
629 }
630 }
631 dpstates[n-1][0].visible = true;
632 dpstates[n-1][0].weight = 0;
633 dpstates[n-1][0].bestvertex = -1;
634
635 for(gap = 2; gap<n; gap++) {
636 for(i=0; i<(n-gap); i++) {
637 j = i+gap;
638 if(!dpstates[j][i].visible) continue;
639 bestvertex = -1;
640 for(k=(i+1);k<j;k++) {
641 if(!dpstates[k][i].visible) continue;
642 if(!dpstates[j][k].visible) continue;
643
644 if(k<=(i+1)) d1=0;
645 else d1 = Distance(poly->GetPoint(i),poly->GetPoint(k));
646 if(j<=(k+1)) d2=0;
647 else d2 = Distance(poly->GetPoint(k),poly->GetPoint(j));
648
649 weight = dpstates[k][i].weight + dpstates[j][k].weight + d1 + d2;
650
651 if((bestvertex == -1)||(weight<minweight)) {
652 bestvertex = k;
653 minweight = weight;
654 }
655 }
656 if(bestvertex == -1) {
657 for(i=1;i<n;i++) {
658 delete [] dpstates[i];
659 }
660 delete [] dpstates;
661
662 return 0;
663 }
664
665 dpstates[j][i].bestvertex = bestvertex;
666 dpstates[j][i].weight = minweight;
667 }
668 }
669
670 newdiagonal.index1 = 0;
671 newdiagonal.index2 = n-1;
672 diagonals.push_back(newdiagonal);
673 while(!diagonals.empty()) {
674 diagonal = *(diagonals.begin());
675 diagonals.pop_front();
676 bestvertex = dpstates[diagonal.index2][diagonal.index1].bestvertex;
677 if(bestvertex == -1) {
678 ret = 0;
679 break;
680 }
681 triangle.Triangle(poly->GetPoint(diagonal.index1),poly->GetPoint(bestvertex),poly->GetPoint(diagonal.index2));
682 triangles->push_back(triangle);
683 if(bestvertex > (diagonal.index1+1)) {
684 newdiagonal.index1 = diagonal.index1;
685 newdiagonal.index2 = bestvertex;
686 diagonals.push_back(newdiagonal);
687 }
688 if(diagonal.index2 > (bestvertex+1)) {
689 newdiagonal.index1 = bestvertex;
690 newdiagonal.index2 = diagonal.index2;
691 diagonals.push_back(newdiagonal);
692 }
693 }
694
695 for(i=1;i<n;i++) {
696 delete [] dpstates[i];
697 }
698 delete [] dpstates;
699
700 return ret;
701 }
702
703 void TPPLPartition::UpdateState(long a, long b, long w, long i, long j, DPState2 **dpstates) {
704 Diagonal newdiagonal;
705 list<Diagonal> *pairs;
706 long w2;
707
708 w2 = dpstates[a][b].weight;
709 if(w>w2) return;
710
711 pairs = &(dpstates[a][b].pairs);
712 newdiagonal.index1 = i;
713 newdiagonal.index2 = j;
714
715 if(w<w2) {
716 pairs->clear();
717 pairs->push_front(newdiagonal);
718 dpstates[a][b].weight = w;
719 } else {
720 if((!pairs->empty())&&(i <= pairs->begin()->index1)) return;
721 while((!pairs->empty())&&(pairs->begin()->index2 >= j)) pairs->pop_front();
722 pairs->push_front(newdiagonal);
723 }
724 }
725
726 void TPPLPartition::TypeA(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates) {
727 list<Diagonal> *pairs;
728 list<Diagonal>::iterator iter,lastiter;
729 long top;
730 long w;
731
732 if(!dpstates[i][j].visible) return;
733 top = j;
734 w = dpstates[i][j].weight;
735 if(k-j > 1) {
736 if (!dpstates[j][k].visible) return;
737 w += dpstates[j][k].weight + 1;
738 }
739 if(j-i > 1) {
740 pairs = &(dpstates[i][j].pairs);
741 iter = pairs->end();
742 lastiter = pairs->end();
743 while(iter!=pairs->begin()) {
744 --iter;
745 if(!IsReflex(vertices[iter->index2].p,vertices[j].p,vertices[k].p)) lastiter = iter;
746 else break;
747 }
748 if(lastiter == pairs->end()) w++;
749 else {
750 if(IsReflex(vertices[k].p,vertices[i].p,vertices[lastiter->index1].p)) w++;
751 else top = lastiter->index1;
752 }
753 }
754 UpdateState(i,k,w,top,j,dpstates);
755 }
756
757 void TPPLPartition::TypeB(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates) {
758 list<Diagonal> *pairs;
759 list<Diagonal>::iterator iter,lastiter;
760 long top;
761 long w;
762
763 if(!dpstates[j][k].visible) return;
764 top = j;
765 w = dpstates[j][k].weight;
766
767 if (j-i > 1) {
768 if (!dpstates[i][j].visible) return;
769 w += dpstates[i][j].weight + 1;
770 }
771 if (k-j > 1) {
772 pairs = &(dpstates[j][k].pairs);
773
774 iter = pairs->begin();
775 if((!pairs->empty())&&(!IsReflex(vertices[i].p,vertices[j].p,vertices[iter->index1].p))) {
776 lastiter = iter;
777 while(iter!=pairs->end()) {
778 if(!IsReflex(vertices[i].p,vertices[j].p,vertices[iter->index1].p)) {
779 lastiter = iter;
780 ++iter;
781 }
782 else break;
783 }
784 if(IsReflex(vertices[lastiter->index2].p,vertices[k].p,vertices[i].p)) w++;
785 else top = lastiter->index2;
786 } else w++;
787 }
788 UpdateState(i,k,w,j,top,dpstates);
789 }
790
791 int TPPLPartition::ConvexPartition_OPT(TPPLPoly *poly, list<TPPLPoly> *parts) {
792 TPPLPoint p1,p2,p3,p4;
793 PartitionVertex *vertices;
794 DPState2 **dpstates;
795 long i,j,k,n,gap;
796 list<Diagonal> diagonals,diagonals2;
797 Diagonal diagonal,newdiagonal;
798 list<Diagonal> *pairs,*pairs2;
799 list<Diagonal>::iterator iter,iter2;
800 int ret;
801 TPPLPoly newpoly;
802 list<long> indices;
803 list<long>::iterator iiter;
804 bool ijreal,jkreal;
805
806 n = poly->GetNumPoints();
807 vertices = new PartitionVertex[n];
808
809 dpstates = new DPState2 *[n];
810 for(i=0;i<n;i++) {
811 dpstates[i] = new DPState2[n];
812 }
813
814 //init vertex information
815 for(i=0;i<n;i++) {
816 vertices[i].p = poly->GetPoint(i);
817 vertices[i].isActive = true;
818 if(i==0) vertices[i].previous = &(vertices[n-1]);
819 else vertices[i].previous = &(vertices[i-1]);
820 if(i==(poly->GetNumPoints()-1)) vertices[i].next = &(vertices[0]);
821 else vertices[i].next = &(vertices[i+1]);
822 }
823 for(i=1;i<n;i++) {
824 UpdateVertexReflexity(&(vertices[i]));
825 }
826
827 //init states and visibility
828 for(i=0;i<(n-1);i++) {
829 p1 = poly->GetPoint(i);
830 for(j=i+1;j<n;j++) {
831 dpstates[i][j].visible = true;
832 if(j==i+1) {
833 dpstates[i][j].weight = 0;
834 } else {
835 dpstates[i][j].weight = 2147483647;
836 }
837 if(j!=(i+1)) {
838 p2 = poly->GetPoint(j);
839
840 //visibility check
841 if(!InCone(&vertices[i],p2)) {
842 dpstates[i][j].visible = false;
843 continue;
844 }
845 if(!InCone(&vertices[j],p1)) {
846 dpstates[i][j].visible = false;
847 continue;
848 }
849
850 for(k=0;k<n;k++) {
851 p3 = poly->GetPoint(k);
852 if(k==(n-1)) p4 = poly->GetPoint(0);
853 else p4 = poly->GetPoint(k+1);
854 if(Intersects(p1,p2,p3,p4)) {
855 dpstates[i][j].visible = false;
856 break;
857 }
858 }
859 }
860 }
861 }
862 for(i=0;i<(n-2);i++) {
863 j = i+2;
864 if(dpstates[i][j].visible) {
865 dpstates[i][j].weight = 0;
866 newdiagonal.index1 = i+1;
867 newdiagonal.index2 = i+1;
868 dpstates[i][j].pairs.push_back(newdiagonal);
869 }
870 }
871
872 dpstates[0][n-1].visible = true;
873 vertices[0].isConvex = false; //by convention
874
875 for(gap=3; gap<n; gap++) {
876 for(i=0;i<n-gap;i++) {
877 if(vertices[i].isConvex) continue;
878 k = i+gap;
879 if(dpstates[i][k].visible) {
880 if(!vertices[k].isConvex) {
881 for(j=i+1;j<k;j++) TypeA(i,j,k,vertices,dpstates);
882 } else {
883 for(j=i+1;j<(k-1);j++) {
884 if(vertices[j].isConvex) continue;
885 TypeA(i,j,k,vertices,dpstates);
886 }
887 TypeA(i,k-1,k,vertices,dpstates);
888 }
889 }
890 }
891 for(k=gap;k<n;k++) {
892 if(vertices[k].isConvex) continue;
893 i = k-gap;
894 if((vertices[i].isConvex)&&(dpstates[i][k].visible)) {
895 TypeB(i,i+1,k,vertices,dpstates);
896 for(j=i+2;j<k;j++) {
897 if(vertices[j].isConvex) continue;
898 TypeB(i,j,k,vertices,dpstates);
899 }
900 }
901 }
902 }
903
904
905 //recover solution
906 ret = 1;
907 newdiagonal.index1 = 0;
908 newdiagonal.index2 = n-1;
909 diagonals.push_front(newdiagonal);
910 while(!diagonals.empty()) {
911 diagonal = *(diagonals.begin());
912 diagonals.pop_front();
913 if((diagonal.index2 - diagonal.index1) <=1) continue;
914 pairs = &(dpstates[diagonal.index1][diagonal.index2].pairs);
915 if(pairs->empty()) {
916 ret = 0;
917 break;
918 }
919 if(!vertices[diagonal.index1].isConvex) {
920 iter = pairs->end();
921 --iter;
922 j = iter->index2;
923 newdiagonal.index1 = j;
924 newdiagonal.index2 = diagonal.index2;
925 diagonals.push_front(newdiagonal);
926 if((j - diagonal.index1)>1) {
927 if(iter->index1 != iter->index2) {
928 pairs2 = &(dpstates[diagonal.index1][j].pairs);
929 while(1) {
930 if(pairs2->empty()) {
931 ret = 0;
932 break;
933 }
934 iter2 = pairs2->end();
935 --iter2;
936 if(iter->index1 != iter2->index1) pairs2->pop_back();
937 else break;
938 }
939 if(ret == 0) break;
940 }
941 newdiagonal.index1 = diagonal.index1;
942 newdiagonal.index2 = j;
943 diagonals.push_front(newdiagonal);
944 }
945 } else {
946 iter = pairs->begin();
947 j = iter->index1;
948 newdiagonal.index1 = diagonal.index1;
949 newdiagonal.index2 = j;
950 diagonals.push_front(newdiagonal);
951 if((diagonal.index2 - j) > 1) {
952 if(iter->index1 != iter->index2) {
953 pairs2 = &(dpstates[j][diagonal.index2].pairs);
954 while(1) {
955 if(pairs2->empty()) {
956 ret = 0;
957 break;
958 }
959 iter2 = pairs2->begin();
960 if(iter->index2 != iter2->index2) pairs2->pop_front();
961 else break;
962 }
963 if(ret == 0) break;
964 }
965 newdiagonal.index1 = j;
966 newdiagonal.index2 = diagonal.index2;
967 diagonals.push_front(newdiagonal);
968 }
969 }
970 }
971
972 if(ret == 0) {
973 for(i=0;i<n;i++) {
974 delete [] dpstates[i];
975 }
976 delete [] dpstates;
977 delete [] vertices;
978
979 return ret;
980 }
981
982 newdiagonal.index1 = 0;
983 newdiagonal.index2 = n-1;
984 diagonals.push_front(newdiagonal);
985 while(!diagonals.empty()) {
986 diagonal = *(diagonals.begin());
987 diagonals.pop_front();
988 if((diagonal.index2 - diagonal.index1) <= 1) continue;
989
990 indices.clear();
991 diagonals2.clear();
992 indices.push_back(diagonal.index1);
993 indices.push_back(diagonal.index2);
994 diagonals2.push_front(diagonal);
995
996 while(!diagonals2.empty()) {
997 diagonal = *(diagonals2.begin());
998 diagonals2.pop_front();
999 if((diagonal.index2 - diagonal.index1) <= 1) continue;
1000 ijreal = true;
1001 jkreal = true;
1002 pairs = &(dpstates[diagonal.index1][diagonal.index2].pairs);
1003 if(!vertices[diagonal.index1].isConvex) {
1004 iter = pairs->end();
1005 --iter;
1006 j = iter->index2;
1007 if(iter->index1 != iter->index2) ijreal = false;
1008 } else {
1009 iter = pairs->begin();
1010 j = iter->index1;
1011 if(iter->index1 != iter->index2) jkreal = false;
1012 }
1013
1014 newdiagonal.index1 = diagonal.index1;
1015 newdiagonal.index2 = j;
1016 if(ijreal) {
1017 diagonals.push_back(newdiagonal);
1018 } else {
1019 diagonals2.push_back(newdiagonal);
1020 }
1021
1022 newdiagonal.index1 = j;
1023 newdiagonal.index2 = diagonal.index2;
1024 if(jkreal) {
1025 diagonals.push_back(newdiagonal);
1026 } else {
1027 diagonals2.push_back(newdiagonal);
1028 }
1029
1030 indices.push_back(j);
1031 }
1032
1033 indices.sort();
1034 newpoly.Init((long)indices.size());
1035 k=0;
1036 for(iiter = indices.begin();iiter!=indices.end(); ++iiter) {
1037 newpoly[k] = vertices[*iiter].p;
1038 k++;
1039 }
1040 parts->push_back(newpoly);
1041 }
1042
1043 for(i=0;i<n;i++) {
1044 delete [] dpstates[i];
1045 }
1046 delete [] dpstates;
1047 delete [] vertices;
1048
1049 return ret;
1050 }
1051
1052 //triangulates a set of polygons by first partitioning them into monotone polygons
1053 //O(n*log(n)) time complexity, O(n) space complexity
1054 //the algorithm used here is outlined in the book
1055 //"Computational Geometry: Algorithms and Applications"
1056 //by Mark de Berg, Otfried Cheong, Marc van Kreveld and Mark Overmars
1057 int TPPLPartition::MonotonePartition(list<TPPLPoly> *inpolys, list<TPPLPoly> *monotonePolys) {
1058 list<TPPLPoly>::iterator iter;
1059 MonotoneVertex *vertices;
1060 long i,numvertices,vindex,vindex2,newnumvertices,maxnumvertices;
1061 long polystartindex, polyendindex;
1062 TPPLPoly *poly;
1063 MonotoneVertex *v,*v2,*vprev,*vnext;
1064 ScanLineEdge newedge;
1065 bool error = false;
1066
1067 numvertices = 0;
1068 for(iter = inpolys->begin(); iter != inpolys->end(); ++iter) {
1069 numvertices += iter->GetNumPoints();
1070 }
1071
1072 maxnumvertices = numvertices*3;
1073 vertices = new MonotoneVertex[maxnumvertices];
1074 newnumvertices = numvertices;
1075
1076 polystartindex = 0;
1077 for(iter = inpolys->begin(); iter != inpolys->end(); ++iter) {
1078 poly = &(*iter);
1079 polyendindex = polystartindex + poly->GetNumPoints()-1;
1080 for(i=0;i<poly->GetNumPoints();i++) {
1081 vertices[i+polystartindex].p = poly->GetPoint(i);
1082 if(i==0) vertices[i+polystartindex].previous = polyendindex;
1083 else vertices[i+polystartindex].previous = i+polystartindex-1;
1084 if(i==(poly->GetNumPoints()-1)) vertices[i+polystartindex].next = polystartindex;
1085 else vertices[i+polystartindex].next = i+polystartindex+1;
1086 }
1087 polystartindex = polyendindex+1;
1088 }
1089
1090 //construct the priority queue
1091 long *priority = new long [numvertices];
1092 for(i=0;i<numvertices;i++) priority[i] = i;
1093 std::sort(priority,&(priority[numvertices]),VertexSorter(vertices));
1094
1095 //determine vertex types
1096 char *vertextypes = new char[maxnumvertices];
1097 for(i=0;i<numvertices;i++) {
1098 v = &(vertices[i]);
1099 vprev = &(vertices[v->previous]);
1100 vnext = &(vertices[v->next]);
1101
1102 if(Below(vprev->p,v->p)&&Below(vnext->p,v->p)) {
1103 if(IsConvex(vnext->p,vprev->p,v->p)) {
1104 vertextypes[i] = TPPL_VERTEXTYPE_START;
1105 } else {
1106 vertextypes[i] = TPPL_VERTEXTYPE_SPLIT;
1107 }
1108 } else if(Below(v->p,vprev->p)&&Below(v->p,vnext->p)) {
1109 if(IsConvex(vnext->p,vprev->p,v->p))
1110 {
1111 vertextypes[i] = TPPL_VERTEXTYPE_END;
1112 } else {
1113 vertextypes[i] = TPPL_VERTEXTYPE_MERGE;
1114 }
1115 } else {
1116 vertextypes[i] = TPPL_VERTEXTYPE_REGULAR;
1117 }
1118 }
1119
1120 //helpers
1121 long *helpers = new long[maxnumvertices];
1122
1123 //binary search tree that holds edges intersecting the scanline
1124 //note that while set doesn't actually have to be implemented as a tree
1125 //complexity requirements for operations are the same as for the balanced binary search tree
1126 set<ScanLineEdge> edgeTree;
1127 //store iterators to the edge tree elements
1128 //this makes deleting existing edges much faster
1129 set<ScanLineEdge>::iterator *edgeTreeIterators,edgeIter;
1130 edgeTreeIterators = new set<ScanLineEdge>::iterator[maxnumvertices];
1131 pair<set<ScanLineEdge>::iterator,bool> edgeTreeRet;
1132
1133 //for each vertex
1134 for(i=0;i<numvertices;i++) {
1135 vindex = priority[i];
1136 v = &(vertices[vindex]);
1137 vindex2 = vindex;
1138 v2 = v;
1139
1140 //depending on the vertex type, do the appropriate action
1141 //comments in the following sections are copied from "Computational Geometry: Algorithms and Applications"
1142 switch(vertextypes[vindex]) {
1143 case TPPL_VERTEXTYPE_START:
1144 //Insert ei in T and set helper(ei) to vi.
1145 newedge.p1 = v->p;
1146 newedge.p2 = vertices[v->next].p;
1147 newedge.index = vindex;
1148 edgeTreeRet = edgeTree.insert(newedge);
1149 edgeTreeIterators[vindex] = edgeTreeRet.first;
1150 helpers[vindex] = vindex;
1151 break;
1152
1153 case TPPL_VERTEXTYPE_END:
1154 //if helper(ei-1) is a merge vertex
1155 if(vertextypes[helpers[v->previous]]==TPPL_VERTEXTYPE_MERGE) {
1156 //Insert the diagonal connecting vi to helper(ei-1) in D.
1157 AddDiagonal(vertices,&newnumvertices,vindex,helpers[v->previous]);
1158 vertextypes[newnumvertices-2] = vertextypes[vindex];
1159 edgeTreeIterators[newnumvertices-2] = edgeTreeIterators[vindex];
1160 helpers[newnumvertices-2] = helpers[vindex];
1161 vertextypes[newnumvertices-1] = vertextypes[helpers[v->previous]];
1162 edgeTreeIterators[newnumvertices-1] = edgeTreeIterators[helpers[v->previous]];
1163 helpers[newnumvertices-1] = helpers[helpers[v->previous]];
1164 }
1165 //Delete ei-1 from T
1166 edgeTree.erase(edgeTreeIterators[v->previous]);
1167 break;
1168
1169 case TPPL_VERTEXTYPE_SPLIT:
1170 //Search in T to find the edge e j directly left of vi.
1171 newedge.p1 = v->p;
1172 newedge.p2 = v->p;
1173 edgeIter = edgeTree.lower_bound(newedge);
1174 if(edgeIter == edgeTree.begin()) {
1175 error = true;
1176 break;
1177 }
1178 --edgeIter;
1179 //Insert the diagonal connecting vi to helper(ej) in D.
1180 AddDiagonal(vertices,&newnumvertices,vindex,helpers[edgeIter->index]);
1181 vertextypes[newnumvertices-2] = vertextypes[vindex];
1182 edgeTreeIterators[newnumvertices-2] = edgeTreeIterators[vindex];
1183 helpers[newnumvertices-2] = helpers[vindex];
1184 vertextypes[newnumvertices-1] = vertextypes[helpers[edgeIter->index]];
1185 edgeTreeIterators[newnumvertices-1] = edgeTreeIterators[helpers[edgeIter->index]];
1186 helpers[newnumvertices-1] = helpers[helpers[edgeIter->index]];
1187 vindex2 = newnumvertices-2;
1188 v2 = &(vertices[vindex2]);
1189 //helper(e j)�vi
1190 helpers[edgeIter->index] = vindex;
1191 //Insert ei in T and set helper(ei) to vi.
1192 newedge.p1 = v2->p;
1193 newedge.p2 = vertices[v2->next].p;
1194 newedge.index = vindex2;
1195 edgeTreeRet = edgeTree.insert(newedge);
1196 edgeTreeIterators[vindex2] = edgeTreeRet.first;
1197 helpers[vindex2] = vindex2;
1198 break;
1199
1200 case TPPL_VERTEXTYPE_MERGE:
1201 //if helper(ei-1) is a merge vertex
1202 if(vertextypes[helpers[v->previous]]==TPPL_VERTEXTYPE_MERGE) {
1203 //Insert the diagonal connecting vi to helper(ei-1) in D.
1204 AddDiagonal(vertices,&newnumvertices,vindex,helpers[v->previous]);
1205 vertextypes[newnumvertices-2] = vertextypes[vindex];
1206 edgeTreeIterators[newnumvertices-2] = edgeTreeIterators[vindex];
1207 helpers[newnumvertices-2] = helpers[vindex];
1208 vertextypes[newnumvertices-1] = vertextypes[helpers[v->previous]];
1209 edgeTreeIterators[newnumvertices-1] = edgeTreeIterators[helpers[v->previous]];
1210 helpers[newnumvertices-1] = helpers[helpers[v->previous]];
1211 vindex2 = newnumvertices-2;
1212 v2 = &(vertices[vindex2]);
1213 }
1214 //Delete ei-1 from T.
1215 edgeTree.erase(edgeTreeIterators[v->previous]);
1216 //Search in T to find the edge e j directly left of vi.
1217 newedge.p1 = v->p;
1218 newedge.p2 = v->p;
1219 edgeIter = edgeTree.lower_bound(newedge);
1220 if(edgeIter == edgeTree.begin()) {
1221 error = true;
1222 break;
1223 }
1224 --edgeIter;
1225 //if helper(ej) is a merge vertex
1226 if(vertextypes[helpers[edgeIter->index]]==TPPL_VERTEXTYPE_MERGE) {
1227 //Insert the diagonal connecting vi to helper(e j) in D.
1228 AddDiagonal(vertices,&newnumvertices,vindex2,helpers[edgeIter->index]);
1229 vertextypes[newnumvertices-2] = vertextypes[vindex2];
1230 edgeTreeIterators[newnumvertices-2] = edgeTreeIterators[vindex2];
1231 helpers[newnumvertices-2] = helpers[vindex2];
1232 vertextypes[newnumvertices-1] = vertextypes[helpers[edgeIter->index]];
1233 edgeTreeIterators[newnumvertices-1] = edgeTreeIterators[helpers[edgeIter->index]];
1234 helpers[newnumvertices-1] = helpers[helpers[edgeIter->index]];
1235 }
1236 //helper(e j)�vi
1237 helpers[edgeIter->index] = vindex2;
1238 break;
1239
1240 case TPPL_VERTEXTYPE_REGULAR:
1241 //if the interior of P lies to the right of vi
1242 if(Below(v->p,vertices[v->previous].p)) {
1243 //if helper(ei-1) is a merge vertex
1244 if(vertextypes[helpers[v->previous]]==TPPL_VERTEXTYPE_MERGE) {
1245 //Insert the diagonal connecting vi to helper(ei-1) in D.
1246 AddDiagonal(vertices,&newnumvertices,vindex,helpers[v->previous]);
1247 vertextypes[newnumvertices-2] = vertextypes[vindex];
1248 edgeTreeIterators[newnumvertices-2] = edgeTreeIterators[vindex];
1249 helpers[newnumvertices-2] = helpers[vindex];
1250 vertextypes[newnumvertices-1] = vertextypes[helpers[v->previous]];
1251 edgeTreeIterators[newnumvertices-1] = edgeTreeIterators[helpers[v->previous]];
1252 helpers[newnumvertices-1] = helpers[helpers[v->previous]];
1253 vindex2 = newnumvertices-2;
1254 v2 = &(vertices[vindex2]);
1255 }
1256 //Delete ei-1 from T.
1257 edgeTree.erase(edgeTreeIterators[v->previous]);
1258 //Insert ei in T and set helper(ei) to vi.
1259 newedge.p1 = v2->p;
1260 newedge.p2 = vertices[v2->next].p;
1261 newedge.index = vindex2;
1262 edgeTreeRet = edgeTree.insert(newedge);
1263 edgeTreeIterators[vindex2] = edgeTreeRet.first;
1264 helpers[vindex2] = vindex;
1265 } else {
1266 //Search in T to find the edge ej directly left of vi.
1267 newedge.p1 = v->p;
1268 newedge.p2 = v->p;
1269 edgeIter = edgeTree.lower_bound(newedge);
1270 if(edgeIter == edgeTree.begin()) {
1271 error = true;
1272 break;
1273 }
1274 --edgeIter;
1275 //if helper(ej) is a merge vertex
1276 if(vertextypes[helpers[edgeIter->index]]==TPPL_VERTEXTYPE_MERGE) {
1277 //Insert the diagonal connecting vi to helper(e j) in D.
1278 AddDiagonal(vertices,&newnumvertices,vindex,helpers[edgeIter->index]);
1279 vertextypes[newnumvertices-2] = vertextypes[vindex];
1280 edgeTreeIterators[newnumvertices-2] = edgeTreeIterators[vindex];
1281 helpers[newnumvertices-2] = helpers[vindex];
1282 vertextypes[newnumvertices-1] = vertextypes[helpers[edgeIter->index]];
1283 edgeTreeIterators[newnumvertices-1] = edgeTreeIterators[helpers[edgeIter->index]];
1284 helpers[newnumvertices-1] = helpers[helpers[edgeIter->index]];
1285 }
1286 //helper(e j)�vi
1287 helpers[edgeIter->index] = vindex;
1288 }
1289 break;
1290 }
1291
1292 if(error) break;
1293 }
1294
1295 char *used = new char[newnumvertices];
1296 memset(used,0,newnumvertices*sizeof(char));
1297
1298 if(!error) {
1299 //return result
1300 long size;
1301 TPPLPoly mpoly;
1302 for(i=0;i<newnumvertices;i++) {
1303 if(used[i]) continue;
1304 v = &(vertices[i]);
1305 vnext = &(vertices[v->next]);
1306 size = 1;
1307 while(vnext!=v) {
1308 vnext = &(vertices[vnext->next]);
1309 size++;
1310 }
1311 mpoly.Init(size);
1312 v = &(vertices[i]);
1313 mpoly[0] = v->p;
1314 vnext = &(vertices[v->next]);
1315 size = 1;
1316 used[i] = 1;
1317 used[v->next] = 1;
1318 while(vnext!=v) {
1319 mpoly[size] = vnext->p;
1320 used[vnext->next] = 1;
1321 vnext = &(vertices[vnext->next]);
1322 size++;
1323 }
1324 monotonePolys->push_back(mpoly);
1325 }
1326 }
1327
1328 //cleanup
1329 delete [] vertices;
1330 delete [] priority;
1331 delete [] vertextypes;
1332 delete [] edgeTreeIterators;
1333 delete [] helpers;
1334 delete [] used;
1335
1336 if(error) {
1337 return 0;
1338 } else {
1339 return 1;
1340 }
1341 }
1342
1343 //adds a diagonal to the doubly-connected list of vertices
1344 void TPPLPartition::AddDiagonal(MonotoneVertex *vertices, long *numvertices, long index1, long index2) {
1345 long newindex1,newindex2;
1346
1347 newindex1 = *numvertices;
1348 (*numvertices)++;
1349 newindex2 = *numvertices;
1350 (*numvertices)++;
1351
1352 vertices[newindex1].p = vertices[index1].p;
1353 vertices[newindex2].p = vertices[index2].p;
1354
1355 vertices[newindex2].next = vertices[index2].next;
1356 vertices[newindex1].next = vertices[index1].next;
1357
1358 vertices[vertices[index2].next].previous = newindex2;
1359 vertices[vertices[index1].next].previous = newindex1;
1360
1361 vertices[index1].next = newindex2;
1362 vertices[newindex2].previous = index1;
1363
1364 vertices[index2].next = newindex1;
1365 vertices[newindex1].previous = index2;
1366 }
1367
1368 bool TPPLPartition::Below(TPPLPoint &p1, TPPLPoint &p2) {
1369 if(p1.y < p2.y) return true;
1370 else if(p1.y == p2.y) {
1371 if(p1.x < p2.x) return true;
1372 }
1373 return false;
1374 }
1375
1376 //sorts in the falling order of y values, if y is equal, x is used instead
1377 bool TPPLPartition::VertexSorter::operator() (long index1, long index2) const {
1378 if(vertices[index1].p.y > vertices[index2].p.y) return true;
1379 else if(vertices[index1].p.y == vertices[index2].p.y) {
1380 if(vertices[index1].p.x > vertices[index2].p.x) return true;
1381 }
1382 return false;
1383 }
1384
1385 bool TPPLPartition::ScanLineEdge::IsConvex(const TPPLPoint& p1, const TPPLPoint& p2, const TPPLPoint& p3) const {
1386 tppl_float tmp;
1387 tmp = (p3.y-p1.y)*(p2.x-p1.x)-(p3.x-p1.x)*(p2.y-p1.y);
1388 if(tmp>0) return 1;
1389 else return 0;
1390 }
1391
1392 bool TPPLPartition::ScanLineEdge::operator < (const ScanLineEdge & other) const {
1393 if(other.p1.y == other.p2.y) {
1394 if(p1.y == p2.y) {
1395 if(p1.y < other.p1.y) return true;
1396 else return false;
1397 }
1398 if(IsConvex(p1,p2,other.p1)) return true;
1399 else return false;
1400 } else if(p1.y == p2.y) {
1401 if(IsConvex(other.p1,other.p2,p1)) return false;
1402 else return true;
1403 } else if(p1.y < other.p1.y) {
1404 if(IsConvex(other.p1,other.p2,p1)) return false;
1405 else return true;
1406 } else {
1407 if(IsConvex(p1,p2,other.p1)) return true;
1408 else return false;
1409 }
1410 }
1411
1412 //triangulates monotone polygon
1413 //O(n) time, O(n) space complexity
1414 int TPPLPartition::TriangulateMonotone(TPPLPoly *inPoly, list<TPPLPoly> *triangles) {
1415 long i,i2,j,topindex,bottomindex,leftindex,rightindex,vindex;
1416 TPPLPoint *points;
1417 long numpoints;
1418 TPPLPoly triangle;
1419
1420 numpoints = inPoly->GetNumPoints();
1421 points = inPoly->GetPoints();
1422
1423 //trivial calses
1424 if(numpoints < 3) return 0;
1425 if(numpoints == 3) {
1426 triangles->push_back(*inPoly);
1427 }
1428
1429 topindex = 0; bottomindex=0;
1430 for(i=1;i<numpoints;i++) {
1431 if(Below(points[i],points[bottomindex])) bottomindex = i;
1432 if(Below(points[topindex],points[i])) topindex = i;
1433 }
1434
1435 //check if the poly is really monotone
1436 i = topindex;
1437 while(i!=bottomindex) {
1438 i2 = i+1; if(i2>=numpoints) i2 = 0;
1439 if(!Below(points[i2],points[i])) return 0;
1440 i = i2;
1441 }
1442 i = bottomindex;
1443 while(i!=topindex) {
1444 i2 = i+1; if(i2>=numpoints) i2 = 0;
1445 if(!Below(points[i],points[i2])) return 0;
1446 i = i2;
1447 }
1448
1449 char *vertextypes = new char[numpoints];
1450 long *priority = new long[numpoints];
1451
1452 //merge left and right vertex chains
1453 priority[0] = topindex;
1454 vertextypes[topindex] = 0;
1455 leftindex = topindex+1; if(leftindex>=numpoints) leftindex = 0;
1456 rightindex = topindex-1; if(rightindex<0) rightindex = numpoints-1;
1457 for(i=1;i<(numpoints-1);i++) {
1458 if(leftindex==bottomindex) {
1459 priority[i] = rightindex;
1460 rightindex--; if(rightindex<0) rightindex = numpoints-1;
1461 vertextypes[priority[i]] = -1;
1462 } else if(rightindex==bottomindex) {
1463 priority[i] = leftindex;
1464 leftindex++; if(leftindex>=numpoints) leftindex = 0;
1465 vertextypes[priority[i]] = 1;
1466 } else {
1467 if(Below(points[leftindex],points[rightindex])) {
1468 priority[i] = rightindex;
1469 rightindex--; if(rightindex<0) rightindex = numpoints-1;
1470 vertextypes[priority[i]] = -1;
1471 } else {
1472 priority[i] = leftindex;
1473 leftindex++; if(leftindex>=numpoints) leftindex = 0;
1474 vertextypes[priority[i]] = 1;
1475 }
1476 }
1477 }
1478 priority[i] = bottomindex;
1479 vertextypes[bottomindex] = 0;
1480
1481 long *stack = new long[numpoints];
1482 long stackptr = 0;
1483
1484 stack[0] = priority[0];
1485 stack[1] = priority[1];
1486 stackptr = 2;
1487
1488 //for each vertex from top to bottom trim as many triangles as possible
1489 for(i=2;i<(numpoints-1);i++) {
1490 vindex = priority[i];
1491 if(vertextypes[vindex]!=vertextypes[stack[stackptr-1]]) {
1492 for(j=0;j<(stackptr-1);j++) {
1493 if(vertextypes[vindex]==1) {
1494 triangle.Triangle(points[stack[j+1]],points[stack[j]],points[vindex]);
1495 } else {
1496 triangle.Triangle(points[stack[j]],points[stack[j+1]],points[vindex]);
1497 }
1498 triangles->push_back(triangle);
1499 }
1500 stack[0] = priority[i-1];
1501 stack[1] = priority[i];
1502 stackptr = 2;
1503 } else {
1504 stackptr--;
1505 while(stackptr>0) {
1506 if(vertextypes[vindex]==1) {
1507 if(IsConvex(points[vindex],points[stack[stackptr-1]],points[stack[stackptr]])) {
1508 triangle.Triangle(points[vindex],points[stack[stackptr-1]],points[stack[stackptr]]);
1509 triangles->push_back(triangle);
1510 stackptr--;
1511 } else {
1512 break;
1513 }
1514 } else {
1515 if(IsConvex(points[vindex],points[stack[stackptr]],points[stack[stackptr-1]])) {
1516 triangle.Triangle(points[vindex],points[stack[stackptr]],points[stack[stackptr-1]]);
1517 triangles->push_back(triangle);
1518 stackptr--;
1519 } else {
1520 break;
1521 }
1522 }
1523 }
1524 stackptr++;
1525 stack[stackptr] = vindex;
1526 stackptr++;
1527 }
1528 }
1529 vindex = priority[i];
1530 for(j=0;j<(stackptr-1);j++) {
1531 if(vertextypes[stack[j+1]]==1) {
1532 triangle.Triangle(points[stack[j]],points[stack[j+1]],points[vindex]);
1533 } else {
1534 triangle.Triangle(points[stack[j+1]],points[stack[j]],points[vindex]);
1535 }
1536 triangles->push_back(triangle);
1537 }
1538
1539 delete [] priority;
1540 delete [] vertextypes;
1541 delete [] stack;
1542
1543 return 1;
1544 }
1545
1546 int TPPLPartition::Triangulate_MONO(list<TPPLPoly> *inpolys, list<TPPLPoly> *triangles) {
1547 list<TPPLPoly> monotone;
1548 list<TPPLPoly>::iterator iter;
1549
1550 if(!MonotonePartition(inpolys,&monotone)) return 0;
1551 for(iter = monotone.begin(); iter!=monotone.end(); ++iter) {
1552 if(!TriangulateMonotone(&(*iter),triangles)) return 0;
1553 }
1554 return 1;
1555 }
1556
1557 int TPPLPartition::Triangulate_MONO(TPPLPoly *poly, list<TPPLPoly> *triangles) {
1558 list<TPPLPoly> polys;
1559 polys.push_back(*poly);
1560
1561 return Triangulate_MONO(&polys, triangles);
1562 }
0 //Copyright (C) 2011 by Ivan Fratric
1 //
2 //Permission is hereby granted, free of charge, to any person obtaining a copy
3 //of this software and associated documentation files (the "Software"), to deal
4 //in the Software without restriction, including without limitation the rights
5 //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
6 //copies of the Software, and to permit persons to whom the Software is
7 //furnished to do so, subject to the following conditions:
8 //
9 //The above copyright notice and this permission notice shall be included in
10 //all copies or substantial portions of the Software.
11 //
12 //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13 //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15 //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16 //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17 //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
18 //THE SOFTWARE.
19
20
21 #include <list>
22 using namespace std;
23
24 typedef double tppl_float;
25
26 #define TPPL_CCW 1
27 #define TPPL_CW -1
28
29 //2D point structure
30 struct TPPLPoint {
31 tppl_float x;
32 tppl_float y;
33
34 TPPLPoint operator + (const TPPLPoint& p) const {
35 TPPLPoint r;
36 r.x = x + p.x;
37 r.y = y + p.y;
38 return r;
39 }
40
41 TPPLPoint operator - (const TPPLPoint& p) const {
42 TPPLPoint r;
43 r.x = x - p.x;
44 r.y = y - p.y;
45 return r;
46 }
47
48 TPPLPoint operator * (const tppl_float f ) const {
49 TPPLPoint r;
50 r.x = x*f;
51 r.y = y*f;
52 return r;
53 }
54
55 TPPLPoint operator / (const tppl_float f ) const {
56 TPPLPoint r;
57 r.x = x/f;
58 r.y = y/f;
59 return r;
60 }
61
62 bool operator==(const TPPLPoint& p) const {
63 if((x == p.x)&&(y==p.y)) return true;
64 else return false;
65 }
66
67 bool operator!=(const TPPLPoint& p) const {
68 if((x == p.x)&&(y==p.y)) return false;
69 else return true;
70 }
71 };
72
73 //Polygon implemented as an array of points with a 'hole' flag
74 class TPPLPoly {
75 protected:
76
77 TPPLPoint *points;
78 long numpoints;
79 bool hole;
80
81 public:
82
83 //constructors/destructors
84 TPPLPoly();
85 ~TPPLPoly();
86
87 TPPLPoly(const TPPLPoly &src);
88 TPPLPoly& operator=(const TPPLPoly &src);
89
90 //getters and setters
91 long GetNumPoints() const {
92 return numpoints;
93 }
94
95 bool IsHole() const {
96 return hole;
97 }
98
99 void SetHole(bool hole) {
100 this->hole = hole;
101 }
102
103 TPPLPoint &GetPoint(long i) {
104 return points[i];
105 }
106
107 TPPLPoint *GetPoints() {
108 return points;
109 }
110
111 TPPLPoint& operator[] (int i) {
112 return points[i];
113 }
114
115 //clears the polygon points
116 void Clear();
117
118 //inits the polygon with numpoints vertices
119 void Init(long numpoints);
120
121 //creates a triangle with points p1,p2,p3
122 void Triangle(TPPLPoint &p1, TPPLPoint &p2, TPPLPoint &p3);
123
124 //inverts the orfer of vertices
125 void Invert();
126
127 //returns the orientation of the polygon
128 //possible values:
129 // TPPL_CCW : polygon vertices are in counter-clockwise order
130 // TPPL_CW : polygon vertices are in clockwise order
131 // 0 : the polygon has no (measurable) area
132 int GetOrientation() const;
133
134 //sets the polygon orientation
135 //orientation can be
136 // TPPL_CCW : sets vertices in counter-clockwise order
137 // TPPL_CW : sets vertices in clockwise order
138 void SetOrientation(int orientation);
139 };
140
141 class TPPLPartition {
142 protected:
143 struct PartitionVertex {
144 bool isActive;
145 bool isConvex;
146 bool isEar;
147
148 TPPLPoint p;
149 tppl_float angle;
150 PartitionVertex *previous;
151 PartitionVertex *next;
152 };
153
154 struct MonotoneVertex {
155 TPPLPoint p;
156 long previous;
157 long next;
158 };
159
160 class VertexSorter{
161 MonotoneVertex *vertices;
162 public:
163 VertexSorter(MonotoneVertex *v) : vertices(v) {}
164 bool operator() (long index1, long index2) const;
165 };
166
167 struct Diagonal {
168 long index1;
169 long index2;
170 };
171
172 //dynamic programming state for minimum-weight triangulation
173 struct DPState {
174 bool visible;
175 tppl_float weight;
176 long bestvertex;
177 };
178
179 //dynamic programming state for convex partitioning
180 struct DPState2 {
181 bool visible;
182 long weight;
183 list<Diagonal> pairs;
184 };
185
186 //edge that intersects the scanline
187 struct ScanLineEdge {
188 long index;
189 TPPLPoint p1;
190 TPPLPoint p2;
191
192 //determines if the edge is to the left of another edge
193 bool operator< (const ScanLineEdge & other) const;
194
195 bool IsConvex(const TPPLPoint& p1, const TPPLPoint& p2, const TPPLPoint& p3) const;
196 };
197
198 //standard helper functions
199 bool IsConvex(TPPLPoint& p1, TPPLPoint& p2, TPPLPoint& p3);
200 bool IsReflex(TPPLPoint& p1, TPPLPoint& p2, TPPLPoint& p3);
201 bool IsInside(TPPLPoint& p1, TPPLPoint& p2, TPPLPoint& p3, TPPLPoint &p);
202
203 bool InCone(TPPLPoint &p1, TPPLPoint &p2, TPPLPoint &p3, TPPLPoint &p);
204 bool InCone(PartitionVertex *v, TPPLPoint &p);
205
206 int Intersects(TPPLPoint &p11, TPPLPoint &p12, TPPLPoint &p21, TPPLPoint &p22);
207
208 TPPLPoint Normalize(const TPPLPoint &p);
209 tppl_float Distance(const TPPLPoint &p1, const TPPLPoint &p2);
210
211 //helper functions for Triangulate_EC
212 void UpdateVertexReflexity(PartitionVertex *v);
213 void UpdateVertex(PartitionVertex *v,PartitionVertex *vertices, long numvertices);
214
215 //helper functions for ConvexPartition_OPT
216 void UpdateState(long a, long b, long w, long i, long j, DPState2 **dpstates);
217 void TypeA(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates);
218 void TypeB(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates);
219
220 //helper functions for MonotonePartition
221 bool Below(TPPLPoint &p1, TPPLPoint &p2);
222 void AddDiagonal(MonotoneVertex *vertices, long *numvertices, long index1, long index2);
223
224 //triangulates a monotone polygon, used in Triangulate_MONO
225 int TriangulateMonotone(TPPLPoly *inPoly, list<TPPLPoly> *triangles);
226
227 public:
228
229 //simple heuristic procedure for removing holes from a list of polygons
230 //works by creating a diagonal from the rightmost hole vertex to some visible vertex
231 //time complexity: O(h*(n^2)), h is the number of holes, n is the number of vertices
232 //space complexity: O(n)
233 //params:
234 // inpolys : a list of polygons that can contain holes
235 // vertices of all non-hole polys have to be in counter-clockwise order
236 // vertices of all hole polys have to be in clockwise order
237 // outpolys : a list of polygons without holes
238 //returns 1 on success, 0 on failure
239 int RemoveHoles(list<TPPLPoly> *inpolys, list<TPPLPoly> *outpolys);
240
241 //triangulates a polygon by ear clipping
242 //time complexity O(n^2), n is the number of vertices
243 //space complexity: O(n)
244 //params:
245 // poly : an input polygon to be triangulated
246 // vertices have to be in counter-clockwise order
247 // triangles : a list of triangles (result)
248 //returns 1 on success, 0 on failure
249 int Triangulate_EC(TPPLPoly *poly, list<TPPLPoly> *triangles);
250
251 //triangulates a list of polygons that may contain holes by ear clipping algorithm
252 //first calls RemoveHoles to get rid of the holes, and then Triangulate_EC for each resulting polygon
253 //time complexity: O(h*(n^2)), h is the number of holes, n is the number of vertices
254 //space complexity: O(n)
255 //params:
256 // inpolys : a list of polygons to be triangulated (can contain holes)
257 // vertices of all non-hole polys have to be in counter-clockwise order
258 // vertices of all hole polys have to be in clockwise order
259 // triangles : a list of triangles (result)
260 //returns 1 on success, 0 on failure
261 int Triangulate_EC(list<TPPLPoly> *inpolys, list<TPPLPoly> *triangles);
262
263 //creates an optimal polygon triangulation in terms of minimal edge length
264 //time complexity: O(n^3), n is the number of vertices
265 //space complexity: O(n^2)
266 //params:
267 // poly : an input polygon to be triangulated
268 // vertices have to be in counter-clockwise order
269 // triangles : a list of triangles (result)
270 //returns 1 on success, 0 on failure
271 int Triangulate_OPT(TPPLPoly *poly, list<TPPLPoly> *triangles);
272
273 //triangulates a polygons by firstly partitioning it into monotone polygons
274 //time complexity: O(n*log(n)), n is the number of vertices
275 //space complexity: O(n)
276 //params:
277 // poly : an input polygon to be triangulated
278 // vertices have to be in counter-clockwise order
279 // triangles : a list of triangles (result)
280 //returns 1 on success, 0 on failure
281 int Triangulate_MONO(TPPLPoly *poly, list<TPPLPoly> *triangles);
282
283 //triangulates a list of polygons by firstly partitioning them into monotone polygons
284 //time complexity: O(n*log(n)), n is the number of vertices
285 //space complexity: O(n)
286 //params:
287 // inpolys : a list of polygons to be triangulated (can contain holes)
288 // vertices of all non-hole polys have to be in counter-clockwise order
289 // vertices of all hole polys have to be in clockwise order
290 // triangles : a list of triangles (result)
291 //returns 1 on success, 0 on failure
292 int Triangulate_MONO(list<TPPLPoly> *inpolys, list<TPPLPoly> *triangles);
293
294 //creates a monotone partition of a list of polygons that can contain holes
295 //time complexity: O(n*log(n)), n is the number of vertices
296 //space complexity: O(n)
297 //params:
298 // inpolys : a list of polygons to be triangulated (can contain holes)
299 // vertices of all non-hole polys have to be in counter-clockwise order
300 // vertices of all hole polys have to be in clockwise order
301 // monotonePolys : a list of monotone polygons (result)
302 //returns 1 on success, 0 on failure
303 int MonotonePartition(list<TPPLPoly> *inpolys, list<TPPLPoly> *monotonePolys);
304
305 //partitions a polygon into convex polygons by using Hertel-Mehlhorn algorithm
306 //the algorithm gives at most four times the number of parts as the optimal algorithm
307 //however, in practice it works much better than that and often gives optimal partition
308 //uses triangulation obtained by ear clipping as intermediate result
309 //time complexity O(n^2), n is the number of vertices
310 //space complexity: O(n)
311 //params:
312 // poly : an input polygon to be partitioned
313 // vertices have to be in counter-clockwise order
314 // parts : resulting list of convex polygons
315 //returns 1 on success, 0 on failure
316 int ConvexPartition_HM(TPPLPoly *poly, list<TPPLPoly> *parts);
317
318 //partitions a list of polygons into convex parts by using Hertel-Mehlhorn algorithm
319 //the algorithm gives at most four times the number of parts as the optimal algorithm
320 //however, in practice it works much better than that and often gives optimal partition
321 //uses triangulation obtained by ear clipping as intermediate result
322 //time complexity O(n^2), n is the number of vertices
323 //space complexity: O(n)
324 //params:
325 // inpolys : an input list of polygons to be partitioned
326 // vertices of all non-hole polys have to be in counter-clockwise order
327 // vertices of all hole polys have to be in clockwise order
328 // parts : resulting list of convex polygons
329 //returns 1 on success, 0 on failure
330 int ConvexPartition_HM(list<TPPLPoly> *inpolys, list<TPPLPoly> *parts);
331
332 //optimal convex partitioning (in terms of number of resulting convex polygons)
333 //using the Keil-Snoeyink algorithm
334 //M. Keil, J. Snoeyink, "On the time bound for convex decomposition of simple polygons", 1998
335 //time complexity O(n^3), n is the number of vertices
336 //space complexity: O(n^3)
337 // poly : an input polygon to be partitioned
338 // vertices have to be in counter-clockwise order
339 // parts : resulting list of convex polygons
340 //returns 1 on success, 0 on failure
341 int ConvexPartition_OPT(TPPLPoly *poly, list<TPPLPoly> *parts);
342 };
0 #if 0
1 <<'SKIP';
2 #endif
3 /*
4 ----------------------------------------------------------------------
5
6 ppport.h -- Perl/Pollution/Portability Version 3.19
7
8 Automatically created by Devel::PPPort running under perl 5.010000.
9
10 Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
11 includes in parts/inc/ instead.
12
13 Use 'perldoc ppport.h' to view the documentation below.
14
15 ----------------------------------------------------------------------
16
17 SKIP
18
19 =pod
20
21 =head1 NAME
22
23 ppport.h - Perl/Pollution/Portability version 3.19
24
25 =head1 SYNOPSIS
26
27 perl ppport.h [options] [source files]
28
29 Searches current directory for files if no [source files] are given
30
31 --help show short help
32
33 --version show version
34
35 --patch=file write one patch file with changes
36 --copy=suffix write changed copies with suffix
37 --diff=program use diff program and options
38
39 --compat-version=version provide compatibility with Perl version
40 --cplusplus accept C++ comments
41
42 --quiet don't output anything except fatal errors
43 --nodiag don't show diagnostics
44 --nohints don't show hints
45 --nochanges don't suggest changes
46 --nofilter don't filter input files
47
48 --strip strip all script and doc functionality from
49 ppport.h
50
51 --list-provided list provided API
52 --list-unsupported list unsupported API
53 --api-info=name show Perl API portability information
54
55 =head1 COMPATIBILITY
56
57 This version of F<ppport.h> is designed to support operation with Perl
58 installations back to 5.003, and has been tested up to 5.10.0.
59
60 =head1 OPTIONS
61
62 =head2 --help
63
64 Display a brief usage summary.
65
66 =head2 --version
67
68 Display the version of F<ppport.h>.
69
70 =head2 --patch=I<file>
71
72 If this option is given, a single patch file will be created if
73 any changes are suggested. This requires a working diff program
74 to be installed on your system.
75
76 =head2 --copy=I<suffix>
77
78 If this option is given, a copy of each file will be saved with
79 the given suffix that contains the suggested changes. This does
80 not require any external programs. Note that this does not
81 automagially add a dot between the original filename and the
82 suffix. If you want the dot, you have to include it in the option
83 argument.
84
85 If neither C<--patch> or C<--copy> are given, the default is to
86 simply print the diffs for each file. This requires either
87 C<Text::Diff> or a C<diff> program to be installed.
88
89 =head2 --diff=I<program>
90
91 Manually set the diff program and options to use. The default
92 is to use C<Text::Diff>, when installed, and output unified
93 context diffs.
94
95 =head2 --compat-version=I<version>
96
97 Tell F<ppport.h> to check for compatibility with the given
98 Perl version. The default is to check for compatibility with Perl
99 version 5.003. You can use this option to reduce the output
100 of F<ppport.h> if you intend to be backward compatible only
101 down to a certain Perl version.
102
103 =head2 --cplusplus
104
105 Usually, F<ppport.h> will detect C++ style comments and
106 replace them with C style comments for portability reasons.
107 Using this option instructs F<ppport.h> to leave C++
108 comments untouched.
109
110 =head2 --quiet
111
112 Be quiet. Don't print anything except fatal errors.
113
114 =head2 --nodiag
115
116 Don't output any diagnostic messages. Only portability
117 alerts will be printed.
118
119 =head2 --nohints
120
121 Don't output any hints. Hints often contain useful portability
122 notes. Warnings will still be displayed.
123
124 =head2 --nochanges
125
126 Don't suggest any changes. Only give diagnostic output and hints
127 unless these are also deactivated.
128
129 =head2 --nofilter
130
131 Don't filter the list of input files. By default, files not looking
132 like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
133
134 =head2 --strip
135
136 Strip all script and documentation functionality from F<ppport.h>.
137 This reduces the size of F<ppport.h> dramatically and may be useful
138 if you want to include F<ppport.h> in smaller modules without
139 increasing their distribution size too much.
140
141 The stripped F<ppport.h> will have a C<--unstrip> option that allows
142 you to undo the stripping, but only if an appropriate C<Devel::PPPort>
143 module is installed.
144
145 =head2 --list-provided
146
147 Lists the API elements for which compatibility is provided by
148 F<ppport.h>. Also lists if it must be explicitly requested,
149 if it has dependencies, and if there are hints or warnings for it.
150
151 =head2 --list-unsupported
152
153 Lists the API elements that are known not to be supported by
154 F<ppport.h> and below which version of Perl they probably
155 won't be available or work.
156
157 =head2 --api-info=I<name>
158
159 Show portability information for API elements matching I<name>.
160 If I<name> is surrounded by slashes, it is interpreted as a regular
161 expression.
162
163 =head1 DESCRIPTION
164
165 In order for a Perl extension (XS) module to be as portable as possible
166 across differing versions of Perl itself, certain steps need to be taken.
167
168 =over 4
169
170 =item *
171
172 Including this header is the first major one. This alone will give you
173 access to a large part of the Perl API that hasn't been available in
174 earlier Perl releases. Use
175
176 perl ppport.h --list-provided
177
178 to see which API elements are provided by ppport.h.
179
180 =item *
181
182 You should avoid using deprecated parts of the API. For example, using
183 global Perl variables without the C<PL_> prefix is deprecated. Also,
184 some API functions used to have a C<perl_> prefix. Using this form is
185 also deprecated. You can safely use the supported API, as F<ppport.h>
186 will provide wrappers for older Perl versions.
187
188 =item *
189
190 If you use one of a few functions or variables that were not present in
191 earlier versions of Perl, and that can't be provided using a macro, you
192 have to explicitly request support for these functions by adding one or
193 more C<#define>s in your source code before the inclusion of F<ppport.h>.
194
195 These functions or variables will be marked C<explicit> in the list shown
196 by C<--list-provided>.
197
198 Depending on whether you module has a single or multiple files that
199 use such functions or variables, you want either C<static> or global
200 variants.
201
202 For a C<static> function or variable (used only in a single source
203 file), use:
204
205 #define NEED_function
206 #define NEED_variable
207
208 For a global function or variable (used in multiple source files),
209 use:
210
211 #define NEED_function_GLOBAL
212 #define NEED_variable_GLOBAL
213
214 Note that you mustn't have more than one global request for the
215 same function or variable in your project.
216
217 Function / Variable Static Request Global Request
218 -----------------------------------------------------------------------------------------
219 PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL
220 PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL
221 eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL
222 grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL
223 grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL
224 grok_number() NEED_grok_number NEED_grok_number_GLOBAL
225 grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL
226 grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL
227 load_module() NEED_load_module NEED_load_module_GLOBAL
228 my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL
229 my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL
230 my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL
231 my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL
232 newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL
233 newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL
234 newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL
235 newSVpvn_flags() NEED_newSVpvn_flags NEED_newSVpvn_flags_GLOBAL
236 newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL
237 pv_display() NEED_pv_display NEED_pv_display_GLOBAL
238 pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL
239 pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL
240 sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL
241 sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL
242 sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL
243 sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL
244 sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL
245 sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL
246 sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL
247 vload_module() NEED_vload_module NEED_vload_module_GLOBAL
248 vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL
249 warner() NEED_warner NEED_warner_GLOBAL
250
251 To avoid namespace conflicts, you can change the namespace of the
252 explicitly exported functions / variables using the C<DPPP_NAMESPACE>
253 macro. Just C<#define> the macro before including C<ppport.h>:
254
255 #define DPPP_NAMESPACE MyOwnNamespace_
256 #include "ppport.h"
257
258 The default namespace is C<DPPP_>.
259
260 =back
261
262 The good thing is that most of the above can be checked by running
263 F<ppport.h> on your source code. See the next section for
264 details.
265
266 =head1 EXAMPLES
267
268 To verify whether F<ppport.h> is needed for your module, whether you
269 should make any changes to your code, and whether any special defines
270 should be used, F<ppport.h> can be run as a Perl script to check your
271 source code. Simply say:
272
273 perl ppport.h
274
275 The result will usually be a list of patches suggesting changes
276 that should at least be acceptable, if not necessarily the most
277 efficient solution, or a fix for all possible problems.
278
279 If you know that your XS module uses features only available in
280 newer Perl releases, if you're aware that it uses C++ comments,
281 and if you want all suggestions as a single patch file, you could
282 use something like this:
283
284 perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
285
286 If you only want your code to be scanned without any suggestions
287 for changes, use:
288
289 perl ppport.h --nochanges
290
291 You can specify a different C<diff> program or options, using
292 the C<--diff> option:
293
294 perl ppport.h --diff='diff -C 10'
295
296 This would output context diffs with 10 lines of context.
297
298 If you want to create patched copies of your files instead, use:
299
300 perl ppport.h --copy=.new
301
302 To display portability information for the C<newSVpvn> function,
303 use:
304
305 perl ppport.h --api-info=newSVpvn
306
307 Since the argument to C<--api-info> can be a regular expression,
308 you can use
309
310 perl ppport.h --api-info=/_nomg$/
311
312 to display portability information for all C<_nomg> functions or
313
314 perl ppport.h --api-info=/./
315
316 to display information for all known API elements.
317
318 =head1 BUGS
319
320 If this version of F<ppport.h> is causing failure during
321 the compilation of this module, please check if newer versions
322 of either this module or C<Devel::PPPort> are available on CPAN
323 before sending a bug report.
324
325 If F<ppport.h> was generated using the latest version of
326 C<Devel::PPPort> and is causing failure of this module, please
327 file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
328
329 Please include the following information:
330
331 =over 4
332
333 =item 1.
334
335 The complete output from running "perl -V"
336
337 =item 2.
338
339 This file.
340
341 =item 3.
342
343 The name and version of the module you were trying to build.
344
345 =item 4.
346
347 A full log of the build that failed.
348
349 =item 5.
350
351 Any other information that you think could be relevant.
352
353 =back
354
355 For the latest version of this code, please get the C<Devel::PPPort>
356 module from CPAN.
357
358 =head1 COPYRIGHT
359
360 Version 3.x, Copyright (c) 2004-2009, Marcus Holland-Moritz.
361
362 Version 2.x, Copyright (C) 2001, Paul Marquess.
363
364 Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
365
366 This program is free software; you can redistribute it and/or
367 modify it under the same terms as Perl itself.
368
369 =head1 SEE ALSO
370
371 See L<Devel::PPPort>.
372
373 =cut
374
375 use strict;
376
377 # Disable broken TRIE-optimization
378 BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 }
379
380 my $VERSION = 3.19;
381
382 my %opt = (
383 quiet => 0,
384 diag => 1,
385 hints => 1,
386 changes => 1,
387 cplusplus => 0,
388 filter => 1,
389 strip => 0,
390 version => 0,
391 );
392
393 my($ppport) = $0 =~ /([\w.]+)$/;
394 my $LF = '(?:\r\n|[\r\n])'; # line feed
395 my $HS = "[ \t]"; # horizontal whitespace
396
397 # Never use C comments in this file!
398 my $ccs = '/'.'*';
399 my $cce = '*'.'/';
400 my $rccs = quotemeta $ccs;
401 my $rcce = quotemeta $cce;
402
403 eval {
404 require Getopt::Long;
405 Getopt::Long::GetOptions(\%opt, qw(
406 help quiet diag! filter! hints! changes! cplusplus strip version
407 patch=s copy=s diff=s compat-version=s
408 list-provided list-unsupported api-info=s
409 )) or usage();
410 };
411
412 if ($@ and grep /^-/, @ARGV) {
413 usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
414 die "Getopt::Long not found. Please don't use any options.\n";
415 }
416
417 if ($opt{version}) {
418 print "This is $0 $VERSION.\n";
419 exit 0;
420 }
421
422 usage() if $opt{help};
423 strip() if $opt{strip};
424
425 if (exists $opt{'compat-version'}) {
426 my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
427 if ($@) {
428 die "Invalid version number format: '$opt{'compat-version'}'\n";
429 }
430 die "Only Perl 5 is supported\n" if $r != 5;
431 die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
432 $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
433 }
434 else {
435 $opt{'compat-version'} = 5;
436 }
437
438 my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
439 ? ( $1 => {
440 ($2 ? ( base => $2 ) : ()),
441 ($3 ? ( todo => $3 ) : ()),
442 (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()),
443 (index($4, 'p') >= 0 ? ( provided => 1 ) : ()),
444 (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()),
445 } )
446 : die "invalid spec: $_" } qw(
447 AvFILLp|5.004050||p
448 AvFILL|||
449 CLASS|||n
450 CPERLscope|5.005000||p
451 CX_CURPAD_SAVE|||
452 CX_CURPAD_SV|||
453 CopFILEAV|5.006000||p
454 CopFILEGV_set|5.006000||p
455 CopFILEGV|5.006000||p
456 CopFILESV|5.006000||p
457 CopFILE_set|5.006000||p
458 CopFILE|5.006000||p
459 CopSTASHPV_set|5.006000||p
460 CopSTASHPV|5.006000||p
461 CopSTASH_eq|5.006000||p
462 CopSTASH_set|5.006000||p
463 CopSTASH|5.006000||p
464 CopyD|5.009002||p
465 Copy|||
466 CvPADLIST|||
467 CvSTASH|||
468 CvWEAKOUTSIDE|||
469 DEFSV_set|5.011000||p
470 DEFSV|5.004050||p
471 END_EXTERN_C|5.005000||p
472 ENTER|||
473 ERRSV|5.004050||p
474 EXTEND|||
475 EXTERN_C|5.005000||p
476 F0convert|||n
477 FREETMPS|||
478 GIMME_V||5.004000|n
479 GIMME|||n
480 GROK_NUMERIC_RADIX|5.007002||p
481 G_ARRAY|||
482 G_DISCARD|||
483 G_EVAL|||
484 G_METHOD|5.006001||p
485 G_NOARGS|||
486 G_SCALAR|||
487 G_VOID||5.004000|
488 GetVars|||
489 GvSVn|5.009003||p
490 GvSV|||
491 Gv_AMupdate|||
492 HEf_SVKEY||5.004000|
493 HeHASH||5.004000|
494 HeKEY||5.004000|
495 HeKLEN||5.004000|
496 HePV||5.004000|
497 HeSVKEY_force||5.004000|
498 HeSVKEY_set||5.004000|
499 HeSVKEY||5.004000|
500 HeUTF8||5.011000|
501 HeVAL||5.004000|
502 HvNAMELEN_get|5.009003||p
503 HvNAME_get|5.009003||p
504 HvNAME|||
505 INT2PTR|5.006000||p
506 IN_LOCALE_COMPILETIME|5.007002||p
507 IN_LOCALE_RUNTIME|5.007002||p
508 IN_LOCALE|5.007002||p
509 IN_PERL_COMPILETIME|5.008001||p
510 IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
511 IS_NUMBER_INFINITY|5.007002||p
512 IS_NUMBER_IN_UV|5.007002||p
513 IS_NUMBER_NAN|5.007003||p
514 IS_NUMBER_NEG|5.007002||p
515 IS_NUMBER_NOT_INT|5.007002||p
516 IVSIZE|5.006000||p
517 IVTYPE|5.006000||p
518 IVdf|5.006000||p
519 LEAVE|||
520 LVRET|||
521 MARK|||
522 MULTICALL||5.011000|
523 MY_CXT_CLONE|5.009002||p
524 MY_CXT_INIT|5.007003||p
525 MY_CXT|5.007003||p
526 MoveD|5.009002||p
527 Move|||
528 NOOP|5.005000||p
529 NUM2PTR|5.006000||p
530 NVTYPE|5.006000||p
531 NVef|5.006001||p
532 NVff|5.006001||p
533 NVgf|5.006001||p
534 Newxc|5.009003||p
535 Newxz|5.009003||p
536 Newx|5.009003||p
537 Nullav|||
538 Nullch|||
539 Nullcv|||
540 Nullhv|||
541 Nullsv|||
542 ORIGMARK|||
543 PAD_BASE_SV|||
544 PAD_CLONE_VARS|||
545 PAD_COMPNAME_FLAGS|||
546 PAD_COMPNAME_GEN_set|||
547 PAD_COMPNAME_GEN|||
548 PAD_COMPNAME_OURSTASH|||
549 PAD_COMPNAME_PV|||
550 PAD_COMPNAME_TYPE|||
551 PAD_DUP|||
552 PAD_RESTORE_LOCAL|||
553 PAD_SAVE_LOCAL|||
554 PAD_SAVE_SETNULLPAD|||
555 PAD_SETSV|||
556 PAD_SET_CUR_NOSAVE|||
557 PAD_SET_CUR|||
558 PAD_SVl|||
559 PAD_SV|||
560 PERLIO_FUNCS_CAST|5.009003||p
561 PERLIO_FUNCS_DECL|5.009003||p
562 PERL_ABS|5.008001||p
563 PERL_BCDVERSION|5.011000||p
564 PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
565 PERL_HASH|5.004000||p
566 PERL_INT_MAX|5.004000||p
567 PERL_INT_MIN|5.004000||p
568 PERL_LONG_MAX|5.004000||p
569 PERL_LONG_MIN|5.004000||p
570 PERL_MAGIC_arylen|5.007002||p
571 PERL_MAGIC_backref|5.007002||p
572 PERL_MAGIC_bm|5.007002||p
573 PERL_MAGIC_collxfrm|5.007002||p
574 PERL_MAGIC_dbfile|5.007002||p
575 PERL_MAGIC_dbline|5.007002||p
576 PERL_MAGIC_defelem|5.007002||p
577 PERL_MAGIC_envelem|5.007002||p
578 PERL_MAGIC_env|5.007002||p
579 PERL_MAGIC_ext|5.007002||p
580 PERL_MAGIC_fm|5.007002||p
581 PERL_MAGIC_glob|5.011000||p
582 PERL_MAGIC_isaelem|5.007002||p
583 PERL_MAGIC_isa|5.007002||p
584 PERL_MAGIC_mutex|5.011000||p
585 PERL_MAGIC_nkeys|5.007002||p
586 PERL_MAGIC_overload_elem|5.007002||p
587 PERL_MAGIC_overload_table|5.007002||p
588 PERL_MAGIC_overload|5.007002||p
589 PERL_MAGIC_pos|5.007002||p
590 PERL_MAGIC_qr|5.007002||p
591 PERL_MAGIC_regdata|5.007002||p
592 PERL_MAGIC_regdatum|5.007002||p
593 PERL_MAGIC_regex_global|5.007002||p
594 PERL_MAGIC_shared_scalar|5.007003||p
595 PERL_MAGIC_shared|5.007003||p
596 PERL_MAGIC_sigelem|5.007002||p
597 PERL_MAGIC_sig|5.007002||p
598 PERL_MAGIC_substr|5.007002||p
599 PERL_MAGIC_sv|5.007002||p
600 PERL_MAGIC_taint|5.007002||p
601 PERL_MAGIC_tiedelem|5.007002||p
602 PERL_MAGIC_tiedscalar|5.007002||p
603 PERL_MAGIC_tied|5.007002||p
604 PERL_MAGIC_utf8|5.008001||p
605 PERL_MAGIC_uvar_elem|5.007003||p
606 PERL_MAGIC_uvar|5.007002||p
607 PERL_MAGIC_vec|5.007002||p
608 PERL_MAGIC_vstring|5.008001||p
609 PERL_PV_ESCAPE_ALL|5.009004||p
610 PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p
611 PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p
612 PERL_PV_ESCAPE_NOCLEAR|5.009004||p
613 PERL_PV_ESCAPE_QUOTE|5.009004||p
614 PERL_PV_ESCAPE_RE|5.009005||p
615 PERL_PV_ESCAPE_UNI_DETECT|5.009004||p
616 PERL_PV_ESCAPE_UNI|5.009004||p
617 PERL_PV_PRETTY_DUMP|5.009004||p
618 PERL_PV_PRETTY_ELLIPSES|5.010000||p
619 PERL_PV_PRETTY_LTGT|5.009004||p
620 PERL_PV_PRETTY_NOCLEAR|5.010000||p
621 PERL_PV_PRETTY_QUOTE|5.009004||p
622 PERL_PV_PRETTY_REGPROP|5.009004||p
623 PERL_QUAD_MAX|5.004000||p
624 PERL_QUAD_MIN|5.004000||p
625 PERL_REVISION|5.006000||p
626 PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
627 PERL_SCAN_DISALLOW_PREFIX|5.007003||p
628 PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
629 PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
630 PERL_SHORT_MAX|5.004000||p
631 PERL_SHORT_MIN|5.004000||p
632 PERL_SIGNALS_UNSAFE_FLAG|5.008001||p
633 PERL_SUBVERSION|5.006000||p
634 PERL_SYS_INIT3||5.006000|
635 PERL_SYS_INIT|||
636 PERL_SYS_TERM||5.011000|
637 PERL_UCHAR_MAX|5.004000||p
638 PERL_UCHAR_MIN|5.004000||p
639 PERL_UINT_MAX|5.004000||p
640 PERL_UINT_MIN|5.004000||p
641 PERL_ULONG_MAX|5.004000||p
642 PERL_ULONG_MIN|5.004000||p
643 PERL_UNUSED_ARG|5.009003||p
644 PERL_UNUSED_CONTEXT|5.009004||p
645 PERL_UNUSED_DECL|5.007002||p
646 PERL_UNUSED_VAR|5.007002||p
647 PERL_UQUAD_MAX|5.004000||p
648 PERL_UQUAD_MIN|5.004000||p
649 PERL_USE_GCC_BRACE_GROUPS|5.009004||p
650 PERL_USHORT_MAX|5.004000||p
651 PERL_USHORT_MIN|5.004000||p
652 PERL_VERSION|5.006000||p
653 PL_DBsignal|5.005000||p
654 PL_DBsingle|||pn
655 PL_DBsub|||pn
656 PL_DBtrace|||pn
657 PL_Sv|5.005000||p
658 PL_bufend|5.011000||p
659 PL_bufptr|5.011000||p
660 PL_compiling|5.004050||p
661 PL_copline|5.011000||p
662 PL_curcop|5.004050||p
663 PL_curstash|5.004050||p
664 PL_debstash|5.004050||p
665 PL_defgv|5.004050||p
666 PL_diehook|5.004050||p
667 PL_dirty|5.004050||p
668 PL_dowarn|||pn
669 PL_errgv|5.004050||p
670 PL_error_count|5.011000||p
671 PL_expect|5.011000||p
672 PL_hexdigit|5.005000||p
673 PL_hints|5.005000||p
674 PL_in_my_stash|5.011000||p
675 PL_in_my|5.011000||p
676 PL_last_in_gv|||n
677 PL_laststatval|5.005000||p
678 PL_lex_state|5.011000||p
679 PL_lex_stuff|5.011000||p
680 PL_linestr|5.011000||p
681 PL_modglobal||5.005000|n
682 PL_na|5.004050||pn
683 PL_no_modify|5.006000||p
684 PL_ofsgv|||n
685 PL_parser|5.009005||p
686 PL_perl_destruct_level|5.004050||p
687 PL_perldb|5.004050||p
688 PL_ppaddr|5.006000||p
689 PL_rsfp_filters|5.004050||p
690 PL_rsfp|5.004050||p
691 PL_rs|||n
692 PL_signals|5.008001||p
693 PL_stack_base|5.004050||p
694 PL_stack_sp|5.004050||p
695 PL_statcache|5.005000||p
696 PL_stdingv|5.004050||p
697 PL_sv_arenaroot|5.004050||p
698 PL_sv_no|5.004050||pn
699 PL_sv_undef|5.004050||pn
700 PL_sv_yes|5.004050||pn
701 PL_tainted|5.004050||p
702 PL_tainting|5.004050||p
703 PL_tokenbuf|5.011000||p
704 POP_MULTICALL||5.011000|
705 POPi|||n
706 POPl|||n
707 POPn|||n
708 POPpbytex||5.007001|n
709 POPpx||5.005030|n
710 POPp|||n
711 POPs|||n
712 PTR2IV|5.006000||p
713 PTR2NV|5.006000||p
714 PTR2UV|5.006000||p
715 PTR2nat|5.009003||p
716 PTR2ul|5.007001||p
717 PTRV|5.006000||p
718 PUSHMARK|||
719 PUSH_MULTICALL||5.011000|
720 PUSHi|||
721 PUSHmortal|5.009002||p
722 PUSHn|||
723 PUSHp|||
724 PUSHs|||
725 PUSHu|5.004000||p
726 PUTBACK|||
727 PerlIO_clearerr||5.007003|
728 PerlIO_close||5.007003|
729 PerlIO_context_layers||5.009004|
730 PerlIO_eof||5.007003|
731 PerlIO_error||5.007003|
732 PerlIO_fileno||5.007003|
733 PerlIO_fill||5.007003|
734 PerlIO_flush||5.007003|
735 PerlIO_get_base||5.007003|
736 PerlIO_get_bufsiz||5.007003|
737 PerlIO_get_cnt||5.007003|
738 PerlIO_get_ptr||5.007003|
739 PerlIO_read||5.007003|
740 PerlIO_seek||5.007003|
741 PerlIO_set_cnt||5.007003|
742 PerlIO_set_ptrcnt||5.007003|
743 PerlIO_setlinebuf||5.007003|
744 PerlIO_stderr||5.007003|
745 PerlIO_stdin||5.007003|
746 PerlIO_stdout||5.007003|
747 PerlIO_tell||5.007003|
748 PerlIO_unread||5.007003|
749 PerlIO_write||5.007003|
750 Perl_signbit||5.009005|n
751 PoisonFree|5.009004||p
752 PoisonNew|5.009004||p
753 PoisonWith|5.009004||p
754 Poison|5.008000||p
755 RETVAL|||n
756 Renewc|||
757 Renew|||
758 SAVECLEARSV|||
759 SAVECOMPPAD|||
760 SAVEPADSV|||
761 SAVETMPS|||
762 SAVE_DEFSV|5.004050||p
763 SPAGAIN|||
764 SP|||
765 START_EXTERN_C|5.005000||p
766 START_MY_CXT|5.007003||p
767 STMT_END|||p
768 STMT_START|||p
769 STR_WITH_LEN|5.009003||p
770 ST|||
771 SV_CONST_RETURN|5.009003||p
772 SV_COW_DROP_PV|5.008001||p
773 SV_COW_SHARED_HASH_KEYS|5.009005||p
774 SV_GMAGIC|5.007002||p
775 SV_HAS_TRAILING_NUL|5.009004||p
776 SV_IMMEDIATE_UNREF|5.007001||p
777 SV_MUTABLE_RETURN|5.009003||p
778 SV_NOSTEAL|5.009002||p
779 SV_SMAGIC|5.009003||p
780 SV_UTF8_NO_ENCODING|5.008001||p
781 SVfARG|5.009005||p
782 SVf_UTF8|5.006000||p
783 SVf|5.006000||p
784 SVt_IV|||
785 SVt_NV|||
786 SVt_PVAV|||
787 SVt_PVCV|||
788 SVt_PVHV|||
789 SVt_PVMG|||
790 SVt_PV|||
791 Safefree|||
792 Slab_Alloc|||
793 Slab_Free|||
794 Slab_to_rw|||
795 StructCopy|||
796 SvCUR_set|||
797 SvCUR|||
798 SvEND|||
799 SvGAMAGIC||5.006001|
800 SvGETMAGIC|5.004050||p
801 SvGROW|||
802 SvIOK_UV||5.006000|
803 SvIOK_notUV||5.006000|
804 SvIOK_off|||
805 SvIOK_only_UV||5.006000|
806 SvIOK_only|||
807 SvIOK_on|||
808 SvIOKp|||
809 SvIOK|||
810 SvIVX|||
811 SvIV_nomg|5.009001||p
812 SvIV_set|||
813 SvIVx|||
814 SvIV|||
815 SvIsCOW_shared_hash||5.008003|
816 SvIsCOW||5.008003|
817 SvLEN_set|||
818 SvLEN|||
819 SvLOCK||5.007003|
820 SvMAGIC_set|5.009003||p
821 SvNIOK_off|||
822 SvNIOKp|||
823 SvNIOK|||
824 SvNOK_off|||
825 SvNOK_only|||
826 SvNOK_on|||
827 SvNOKp|||
828 SvNOK|||
829 SvNVX|||
830 SvNV_set|||
831 SvNVx|||
832 SvNV|||
833 SvOK|||
834 SvOOK_offset||5.011000|
835 SvOOK|||
836 SvPOK_off|||
837 SvPOK_only_UTF8||5.006000|
838 SvPOK_only|||
839 SvPOK_on|||
840 SvPOKp|||
841 SvPOK|||
842 SvPVX_const|5.009003||p
843 SvPVX_mutable|5.009003||p
844 SvPVX|||
845 SvPV_const|5.009003||p
846 SvPV_flags_const_nolen|5.009003||p
847 SvPV_flags_const|5.009003||p
848 SvPV_flags_mutable|5.009003||p
849 SvPV_flags|5.007002||p
850 SvPV_force_flags_mutable|5.009003||p
851 SvPV_force_flags_nolen|5.009003||p
852 SvPV_force_flags|5.007002||p
853 SvPV_force_mutable|5.009003||p
854 SvPV_force_nolen|5.009003||p
855 SvPV_force_nomg_nolen|5.009003||p
856 SvPV_force_nomg|5.007002||p
857 SvPV_force|||p
858 SvPV_mutable|5.009003||p
859 SvPV_nolen_const|5.009003||p
860 SvPV_nolen|5.006000||p
861 SvPV_nomg_const_nolen|5.009003||p
862 SvPV_nomg_const|5.009003||p
863 SvPV_nomg|5.007002||p
864 SvPV_renew|5.009003||p
865 SvPV_set|||
866 SvPVbyte_force||5.009002|
867 SvPVbyte_nolen||5.006000|
868 SvPVbytex_force||5.006000|
869 SvPVbytex||5.006000|
870 SvPVbyte|5.006000||p
871 SvPVutf8_force||5.006000|
872 SvPVutf8_nolen||5.006000|
873 SvPVutf8x_force||5.006000|
874 SvPVutf8x||5.006000|
875 SvPVutf8||5.006000|
876 SvPVx|||
877 SvPV|||
878 SvREFCNT_dec|||
879 SvREFCNT_inc_NN|5.009004||p
880 SvREFCNT_inc_simple_NN|5.009004||p
881 SvREFCNT_inc_simple_void_NN|5.009004||p
882 SvREFCNT_inc_simple_void|5.009004||p
883 SvREFCNT_inc_simple|5.009004||p
884 SvREFCNT_inc_void_NN|5.009004||p
885 SvREFCNT_inc_void|5.009004||p
886 SvREFCNT_inc|||p
887 SvREFCNT|||
888 SvROK_off|||
889 SvROK_on|||
890 SvROK|||
891 SvRV_set|5.009003||p
892 SvRV|||
893 SvRXOK||5.009005|
894 SvRX||5.009005|
895 SvSETMAGIC|||
896 SvSHARED_HASH|5.009003||p
897 SvSHARE||5.007003|
898 SvSTASH_set|5.009003||p
899 SvSTASH|||
900 SvSetMagicSV_nosteal||5.004000|
901 SvSetMagicSV||5.004000|
902 SvSetSV_nosteal||5.004000|
903 SvSetSV|||
904 SvTAINTED_off||5.004000|
905 SvTAINTED_on||5.004000|
906 SvTAINTED||5.004000|
907 SvTAINT|||
908 SvTRUE|||
909 SvTYPE|||
910 SvUNLOCK||5.007003|
911 SvUOK|5.007001|5.006000|p
912 SvUPGRADE|||
913 SvUTF8_off||5.006000|
914 SvUTF8_on||5.006000|
915 SvUTF8||5.006000|
916 SvUVXx|5.004000||p
917 SvUVX|5.004000||p
918 SvUV_nomg|5.009001||p
919 SvUV_set|5.009003||p
920 SvUVx|5.004000||p
921 SvUV|5.004000||p
922 SvVOK||5.008001|
923 SvVSTRING_mg|5.009004||p
924 THIS|||n
925 UNDERBAR|5.009002||p
926 UTF8_MAXBYTES|5.009002||p
927 UVSIZE|5.006000||p
928 UVTYPE|5.006000||p
929 UVXf|5.007001||p
930 UVof|5.006000||p
931 UVuf|5.006000||p
932 UVxf|5.006000||p
933 WARN_ALL|5.006000||p
934 WARN_AMBIGUOUS|5.006000||p
935 WARN_ASSERTIONS|5.011000||p
936 WARN_BAREWORD|5.006000||p
937 WARN_CLOSED|5.006000||p
938 WARN_CLOSURE|5.006000||p
939 WARN_DEBUGGING|5.006000||p
940 WARN_DEPRECATED|5.006000||p
941 WARN_DIGIT|5.006000||p
942 WARN_EXEC|5.006000||p
943 WARN_EXITING|5.006000||p
944 WARN_GLOB|5.006000||p
945 WARN_INPLACE|5.006000||p
946 WARN_INTERNAL|5.006000||p
947 WARN_IO|5.006000||p
948 WARN_LAYER|5.008000||p
949 WARN_MALLOC|5.006000||p
950 WARN_MISC|5.006000||p
951 WARN_NEWLINE|5.006000||p
952 WARN_NUMERIC|5.006000||p
953 WARN_ONCE|5.006000||p
954 WARN_OVERFLOW|5.006000||p
955 WARN_PACK|5.006000||p
956 WARN_PARENTHESIS|5.006000||p
957 WARN_PIPE|5.006000||p
958 WARN_PORTABLE|5.006000||p
959 WARN_PRECEDENCE|5.006000||p
960 WARN_PRINTF|5.006000||p
961 WARN_PROTOTYPE|5.006000||p
962 WARN_QW|5.006000||p
963 WARN_RECURSION|5.006000||p
964 WARN_REDEFINE|5.006000||p
965 WARN_REGEXP|5.006000||p
966 WARN_RESERVED|5.006000||p
967 WARN_SEMICOLON|5.006000||p
968 WARN_SEVERE|5.006000||p
969 WARN_SIGNAL|5.006000||p
970 WARN_SUBSTR|5.006000||p
971 WARN_SYNTAX|5.006000||p
972 WARN_TAINT|5.006000||p
973 WARN_THREADS|5.008000||p
974 WARN_UNINITIALIZED|5.006000||p
975 WARN_UNOPENED|5.006000||p
976 WARN_UNPACK|5.006000||p
977 WARN_UNTIE|5.006000||p
978 WARN_UTF8|5.006000||p
979 WARN_VOID|5.006000||p
980 XCPT_CATCH|5.009002||p
981 XCPT_RETHROW|5.009002||p
982 XCPT_TRY_END|5.009002||p
983 XCPT_TRY_START|5.009002||p
984 XPUSHi|||
985 XPUSHmortal|5.009002||p
986 XPUSHn|||
987 XPUSHp|||
988 XPUSHs|||
989 XPUSHu|5.004000||p
990 XSPROTO|5.010000||p
991 XSRETURN_EMPTY|||
992 XSRETURN_IV|||
993 XSRETURN_NO|||
994 XSRETURN_NV|||
995 XSRETURN_PV|||
996 XSRETURN_UNDEF|||
997 XSRETURN_UV|5.008001||p
998 XSRETURN_YES|||
999 XSRETURN|||p
1000 XST_mIV|||
1001 XST_mNO|||
1002 XST_mNV|||
1003 XST_mPV|||
1004 XST_mUNDEF|||
1005 XST_mUV|5.008001||p
1006 XST_mYES|||
1007 XS_VERSION_BOOTCHECK|||
1008 XS_VERSION|||
1009 XSprePUSH|5.006000||p
1010 XS|||
1011 ZeroD|5.009002||p
1012 Zero|||
1013 _aMY_CXT|5.007003||p
1014 _pMY_CXT|5.007003||p
1015 aMY_CXT_|5.007003||p
1016 aMY_CXT|5.007003||p
1017 aTHXR_|5.011000||p
1018 aTHXR|5.011000||p
1019 aTHX_|5.006000||p
1020 aTHX|5.006000||p
1021 add_data|||n
1022 addmad|||
1023 allocmy|||
1024 amagic_call|||
1025 amagic_cmp_locale|||
1026 amagic_cmp|||
1027 amagic_i_ncmp|||
1028 amagic_ncmp|||
1029 any_dup|||
1030 ao|||
1031 append_elem|||
1032 append_list|||
1033 append_madprops|||
1034 apply_attrs_my|||
1035 apply_attrs_string||5.006001|
1036 apply_attrs|||
1037 apply|||
1038 atfork_lock||5.007003|n
1039 atfork_unlock||5.007003|n
1040 av_arylen_p||5.009003|
1041 av_clear|||
1042 av_create_and_push||5.009005|
1043 av_create_and_unshift_one||5.009005|
1044 av_delete||5.006000|
1045 av_exists||5.006000|
1046 av_extend|||
1047 av_fetch|||
1048 av_fill|||
1049 av_iter_p||5.011000|
1050 av_len|||
1051 av_make|||
1052 av_pop|||
1053 av_push|||
1054 av_reify|||
1055 av_shift|||
1056 av_store|||
1057 av_undef|||
1058 av_unshift|||
1059 ax|||n
1060 bad_type|||
1061 bind_match|||
1062 block_end|||
1063 block_gimme||5.004000|
1064 block_start|||
1065 boolSV|5.004000||p
1066 boot_core_PerlIO|||
1067 boot_core_UNIVERSAL|||
1068 boot_core_mro|||
1069 bytes_from_utf8||5.007001|
1070 bytes_to_uni|||n
1071 bytes_to_utf8||5.006001|
1072 call_argv|5.006000||p
1073 call_atexit||5.006000|
1074 call_list||5.004000|
1075 call_method|5.006000||p
1076 call_pv|5.006000||p
1077 call_sv|5.006000||p
1078 calloc||5.007002|n
1079 cando|||
1080 cast_i32||5.006000|
1081 cast_iv||5.006000|
1082 cast_ulong||5.006000|
1083 cast_uv||5.006000|
1084 check_type_and_open|||
1085 check_uni|||
1086 checkcomma|||
1087 checkposixcc|||
1088 ckWARN|5.006000||p
1089 ck_anoncode|||
1090 ck_bitop|||
1091 ck_concat|||
1092 ck_defined|||
1093 ck_delete|||
1094 ck_die|||
1095 ck_each|||
1096 ck_eof|||
1097 ck_eval|||
1098 ck_exec|||
1099 ck_exists|||
1100 ck_exit|||
1101 ck_ftst|||
1102 ck_fun|||
1103 ck_glob|||
1104 ck_grep|||
1105 ck_index|||
1106 ck_join|||
1107 ck_lfun|||
1108 ck_listiob|||
1109 ck_match|||
1110 ck_method|||
1111 ck_null|||
1112 ck_open|||
1113 ck_readline|||
1114 ck_repeat|||
1115 ck_require|||
1116 ck_return|||
1117 ck_rfun|||
1118 ck_rvconst|||
1119 ck_sassign|||
1120 ck_select|||
1121 ck_shift|||
1122 ck_sort|||
1123 ck_spair|||
1124 ck_split|||
1125 ck_subr|||
1126 ck_substr|||
1127 ck_svconst|||
1128 ck_trunc|||
1129 ck_unpack|||
1130 ckwarn_d||5.009003|
1131 ckwarn||5.009003|
1132 cl_and|||n
1133 cl_anything|||n
1134 cl_init_zero|||n
1135 cl_init|||n
1136 cl_is_anything|||n
1137 cl_or|||n
1138 clear_placeholders|||
1139 closest_cop|||
1140 convert|||
1141 cop_free|||
1142 cr_textfilter|||
1143 create_eval_scope|||
1144 croak_nocontext|||vn
1145 croak_xs_usage||5.011000|
1146 croak|||v
1147 csighandler||5.009003|n
1148 curmad|||
1149 custom_op_desc||5.007003|
1150 custom_op_name||5.007003|
1151 cv_ckproto_len|||
1152 cv_clone|||
1153 cv_const_sv||5.004000|
1154 cv_dump|||
1155 cv_undef|||
1156 cx_dump||5.005000|
1157 cx_dup|||
1158 cxinc|||
1159 dAXMARK|5.009003||p
1160 dAX|5.007002||p
1161 dITEMS|5.007002||p
1162 dMARK|||
1163 dMULTICALL||5.009003|
1164 dMY_CXT_SV|5.007003||p
1165 dMY_CXT|5.007003||p
1166 dNOOP|5.006000||p
1167 dORIGMARK|||
1168 dSP|||
1169 dTHR|5.004050||p
1170 dTHXR|5.011000||p
1171 dTHXa|5.006000||p
1172 dTHXoa|5.006000||p
1173 dTHX|5.006000||p
1174 dUNDERBAR|5.009002||p
1175 dVAR|5.009003||p
1176 dXCPT|5.009002||p
1177 dXSARGS|||
1178 dXSI32|||
1179 dXSTARG|5.006000||p
1180 deb_curcv|||
1181 deb_nocontext|||vn
1182 deb_stack_all|||
1183 deb_stack_n|||
1184 debop||5.005000|
1185 debprofdump||5.005000|
1186 debprof|||
1187 debstackptrs||5.007003|
1188 debstack||5.007003|
1189 debug_start_match|||
1190 deb||5.007003|v
1191 del_sv|||
1192 delete_eval_scope|||
1193 delimcpy||5.004000|
1194 deprecate_old|||
1195 deprecate|||
1196 despatch_signals||5.007001|
1197 destroy_matcher|||
1198 die_nocontext|||vn
1199 die_where|||
1200 die|||v
1201 dirp_dup|||
1202 div128|||
1203 djSP|||
1204 do_aexec5|||
1205 do_aexec|||
1206 do_aspawn|||
1207 do_binmode||5.004050|
1208 do_chomp|||
1209 do_chop|||
1210 do_close|||
1211 do_dump_pad|||
1212 do_eof|||
1213 do_exec3|||
1214 do_execfree|||
1215 do_exec|||
1216 do_gv_dump||5.006000|
1217 do_gvgv_dump||5.006000|
1218 do_hv_dump||5.006000|
1219 do_ipcctl|||
1220 do_ipcget|||
1221 do_join|||
1222 do_kv|||
1223 do_magic_dump||5.006000|
1224 do_msgrcv|||
1225 do_msgsnd|||
1226 do_oddball|||
1227 do_op_dump||5.006000|
1228 do_op_xmldump|||
1229 do_open9||5.006000|
1230 do_openn||5.007001|
1231 do_open||5.004000|
1232 do_pmop_dump||5.006000|
1233 do_pmop_xmldump|||
1234 do_print|||
1235 do_readline|||
1236 do_seek|||
1237 do_semop|||
1238 do_shmio|||
1239 do_smartmatch|||
1240 do_spawn_nowait|||
1241 do_spawn|||
1242 do_sprintf|||
1243 do_sv_dump||5.006000|
1244 do_sysseek|||
1245 do_tell|||
1246 do_trans_complex_utf8|||
1247 do_trans_complex|||
1248 do_trans_count_utf8|||
1249 do_trans_count|||
1250 do_trans_simple_utf8|||
1251 do_trans_simple|||
1252 do_trans|||
1253 do_vecget|||
1254 do_vecset|||
1255 do_vop|||
1256 docatch|||
1257 doeval|||
1258 dofile|||
1259 dofindlabel|||
1260 doform|||
1261 doing_taint||5.008001|n
1262 dooneliner|||
1263 doopen_pm|||
1264 doparseform|||
1265 dopoptoeval|||
1266 dopoptogiven|||
1267 dopoptolabel|||
1268 dopoptoloop|||
1269 dopoptosub_at|||
1270 dopoptowhen|||
1271 doref||5.009003|
1272 dounwind|||
1273 dowantarray|||
1274 dump_all||5.006000|
1275 dump_eval||5.006000|
1276 dump_exec_pos|||
1277 dump_fds|||
1278 dump_form||5.006000|
1279 dump_indent||5.006000|v
1280 dump_mstats|||
1281 dump_packsubs||5.006000|
1282 dump_sub||5.006000|
1283 dump_sv_child|||
1284 dump_trie_interim_list|||
1285 dump_trie_interim_table|||
1286 dump_trie|||
1287 dump_vindent||5.006000|
1288 dumpuntil|||
1289 dup_attrlist|||
1290 emulate_cop_io|||
1291 eval_pv|5.006000||p
1292 eval_sv|5.006000||p
1293 exec_failed|||
1294 expect_number|||
1295 fbm_compile||5.005000|
1296 fbm_instr||5.005000|
1297 feature_is_enabled|||
1298 fetch_cop_label||5.011000|
1299 filter_add|||
1300 filter_del|||
1301 filter_gets|||
1302 filter_read|||
1303 find_and_forget_pmops|||
1304 find_array_subscript|||
1305 find_beginning|||
1306 find_byclass|||
1307 find_hash_subscript|||
1308 find_in_my_stash|||
1309 find_runcv||5.008001|
1310 find_rundefsvoffset||5.009002|
1311 find_script|||
1312 find_uninit_var|||
1313 first_symbol|||n
1314 fold_constants|||
1315 forbid_setid|||
1316 force_ident|||
1317 force_list|||
1318 force_next|||
1319 force_version|||
1320 force_word|||
1321 forget_pmop|||
1322 form_nocontext|||vn
1323 form||5.004000|v
1324 fp_dup|||
1325 fprintf_nocontext|||vn
1326 free_global_struct|||
1327 free_tied_hv_pool|||
1328 free_tmps|||
1329 gen_constant_list|||
1330 get_arena|||
1331 get_aux_mg|||
1332 get_av|5.006000||p
1333 get_context||5.006000|n
1334 get_cvn_flags||5.009005|
1335 get_cv|5.006000||p
1336 get_db_sub|||
1337 get_debug_opts|||
1338 get_hash_seed|||
1339 get_hv|5.006000||p
1340 get_isa_hash|||
1341 get_mstats|||
1342 get_no_modify|||
1343 get_num|||
1344 get_op_descs||5.005000|
1345 get_op_names||5.005000|
1346 get_opargs|||
1347 get_ppaddr||5.006000|
1348 get_re_arg|||
1349 get_sv|5.006000||p
1350 get_vtbl||5.005030|
1351 getcwd_sv||5.007002|
1352 getenv_len|||
1353 glob_2number|||
1354 glob_assign_glob|||
1355 glob_assign_ref|||
1356 gp_dup|||
1357 gp_free|||
1358 gp_ref|||
1359 grok_bin|5.007003||p
1360 grok_hex|5.007003||p
1361 grok_number|5.007002||p
1362 grok_numeric_radix|5.007002||p
1363 grok_oct|5.007003||p
1364 group_end|||
1365 gv_AVadd|||
1366 gv_HVadd|||
1367 gv_IOadd|||
1368 gv_SVadd|||
1369 gv_autoload4||5.004000|
1370 gv_check|||
1371 gv_const_sv||5.009003|
1372 gv_dump||5.006000|
1373 gv_efullname3||5.004000|
1374 gv_efullname4||5.006001|
1375 gv_efullname|||
1376 gv_ename|||
1377 gv_fetchfile_flags||5.009005|
1378 gv_fetchfile|||
1379 gv_fetchmeth_autoload||5.007003|
1380 gv_fetchmethod_autoload||5.004000|
1381 gv_fetchmethod_flags||5.011000|
1382 gv_fetchmethod|||
1383 gv_fetchmeth|||
1384 gv_fetchpvn_flags|5.009002||p
1385 gv_fetchpvs|5.009004||p
1386 gv_fetchpv|||
1387 gv_fetchsv||5.009002|
1388 gv_fullname3||5.004000|
1389 gv_fullname4||5.006001|
1390 gv_fullname|||
1391 gv_get_super_pkg|||
1392 gv_handler||5.007001|
1393 gv_init_sv|||
1394 gv_init|||
1395 gv_name_set||5.009004|
1396 gv_stashpvn|5.004000||p
1397 gv_stashpvs|5.009003||p
1398 gv_stashpv|||
1399 gv_stashsv|||
1400 he_dup|||
1401 hek_dup|||
1402 hfreeentries|||
1403 hsplit|||
1404 hv_assert||5.011000|
1405 hv_auxinit|||n
1406 hv_backreferences_p|||
1407 hv_clear_placeholders||5.009001|
1408 hv_clear|||
1409 hv_common_key_len||5.010000|
1410 hv_common||5.010000|
1411 hv_copy_hints_hv|||
1412 hv_delayfree_ent||5.004000|
1413 hv_delete_common|||
1414 hv_delete_ent||5.004000|
1415 hv_delete|||
1416 hv_eiter_p||5.009003|
1417 hv_eiter_set||5.009003|
1418 hv_exists_ent||5.004000|
1419 hv_exists|||
1420 hv_fetch_ent||5.004000|
1421 hv_fetchs|5.009003||p
1422 hv_fetch|||
1423 hv_free_ent||5.004000|
1424 hv_iterinit|||
1425 hv_iterkeysv||5.004000|
1426 hv_iterkey|||
1427 hv_iternext_flags||5.008000|
1428 hv_iternextsv|||
1429 hv_iternext|||
1430 hv_iterval|||
1431 hv_kill_backrefs|||
1432 hv_ksplit||5.004000|
1433 hv_magic_check|||n
1434 hv_magic|||
1435 hv_name_set||5.009003|
1436 hv_notallowed|||
1437 hv_placeholders_get||5.009003|
1438 hv_placeholders_p||5.009003|
1439 hv_placeholders_set||5.009003|
1440 hv_riter_p||5.009003|
1441 hv_riter_set||5.009003|
1442 hv_scalar||5.009001|
1443 hv_store_ent||5.004000|
1444 hv_store_flags||5.008000|
1445 hv_stores|5.009004||p
1446 hv_store|||
1447 hv_undef|||
1448 ibcmp_locale||5.004000|
1449 ibcmp_utf8||5.007003|
1450 ibcmp|||
1451 incline|||
1452 incpush_if_exists|||
1453 incpush_use_sep|||
1454 incpush|||
1455 ingroup|||
1456 init_argv_symbols|||
1457 init_debugger|||
1458 init_global_struct|||
1459 init_i18nl10n||5.006000|
1460 init_i18nl14n||5.006000|
1461 init_ids|||
1462 init_interp|||
1463 init_main_stash|||
1464 init_perllib|||
1465 init_postdump_symbols|||
1466 init_predump_symbols|||
1467 init_stacks||5.005000|
1468 init_tm||5.007002|
1469 instr|||
1470 intro_my|||
1471 intuit_method|||
1472 intuit_more|||
1473 invert|||
1474 io_close|||
1475 isALNUMC|5.006000||p
1476 isALNUM|||
1477 isALPHA|||
1478 isASCII|5.006000||p
1479 isBLANK|5.006001||p
1480 isCNTRL|5.006000||p
1481 isDIGIT|||
1482 isGRAPH|5.006000||p
1483 isGV_with_GP|5.009004||p
1484 isLOWER|||
1485 isPRINT|5.004000||p
1486 isPSXSPC|5.006001||p
1487 isPUNCT|5.006000||p
1488 isSPACE|||
1489 isUPPER|||
1490 isXDIGIT|5.006000||p
1491 is_an_int|||
1492 is_gv_magical_sv|||
1493 is_handle_constructor|||n
1494 is_list_assignment|||
1495 is_lvalue_sub||5.007001|
1496 is_uni_alnum_lc||5.006000|
1497 is_uni_alnumc_lc||5.006000|
1498 is_uni_alnumc||5.006000|
1499 is_uni_alnum||5.006000|
1500 is_uni_alpha_lc||5.006000|
1501 is_uni_alpha||5.006000|
1502 is_uni_ascii_lc||5.006000|
1503 is_uni_ascii||5.006000|
1504 is_uni_cntrl_lc||5.006000|
1505 is_uni_cntrl||5.006000|
1506 is_uni_digit_lc||5.006000|
1507 is_uni_digit||5.006000|
1508 is_uni_graph_lc||5.006000|
1509 is_uni_graph||5.006000|
1510 is_uni_idfirst_lc||5.006000|
1511 is_uni_idfirst||5.006000|
1512 is_uni_lower_lc||5.006000|
1513 is_uni_lower||5.006000|
1514 is_uni_print_lc||5.006000|
1515 is_uni_print||5.006000|
1516 is_uni_punct_lc||5.006000|
1517 is_uni_punct||5.006000|
1518 is_uni_space_lc||5.006000|
1519 is_uni_space||5.006000|
1520 is_uni_upper_lc||5.006000|
1521 is_uni_upper||5.006000|
1522 is_uni_xdigit_lc||5.006000|
1523 is_uni_xdigit||5.006000|
1524 is_utf8_alnumc||5.006000|
1525 is_utf8_alnum||5.006000|
1526 is_utf8_alpha||5.006000|
1527 is_utf8_ascii||5.006000|
1528 is_utf8_char_slow|||n
1529 is_utf8_char||5.006000|
1530 is_utf8_cntrl||5.006000|
1531 is_utf8_common|||
1532 is_utf8_digit||5.006000|
1533 is_utf8_graph||5.006000|
1534 is_utf8_idcont||5.008000|
1535 is_utf8_idfirst||5.006000|
1536 is_utf8_lower||5.006000|
1537 is_utf8_mark||5.006000|
1538 is_utf8_print||5.006000|
1539 is_utf8_punct||5.006000|
1540 is_utf8_space||5.006000|
1541 is_utf8_string_loclen||5.009003|
1542 is_utf8_string_loc||5.008001|
1543 is_utf8_string||5.006001|
1544 is_utf8_upper||5.006000|
1545 is_utf8_xdigit||5.006000|
1546 isa_lookup|||
1547 items|||n
1548 ix|||n
1549 jmaybe|||
1550 join_exact|||
1551 keyword|||
1552 leave_scope|||
1553 lex_end|||
1554 lex_start|||
1555 linklist|||
1556 listkids|||
1557 list|||
1558 load_module_nocontext|||vn
1559 load_module|5.006000||pv
1560 localize|||
1561 looks_like_bool|||
1562 looks_like_number|||
1563 lop|||
1564 mPUSHi|5.009002||p
1565 mPUSHn|5.009002||p
1566 mPUSHp|5.009002||p
1567 mPUSHs|5.011000||p
1568 mPUSHu|5.009002||p
1569 mXPUSHi|5.009002||p
1570 mXPUSHn|5.009002||p
1571 mXPUSHp|5.009002||p
1572 mXPUSHs|5.011000||p
1573 mXPUSHu|5.009002||p
1574 mad_free|||
1575 madlex|||
1576 madparse|||
1577 magic_clear_all_env|||
1578 magic_clearenv|||
1579 magic_clearhint|||
1580 magic_clearisa|||
1581 magic_clearpack|||
1582 magic_clearsig|||
1583 magic_dump||5.006000|
1584 magic_existspack|||
1585 magic_freearylen_p|||
1586 magic_freeovrld|||
1587 magic_getarylen|||
1588 magic_getdefelem|||
1589 magic_getnkeys|||
1590 magic_getpack|||
1591 magic_getpos|||
1592 magic_getsig|||
1593 magic_getsubstr|||
1594 magic_gettaint|||
1595 magic_getuvar|||
1596 magic_getvec|||
1597 magic_get|||
1598 magic_killbackrefs|||
1599 magic_len|||
1600 magic_methcall|||
1601 magic_methpack|||
1602 magic_nextpack|||
1603 magic_regdata_cnt|||
1604 magic_regdatum_get|||
1605 magic_regdatum_set|||
1606 magic_scalarpack|||
1607 magic_set_all_env|||
1608 magic_setamagic|||
1609 magic_setarylen|||
1610 magic_setcollxfrm|||
1611 magic_setdbline|||
1612 magic_setdefelem|||
1613 magic_setenv|||
1614 magic_sethint|||
1615 magic_setisa|||
1616 magic_setmglob|||
1617 magic_setnkeys|||
1618 magic_setpack|||
1619 magic_setpos|||
1620 magic_setregexp|||
1621 magic_setsig|||
1622 magic_setsubstr|||
1623 magic_settaint|||
1624 magic_setutf8|||
1625 magic_setuvar|||
1626 magic_setvec|||
1627 magic_set|||
1628 magic_sizepack|||
1629 magic_wipepack|||
1630 make_matcher|||
1631 make_trie_failtable|||
1632 make_trie|||
1633 malloc_good_size|||n
1634 malloced_size|||n
1635 malloc||5.007002|n
1636 markstack_grow|||
1637 matcher_matches_sv|||
1638 measure_struct|||
1639 memEQ|5.004000||p
1640 memNE|5.004000||p
1641 mem_collxfrm|||
1642 mem_log_common|||n
1643 mess_alloc|||
1644 mess_nocontext|||vn
1645 mess||5.006000|v
1646 method_common|||
1647 mfree||5.007002|n
1648 mg_clear|||
1649 mg_copy|||
1650 mg_dup|||
1651 mg_find|||
1652 mg_free|||
1653 mg_get|||
1654 mg_length||5.005000|
1655 mg_localize|||
1656 mg_magical|||
1657 mg_set|||
1658 mg_size||5.005000|
1659 mini_mktime||5.007002|
1660 missingterm|||
1661 mode_from_discipline|||
1662 modkids|||
1663 mod|||
1664 more_bodies|||
1665 more_sv|||
1666 moreswitches|||
1667 mro_get_from_name||5.011000|
1668 mro_get_linear_isa_dfs|||
1669 mro_get_linear_isa||5.009005|
1670 mro_get_private_data||5.011000|
1671 mro_isa_changed_in|||
1672 mro_meta_dup|||
1673 mro_meta_init|||
1674 mro_method_changed_in||5.009005|
1675 mro_register||5.011000|
1676 mro_set_mro||5.011000|
1677 mro_set_private_data||5.011000|
1678 mul128|||
1679 mulexp10|||n
1680 my_atof2||5.007002|
1681 my_atof||5.006000|
1682 my_attrs|||
1683 my_bcopy|||n
1684 my_betoh16|||n
1685 my_betoh32|||n
1686 my_betoh64|||n
1687 my_betohi|||n
1688 my_betohl|||n
1689 my_betohs|||n
1690 my_bzero|||n
1691 my_chsize|||
1692 my_clearenv|||
1693 my_cxt_index|||
1694 my_cxt_init|||
1695 my_dirfd||5.009005|
1696 my_exit_jump|||
1697 my_exit|||
1698 my_failure_exit||5.004000|
1699 my_fflush_all||5.006000|
1700 my_fork||5.007003|n
1701 my_htobe16|||n
1702 my_htobe32|||n
1703 my_htobe64|||n
1704 my_htobei|||n
1705 my_htobel|||n
1706 my_htobes|||n
1707 my_htole16|||n
1708 my_htole32|||n
1709 my_htole64|||n
1710 my_htolei|||n
1711 my_htolel|||n
1712 my_htoles|||n
1713 my_htonl|||
1714 my_kid|||
1715 my_letoh16|||n
1716 my_letoh32|||n
1717 my_letoh64|||n
1718 my_letohi|||n
1719 my_letohl|||n
1720 my_letohs|||n
1721 my_lstat|||
1722 my_memcmp||5.004000|n
1723 my_memset|||n
1724 my_ntohl|||
1725 my_pclose||5.004000|
1726 my_popen_list||5.007001|
1727 my_popen||5.004000|
1728 my_setenv|||
1729 my_snprintf|5.009004||pvn
1730 my_socketpair||5.007003|n
1731 my_sprintf|5.009003||pvn
1732 my_stat|||
1733 my_strftime||5.007002|
1734 my_strlcat|5.009004||pn
1735 my_strlcpy|5.009004||pn
1736 my_swabn|||n
1737 my_swap|||
1738 my_unexec|||
1739 my_vsnprintf||5.009004|n
1740 need_utf8|||n
1741 newANONATTRSUB||5.006000|
1742 newANONHASH|||
1743 newANONLIST|||
1744 newANONSUB|||
1745 newASSIGNOP|||
1746 newATTRSUB||5.006000|
1747 newAVREF|||
1748 newAV|||
1749 newBINOP|||
1750 newCONDOP|||
1751 newCONSTSUB|5.004050||p
1752 newCVREF|||
1753 newDEFSVOP|||
1754 newFORM|||
1755 newFOROP|||
1756 newGIVENOP||5.009003|
1757 newGIVWHENOP|||
1758 newGP|||
1759 newGVOP|||
1760 newGVREF|||
1761 newGVgen|||
1762 newHVREF|||
1763 newHVhv||5.005000|
1764 newHV|||
1765 newIO|||
1766 newLISTOP|||
1767 newLOGOP|||
1768 newLOOPEX|||
1769 newLOOPOP|||
1770 newMADPROP|||
1771 newMADsv|||
1772 newMYSUB|||
1773 newNULLLIST|||
1774 newOP|||
1775 newPADOP|||
1776 newPMOP|||
1777 newPROG|||
1778 newPVOP|||
1779 newRANGE|||
1780 newRV_inc|5.004000||p
1781 newRV_noinc|5.004000||p
1782 newRV|||
1783 newSLICEOP|||
1784 newSTATEOP|||
1785 newSUB|||
1786 newSVOP|||
1787 newSVREF|||
1788 newSV_type|5.009005||p
1789 newSVhek||5.009003|
1790 newSViv|||
1791 newSVnv|||
1792 newSVpvf_nocontext|||vn
1793 newSVpvf||5.004000|v
1794 newSVpvn_flags|5.011000||p
1795 newSVpvn_share|5.007001||p
1796 newSVpvn_utf8|5.011000||p
1797 newSVpvn|5.004050||p
1798 newSVpvs_flags|5.011000||p
1799 newSVpvs_share||5.009003|
1800 newSVpvs|5.009003||p
1801 newSVpv|||
1802 newSVrv|||
1803 newSVsv|||
1804 newSVuv|5.006000||p
1805 newSV|||
1806 newTOKEN|||
1807 newUNOP|||
1808 newWHENOP||5.009003|
1809 newWHILEOP||5.009003|
1810 newXS_flags||5.009004|
1811 newXSproto||5.006000|
1812 newXS||5.006000|
1813 new_collate||5.006000|
1814 new_constant|||
1815 new_ctype||5.006000|
1816 new_he|||
1817 new_logop|||
1818 new_numeric||5.006000|
1819 new_stackinfo||5.005000|
1820 new_version||5.009000|
1821 new_warnings_bitfield|||
1822 next_symbol|||
1823 nextargv|||
1824 nextchar|||
1825 ninstr|||
1826 no_bareword_allowed|||
1827 no_fh_allowed|||
1828 no_op|||
1829 not_a_number|||
1830 nothreadhook||5.008000|
1831 nuke_stacks|||
1832 num_overflow|||n
1833 offer_nice_chunk|||
1834 oopsAV|||
1835 oopsHV|||
1836 op_clear|||
1837 op_const_sv|||
1838 op_dump||5.006000|
1839 op_free|||
1840 op_getmad_weak|||
1841 op_getmad|||
1842 op_null||5.007002|
1843 op_refcnt_dec|||
1844 op_refcnt_inc|||
1845 op_refcnt_lock||5.009002|
1846 op_refcnt_unlock||5.009002|
1847 op_xmldump|||
1848 open_script|||
1849 pMY_CXT_|5.007003||p
1850 pMY_CXT|5.007003||p
1851 pTHX_|5.006000||p
1852 pTHX|5.006000||p
1853 packWARN|5.007003||p
1854 pack_cat||5.007003|
1855 pack_rec|||
1856 package|||
1857 packlist||5.008001|
1858 pad_add_anon|||
1859 pad_add_name|||
1860 pad_alloc|||
1861 pad_block_start|||
1862 pad_check_dup|||
1863 pad_compname_type|||
1864 pad_findlex|||
1865 pad_findmy|||
1866 pad_fixup_inner_anons|||
1867 pad_free|||
1868 pad_leavemy|||
1869 pad_new|||
1870 pad_peg|||n
1871 pad_push|||
1872 pad_reset|||
1873 pad_setsv|||
1874 pad_sv||5.011000|
1875 pad_swipe|||
1876 pad_tidy|||
1877 pad_undef|||
1878 parse_body|||
1879 parse_unicode_opts|||
1880 parser_dup|||
1881 parser_free|||
1882 path_is_absolute|||n
1883 peep|||
1884 pending_Slabs_to_ro|||
1885 perl_alloc_using|||n
1886 perl_alloc|||n
1887 perl_clone_using|||n
1888 perl_clone|||n
1889 perl_construct|||n
1890 perl_destruct||5.007003|n
1891 perl_free|||n
1892 perl_parse||5.006000|n
1893 perl_run|||n
1894 pidgone|||
1895 pm_description|||
1896 pmflag|||
1897 pmop_dump||5.006000|
1898 pmop_xmldump|||
1899 pmruntime|||
1900 pmtrans|||
1901 pop_scope|||
1902 pregcomp||5.009005|
1903 pregexec|||
1904 pregfree2||5.011000|
1905 pregfree|||
1906 prepend_elem|||
1907 prepend_madprops|||
1908 printbuf|||
1909 printf_nocontext|||vn
1910 process_special_blocks|||
1911 ptr_table_clear||5.009005|
1912 ptr_table_fetch||5.009005|
1913 ptr_table_find|||n
1914 ptr_table_free||5.009005|
1915 ptr_table_new||5.009005|
1916 ptr_table_split||5.009005|
1917 ptr_table_store||5.009005|
1918 push_scope|||
1919 put_byte|||
1920 pv_display|5.006000||p
1921 pv_escape|5.009004||p
1922 pv_pretty|5.009004||p
1923 pv_uni_display||5.007003|
1924 qerror|||
1925 qsortsvu|||
1926 re_compile||5.009005|
1927 re_croak2|||
1928 re_dup_guts|||
1929 re_intuit_start||5.009005|
1930 re_intuit_string||5.006000|
1931 readpipe_override|||
1932 realloc||5.007002|n
1933 reentrant_free|||
1934 reentrant_init|||
1935 reentrant_retry|||vn
1936 reentrant_size|||
1937 ref_array_or_hash|||
1938 refcounted_he_chain_2hv|||
1939 refcounted_he_fetch|||
1940 refcounted_he_free|||
1941 refcounted_he_new_common|||
1942 refcounted_he_new|||
1943 refcounted_he_value|||
1944 refkids|||
1945 refto|||
1946 ref||5.011000|
1947 reg_check_named_buff_matched|||
1948 reg_named_buff_all||5.009005|
1949 reg_named_buff_exists||5.009005|
1950 reg_named_buff_fetch||5.009005|
1951 reg_named_buff_firstkey||5.009005|
1952 reg_named_buff_iter|||
1953 reg_named_buff_nextkey||5.009005|
1954 reg_named_buff_scalar||5.009005|
1955 reg_named_buff|||
1956 reg_namedseq|||
1957 reg_node|||
1958 reg_numbered_buff_fetch|||
1959 reg_numbered_buff_length|||
1960 reg_numbered_buff_store|||
1961 reg_qr_package|||
1962 reg_recode|||
1963 reg_scan_name|||
1964 reg_skipcomment|||
1965 reg_temp_copy|||
1966 reganode|||
1967 regatom|||
1968 regbranch|||
1969 regclass_swash||5.009004|
1970 regclass|||
1971 regcppop|||
1972 regcppush|||
1973 regcurly|||n
1974 regdump_extflags|||
1975 regdump||5.005000|
1976 regdupe_internal|||
1977 regexec_flags||5.005000|
1978 regfree_internal||5.009005|
1979 reghop3|||n
1980 reghop4|||n
1981 reghopmaybe3|||n
1982 reginclass|||
1983 reginitcolors||5.006000|
1984 reginsert|||
1985 regmatch|||
1986 regnext||5.005000|
1987 regpiece|||
1988 regpposixcc|||
1989 regprop|||
1990 regrepeat|||
1991 regtail_study|||
1992 regtail|||
1993 regtry|||
1994 reguni|||
1995 regwhite|||n
1996 reg|||
1997 repeatcpy|||
1998 report_evil_fh|||
1999 report_uninit|||
2000 require_pv||5.006000|
2001 require_tie_mod|||
2002 restore_magic|||
2003 rninstr|||
2004 rsignal_restore|||
2005 rsignal_save|||
2006 rsignal_state||5.004000|
2007 rsignal||5.004000|
2008 run_body|||
2009 run_user_filter|||
2010 runops_debug||5.005000|
2011 runops_standard||5.005000|
2012 rvpv_dup|||
2013 rxres_free|||
2014 rxres_restore|||
2015 rxres_save|||
2016 safesyscalloc||5.006000|n
2017 safesysfree||5.006000|n
2018 safesysmalloc||5.006000|n
2019 safesysrealloc||5.006000|n
2020 same_dirent|||
2021 save_I16||5.004000|
2022 save_I32|||
2023 save_I8||5.006000|
2024 save_adelete||5.011000|
2025 save_aelem||5.004050|
2026 save_alloc||5.006000|
2027 save_aptr|||
2028 save_ary|||
2029 save_bool||5.008001|
2030 save_clearsv|||
2031 save_delete|||
2032 save_destructor_x||5.006000|
2033 save_destructor||5.006000|
2034 save_freeop|||
2035 save_freepv|||
2036 save_freesv|||
2037 save_generic_pvref||5.006001|
2038 save_generic_svref||5.005030|
2039 save_gp||5.004000|
2040 save_hash|||
2041 save_hek_flags|||n
2042 save_helem_flags||5.011000|
2043 save_helem||5.004050|
2044 save_hints|||
2045 save_hptr|||
2046 save_int|||
2047 save_item|||
2048 save_iv||5.005000|
2049 save_lines|||
2050 save_list|||
2051 save_long|||
2052 save_magic|||
2053 save_mortalizesv||5.007001|
2054 save_nogv|||
2055 save_op|||
2056 save_padsv_and_mortalize||5.011000|
2057 save_pptr|||
2058 save_pushi32ptr|||
2059 save_pushptri32ptr|||
2060 save_pushptrptr|||
2061 save_pushptr||5.011000|
2062 save_re_context||5.006000|
2063 save_scalar_at|||
2064 save_scalar|||
2065 save_set_svflags||5.009000|
2066 save_shared_pvref||5.007003|
2067 save_sptr|||
2068 save_svref|||
2069 save_vptr||5.006000|
2070 savepvn|||
2071 savepvs||5.009003|
2072 savepv|||
2073 savesharedpvn||5.009005|
2074 savesharedpv||5.007003|
2075 savestack_grow_cnt||5.008001|
2076 savestack_grow|||
2077 savesvpv||5.009002|
2078 sawparens|||
2079 scalar_mod_type|||n
2080 scalarboolean|||
2081 scalarkids|||
2082 scalarseq|||
2083 scalarvoid|||
2084 scalar|||
2085 scan_bin||5.006000|
2086 scan_commit|||
2087 scan_const|||
2088 scan_formline|||
2089 scan_heredoc|||
2090 scan_hex|||
2091 scan_ident|||
2092 scan_inputsymbol|||
2093 scan_num||5.007001|
2094 scan_oct|||
2095 scan_pat|||
2096 scan_str|||
2097 scan_subst|||
2098 scan_trans|||
2099 scan_version||5.009001|
2100 scan_vstring||5.009005|
2101 scan_word|||
2102 scope|||
2103 screaminstr||5.005000|
2104 search_const|||
2105 seed||5.008001|
2106 sequence_num|||
2107 sequence_tail|||
2108 sequence|||
2109 set_context||5.006000|n
2110 set_numeric_local||5.006000|
2111 set_numeric_radix||5.006000|
2112 set_numeric_standard||5.006000|
2113 setdefout|||
2114 share_hek_flags|||
2115 share_hek||5.004000|
2116 si_dup|||
2117 sighandler|||n
2118 simplify_sort|||
2119 skipspace0|||
2120 skipspace1|||
2121 skipspace2|||
2122 skipspace|||
2123 softref2xv|||
2124 sortcv_stacked|||
2125 sortcv_xsub|||
2126 sortcv|||
2127 sortsv_flags||5.009003|
2128 sortsv||5.007003|
2129 space_join_names_mortal|||
2130 ss_dup|||
2131 stack_grow|||
2132 start_force|||
2133 start_glob|||
2134 start_subparse||5.004000|
2135 stashpv_hvname_match||5.011000|
2136 stdize_locale|||
2137 store_cop_label|||
2138 strEQ|||
2139 strGE|||
2140 strGT|||
2141 strLE|||
2142 strLT|||
2143 strNE|||
2144 str_to_version||5.006000|
2145 strip_return|||
2146 strnEQ|||
2147 strnNE|||
2148 study_chunk|||
2149 sub_crush_depth|||
2150 sublex_done|||
2151 sublex_push|||
2152 sublex_start|||
2153 sv_2bool|||
2154 sv_2cv|||
2155 sv_2io|||
2156 sv_2iuv_common|||
2157 sv_2iuv_non_preserve|||
2158 sv_2iv_flags||5.009001|
2159 sv_2iv|||
2160 sv_2mortal|||
2161 sv_2num|||
2162 sv_2nv|||
2163 sv_2pv_flags|5.007002||p
2164 sv_2pv_nolen|5.006000||p
2165 sv_2pvbyte_nolen|5.006000||p
2166 sv_2pvbyte|5.006000||p
2167 sv_2pvutf8_nolen||5.006000|
2168 sv_2pvutf8||5.006000|
2169 sv_2pv|||
2170 sv_2uv_flags||5.009001|
2171 sv_2uv|5.004000||p
2172 sv_add_arena|||
2173 sv_add_backref|||
2174 sv_backoff|||
2175 sv_bless|||
2176 sv_cat_decode||5.008001|
2177 sv_catpv_mg|5.004050||p
2178 sv_catpvf_mg_nocontext|||pvn
2179 sv_catpvf_mg|5.006000|5.004000|pv
2180 sv_catpvf_nocontext|||vn
2181 sv_catpvf||5.004000|v
2182 sv_catpvn_flags||5.007002|
2183 sv_catpvn_mg|5.004050||p
2184 sv_catpvn_nomg|5.007002||p
2185 sv_catpvn|||
2186 sv_catpvs|5.009003||p
2187 sv_catpv|||
2188 sv_catsv_flags||5.007002|
2189 sv_catsv_mg|5.004050||p
2190 sv_catsv_nomg|5.007002||p
2191 sv_catsv|||
2192 sv_catxmlpvn|||
2193 sv_catxmlsv|||
2194 sv_chop|||
2195 sv_clean_all|||
2196 sv_clean_objs|||
2197 sv_clear|||
2198 sv_cmp_locale||5.004000|
2199 sv_cmp|||
2200 sv_collxfrm|||
2201 sv_compile_2op||5.008001|
2202 sv_copypv||5.007003|
2203 sv_dec|||
2204 sv_del_backref|||
2205 sv_derived_from||5.004000|
2206 sv_destroyable||5.010000|
2207 sv_does||5.009004|
2208 sv_dump|||
2209 sv_dup_inc_multiple|||
2210 sv_dup|||
2211 sv_eq|||
2212 sv_exp_grow|||
2213 sv_force_normal_flags||5.007001|
2214 sv_force_normal||5.006000|
2215 sv_free2|||
2216 sv_free_arenas|||
2217 sv_free|||
2218 sv_gets||5.004000|
2219 sv_grow|||
2220 sv_i_ncmp|||
2221 sv_inc|||
2222 sv_insert_flags||5.011000|
2223 sv_insert|||
2224 sv_isa|||
2225 sv_isobject|||
2226 sv_iv||5.005000|
2227 sv_kill_backrefs|||
2228 sv_len_utf8||5.006000|
2229 sv_len|||
2230 sv_magic_portable|5.011000|5.004000|p
2231 sv_magicext||5.007003|
2232 sv_magic|||
2233 sv_mortalcopy|||
2234 sv_ncmp|||
2235 sv_newmortal|||
2236 sv_newref|||
2237 sv_nolocking||5.007003|
2238 sv_nosharing||5.007003|
2239 sv_nounlocking|||
2240 sv_nv||5.005000|
2241 sv_peek||5.005000|
2242 sv_pos_b2u_midway|||
2243 sv_pos_b2u||5.006000|
2244 sv_pos_u2b_cached|||
2245 sv_pos_u2b_forwards|||n
2246 sv_pos_u2b_midway|||n
2247 sv_pos_u2b||5.006000|
2248 sv_pvbyten_force||5.006000|
2249 sv_pvbyten||5.006000|
2250 sv_pvbyte||5.006000|
2251 sv_pvn_force_flags|5.007002||p
2252 sv_pvn_force|||
2253 sv_pvn_nomg|5.007003|5.005000|p
2254 sv_pvn||5.005000|
2255 sv_pvutf8n_force||5.006000|
2256 sv_pvutf8n||5.006000|
2257 sv_pvutf8||5.006000|
2258 sv_pv||5.006000|
2259 sv_recode_to_utf8||5.007003|
2260 sv_reftype|||
2261 sv_release_COW|||
2262 sv_replace|||
2263 sv_report_used|||
2264 sv_reset|||
2265 sv_rvweaken||5.006000|
2266 sv_setiv_mg|5.004050||p
2267 sv_setiv|||
2268 sv_setnv_mg|5.006000||p
2269 sv_setnv|||
2270 sv_setpv_mg|5.004050||p
2271 sv_setpvf_mg_nocontext|||pvn
2272 sv_setpvf_mg|5.006000|5.004000|pv
2273 sv_setpvf_nocontext|||vn
2274 sv_setpvf||5.004000|v
2275 sv_setpviv_mg||5.008001|
2276 sv_setpviv||5.008001|
2277 sv_setpvn_mg|5.004050||p
2278 sv_setpvn|||
2279 sv_setpvs|5.009004||p
2280 sv_setpv|||
2281 sv_setref_iv|||
2282 sv_setref_nv|||
2283 sv_setref_pvn|||
2284 sv_setref_pv|||
2285 sv_setref_uv||5.007001|
2286 sv_setsv_cow|||
2287 sv_setsv_flags||5.007002|
2288 sv_setsv_mg|5.004050||p
2289 sv_setsv_nomg|5.007002||p
2290 sv_setsv|||
2291 sv_setuv_mg|5.004050||p
2292 sv_setuv|5.004000||p
2293 sv_tainted||5.004000|
2294 sv_taint||5.004000|
2295 sv_true||5.005000|
2296 sv_unglob|||
2297 sv_uni_display||5.007003|
2298 sv_unmagic|||
2299 sv_unref_flags||5.007001|
2300 sv_unref|||
2301 sv_untaint||5.004000|
2302 sv_upgrade|||
2303 sv_usepvn_flags||5.009004|
2304 sv_usepvn_mg|5.004050||p
2305 sv_usepvn|||
2306 sv_utf8_decode||5.006000|
2307 sv_utf8_downgrade||5.006000|
2308 sv_utf8_encode||5.006000|
2309 sv_utf8_upgrade_flags_grow||5.011000|
2310 sv_utf8_upgrade_flags||5.007002|
2311 sv_utf8_upgrade_nomg||5.007002|
2312 sv_utf8_upgrade||5.007001|
2313 sv_uv|5.005000||p
2314 sv_vcatpvf_mg|5.006000|5.004000|p
2315 sv_vcatpvfn||5.004000|
2316 sv_vcatpvf|5.006000|5.004000|p
2317 sv_vsetpvf_mg|5.006000|5.004000|p
2318 sv_vsetpvfn||5.004000|
2319 sv_vsetpvf|5.006000|5.004000|p
2320 sv_xmlpeek|||
2321 svtype|||
2322 swallow_bom|||
2323 swap_match_buff|||
2324 swash_fetch||5.007002|
2325 swash_get|||
2326 swash_init||5.006000|
2327 sys_init3||5.010000|n
2328 sys_init||5.010000|n
2329 sys_intern_clear|||
2330 sys_intern_dup|||
2331 sys_intern_init|||
2332 sys_term||5.010000|n
2333 taint_env|||
2334 taint_proper|||
2335 tmps_grow||5.006000|
2336 toLOWER|||
2337 toUPPER|||
2338 to_byte_substr|||
2339 to_uni_fold||5.007003|
2340 to_uni_lower_lc||5.006000|
2341 to_uni_lower||5.007003|
2342 to_uni_title_lc||5.006000|
2343 to_uni_title||5.007003|
2344 to_uni_upper_lc||5.006000|
2345 to_uni_upper||5.007003|
2346 to_utf8_case||5.007003|
2347 to_utf8_fold||5.007003|
2348 to_utf8_lower||5.007003|
2349 to_utf8_substr|||
2350 to_utf8_title||5.007003|
2351 to_utf8_upper||5.007003|
2352 token_free|||
2353 token_getmad|||
2354 tokenize_use|||
2355 tokeq|||
2356 tokereport|||
2357 too_few_arguments|||
2358 too_many_arguments|||
2359 uiv_2buf|||n
2360 unlnk|||
2361 unpack_rec|||
2362 unpack_str||5.007003|
2363 unpackstring||5.008001|
2364 unshare_hek_or_pvn|||
2365 unshare_hek|||
2366 unsharepvn||5.004000|
2367 unwind_handler_stack|||
2368 update_debugger_info|||
2369 upg_version||5.009005|
2370 usage|||
2371 utf16_to_utf8_reversed||5.006001|
2372 utf16_to_utf8||5.006001|
2373 utf8_distance||5.006000|
2374 utf8_hop||5.006000|
2375 utf8_length||5.007001|
2376 utf8_mg_pos_cache_update|||
2377 utf8_to_bytes||5.006001|
2378 utf8_to_uvchr||5.007001|
2379 utf8_to_uvuni||5.007001|
2380 utf8n_to_uvchr|||
2381 utf8n_to_uvuni||5.007001|
2382 utilize|||
2383 uvchr_to_utf8_flags||5.007003|
2384 uvchr_to_utf8|||
2385 uvuni_to_utf8_flags||5.007003|
2386 uvuni_to_utf8||5.007001|
2387 validate_suid|||
2388 varname|||
2389 vcmp||5.009000|
2390 vcroak||5.006000|
2391 vdeb||5.007003|
2392 vdie_common|||
2393 vdie_croak_common|||
2394 vdie|||
2395 vform||5.006000|
2396 visit|||
2397 vivify_defelem|||
2398 vivify_ref|||
2399 vload_module|5.006000||p
2400 vmess||5.006000|
2401 vnewSVpvf|5.006000|5.004000|p
2402 vnormal||5.009002|
2403 vnumify||5.009000|
2404 vstringify||5.009000|
2405 vverify||5.009003|
2406 vwarner||5.006000|
2407 vwarn||5.006000|
2408 wait4pid|||
2409 warn_nocontext|||vn
2410 warner_nocontext|||vn
2411 warner|5.006000|5.004000|pv
2412 warn|||v
2413 watch|||
2414 whichsig|||
2415 write_no_mem|||
2416 write_to_stderr|||
2417 xmldump_all|||
2418 xmldump_attr|||
2419 xmldump_eval|||
2420 xmldump_form|||
2421 xmldump_indent|||v
2422 xmldump_packsubs|||
2423 xmldump_sub|||
2424 xmldump_vindent|||
2425 yyerror|||
2426 yylex|||
2427 yyparse|||
2428 yywarn|||
2429 );
2430
2431 if (exists $opt{'list-unsupported'}) {
2432 my $f;
2433 for $f (sort { lc $a cmp lc $b } keys %API) {
2434 next unless $API{$f}{todo};
2435 print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
2436 }
2437 exit 0;
2438 }
2439
2440 # Scan for possible replacement candidates
2441
2442 my(%replace, %need, %hints, %warnings, %depends);
2443 my $replace = 0;
2444 my($hint, $define, $function);
2445
2446 sub find_api
2447 {
2448 my $code = shift;
2449 $code =~ s{
2450 / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
2451 | "[^"\\]*(?:\\.[^"\\]*)*"
2452 | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx;
2453 grep { exists $API{$_} } $code =~ /(\w+)/mg;
2454 }
2455
2456 while (<DATA>) {
2457 if ($hint) {
2458 my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings;
2459 if (m{^\s*\*\s(.*?)\s*$}) {
2460 for (@{$hint->[1]}) {
2461 $h->{$_} ||= ''; # suppress warning with older perls
2462 $h->{$_} .= "$1\n";
2463 }
2464 }
2465 else { undef $hint }
2466 }
2467
2468 $hint = [$1, [split /,?\s+/, $2]]
2469 if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$};
2470
2471 if ($define) {
2472 if ($define->[1] =~ /\\$/) {
2473 $define->[1] .= $_;
2474 }
2475 else {
2476 if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) {
2477 my @n = find_api($define->[1]);
2478 push @{$depends{$define->[0]}}, @n if @n
2479 }
2480 undef $define;
2481 }
2482 }
2483
2484 $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)};
2485
2486 if ($function) {
2487 if (/^}/) {
2488 if (exists $API{$function->[0]}) {
2489 my @n = find_api($function->[1]);
2490 push @{$depends{$function->[0]}}, @n if @n
2491 }
2492 undef $function;
2493 }
2494 else {
2495 $function->[1] .= $_;
2496 }
2497 }
2498
2499 $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)};
2500
2501 $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
2502 $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
2503 $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
2504 $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
2505
2506 if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
2507 my @deps = map { s/\s+//g; $_ } split /,/, $3;
2508 my $d;
2509 for $d (map { s/\s+//g; $_ } split /,/, $1) {
2510 push @{$depends{$d}}, @deps;
2511 }
2512 }
2513
2514 $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
2515 }
2516
2517 for (values %depends) {
2518 my %s;
2519 $_ = [sort grep !$s{$_}++, @$_];
2520 }
2521
2522 if (exists $opt{'api-info'}) {
2523 my $f;
2524 my $count = 0;
2525 my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
2526 for $f (sort { lc $a cmp lc $b } keys %API) {
2527 next unless $f =~ /$match/;
2528 print "\n=== $f ===\n\n";
2529 my $info = 0;
2530 if ($API{$f}{base} || $API{$f}{todo}) {
2531 my $base = format_version($API{$f}{base} || $API{$f}{todo});
2532 print "Supported at least starting from perl-$base.\n";
2533 $info++;
2534 }
2535 if ($API{$f}{provided}) {
2536 my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
2537 print "Support by $ppport provided back to perl-$todo.\n";
2538 print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
2539 print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
2540 print "\n$hints{$f}" if exists $hints{$f};
2541 print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f};
2542 $info++;
2543 }
2544 print "No portability information available.\n" unless $info;
2545 $count++;
2546 }
2547 $count or print "Found no API matching '$opt{'api-info'}'.";
2548 print "\n";
2549 exit 0;
2550 }
2551
2552 if (exists $opt{'list-provided'}) {
2553 my $f;
2554 for $f (sort { lc $a cmp lc $b } keys %API) {
2555 next unless $API{$f}{provided};
2556 my @flags;
2557 push @flags, 'explicit' if exists $need{$f};
2558 push @flags, 'depend' if exists $depends{$f};
2559 push @flags, 'hint' if exists $hints{$f};
2560 push @flags, 'warning' if exists $warnings{$f};
2561 my $flags = @flags ? ' ['.join(', ', @flags).']' : '';
2562 print "$f$flags\n";
2563 }
2564 exit 0;
2565 }
2566
2567 my @files;
2568 my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc );
2569 my $srcext = join '|', map { quotemeta $_ } @srcext;
2570
2571 if (@ARGV) {
2572 my %seen;
2573 for (@ARGV) {
2574 if (-e) {
2575 if (-f) {
2576 push @files, $_ unless $seen{$_}++;
2577 }
2578 else { warn "'$_' is not a file.\n" }
2579 }
2580 else {
2581 my @new = grep { -f } glob $_
2582 or warn "'$_' does not exist.\n";
2583 push @files, grep { !$seen{$_}++ } @new;
2584 }
2585 }
2586 }
2587 else {
2588 eval {
2589 require File::Find;
2590 File::Find::find(sub {
2591 $File::Find::name =~ /($srcext)$/i
2592 and push @files, $File::Find::name;
2593 }, '.');
2594 };
2595 if ($@) {
2596 @files = map { glob "*$_" } @srcext;
2597 }
2598 }
2599
2600 if (!@ARGV || $opt{filter}) {
2601 my(@in, @out);
2602 my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
2603 for (@files) {
2604 my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i;
2605 push @{ $out ? \@out : \@in }, $_;
2606 }
2607 if (@ARGV && @out) {
2608 warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
2609 }
2610 @files = @in;
2611 }
2612
2613 die "No input files given!\n" unless @files;
2614
2615 my(%files, %global, %revreplace);
2616 %revreplace = reverse %replace;
2617 my $filename;
2618 my $patch_opened = 0;
2619
2620 for $filename (@files) {
2621 unless (open IN, "<$filename") {
2622 warn "Unable to read from $filename: $!\n";
2623 next;
2624 }
2625
2626 info("Scanning $filename ...");
2627
2628 my $c = do { local $/; <IN> };
2629 close IN;
2630
2631 my %file = (orig => $c, changes => 0);
2632
2633 # Temporarily remove C/XS comments and strings from the code
2634 my @ccom;
2635
2636 $c =~ s{
2637 ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]*
2638 | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* )
2639 | ( ^$HS*\#[^\r\n]*
2640 | "[^"\\]*(?:\\.[^"\\]*)*"
2641 | '[^'\\]*(?:\\.[^'\\]*)*'
2642 | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) )
2643 }{ defined $2 and push @ccom, $2;
2644 defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex;
2645
2646 $file{ccom} = \@ccom;
2647 $file{code} = $c;
2648 $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m;
2649
2650 my $func;
2651
2652 for $func (keys %API) {
2653 my $match = $func;
2654 $match .= "|$revreplace{$func}" if exists $revreplace{$func};
2655 if ($c =~ /\b(?:Perl_)?($match)\b/) {
2656 $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
2657 $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
2658 if (exists $API{$func}{provided}) {
2659 $file{uses_provided}{$func}++;
2660 if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
2661 $file{uses}{$func}++;
2662 my @deps = rec_depend($func);
2663 if (@deps) {
2664 $file{uses_deps}{$func} = \@deps;
2665 for (@deps) {
2666 $file{uses}{$_} = 0 unless exists $file{uses}{$_};
2667 }
2668 }
2669 for ($func, @deps) {
2670 $file{needs}{$_} = 'static' if exists $need{$_};
2671 }
2672 }
2673 }
2674 if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
2675 if ($c =~ /\b$func\b/) {
2676 $file{uses_todo}{$func}++;
2677 }
2678 }
2679 }
2680 }
2681
2682 while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
2683 if (exists $need{$2}) {
2684 $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
2685 }
2686 else { warning("Possibly wrong #define $1 in $filename") }
2687 }
2688
2689 for (qw(uses needs uses_todo needed_global needed_static)) {
2690 for $func (keys %{$file{$_}}) {
2691 push @{$global{$_}{$func}}, $filename;
2692 }
2693 }
2694
2695 $files{$filename} = \%file;
2696 }
2697
2698 # Globally resolve NEED_'s
2699 my $need;
2700 for $need (keys %{$global{needs}}) {
2701 if (@{$global{needs}{$need}} > 1) {
2702 my @targets = @{$global{needs}{$need}};
2703 my @t = grep $files{$_}{needed_global}{$need}, @targets;
2704 @targets = @t if @t;
2705 @t = grep /\.xs$/i, @targets;
2706 @targets = @t if @t;
2707 my $target = shift @targets;
2708 $files{$target}{needs}{$need} = 'global';
2709 for (@{$global{needs}{$need}}) {
2710 $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
2711 }
2712 }
2713 }
2714
2715 for $filename (@files) {
2716 exists $files{$filename} or next;
2717
2718 info("=== Analyzing $filename ===");
2719
2720 my %file = %{$files{$filename}};
2721 my $func;
2722 my $c = $file{code};
2723 my $warnings = 0;
2724
2725 for $func (sort keys %{$file{uses_Perl}}) {
2726 if ($API{$func}{varargs}) {
2727 unless ($API{$func}{nothxarg}) {
2728 my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
2729 { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
2730 if ($changes) {
2731 warning("Doesn't pass interpreter argument aTHX to Perl_$func");
2732 $file{changes} += $changes;
2733 }
2734 }
2735 }
2736 else {
2737 warning("Uses Perl_$func instead of $func");
2738 $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
2739 {$func$1(}g);
2740 }
2741 }
2742
2743 for $func (sort keys %{$file{uses_replace}}) {
2744 warning("Uses $func instead of $replace{$func}");
2745 $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
2746 }
2747
2748 for $func (sort keys %{$file{uses_provided}}) {
2749 if ($file{uses}{$func}) {
2750 if (exists $file{uses_deps}{$func}) {
2751 diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
2752 }
2753 else {
2754 diag("Uses $func");
2755 }
2756 }
2757 $warnings += hint($func);
2758 }
2759
2760 unless ($opt{quiet}) {
2761 for $func (sort keys %{$file{uses_todo}}) {
2762 print "*** WARNING: Uses $func, which may not be portable below perl ",
2763 format_version($API{$func}{todo}), ", even with '$ppport'\n";
2764 $warnings++;
2765 }
2766 }
2767
2768 for $func (sort keys %{$file{needed_static}}) {
2769 my $message = '';
2770 if (not exists $file{uses}{$func}) {
2771 $message = "No need to define NEED_$func if $func is never used";
2772 }
2773 elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
2774 $message = "No need to define NEED_$func when already needed globally";
2775 }
2776 if ($message) {
2777 diag($message);
2778 $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
2779 }
2780 }
2781
2782 for $func (sort keys %{$file{needed_global}}) {
2783 my $message = '';
2784 if (not exists $global{uses}{$func}) {
2785 $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
2786 }
2787 elsif (exists $file{needs}{$func}) {
2788 if ($file{needs}{$func} eq 'extern') {
2789 $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
2790 }
2791 elsif ($file{needs}{$func} eq 'static') {
2792 $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
2793 }
2794 }
2795 if ($message) {
2796 diag($message);
2797 $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
2798 }
2799 }
2800
2801 $file{needs_inc_ppport} = keys %{$file{uses}};
2802
2803 if ($file{needs_inc_ppport}) {
2804 my $pp = '';
2805
2806 for $func (sort keys %{$file{needs}}) {
2807 my $type = $file{needs}{$func};
2808 next if $type eq 'extern';
2809 my $suffix = $type eq 'global' ? '_GLOBAL' : '';
2810 unless (exists $file{"needed_$type"}{$func}) {
2811 if ($type eq 'global') {
2812 diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
2813 }
2814 else {
2815 diag("File needs $func, adding static request");
2816 }
2817 $pp .= "#define NEED_$func$suffix\n";
2818 }
2819 }
2820
2821 if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
2822 $pp = '';
2823 $file{changes}++;
2824 }
2825
2826 unless ($file{has_inc_ppport}) {
2827 diag("Needs to include '$ppport'");
2828 $pp .= qq(#include "$ppport"\n)
2829 }
2830
2831 if ($pp) {
2832 $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
2833 || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
2834 || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
2835 || ($c =~ s/^/$pp/);
2836 }
2837 }
2838 else {
2839 if ($file{has_inc_ppport}) {
2840 diag("No need to include '$ppport'");
2841 $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
2842 }
2843 }
2844
2845 # put back in our C comments
2846 my $ix;
2847 my $cppc = 0;
2848 my @ccom = @{$file{ccom}};
2849 for $ix (0 .. $#ccom) {
2850 if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
2851 $cppc++;
2852 $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
2853 }
2854 else {
2855 $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
2856 }
2857 }
2858
2859 if ($cppc) {
2860 my $s = $cppc != 1 ? 's' : '';
2861 warning("Uses $cppc C++ style comment$s, which is not portable");
2862 }
2863
2864 my $s = $warnings != 1 ? 's' : '';
2865 my $warn = $warnings ? " ($warnings warning$s)" : '';
2866 info("Analysis completed$warn");
2867
2868 if ($file{changes}) {
2869 if (exists $opt{copy}) {
2870 my $newfile = "$filename$opt{copy}";
2871 if (-e $newfile) {
2872 error("'$newfile' already exists, refusing to write copy of '$filename'");
2873 }
2874 else {
2875 local *F;
2876 if (open F, ">$newfile") {
2877 info("Writing copy of '$filename' with changes to '$newfile'");
2878 print F $c;
2879 close F;
2880 }
2881 else {
2882 error("Cannot open '$newfile' for writing: $!");
2883 }
2884 }
2885 }
2886 elsif (exists $opt{patch} || $opt{changes}) {
2887 if (exists $opt{patch}) {
2888 unless ($patch_opened) {
2889 if (open PATCH, ">$opt{patch}") {
2890 $patch_opened = 1;
2891 }
2892 else {
2893 error("Cannot open '$opt{patch}' for writing: $!");
2894 delete $opt{patch};
2895 $opt{changes} = 1;
2896 goto fallback;
2897 }
2898 }
2899 mydiff(\*PATCH, $filename, $c);
2900 }
2901 else {
2902 fallback:
2903 info("Suggested changes:");
2904 mydiff(\*STDOUT, $filename, $c);
2905 }
2906 }
2907 else {
2908 my $s = $file{changes} == 1 ? '' : 's';
2909 info("$file{changes} potentially required change$s detected");
2910 }
2911 }
2912 else {
2913 info("Looks good");
2914 }
2915 }
2916
2917 close PATCH if $patch_opened;
2918
2919 exit 0;
2920
2921
2922 sub try_use { eval "use @_;"; return $@ eq '' }
2923
2924 sub mydiff
2925 {
2926 local *F = shift;
2927 my($file, $str) = @_;
2928 my $diff;
2929
2930 if (exists $opt{diff}) {
2931 $diff = run_diff($opt{diff}, $file, $str);
2932 }
2933
2934 if (!defined $diff and try_use('Text::Diff')) {
2935 $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
2936 $diff = <<HEADER . $diff;
2937 --- $file
2938 +++ $file.patched
2939 HEADER
2940 }
2941
2942 if (!defined $diff) {
2943 $diff = run_diff('diff -u', $file, $str);
2944 }
2945
2946 if (!defined $diff) {
2947 $diff = run_diff('diff', $file, $str);
2948 }
2949
2950 if (!defined $diff) {
2951 error("Cannot generate a diff. Please install Text::Diff or use --copy.");
2952 return;
2953 }
2954
2955 print F $diff;
2956 }
2957
2958 sub run_diff
2959 {
2960 my($prog, $file, $str) = @_;
2961 my $tmp = 'dppptemp';
2962 my $suf = 'aaa';
2963 my $diff = '';
2964 local *F;
2965
2966 while (-e "$tmp.$suf") { $suf++ }
2967 $tmp = "$tmp.$suf";
2968
2969 if (open F, ">$tmp") {
2970 print F $str;
2971 close F;
2972
2973 if (open F, "$prog $file $tmp |") {
2974 while (<F>) {
2975 s/\Q$tmp\E/$file.patched/;
2976 $diff .= $_;
2977 }
2978 close F;
2979 unlink $tmp;
2980 return $diff;
2981 }
2982
2983 unlink $tmp;
2984 }
2985 else {
2986 error("Cannot open '$tmp' for writing: $!");
2987 }
2988
2989 return undef;
2990 }
2991
2992 sub rec_depend
2993 {
2994 my($func, $seen) = @_;
2995 return () unless exists $depends{$func};
2996 $seen = {%{$seen||{}}};
2997 return () if $seen->{$func}++;
2998 my %s;
2999 grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}};
3000 }
3001
3002 sub parse_version
3003 {
3004 my $ver = shift;
3005
3006 if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
3007 return ($1, $2, $3);
3008 }
3009 elsif ($ver !~ /^\d+\.[\d_]+$/) {
3010 die "cannot parse version '$ver'\n";
3011 }
3012
3013 $ver =~ s/_//g;
3014 $ver =~ s/$/000000/;
3015
3016 my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
3017
3018 $v = int $v;
3019 $s = int $s;
3020
3021 if ($r < 5 || ($r == 5 && $v < 6)) {
3022 if ($s % 10) {
3023 die "cannot parse version '$ver'\n";
3024 }
3025 }
3026
3027 return ($r, $v, $s);
3028 }
3029
3030 sub format_version
3031 {
3032 my $ver = shift;
3033
3034 $ver =~ s/$/000000/;
3035 my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
3036
3037 $v = int $v;
3038 $s = int $s;
3039
3040 if ($r < 5 || ($r == 5 && $v < 6)) {
3041 if ($s % 10) {
3042 die "invalid version '$ver'\n";
3043 }
3044 $s /= 10;
3045
3046 $ver = sprintf "%d.%03d", $r, $v;
3047 $s > 0 and $ver .= sprintf "_%02d", $s;
3048
3049 return $ver;
3050 }
3051
3052 return sprintf "%d.%d.%d", $r, $v, $s;
3053 }
3054
3055 sub info
3056 {
3057 $opt{quiet} and return;
3058 print @_, "\n";
3059 }
3060
3061 sub diag
3062 {
3063 $opt{quiet} and return;
3064 $opt{diag} and print @_, "\n";
3065 }
3066
3067 sub warning
3068 {
3069 $opt{quiet} and return;
3070 print "*** ", @_, "\n";
3071 }
3072
3073 sub error
3074 {
3075 print "*** ERROR: ", @_, "\n";
3076 }
3077
3078 my %given_hints;
3079 my %given_warnings;
3080 sub hint
3081 {
3082 $opt{quiet} and return;
3083 my $func = shift;
3084 my $rv = 0;
3085 if (exists $warnings{$func} && !$given_warnings{$func}++) {
3086 my $warn = $warnings{$func};
3087 $warn =~ s!^!*** !mg;
3088 print "*** WARNING: $func\n", $warn;
3089 $rv++;
3090 }
3091 if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) {
3092 my $hint = $hints{$func};
3093 $hint =~ s/^/ /mg;
3094 print " --- hint for $func ---\n", $hint;
3095 }
3096 $rv;
3097 }
3098
3099 sub usage
3100 {
3101 my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
3102 my %M = ( 'I' => '*' );
3103 $usage =~ s/^\s*perl\s+\S+/$^X $0/;
3104 $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
3105
3106 print <<ENDUSAGE;
3107
3108 Usage: $usage
3109
3110 See perldoc $0 for details.
3111
3112 ENDUSAGE
3113
3114 exit 2;
3115 }
3116
3117 sub strip
3118 {
3119 my $self = do { local(@ARGV,$/)=($0); <> };
3120 my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms;
3121 $copy =~ s/^(?=\S+)/ /gms;
3122 $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms;
3123 $self =~ s/^SKIP.*(?=^__DATA__)/SKIP
3124 if (\@ARGV && \$ARGV[0] eq '--unstrip') {
3125 eval { require Devel::PPPort };
3126 \$@ and die "Cannot require Devel::PPPort, please install.\\n";
3127 if (eval \$Devel::PPPort::VERSION < $VERSION) {
3128 die "$0 was originally generated with Devel::PPPort $VERSION.\\n"
3129 . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n"
3130 . "Please install a newer version, or --unstrip will not work.\\n";
3131 }
3132 Devel::PPPort::WriteFile(\$0);
3133 exit 0;
3134 }
3135 print <<END;
3136
3137 Sorry, but this is a stripped version of \$0.
3138
3139 To be able to use its original script and doc functionality,
3140 please try to regenerate this file using:
3141
3142 \$^X \$0 --unstrip
3143
3144 END
3145 /ms;
3146 my($pl, $c) = $self =~ /(.*^__DATA__)(.*)/ms;
3147 $c =~ s{
3148 / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
3149 | ( "[^"\\]*(?:\\.[^"\\]*)*"
3150 | '[^'\\]*(?:\\.[^'\\]*)*' )
3151 | ($HS+) }{ defined $2 ? ' ' : ($1 || '') }gsex;
3152 $c =~ s!\s+$!!mg;
3153 $c =~ s!^$LF!!mg;
3154 $c =~ s!^\s*#\s*!#!mg;
3155 $c =~ s!^\s+!!mg;
3156
3157 open OUT, ">$0" or die "cannot strip $0: $!\n";
3158 print OUT "$pl$c\n";
3159
3160 exit 0;
3161 }
3162
3163 __DATA__
3164 */
3165
3166 #ifndef _P_P_PORTABILITY_H_
3167 #define _P_P_PORTABILITY_H_
3168
3169 #ifndef DPPP_NAMESPACE
3170 # define DPPP_NAMESPACE DPPP_
3171 #endif
3172
3173 #define DPPP_CAT2(x,y) CAT2(x,y)
3174 #define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
3175
3176 #ifndef PERL_REVISION
3177 # if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
3178 # define PERL_PATCHLEVEL_H_IMPLICIT
3179 # include <patchlevel.h>
3180 # endif
3181 # if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
3182 # include <could_not_find_Perl_patchlevel.h>
3183 # endif
3184 # ifndef PERL_REVISION
3185 # define PERL_REVISION (5)
3186 /* Replace: 1 */
3187 # define PERL_VERSION PATCHLEVEL
3188 # define PERL_SUBVERSION SUBVERSION
3189 /* Replace PERL_PATCHLEVEL with PERL_VERSION */
3190 /* Replace: 0 */
3191 # endif
3192 #endif
3193
3194 #define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10))
3195 #define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION))
3196
3197 /* It is very unlikely that anyone will try to use this with Perl 6
3198 (or greater), but who knows.
3199 */
3200 #if PERL_REVISION != 5
3201 # error ppport.h only works with Perl version 5
3202 #endif /* PERL_REVISION != 5 */
3203 #ifndef dTHR
3204 # define dTHR dNOOP
3205 #endif
3206 #ifndef dTHX
3207 # define dTHX dNOOP
3208 #endif
3209
3210 #ifndef dTHXa
3211 # define dTHXa(x) dNOOP
3212 #endif
3213 #ifndef pTHX
3214 # define pTHX void
3215 #endif
3216
3217 #ifndef pTHX_
3218 # define pTHX_
3219 #endif
3220
3221 #ifndef aTHX
3222 # define aTHX
3223 #endif
3224
3225 #ifndef aTHX_
3226 # define aTHX_
3227 #endif
3228
3229 #if (PERL_BCDVERSION < 0x5006000)
3230 # ifdef USE_THREADS
3231 # define aTHXR thr
3232 # define aTHXR_ thr,
3233 # else
3234 # define aTHXR
3235 # define aTHXR_
3236 # endif
3237 # define dTHXR dTHR
3238 #else
3239 # define aTHXR aTHX
3240 # define aTHXR_ aTHX_
3241 # define dTHXR dTHX
3242 #endif
3243 #ifndef dTHXoa
3244 # define dTHXoa(x) dTHXa(x)
3245 #endif
3246
3247 #ifdef I_LIMITS
3248 # include <limits.h>
3249 #endif
3250
3251 #ifndef PERL_UCHAR_MIN
3252 # define PERL_UCHAR_MIN ((unsigned char)0)
3253 #endif
3254
3255 #ifndef PERL_UCHAR_MAX
3256 # ifdef UCHAR_MAX
3257 # define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
3258 # else
3259 # ifdef MAXUCHAR
3260 # define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
3261 # else
3262 # define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
3263 # endif
3264 # endif
3265 #endif
3266
3267 #ifndef PERL_USHORT_MIN
3268 # define PERL_USHORT_MIN ((unsigned short)0)
3269 #endif
3270
3271 #ifndef PERL_USHORT_MAX
3272 # ifdef USHORT_MAX
3273 # define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
3274 # else
3275 # ifdef MAXUSHORT
3276 # define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
3277 # else
3278 # ifdef USHRT_MAX
3279 # define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
3280 # else
3281 # define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
3282 # endif
3283 # endif
3284 # endif
3285 #endif
3286
3287 #ifndef PERL_SHORT_MAX
3288 # ifdef SHORT_MAX
3289 # define PERL_SHORT_MAX ((short)SHORT_MAX)
3290 # else
3291 # ifdef MAXSHORT /* Often used in <values.h> */
3292 # define PERL_SHORT_MAX ((short)MAXSHORT)
3293 # else
3294 # ifdef SHRT_MAX
3295 # define PERL_SHORT_MAX ((short)SHRT_MAX)
3296 # else
3297 # define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
3298 # endif
3299 # endif
3300 # endif
3301 #endif
3302
3303 #ifndef PERL_SHORT_MIN
3304 # ifdef SHORT_MIN
3305 # define PERL_SHORT_MIN ((short)SHORT_MIN)
3306 # else
3307 # ifdef MINSHORT
3308 # define PERL_SHORT_MIN ((short)MINSHORT)
3309 # else
3310 # ifdef SHRT_MIN
3311 # define PERL_SHORT_MIN ((short)SHRT_MIN)
3312 # else
3313 # define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
3314 # endif
3315 # endif
3316 # endif
3317 #endif
3318
3319 #ifndef PERL_UINT_MAX
3320 # ifdef UINT_MAX
3321 # define PERL_UINT_MAX ((unsigned int)UINT_MAX)
3322 # else
3323 # ifdef MAXUINT
3324 # define PERL_UINT_MAX ((unsigned int)MAXUINT)
3325 # else
3326 # define PERL_UINT_MAX (~(unsigned int)0)
3327 # endif
3328 # endif
3329 #endif
3330
3331 #ifndef PERL_UINT_MIN
3332 # define PERL_UINT_MIN ((unsigned int)0)
3333 #endif
3334
3335 #ifndef PERL_INT_MAX
3336 # ifdef INT_MAX
3337 # define PERL_INT_MAX ((int)INT_MAX)
3338 # else
3339 # ifdef MAXINT /* Often used in <values.h> */
3340 # define PERL_INT_MAX ((int)MAXINT)
3341 # else
3342 # define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
3343 # endif
3344 # endif
3345 #endif
3346
3347 #ifndef PERL_INT_MIN
3348 # ifdef INT_MIN
3349 # define PERL_INT_MIN ((int)INT_MIN)
3350 # else
3351 # ifdef MININT
3352 # define PERL_INT_MIN ((int)MININT)
3353 # else
3354 # define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
3355 # endif
3356 # endif
3357 #endif
3358
3359 #ifndef PERL_ULONG_MAX
3360 # ifdef ULONG_MAX
3361 # define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
3362 # else
3363 # ifdef MAXULONG
3364 # define PERL_ULONG_MAX ((unsigned long)MAXULONG)
3365 # else
3366 # define PERL_ULONG_MAX (~(unsigned long)0)
3367 # endif
3368 # endif
3369 #endif
3370
3371 #ifndef PERL_ULONG_MIN
3372 # define PERL_ULONG_MIN ((unsigned long)0L)
3373 #endif
3374
3375 #ifndef PERL_LONG_MAX
3376 # ifdef LONG_MAX
3377 # define PERL_LONG_MAX ((long)LONG_MAX)
3378 # else
3379 # ifdef MAXLONG
3380 # define PERL_LONG_MAX ((long)MAXLONG)
3381 # else
3382 # define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
3383 # endif
3384 # endif
3385 #endif
3386
3387 #ifndef PERL_LONG_MIN
3388 # ifdef LONG_MIN
3389 # define PERL_LONG_MIN ((long)LONG_MIN)
3390 # else
3391 # ifdef MINLONG
3392 # define PERL_LONG_MIN ((long)MINLONG)
3393 # else
3394 # define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
3395 # endif
3396 # endif
3397 #endif
3398
3399 #if defined(HAS_QUAD) && (defined(convex) || defined(uts))
3400 # ifndef PERL_UQUAD_MAX
3401 # ifdef ULONGLONG_MAX
3402 # define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
3403 # else
3404 # ifdef MAXULONGLONG
3405 # define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
3406 # else
3407 # define PERL_UQUAD_MAX (~(unsigned long long)0)
3408 # endif
3409 # endif
3410 # endif
3411
3412 # ifndef PERL_UQUAD_MIN
3413 # define PERL_UQUAD_MIN ((unsigned long long)0L)
3414 # endif
3415
3416 # ifndef PERL_QUAD_MAX
3417 # ifdef LONGLONG_MAX
3418 # define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
3419 # else
3420 # ifdef MAXLONGLONG
3421 # define PERL_QUAD_MAX ((long long)MAXLONGLONG)
3422 # else
3423 # define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
3424 # endif
3425 # endif
3426 # endif
3427
3428 # ifndef PERL_QUAD_MIN
3429 # ifdef LONGLONG_MIN
3430 # define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
3431 # else
3432 # ifdef MINLONGLONG
3433 # define PERL_QUAD_MIN ((long long)MINLONGLONG)
3434 # else
3435 # define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
3436 # endif
3437 # endif
3438 # endif
3439 #endif
3440
3441 /* This is based on code from 5.003 perl.h */
3442 #ifdef HAS_QUAD
3443 # ifdef cray
3444 #ifndef IVTYPE
3445 # define IVTYPE int
3446 #endif
3447
3448 #ifndef IV_MIN
3449 # define IV_MIN PERL_INT_MIN
3450 #endif
3451
3452 #ifndef IV_MAX
3453 # define IV_MAX PERL_INT_MAX
3454 #endif
3455
3456 #ifndef UV_MIN
3457 # define UV_MIN PERL_UINT_MIN
3458 #endif
3459
3460 #ifndef UV_MAX
3461 # define UV_MAX PERL_UINT_MAX
3462 #endif
3463
3464 # ifdef INTSIZE
3465 #ifndef IVSIZE
3466 # define IVSIZE INTSIZE
3467 #endif
3468
3469 # endif
3470 # else
3471 # if defined(convex) || defined(uts)
3472 #ifndef IVTYPE
3473 # define IVTYPE long long
3474 #endif
3475
3476 #ifndef IV_MIN
3477 # define IV_MIN PERL_QUAD_MIN
3478 #endif
3479
3480 #ifndef IV_MAX
3481 # define IV_MAX PERL_QUAD_MAX
3482 #endif
3483
3484 #ifndef UV_MIN
3485 # define UV_MIN PERL_UQUAD_MIN
3486 #endif
3487
3488 #ifndef UV_MAX
3489 # define UV_MAX PERL_UQUAD_MAX
3490 #endif
3491
3492 # ifdef LONGLONGSIZE
3493 #ifndef IVSIZE
3494 # define IVSIZE LONGLONGSIZE
3495 #endif
3496
3497 # endif
3498 # else
3499 #ifndef IVTYPE
3500 # define IVTYPE long
3501 #endif
3502
3503 #ifndef IV_MIN
3504 # define IV_MIN PERL_LONG_MIN
3505 #endif
3506
3507 #ifndef IV_MAX
3508 # define IV_MAX PERL_LONG_MAX
3509 #endif
3510
3511 #ifndef UV_MIN
3512 # define UV_MIN PERL_ULONG_MIN
3513 #endif
3514
3515 #ifndef UV_MAX
3516 # define UV_MAX PERL_ULONG_MAX
3517 #endif
3518
3519 # ifdef LONGSIZE
3520 #ifndef IVSIZE
3521 # define IVSIZE LONGSIZE
3522 #endif
3523
3524 # endif
3525 # endif
3526 # endif
3527 #ifndef IVSIZE
3528 # define IVSIZE 8
3529 #endif
3530
3531 #ifndef PERL_QUAD_MIN
3532 # define PERL_QUAD_MIN IV_MIN
3533 #endif
3534
3535 #ifndef PERL_QUAD_MAX
3536 # define PERL_QUAD_MAX IV_MAX
3537 #endif
3538
3539 #ifndef PERL_UQUAD_MIN
3540 # define PERL_UQUAD_MIN UV_MIN
3541 #endif
3542
3543 #ifndef PERL_UQUAD_MAX
3544 # define PERL_UQUAD_MAX UV_MAX
3545 #endif
3546
3547 #else
3548 #ifndef IVTYPE
3549 # define IVTYPE long
3550 #endif
3551
3552 #ifndef IV_MIN
3553 # define IV_MIN PERL_LONG_MIN
3554 #endif
3555
3556 #ifndef IV_MAX
3557 # define IV_MAX PERL_LONG_MAX
3558 #endif
3559
3560 #ifndef UV_MIN
3561 # define UV_MIN PERL_ULONG_MIN
3562 #endif
3563
3564 #ifndef UV_MAX
3565 # define UV_MAX PERL_ULONG_MAX
3566 #endif
3567
3568 #endif
3569
3570 #ifndef IVSIZE
3571 # ifdef LONGSIZE
3572 # define IVSIZE LONGSIZE
3573 # else
3574 # define IVSIZE 4 /* A bold guess, but the best we can make. */
3575 # endif
3576 #endif
3577 #ifndef UVTYPE
3578 # define UVTYPE unsigned IVTYPE
3579 #endif
3580
3581 #ifndef UVSIZE
3582 # define UVSIZE IVSIZE
3583 #endif
3584 #ifndef sv_setuv
3585 # define sv_setuv(sv, uv) \
3586 STMT_START { \
3587 UV TeMpUv = uv; \
3588 if (TeMpUv <= IV_MAX) \
3589 sv_setiv(sv, TeMpUv); \
3590 else \
3591 sv_setnv(sv, (double)TeMpUv); \
3592 } STMT_END
3593 #endif
3594 #ifndef newSVuv
3595 # define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
3596 #endif
3597 #ifndef sv_2uv
3598 # define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
3599 #endif
3600
3601 #ifndef SvUVX
3602 # define SvUVX(sv) ((UV)SvIVX(sv))
3603 #endif
3604
3605 #ifndef SvUVXx
3606 # define SvUVXx(sv) SvUVX(sv)
3607 #endif
3608
3609 #ifndef SvUV
3610 # define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
3611 #endif
3612
3613 #ifndef SvUVx
3614 # define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
3615 #endif
3616
3617 /* Hint: sv_uv
3618 * Always use the SvUVx() macro instead of sv_uv().
3619 */
3620 #ifndef sv_uv
3621 # define sv_uv(sv) SvUVx(sv)
3622 #endif
3623
3624 #if !defined(SvUOK) && defined(SvIOK_UV)
3625 # define SvUOK(sv) SvIOK_UV(sv)
3626 #endif
3627 #ifndef XST_mUV
3628 # define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
3629 #endif
3630
3631 #ifndef XSRETURN_UV
3632 # define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
3633 #endif
3634 #ifndef PUSHu
3635 # define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
3636 #endif
3637
3638 #ifndef XPUSHu
3639 # define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
3640 #endif
3641
3642 #ifdef HAS_MEMCMP
3643 #ifndef memNE
3644 # define memNE(s1,s2,l) (memcmp(s1,s2,l))
3645 #endif
3646
3647 #ifndef memEQ
3648 # define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
3649 #endif
3650
3651 #else
3652 #ifndef memNE
3653 # define memNE(s1,s2,l) (bcmp(s1,s2,l))
3654 #endif
3655
3656 #ifndef memEQ
3657 # define memEQ(s1,s2,l) (!bcmp(s1,s2,l))
3658 #endif
3659
3660 #endif
3661 #ifndef MoveD
3662 # define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t))
3663 #endif
3664
3665 #ifndef CopyD
3666 # define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
3667 #endif
3668
3669 #ifdef HAS_MEMSET
3670 #ifndef ZeroD
3671 # define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t))
3672 #endif
3673
3674 #else
3675 #ifndef ZeroD
3676 # define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d)
3677 #endif
3678
3679 #endif
3680 #ifndef PoisonWith
3681 # define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))
3682 #endif
3683
3684 #ifndef PoisonNew
3685 # define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB)
3686 #endif
3687
3688 #ifndef PoisonFree
3689 # define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF)
3690 #endif
3691
3692 #ifndef Poison
3693 # define Poison(d,n,t) PoisonFree(d,n,t)
3694 #endif
3695 #ifndef Newx
3696 # define Newx(v,n,t) New(0,v,n,t)
3697 #endif
3698
3699 #ifndef Newxc
3700 # define Newxc(v,n,t,c) Newc(0,v,n,t,c)
3701 #endif
3702
3703 #ifndef Newxz
3704 # define Newxz(v,n,t) Newz(0,v,n,t)
3705 #endif
3706
3707 #ifndef PERL_UNUSED_DECL
3708 # ifdef HASATTRIBUTE
3709 # if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
3710 # define PERL_UNUSED_DECL
3711 # else
3712 # define PERL_UNUSED_DECL __attribute__((unused))
3713 # endif
3714 # else
3715 # define PERL_UNUSED_DECL
3716 # endif
3717 #endif
3718
3719 #ifndef PERL_UNUSED_ARG
3720 # if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
3721 # include <note.h>
3722 # define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
3723 # else
3724 # define PERL_UNUSED_ARG(x) ((void)x)
3725 # endif
3726 #endif
3727
3728 #ifndef PERL_UNUSED_VAR
3729 # define PERL_UNUSED_VAR(x) ((void)x)
3730 #endif
3731
3732 #ifndef PERL_UNUSED_CONTEXT
3733 # ifdef USE_ITHREADS
3734 # define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
3735 # else
3736 # define PERL_UNUSED_CONTEXT
3737 # endif
3738 #endif
3739 #ifndef NOOP
3740 # define NOOP /*EMPTY*/(void)0
3741 #endif
3742
3743 #ifndef dNOOP
3744 # define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
3745 #endif
3746
3747 #ifndef NVTYPE
3748 # if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
3749 # define NVTYPE long double
3750 # else
3751 # define NVTYPE double
3752 # endif
3753 typedef NVTYPE NV;
3754 #endif
3755
3756 #ifndef INT2PTR
3757 # if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
3758 # define PTRV UV
3759 # define INT2PTR(any,d) (any)(d)
3760 # else
3761 # if PTRSIZE == LONGSIZE
3762 # define PTRV unsigned long
3763 # else
3764 # define PTRV unsigned
3765 # endif
3766 # define INT2PTR(any,d) (any)(PTRV)(d)
3767 # endif
3768 #endif
3769
3770 #ifndef PTR2ul
3771 # if PTRSIZE == LONGSIZE
3772 # define PTR2ul(p) (unsigned long)(p)
3773 # else
3774 # define PTR2ul(p) INT2PTR(unsigned long,p)
3775 # endif
3776 #endif
3777 #ifndef PTR2nat
3778 # define PTR2nat(p) (PTRV)(p)
3779 #endif
3780
3781 #ifndef NUM2PTR
3782 # define NUM2PTR(any,d) (any)PTR2nat(d)
3783 #endif
3784
3785 #ifndef PTR2IV
3786 # define PTR2IV(p) INT2PTR(IV,p)
3787 #endif
3788
3789 #ifndef PTR2UV
3790 # define PTR2UV(p) INT2PTR(UV,p)
3791 #endif
3792
3793 #ifndef PTR2NV
3794 # define PTR2NV(p) NUM2PTR(NV,p)
3795 #endif
3796
3797 #undef START_EXTERN_C
3798 #undef END_EXTERN_C
3799 #undef EXTERN_C
3800 #ifdef __cplusplus
3801 # define START_EXTERN_C extern "C" {
3802 # define END_EXTERN_C }
3803 # define EXTERN_C extern "C"
3804 #else
3805 # define START_EXTERN_C
3806 # define END_EXTERN_C
3807 # define EXTERN_C extern
3808 #endif
3809
3810 #if defined(PERL_GCC_PEDANTIC)
3811 # ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
3812 # define PERL_GCC_BRACE_GROUPS_FORBIDDEN
3813 # endif
3814 #endif
3815
3816 #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
3817 # ifndef PERL_USE_GCC_BRACE_GROUPS
3818 # define PERL_USE_GCC_BRACE_GROUPS
3819 # endif
3820 #endif
3821
3822 #undef STMT_START
3823 #undef STMT_END
3824 #ifdef PERL_USE_GCC_BRACE_GROUPS
3825 # define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
3826 # define STMT_END )
3827 #else
3828 # if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
3829 # define STMT_START if (1)
3830 # define STMT_END else (void)0
3831 # else
3832 # define STMT_START do
3833 # define STMT_END while (0)
3834 # endif
3835 #endif
3836 #ifndef boolSV
3837 # define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
3838 #endif
3839
3840 /* DEFSV appears first in 5.004_56 */
3841 #ifndef DEFSV
3842 # define DEFSV GvSV(PL_defgv)
3843 #endif
3844
3845 #ifndef SAVE_DEFSV
3846 # define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
3847 #endif
3848
3849 #ifndef DEFSV_set
3850 # define DEFSV_set(sv) (DEFSV = (sv))
3851 #endif
3852
3853 /* Older perls (<=5.003) lack AvFILLp */
3854 #ifndef AvFILLp
3855 # define AvFILLp AvFILL
3856 #endif
3857 #ifndef ERRSV
3858 # define ERRSV get_sv("@",FALSE)
3859 #endif
3860
3861 /* Hint: gv_stashpvn
3862 * This function's backport doesn't support the length parameter, but
3863 * rather ignores it. Portability can only be ensured if the length
3864 * parameter is used for speed reasons, but the length can always be
3865 * correctly computed from the string argument.
3866 */
3867 #ifndef gv_stashpvn
3868 # define gv_stashpvn(str,len,create) gv_stashpv(str,create)
3869 #endif
3870
3871 /* Replace: 1 */
3872 #ifndef get_cv
3873 # define get_cv perl_get_cv
3874 #endif
3875
3876 #ifndef get_sv
3877 # define get_sv perl_get_sv
3878 #endif
3879
3880 #ifndef get_av
3881 # define get_av perl_get_av
3882 #endif
3883
3884 #ifndef get_hv
3885 # define get_hv perl_get_hv
3886 #endif
3887
3888 /* Replace: 0 */
3889 #ifndef dUNDERBAR
3890 # define dUNDERBAR dNOOP
3891 #endif
3892
3893 #ifndef UNDERBAR
3894 # define UNDERBAR DEFSV
3895 #endif
3896 #ifndef dAX
3897 # define dAX I32 ax = MARK - PL_stack_base + 1
3898 #endif
3899
3900 #ifndef dITEMS
3901 # define dITEMS I32 items = SP - MARK
3902 #endif
3903 #ifndef dXSTARG
3904 # define dXSTARG SV * targ = sv_newmortal()
3905 #endif
3906 #ifndef dAXMARK
3907 # define dAXMARK I32 ax = POPMARK; \
3908 register SV ** const mark = PL_stack_base + ax++
3909 #endif
3910 #ifndef XSprePUSH
3911 # define XSprePUSH (sp = PL_stack_base + ax - 1)
3912 #endif
3913
3914 #if (PERL_BCDVERSION < 0x5005000)
3915 # undef XSRETURN
3916 # define XSRETURN(off) \
3917 STMT_START { \
3918 PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
3919 return; \
3920 } STMT_END
3921 #endif
3922 #ifndef XSPROTO
3923 # define XSPROTO(name) void name(pTHX_ CV* cv)
3924 #endif
3925
3926 #ifndef SVfARG
3927 # define SVfARG(p) ((void*)(p))
3928 #endif
3929 #ifndef PERL_ABS
3930 # define PERL_ABS(x) ((x) < 0 ? -(x) : (x))
3931 #endif
3932 #ifndef dVAR
3933 # define dVAR dNOOP
3934 #endif
3935 #ifndef SVf
3936 # define SVf "_"
3937 #endif
3938 #ifndef UTF8_MAXBYTES
3939 # define UTF8_MAXBYTES UTF8_MAXLEN
3940 #endif
3941 #ifndef CPERLscope
3942 # define CPERLscope(x) x
3943 #endif
3944 #ifndef PERL_HASH
3945 # define PERL_HASH(hash,str,len) \
3946 STMT_START { \
3947 const char *s_PeRlHaSh = str; \
3948 I32 i_PeRlHaSh = len; \
3949 U32 hash_PeRlHaSh = 0; \
3950 while (i_PeRlHaSh--) \
3951 hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
3952 (hash) = hash_PeRlHaSh; \
3953 } STMT_END
3954 #endif
3955
3956 #ifndef PERLIO_FUNCS_DECL
3957 # ifdef PERLIO_FUNCS_CONST
3958 # define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
3959 # define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
3960 # else
3961 # define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
3962 # define PERLIO_FUNCS_CAST(funcs) (funcs)
3963 # endif
3964 #endif
3965
3966 /* provide these typedefs for older perls */
3967 #if (PERL_BCDVERSION < 0x5009003)
3968
3969 # ifdef ARGSproto
3970 typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto);
3971 # else
3972 typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
3973 # endif
3974
3975 typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
3976
3977 #endif
3978 #ifndef isPSXSPC
3979 # define isPSXSPC(c) (isSPACE(c) || (c) == '\v')
3980 #endif
3981
3982 #ifndef isBLANK
3983 # define isBLANK(c) ((c) == ' ' || (c) == '\t')
3984 #endif
3985
3986 #ifdef EBCDIC
3987 #ifndef isALNUMC
3988 # define isALNUMC(c) isalnum(c)
3989 #endif
3990
3991 #ifndef isASCII
3992 # define isASCII(c) isascii(c)
3993 #endif
3994
3995 #ifndef isCNTRL
3996 # define isCNTRL(c) iscntrl(c)
3997 #endif
3998
3999 #ifndef isGRAPH
4000 # define isGRAPH(c) isgraph(c)
4001 #endif
4002
4003 #ifndef isPRINT
4004 # define isPRINT(c) isprint(c)
4005 #endif
4006
4007 #ifndef isPUNCT
4008 # define isPUNCT(c) ispunct(c)
4009 #endif
4010
4011 #ifndef isXDIGIT
4012 # define isXDIGIT(c) isxdigit(c)
4013 #endif
4014
4015 #else
4016 # if (PERL_BCDVERSION < 0x5010000)
4017 /* Hint: isPRINT
4018 * The implementation in older perl versions includes all of the
4019 * isSPACE() characters, which is wrong. The version provided by
4020 * Devel::PPPort always overrides a present buggy version.
4021 */
4022 # undef isPRINT
4023 # endif
4024 #ifndef isALNUMC
4025 # define isALNUMC(c) (isALPHA(c) || isDIGIT(c))
4026 #endif
4027
4028 #ifndef isASCII
4029 # define isASCII(c) ((c) <= 127)
4030 #endif
4031
4032 #ifndef isCNTRL
4033 # define isCNTRL(c) ((c) < ' ' || (c) == 127)
4034 #endif
4035
4036 #ifndef isGRAPH
4037 # define isGRAPH(c) (isALNUM(c) || isPUNCT(c))
4038 #endif
4039
4040 #ifndef isPRINT
4041 # define isPRINT(c) (((c) >= 32 && (c) < 127))
4042 #endif
4043
4044 #ifndef isPUNCT
4045 # define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
4046 #endif
4047
4048 #ifndef isXDIGIT
4049 # define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
4050 #endif
4051
4052 #endif
4053
4054 #ifndef PERL_SIGNALS_UNSAFE_FLAG
4055
4056 #define PERL_SIGNALS_UNSAFE_FLAG 0x0001
4057
4058 #if (PERL_BCDVERSION < 0x5008000)
4059 # define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG
4060 #else
4061 # define D_PPP_PERL_SIGNALS_INIT 0
4062 #endif
4063
4064 #if defined(NEED_PL_signals)
4065 static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
4066 #elif defined(NEED_PL_signals_GLOBAL)
4067 U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
4068 #else
4069 extern U32 DPPP_(my_PL_signals);
4070 #endif
4071 #define PL_signals DPPP_(my_PL_signals)
4072
4073 #endif
4074
4075 /* Hint: PL_ppaddr
4076 * Calling an op via PL_ppaddr requires passing a context argument
4077 * for threaded builds. Since the context argument is different for
4078 * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will
4079 * automatically be defined as the correct argument.
4080 */
4081
4082 #if (PERL_BCDVERSION <= 0x5005005)
4083 /* Replace: 1 */
4084 # define PL_ppaddr ppaddr
4085 # define PL_no_modify no_modify
4086 /* Replace: 0 */
4087 #endif
4088
4089 #if (PERL_BCDVERSION <= 0x5004005)
4090 /* Replace: 1 */
4091 # define PL_DBsignal DBsignal
4092 # define PL_DBsingle DBsingle
4093 # define PL_DBsub DBsub
4094 # define PL_DBtrace DBtrace
4095 # define PL_Sv Sv
4096 # define PL_bufend bufend
4097 # define PL_bufptr bufptr
4098 # define PL_compiling compiling
4099 # define PL_copline copline
4100 # define PL_curcop curcop
4101 # define PL_curstash curstash
4102 # define PL_debstash debstash
4103 # define PL_defgv defgv
4104 # define PL_diehook diehook
4105 # define PL_dirty dirty
4106 # define PL_dowarn dowarn
4107 # define PL_errgv errgv
4108 # define PL_error_count error_count
4109 # define PL_expect expect
4110 # define PL_hexdigit hexdigit
4111 # define PL_hints hints
4112 # define PL_in_my in_my
4113 # define PL_laststatval laststatval
4114 # define PL_lex_state lex_state
4115 # define PL_lex_stuff lex_stuff
4116 # define PL_linestr linestr
4117 # define PL_na na
4118 # define PL_perl_destruct_level perl_destruct_level
4119 # define PL_perldb perldb
4120 # define PL_rsfp_filters rsfp_filters
4121 # define PL_rsfp rsfp
4122 # define PL_stack_base stack_base
4123 # define PL_stack_sp stack_sp
4124 # define PL_statcache statcache
4125 # define PL_stdingv stdingv
4126 # define PL_sv_arenaroot sv_arenaroot
4127 # define PL_sv_no sv_no
4128 # define PL_sv_undef sv_undef
4129 # define PL_sv_yes sv_yes
4130 # define PL_tainted tainted
4131 # define PL_tainting tainting
4132 # define PL_tokenbuf tokenbuf
4133 /* Replace: 0 */
4134 #endif
4135
4136 /* Warning: PL_parser
4137 * For perl versions earlier than 5.9.5, this is an always
4138 * non-NULL dummy. Also, it cannot be dereferenced. Don't
4139 * use it if you can avoid is and unless you absolutely know
4140 * what you're doing.
4141 * If you always check that PL_parser is non-NULL, you can
4142 * define DPPP_PL_parser_NO_DUMMY to avoid the creation of
4143 * a dummy parser structure.
4144 */
4145
4146 #if (PERL_BCDVERSION >= 0x5009005)
4147 # ifdef DPPP_PL_parser_NO_DUMMY
4148 # define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
4149 (croak("panic: PL_parser == NULL in %s:%d", \
4150 __FILE__, __LINE__), (yy_parser *) NULL))->var)
4151 # else
4152 # ifdef DPPP_PL_parser_NO_DUMMY_WARNING
4153 # define D_PPP_parser_dummy_warning(var)
4154 # else
4155 # define D_PPP_parser_dummy_warning(var) \
4156 warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__),
4157 # endif
4158 # define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
4159 (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var)
4160 #if defined(NEED_PL_parser)
4161 static yy_parser DPPP_(dummy_PL_parser);
4162 #elif defined(NEED_PL_parser_GLOBAL)
4163 yy_parser DPPP_(dummy_PL_parser);
4164 #else
4165 extern yy_parser DPPP_(dummy_PL_parser);
4166 #endif
4167
4168 # endif
4169
4170 /* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */
4171 /* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf
4172 * Do not use this variable unless you know exactly what you're
4173 * doint. It is internal to the perl parser and may change or even
4174 * be removed in the future. As of perl 5.9.5, you have to check
4175 * for (PL_parser != NULL) for this variable to have any effect.
4176 * An always non-NULL PL_parser dummy is provided for earlier
4177 * perl versions.
4178 * If PL_parser is NULL when you try to access this variable, a
4179 * dummy is being accessed instead and a warning is issued unless
4180 * you define DPPP_PL_parser_NO_DUMMY_WARNING.
4181 * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access
4182 * this variable will croak with a panic message.
4183 */
4184
4185 # define PL_expect D_PPP_my_PL_parser_var(expect)
4186 # define PL_copline D_PPP_my_PL_parser_var(copline)
4187 # define PL_rsfp D_PPP_my_PL_parser_var(rsfp)
4188 # define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters)
4189 # define PL_linestr D_PPP_my_PL_parser_var(linestr)
4190 # define PL_bufptr D_PPP_my_PL_parser_var(bufptr)
4191 # define PL_bufend D_PPP_my_PL_parser_var(bufend)
4192 # define PL_lex_state D_PPP_my_PL_parser_var(lex_state)
4193 # define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff)
4194 # define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf)
4195 # define PL_in_my D_PPP_my_PL_parser_var(in_my)
4196 # define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash)
4197 # define PL_error_count D_PPP_my_PL_parser_var(error_count)
4198
4199
4200 #else
4201
4202 /* ensure that PL_parser != NULL and cannot be dereferenced */
4203 # define PL_parser ((void *) 1)
4204
4205 #endif
4206 #ifndef mPUSHs
4207 # define mPUSHs(s) PUSHs(sv_2mortal(s))
4208 #endif
4209
4210 #ifndef PUSHmortal
4211 # define PUSHmortal PUSHs(sv_newmortal())
4212 #endif
4213
4214 #ifndef mPUSHp
4215 # define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l))
4216 #endif
4217
4218 #ifndef mPUSHn
4219 # define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n))
4220 #endif
4221
4222 #ifndef mPUSHi
4223 # define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i))
4224 #endif
4225
4226 #ifndef mPUSHu
4227 # define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u))
4228 #endif
4229 #ifndef mXPUSHs
4230 # define mXPUSHs(s) XPUSHs(sv_2mortal(s))
4231 #endif
4232
4233 #ifndef XPUSHmortal
4234 # define XPUSHmortal XPUSHs(sv_newmortal())
4235 #endif
4236
4237 #ifndef mXPUSHp
4238 # define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END
4239 #endif
4240
4241 #ifndef mXPUSHn
4242 # define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
4243 #endif
4244
4245 #ifndef mXPUSHi
4246 # define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
4247 #endif
4248
4249 #ifndef mXPUSHu
4250 # define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END
4251 #endif
4252
4253 /* Replace: 1 */
4254 #ifndef call_sv
4255 # define call_sv perl_call_sv
4256 #endif
4257
4258 #ifndef call_pv
4259 # define call_pv perl_call_pv
4260 #endif
4261
4262 #ifndef call_argv
4263 # define call_argv perl_call_argv
4264 #endif
4265
4266 #ifndef call_method
4267 # define call_method perl_call_method
4268 #endif
4269 #ifndef eval_sv
4270 # define eval_sv perl_eval_sv
4271 #endif
4272
4273 /* Replace: 0 */
4274 #ifndef PERL_LOADMOD_DENY
4275 # define PERL_LOADMOD_DENY 0x1
4276 #endif
4277
4278 #ifndef PERL_LOADMOD_NOIMPORT
4279 # define PERL_LOADMOD_NOIMPORT 0x2
4280 #endif
4281
4282 #ifndef PERL_LOADMOD_IMPORT_OPS
4283 # define PERL_LOADMOD_IMPORT_OPS 0x4
4284 #endif
4285
4286 #ifndef G_METHOD
4287 # define G_METHOD 64
4288 # ifdef call_sv
4289 # undef call_sv
4290 # endif
4291 # if (PERL_BCDVERSION < 0x5006000)
4292 # define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \
4293 (flags) & ~G_METHOD) : perl_call_sv(sv, flags))
4294 # else
4295 # define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \
4296 (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags))
4297 # endif
4298 #endif
4299
4300 /* Replace perl_eval_pv with eval_pv */
4301
4302 #ifndef eval_pv
4303 #if defined(NEED_eval_pv)
4304 static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
4305 static
4306 #else
4307 extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
4308 #endif
4309
4310 #ifdef eval_pv
4311 # undef eval_pv
4312 #endif
4313 #define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
4314 #define Perl_eval_pv DPPP_(my_eval_pv)
4315
4316 #if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
4317
4318 SV*
4319 DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
4320 {
4321 dSP;
4322 SV* sv = newSVpv(p, 0);
4323
4324 PUSHMARK(sp);
4325 eval_sv(sv, G_SCALAR);
4326 SvREFCNT_dec(sv);
4327
4328 SPAGAIN;
4329 sv = POPs;
4330 PUTBACK;
4331
4332 if (croak_on_error && SvTRUE(GvSV(errgv)))
4333 croak(SvPVx(GvSV(errgv), na));
4334
4335 return sv;
4336 }
4337
4338 #endif
4339 #endif
4340
4341 #ifndef vload_module
4342 #if defined(NEED_vload_module)
4343 static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
4344 static
4345 #else
4346 extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
4347 #endif
4348
4349 #ifdef vload_module
4350 # undef vload_module
4351 #endif
4352 #define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d)
4353 #define Perl_vload_module DPPP_(my_vload_module)
4354
4355 #if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL)
4356
4357 void
4358 DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args)
4359 {
4360 dTHR;
4361 dVAR;
4362 OP *veop, *imop;
4363
4364 OP * const modname = newSVOP(OP_CONST, 0, name);
4365 /* 5.005 has a somewhat hacky force_normal that doesn't croak on
4366 SvREADONLY() if PL_compling is true. Current perls take care in
4367 ck_require() to correctly turn off SvREADONLY before calling
4368 force_normal_flags(). This seems a better fix than fudging PL_compling
4369 */
4370 SvREADONLY_off(((SVOP*)modname)->op_sv);
4371 modname->op_private |= OPpCONST_BARE;
4372 if (ver) {
4373 veop = newSVOP(OP_CONST, 0, ver);
4374 }
4375 else
4376 veop = NULL;
4377 if (flags & PERL_LOADMOD_NOIMPORT) {
4378 imop = sawparens(newNULLLIST());
4379 }
4380 else if (flags & PERL_LOADMOD_IMPORT_OPS) {
4381 imop = va_arg(*args, OP*);
4382 }
4383 else {
4384 SV *sv;
4385 imop = NULL;
4386 sv = va_arg(*args, SV*);
4387 while (sv) {
4388 imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
4389 sv = va_arg(*args, SV*);
4390 }
4391 }
4392 {
4393 const line_t ocopline = PL_copline;
4394 COP * const ocurcop = PL_curcop;
4395 const int oexpect = PL_expect;
4396
4397 #if (PERL_BCDVERSION >= 0x5004000)
4398 utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
4399 veop, modname, imop);
4400 #else
4401 utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
4402 modname, imop);
4403 #endif
4404 PL_expect = oexpect;
4405 PL_copline = ocopline;
4406 PL_curcop = ocurcop;
4407 }
4408 }
4409
4410 #endif
4411 #endif
4412
4413 #ifndef load_module
4414 #if defined(NEED_load_module)
4415 static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
4416 static
4417 #else
4418 extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
4419 #endif
4420
4421 #ifdef load_module
4422 # undef load_module
4423 #endif
4424 #define load_module DPPP_(my_load_module)
4425 #define Perl_load_module DPPP_(my_load_module)
4426
4427 #if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL)
4428
4429 void
4430 DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...)
4431 {
4432 va_list args;
4433 va_start(args, ver);
4434 vload_module(flags, name, ver, &args);
4435 va_end(args);
4436 }
4437
4438 #endif
4439 #endif
4440 #ifndef newRV_inc
4441 # define newRV_inc(sv) newRV(sv) /* Replace */
4442 #endif
4443
4444 #ifndef newRV_noinc
4445 #if defined(NEED_newRV_noinc)
4446 static SV * DPPP_(my_newRV_noinc)(SV *sv);
4447 static
4448 #else
4449 extern SV * DPPP_(my_newRV_noinc)(SV *sv);
4450 #endif
4451
4452 #ifdef newRV_noinc
4453 # undef newRV_noinc
4454 #endif
4455 #define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
4456 #define Perl_newRV_noinc DPPP_(my_newRV_noinc)
4457
4458 #if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
4459 SV *
4460 DPPP_(my_newRV_noinc)(SV *sv)
4461 {
4462 SV *rv = (SV *)newRV(sv);
4463 SvREFCNT_dec(sv);
4464 return rv;
4465 }
4466 #endif
4467 #endif
4468
4469 /* Hint: newCONSTSUB
4470 * Returns a CV* as of perl-5.7.1. This return value is not supported
4471 * by Devel::PPPort.
4472 */
4473
4474 /* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
4475 #if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005)
4476 #if defined(NEED_newCONSTSUB)
4477 static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
4478 static
4479 #else
4480 extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
4481 #endif
4482
4483 #ifdef newCONSTSUB
4484 # undef newCONSTSUB
4485 #endif
4486 #define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
4487 #define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
4488
4489 #if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
4490
4491 /* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */
4492 /* (There's no PL_parser in perl < 5.005, so this is completely safe) */
4493 #define D_PPP_PL_copline PL_copline
4494
4495 void
4496 DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv)
4497 {
4498 U32 oldhints = PL_hints;
4499 HV *old_cop_stash = PL_curcop->cop_stash;
4500 HV *old_curstash = PL_curstash;
4501 line_t oldline = PL_curcop->cop_line;
4502 PL_curcop->cop_line = D_PPP_PL_copline;
4503
4504 PL_hints &= ~HINT_BLOCK_SCOPE;
4505 if (stash)
4506 PL_curstash = PL_curcop->cop_stash = stash;
4507
4508 newSUB(
4509
4510 #if (PERL_BCDVERSION < 0x5003022)
4511 start_subparse(),
4512 #elif (PERL_BCDVERSION == 0x5003022)
4513 start_subparse(0),
4514 #else /* 5.003_23 onwards */
4515 start_subparse(FALSE, 0),
4516 #endif
4517
4518 newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)),
4519 newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */
4520 newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
4521 );
4522
4523 PL_hints = oldhints;
4524 PL_curcop->cop_stash = old_cop_stash;
4525 PL_curstash = old_curstash;
4526 PL_curcop->cop_line = oldline;
4527 }
4528 #endif
4529 #endif
4530
4531 /*
4532 * Boilerplate macros for initializing and accessing interpreter-local
4533 * data from C. All statics in extensions should be reworked to use
4534 * this, if you want to make the extension thread-safe. See ext/re/re.xs
4535 * for an example of the use of these macros.
4536 *
4537 * Code that uses these macros is responsible for the following:
4538 * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
4539 * 2. Declare a typedef named my_cxt_t that is a structure that contains
4540 * all the data that needs to be interpreter-local.
4541 * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
4542 * 4. Use the MY_CXT_INIT macro such that it is called exactly once
4543 * (typically put in the BOOT: section).
4544 * 5. Use the members of the my_cxt_t structure everywhere as
4545 * MY_CXT.member.
4546 * 6. Use the dMY_CXT macro (a declaration) in all the functions that
4547 * access MY_CXT.
4548 */
4549
4550 #if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
4551 defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT)
4552
4553 #ifndef START_MY_CXT
4554
4555 /* This must appear in all extensions that define a my_cxt_t structure,
4556 * right after the definition (i.e. at file scope). The non-threads
4557 * case below uses it to declare the data as static. */
4558 #define START_MY_CXT
4559
4560 #if (PERL_BCDVERSION < 0x5004068)
4561 /* Fetches the SV that keeps the per-interpreter data. */
4562 #define dMY_CXT_SV \
4563 SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
4564 #else /* >= perl5.004_68 */
4565 #define dMY_CXT_SV \
4566 SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \
4567 sizeof(MY_CXT_KEY)-1, TRUE)
4568 #endif /* < perl5.004_68 */
4569
4570 /* This declaration should be used within all functions that use the
4571 * interpreter-local data. */
4572 #define dMY_CXT \
4573 dMY_CXT_SV; \
4574 my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
4575
4576 /* Creates and zeroes the per-interpreter data.
4577 * (We allocate my_cxtp in a Perl SV so that it will be released when
4578 * the interpreter goes away.) */
4579 #define MY_CXT_INIT \
4580 dMY_CXT_SV; \
4581 /* newSV() allocates one more than needed */ \
4582 my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
4583 Zero(my_cxtp, 1, my_cxt_t); \
4584 sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
4585
4586 /* This macro must be used to access members of the my_cxt_t structure.
4587 * e.g. MYCXT.some_data */
4588 #define MY_CXT (*my_cxtp)
4589
4590 /* Judicious use of these macros can reduce the number of times dMY_CXT
4591 * is used. Use is similar to pTHX, aTHX etc. */
4592 #define pMY_CXT my_cxt_t *my_cxtp
4593 #define pMY_CXT_ pMY_CXT,
4594 #define _pMY_CXT ,pMY_CXT
4595 #define aMY_CXT my_cxtp
4596 #define aMY_CXT_ aMY_CXT,
4597 #define _aMY_CXT ,aMY_CXT
4598
4599 #endif /* START_MY_CXT */
4600
4601 #ifndef MY_CXT_CLONE
4602 /* Clones the per-interpreter data. */
4603 #define MY_CXT_CLONE \
4604 dMY_CXT_SV; \
4605 my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
4606 Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
4607 sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
4608 #endif
4609
4610 #else /* single interpreter */
4611
4612 #ifndef START_MY_CXT
4613
4614 #define START_MY_CXT static my_cxt_t my_cxt;
4615 #define dMY_CXT_SV dNOOP
4616 #define dMY_CXT dNOOP
4617 #define MY_CXT_INIT NOOP
4618 #define MY_CXT my_cxt
4619
4620 #define pMY_CXT void
4621 #define pMY_CXT_
4622 #define _pMY_CXT
4623 #define aMY_CXT
4624 #define aMY_CXT_
4625 #define _aMY_CXT
4626
4627 #endif /* START_MY_CXT */
4628
4629 #ifndef MY_CXT_CLONE
4630 #define MY_CXT_CLONE NOOP
4631 #endif
4632
4633 #endif
4634
4635 #ifndef IVdf
4636 # if IVSIZE == LONGSIZE
4637 # define IVdf "ld"
4638 # define UVuf "lu"
4639 # define UVof "lo"
4640 # define UVxf "lx"
4641 # define UVXf "lX"
4642 # else
4643 # if IVSIZE == INTSIZE
4644 # define IVdf "d"
4645 # define UVuf "u"
4646 # define UVof "o"
4647 # define UVxf "x"
4648 # define UVXf "X"
4649 # endif
4650 # endif
4651 #endif
4652
4653 #ifndef NVef
4654 # if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
4655 defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000)
4656 /* Not very likely, but let's try anyway. */
4657 # define NVef PERL_PRIeldbl
4658 # define NVff PERL_PRIfldbl
4659 # define NVgf PERL_PRIgldbl
4660 # else
4661 # define NVef "e"
4662 # define NVff "f"
4663 # define NVgf "g"
4664 # endif
4665 #endif
4666
4667 #ifndef SvREFCNT_inc
4668 # ifdef PERL_USE_GCC_BRACE_GROUPS
4669 # define SvREFCNT_inc(sv) \
4670 ({ \
4671 SV * const _sv = (SV*)(sv); \
4672 if (_sv) \
4673 (SvREFCNT(_sv))++; \
4674 _sv; \
4675 })
4676 # else
4677 # define SvREFCNT_inc(sv) \
4678 ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
4679 # endif
4680 #endif
4681
4682 #ifndef SvREFCNT_inc_simple
4683 # ifdef PERL_USE_GCC_BRACE_GROUPS
4684 # define SvREFCNT_inc_simple(sv) \
4685 ({ \
4686 if (sv) \
4687 (SvREFCNT(sv))++; \
4688 (SV *)(sv); \
4689 })
4690 # else
4691 # define SvREFCNT_inc_simple(sv) \
4692 ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL)
4693 # endif
4694 #endif
4695
4696 #ifndef SvREFCNT_inc_NN
4697 # ifdef PERL_USE_GCC_BRACE_GROUPS
4698 # define SvREFCNT_inc_NN(sv) \
4699 ({ \
4700 SV * const _sv = (SV*)(sv); \
4701 SvREFCNT(_sv)++; \
4702 _sv; \
4703 })
4704 # else
4705 # define SvREFCNT_inc_NN(sv) \
4706 (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
4707 # endif
4708 #endif
4709
4710 #ifndef SvREFCNT_inc_void
4711 # ifdef PERL_USE_GCC_BRACE_GROUPS
4712 # define SvREFCNT_inc_void(sv) \
4713 ({ \
4714 SV * const _sv = (SV*)(sv); \
4715 if (_sv) \
4716 (void)(SvREFCNT(_sv)++); \
4717 })
4718 # else
4719 # define SvREFCNT_inc_void(sv) \
4720 (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
4721 # endif
4722 #endif
4723 #ifndef SvREFCNT_inc_simple_void
4724 # define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
4725 #endif
4726
4727 #ifndef SvREFCNT_inc_simple_NN
4728 # define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv))
4729 #endif
4730
4731 #ifndef SvREFCNT_inc_void_NN
4732 # define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
4733 #endif
4734
4735 #ifndef SvREFCNT_inc_simple_void_NN
4736 # define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
4737 #endif
4738
4739 #ifndef newSV_type
4740
4741 #if defined(NEED_newSV_type)
4742 static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t);
4743 static
4744 #else
4745 extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t);
4746 #endif
4747
4748 #ifdef newSV_type
4749 # undef newSV_type
4750 #endif
4751 #define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a)
4752 #define Perl_newSV_type DPPP_(my_newSV_type)
4753
4754 #if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL)
4755
4756 SV*
4757 DPPP_(my_newSV_type)(pTHX_ svtype const t)
4758 {
4759 SV* const sv = newSV(0);
4760 sv_upgrade(sv, t);
4761 return sv;
4762 }
4763
4764 #endif
4765
4766 #endif
4767
4768 #if (PERL_BCDVERSION < 0x5006000)
4769 # define D_PPP_CONSTPV_ARG(x) ((char *) (x))
4770 #else
4771 # define D_PPP_CONSTPV_ARG(x) (x)
4772 #endif
4773 #ifndef newSVpvn
4774 # define newSVpvn(data,len) ((data) \
4775 ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
4776 : newSV(0))
4777 #endif
4778 #ifndef newSVpvn_utf8
4779 # define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
4780 #endif
4781 #ifndef SVf_UTF8
4782 # define SVf_UTF8 0
4783 #endif
4784
4785 #ifndef newSVpvn_flags
4786
4787 #if defined(NEED_newSVpvn_flags)
4788 static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
4789 static
4790 #else
4791 extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
4792 #endif
4793
4794 #ifdef newSVpvn_flags
4795 # undef newSVpvn_flags
4796 #endif
4797 #define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c)
4798 #define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags)
4799
4800 #if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL)
4801
4802 SV *
4803 DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags)
4804 {
4805 SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len);
4806 SvFLAGS(sv) |= (flags & SVf_UTF8);
4807 return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
4808 }
4809
4810 #endif
4811
4812 #endif
4813
4814 /* Backwards compatibility stuff... :-( */
4815 #if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen)
4816 # define NEED_sv_2pv_flags
4817 #endif
4818 #if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL)
4819 # define NEED_sv_2pv_flags_GLOBAL
4820 #endif
4821
4822 /* Hint: sv_2pv_nolen
4823 * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen().
4824 */
4825 #ifndef sv_2pv_nolen
4826 # define sv_2pv_nolen(sv) SvPV_nolen(sv)
4827 #endif
4828
4829 #ifdef SvPVbyte
4830
4831 /* Hint: SvPVbyte
4832 * Does not work in perl-5.6.1, ppport.h implements a version
4833 * borrowed from perl-5.7.3.
4834 */
4835
4836 #if (PERL_BCDVERSION < 0x5007000)
4837
4838 #if defined(NEED_sv_2pvbyte)
4839 static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
4840 static
4841 #else
4842 extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
4843 #endif
4844
4845 #ifdef sv_2pvbyte
4846 # undef sv_2pvbyte
4847 #endif
4848 #define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
4849 #define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
4850
4851 #if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
4852
4853 char *
4854 DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp)
4855 {
4856 sv_utf8_downgrade(sv,0);
4857 return SvPV(sv,*lp);
4858 }
4859
4860 #endif
4861
4862 /* Hint: sv_2pvbyte
4863 * Use the SvPVbyte() macro instead of sv_2pvbyte().
4864 */
4865
4866 #undef SvPVbyte
4867
4868 #define SvPVbyte(sv, lp) \
4869 ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
4870 ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
4871
4872 #endif
4873
4874 #else
4875
4876 # define SvPVbyte SvPV
4877 # define sv_2pvbyte sv_2pv
4878
4879 #endif
4880 #ifndef sv_2pvbyte_nolen
4881 # define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv)
4882 #endif
4883
4884 /* Hint: sv_pvn
4885 * Always use the SvPV() macro instead of sv_pvn().
4886 */
4887
4888 /* Hint: sv_pvn_force
4889 * Always use the SvPV_force() macro instead of sv_pvn_force().
4890 */
4891
4892 /* If these are undefined, they're not handled by the core anyway */
4893 #ifndef SV_IMMEDIATE_UNREF
4894 # define SV_IMMEDIATE_UNREF 0
4895 #endif
4896
4897 #ifndef SV_GMAGIC
4898 # define SV_GMAGIC 0
4899 #endif
4900
4901 #ifndef SV_COW_DROP_PV
4902 # define SV_COW_DROP_PV 0
4903 #endif
4904
4905 #ifndef SV_UTF8_NO_ENCODING
4906 # define SV_UTF8_NO_ENCODING 0
4907 #endif
4908
4909 #ifndef SV_NOSTEAL
4910 # define SV_NOSTEAL 0
4911 #endif
4912
4913 #ifndef SV_CONST_RETURN
4914 # define SV_CONST_RETURN 0
4915 #endif
4916
4917 #ifndef SV_MUTABLE_RETURN
4918 # define SV_MUTABLE_RETURN 0
4919 #endif
4920
4921 #ifndef SV_SMAGIC
4922 # define SV_SMAGIC 0
4923 #endif
4924
4925 #ifndef SV_HAS_TRAILING_NUL
4926 # define SV_HAS_TRAILING_NUL 0
4927 #endif
4928
4929 #ifndef SV_COW_SHARED_HASH_KEYS
4930 # define SV_COW_SHARED_HASH_KEYS 0
4931 #endif
4932
4933 #if (PERL_BCDVERSION < 0x5007002)
4934
4935 #if defined(NEED_sv_2pv_flags)
4936 static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
4937 static
4938 #else
4939 extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
4940 #endif
4941
4942 #ifdef sv_2pv_flags
4943 # undef sv_2pv_flags
4944 #endif
4945 #define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c)
4946 #define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags)
4947
4948 #if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL)
4949
4950 char *
4951 DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
4952 {
4953 STRLEN n_a = (STRLEN) flags;
4954 return sv_2pv(sv, lp ? lp : &n_a);
4955 }
4956
4957 #endif
4958
4959 #if defined(NEED_sv_pvn_force_flags)
4960 static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
4961 static
4962 #else
4963 extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
4964 #endif
4965
4966 #ifdef sv_pvn_force_flags
4967 # undef sv_pvn_force_flags
4968 #endif
4969 #define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c)
4970 #define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags)
4971
4972 #if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL)
4973
4974 char *
4975 DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
4976 {
4977 STRLEN n_a = (STRLEN) flags;
4978 return sv_pvn_force(sv, lp ? lp : &n_a);
4979 }
4980
4981 #endif
4982
4983 #endif
4984
4985 #if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) )
4986 # define DPPP_SVPV_NOLEN_LP_ARG &PL_na
4987 #else
4988 # define DPPP_SVPV_NOLEN_LP_ARG 0
4989 #endif
4990 #ifndef SvPV_const
4991 # define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC)
4992 #endif
4993
4994 #ifndef SvPV_mutable
4995 # define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC)
4996 #endif
4997 #ifndef SvPV_flags
4998 # define SvPV_flags(sv, lp, flags) \
4999 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
5000 ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags))
5001 #endif
5002 #ifndef SvPV_flags_const
5003 # define SvPV_flags_const(sv, lp, flags) \
5004 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
5005 ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \
5006 (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN))
5007 #endif
5008 #ifndef SvPV_flags_const_nolen
5009 # define SvPV_flags_const_nolen(sv, flags) \
5010 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
5011 ? SvPVX_const(sv) : \
5012 (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN))
5013 #endif
5014 #ifndef SvPV_flags_mutable
5015 # define SvPV_flags_mutable(sv, lp, flags) \
5016 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
5017 ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \
5018 sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
5019 #endif
5020 #ifndef SvPV_force
5021 # define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC)
5022 #endif
5023
5024 #ifndef SvPV_force_nolen
5025 # define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC)
5026 #endif
5027
5028 #ifndef SvPV_force_mutable
5029 # define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC)
5030 #endif
5031
5032 #ifndef SvPV_force_nomg
5033 # define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0)
5034 #endif
5035
5036 #ifndef SvPV_force_nomg_nolen
5037 # define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0)
5038 #endif
5039 #ifndef SvPV_force_flags
5040 # define SvPV_force_flags(sv, lp, flags) \
5041 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
5042 ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags))
5043 #endif
5044 #ifndef SvPV_force_flags_nolen
5045 # define SvPV_force_flags_nolen(sv, flags) \
5046 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
5047 ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags))
5048 #endif
5049 #ifndef SvPV_force_flags_mutable
5050 # define SvPV_force_flags_mutable(sv, lp, flags) \
5051 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
5052 ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \
5053 : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
5054 #endif
5055 #ifndef SvPV_nolen
5056 # define SvPV_nolen(sv) \
5057 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
5058 ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC))
5059 #endif
5060 #ifndef SvPV_nolen_const
5061 # define SvPV_nolen_const(sv) \
5062 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
5063 ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN))
5064 #endif
5065 #ifndef SvPV_nomg
5066 # define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0)
5067 #endif
5068
5069 #ifndef SvPV_nomg_const
5070 # define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0)
5071 #endif
5072
5073 #ifndef SvPV_nomg_const_nolen
5074 # define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0)
5075 #endif
5076 #ifndef SvPV_renew
5077 # define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \
5078 SvPV_set((sv), (char *) saferealloc( \
5079 (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \
5080 } STMT_END
5081 #endif
5082 #ifndef SvMAGIC_set
5083 # define SvMAGIC_set(sv, val) \
5084 STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
5085 (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
5086 #endif
5087
5088 #if (PERL_BCDVERSION < 0x5009003)
5089 #ifndef SvPVX_const
5090 # define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv)))
5091 #endif
5092
5093 #ifndef SvPVX_mutable
5094 # define SvPVX_mutable(sv) (0 + SvPVX(sv))
5095 #endif
5096 #ifndef SvRV_set
5097 # define SvRV_set(sv, val) \
5098 STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
5099 (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END
5100 #endif
5101
5102 #else
5103 #ifndef SvPVX_const
5104 # define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv))
5105 #endif
5106
5107 #ifndef SvPVX_mutable
5108 # define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv)
5109 #endif
5110 #ifndef SvRV_set
5111 # define SvRV_set(sv, val) \
5112 STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
5113 ((sv)->sv_u.svu_rv = (val)); } STMT_END
5114 #endif
5115
5116 #endif
5117 #ifndef SvSTASH_set
5118 # define SvSTASH_set(sv, val) \
5119 STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
5120 (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
5121 #endif
5122
5123 #if (PERL_BCDVERSION < 0x5004000)
5124 #ifndef SvUV_set
5125 # define SvUV_set(sv, val) \
5126 STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
5127 (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END
5128 #endif
5129
5130 #else
5131 #ifndef SvUV_set
5132 # define SvUV_set(sv, val) \
5133 STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
5134 (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END
5135 #endif
5136
5137 #endif
5138
5139 #if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf)
5140 #if defined(NEED_vnewSVpvf)
5141 static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
5142 static
5143 #else
5144 extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
5145 #endif
5146
5147 #ifdef vnewSVpvf
5148 # undef vnewSVpvf
5149 #endif
5150 #define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
5151 #define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
5152
5153 #if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
5154
5155 SV *
5156 DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
5157 {
5158 register SV *sv = newSV(0);
5159 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5160 return sv;
5161 }
5162
5163 #endif
5164 #endif
5165
5166 #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf)
5167 # define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
5168 #endif
5169
5170 #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf)
5171 # define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
5172 #endif
5173
5174 #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg)
5175 #if defined(NEED_sv_catpvf_mg)
5176 static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
5177 static
5178 #else
5179 extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
5180 #endif
5181
5182 #define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
5183
5184 #if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
5185
5186 void
5187 DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
5188 {
5189 va_list args;
5190 va_start(args, pat);
5191 sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
5192 SvSETMAGIC(sv);
5193 va_end(args);
5194 }
5195
5196 #endif
5197 #endif
5198
5199 #ifdef PERL_IMPLICIT_CONTEXT
5200 #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext)
5201 #if defined(NEED_sv_catpvf_mg_nocontext)
5202 static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
5203 static
5204 #else
5205 extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
5206 #endif
5207
5208 #define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
5209 #define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
5210
5211 #if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
5212
5213 void
5214 DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
5215 {
5216 dTHX;
5217 va_list args;
5218 va_start(args, pat);
5219 sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
5220 SvSETMAGIC(sv);
5221 va_end(args);
5222 }
5223
5224 #endif
5225 #endif
5226 #endif
5227
5228 /* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */
5229 #ifndef sv_catpvf_mg
5230 # ifdef PERL_IMPLICIT_CONTEXT
5231 # define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
5232 # else
5233 # define sv_catpvf_mg Perl_sv_catpvf_mg
5234 # endif
5235 #endif
5236
5237 #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg)
5238 # define sv_vcatpvf_mg(sv, pat, args) \
5239 STMT_START { \
5240 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \
5241 SvSETMAGIC(sv); \
5242 } STMT_END
5243 #endif
5244
5245 #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg)
5246 #if defined(NEED_sv_setpvf_mg)
5247 static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
5248 static
5249 #else
5250 extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
5251 #endif
5252
5253 #define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
5254
5255 #if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
5256
5257 void
5258 DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
5259 {
5260 va_list args;
5261 va_start(args, pat);
5262 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
5263 SvSETMAGIC(sv);
5264 va_end(args);
5265 }
5266
5267 #endif
5268 #endif
5269
5270 #ifdef PERL_IMPLICIT_CONTEXT
5271 #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext)
5272 #if defined(NEED_sv_setpvf_mg_nocontext)
5273 static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
5274 static
5275 #else
5276 extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
5277 #endif
5278
5279 #define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
5280 #define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
5281
5282 #if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
5283
5284 void
5285 DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
5286 {
5287 dTHX;
5288 va_list args;
5289 va_start(args, pat);
5290 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
5291 SvSETMAGIC(sv);
5292 va_end(args);
5293 }
5294
5295 #endif
5296 #endif
5297 #endif
5298
5299 /* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */
5300 #ifndef sv_setpvf_mg
5301 # ifdef PERL_IMPLICIT_CONTEXT
5302 # define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
5303 # else
5304 # define sv_setpvf_mg Perl_sv_setpvf_mg
5305 # endif
5306 #endif
5307
5308 #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg)
5309 # define sv_vsetpvf_mg(sv, pat, args) \
5310 STMT_START { \
5311 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \
5312 SvSETMAGIC(sv); \
5313 } STMT_END
5314 #endif
5315
5316 #ifndef newSVpvn_share
5317
5318 #if defined(NEED_newSVpvn_share)
5319 static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
5320 static
5321 #else
5322 extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
5323 #endif
5324
5325 #ifdef newSVpvn_share
5326 # undef newSVpvn_share
5327 #endif
5328 #define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c)
5329 #define Perl_newSVpvn_share DPPP_(my_newSVpvn_share)
5330
5331 #if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL)
5332
5333 SV *
5334 DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash)
5335 {
5336 SV *sv;
5337 if (len < 0)
5338 len = -len;
5339 if (!hash)
5340 PERL_HASH(hash, (char*) src, len);
5341 sv = newSVpvn((char *) src, len);
5342 sv_upgrade(sv, SVt_PVIV);
5343 SvIVX(sv) = hash;
5344 SvREADONLY_on(sv);
5345 SvPOK_on(sv);
5346 return sv;
5347 }
5348
5349 #endif
5350
5351 #endif
5352 #ifndef SvSHARED_HASH
5353 # define SvSHARED_HASH(sv) (0 + SvUVX(sv))
5354 #endif
5355 #ifndef HvNAME_get
5356 # define HvNAME_get(hv) HvNAME(hv)
5357 #endif
5358 #ifndef HvNAMELEN_get
5359 # define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0)
5360 #endif
5361 #ifndef GvSVn
5362 # define GvSVn(gv) GvSV(gv)
5363 #endif
5364
5365 #ifndef isGV_with_GP
5366 # define isGV_with_GP(gv) isGV(gv)
5367 #endif
5368 #ifndef WARN_ALL
5369 # define WARN_ALL 0
5370 #endif
5371
5372 #ifndef WARN_CLOSURE
5373 # define WARN_CLOSURE 1
5374 #endif
5375
5376 #ifndef WARN_DEPRECATED
5377 # define WARN_DEPRECATED 2
5378 #endif
5379
5380 #ifndef WARN_EXITING
5381 # define WARN_EXITING 3
5382 #endif
5383
5384 #ifndef WARN_GLOB
5385 # define WARN_GLOB 4
5386 #endif
5387
5388 #ifndef WARN_IO
5389 # define WARN_IO 5
5390 #endif
5391
5392 #ifndef WARN_CLOSED
5393 # define WARN_CLOSED 6
5394 #endif
5395
5396 #ifndef WARN_EXEC
5397 # define WARN_EXEC 7
5398 #endif
5399
5400 #ifndef WARN_LAYER
5401 # define WARN_LAYER 8
5402 #endif
5403
5404 #ifndef WARN_NEWLINE
5405 # define WARN_NEWLINE 9
5406 #endif
5407
5408 #ifndef WARN_PIPE
5409 # define WARN_PIPE 10
5410 #endif
5411
5412 #ifndef WARN_UNOPENED
5413 # define WARN_UNOPENED 11
5414 #endif
5415
5416 #ifndef WARN_MISC
5417 # define WARN_MISC 12
5418 #endif
5419
5420 #ifndef WARN_NUMERIC
5421 # define WARN_NUMERIC 13
5422 #endif
5423
5424 #ifndef WARN_ONCE
5425 # define WARN_ONCE 14
5426 #endif
5427
5428 #ifndef WARN_OVERFLOW
5429 # define WARN_OVERFLOW 15
5430 #endif
5431
5432 #ifndef WARN_PACK
5433 # define WARN_PACK 16
5434 #endif
5435
5436 #ifndef WARN_PORTABLE
5437 # define WARN_PORTABLE 17
5438 #endif
5439
5440 #ifndef WARN_RECURSION
5441 # define WARN_RECURSION 18
5442 #endif
5443
5444 #ifndef WARN_REDEFINE
5445 # define WARN_REDEFINE 19
5446 #endif
5447
5448 #ifndef WARN_REGEXP
5449 # define WARN_REGEXP 20
5450 #endif
5451
5452 #ifndef WARN_SEVERE
5453 # define WARN_SEVERE 21
5454 #endif
5455
5456 #ifndef WARN_DEBUGGING
5457 # define WARN_DEBUGGING 22
5458 #endif
5459
5460 #ifndef WARN_INPLACE
5461 # define WARN_INPLACE 23
5462 #endif
5463
5464 #ifndef WARN_INTERNAL
5465 # define WARN_INTERNAL 24
5466 #endif
5467
5468 #ifndef WARN_MALLOC
5469 # define WARN_MALLOC 25
5470 #endif
5471
5472 #ifndef WARN_SIGNAL
5473 # define WARN_SIGNAL 26
5474 #endif
5475
5476 #ifndef WARN_SUBSTR
5477 # define WARN_SUBSTR 27
5478 #endif
5479
5480 #ifndef WARN_SYNTAX
5481 # define WARN_SYNTAX 28
5482 #endif
5483
5484 #ifndef WARN_AMBIGUOUS
5485 # define WARN_AMBIGUOUS 29
5486 #endif
5487
5488 #ifndef WARN_BAREWORD
5489 # define WARN_BAREWORD 30
5490 #endif
5491
5492 #ifndef WARN_DIGIT
5493 # define WARN_DIGIT 31
5494 #endif
5495
5496 #ifndef WARN_PARENTHESIS
5497 # define WARN_PARENTHESIS 32
5498 #endif
5499
5500 #ifndef WARN_PRECEDENCE
5501 # define WARN_PRECEDENCE 33
5502 #endif
5503
5504 #ifndef WARN_PRINTF
5505 # define WARN_PRINTF 34
5506 #endif
5507
5508 #ifndef WARN_PROTOTYPE
5509 # define WARN_PROTOTYPE 35
5510 #endif
5511
5512 #ifndef WARN_QW
5513 # define WARN_QW 36
5514 #endif
5515
5516 #ifndef WARN_RESERVED
5517 # define WARN_RESERVED 37
5518 #endif
5519
5520 #ifndef WARN_SEMICOLON
5521 # define WARN_SEMICOLON 38
5522 #endif
5523
5524 #ifndef WARN_TAINT
5525 # define WARN_TAINT 39
5526 #endif
5527
5528 #ifndef WARN_THREADS
5529 # define WARN_THREADS 40
5530 #endif
5531
5532 #ifndef WARN_UNINITIALIZED
5533 # define WARN_UNINITIALIZED 41
5534 #endif
5535
5536 #ifndef WARN_UNPACK
5537 # define WARN_UNPACK 42
5538 #endif
5539
5540 #ifndef WARN_UNTIE
5541 # define WARN_UNTIE 43
5542 #endif
5543
5544 #ifndef WARN_UTF8
5545 # define WARN_UTF8 44
5546 #endif
5547
5548 #ifndef WARN_VOID
5549 # define WARN_VOID 45
5550 #endif
5551
5552 #ifndef WARN_ASSERTIONS
5553 # define WARN_ASSERTIONS 46
5554 #endif
5555 #ifndef packWARN
5556 # define packWARN(a) (a)
5557 #endif
5558
5559 #ifndef ckWARN
5560 # ifdef G_WARN_ON
5561 # define ckWARN(a) (PL_dowarn & G_WARN_ON)
5562 # else
5563 # define ckWARN(a) PL_dowarn
5564 # endif
5565 #endif
5566
5567 #if (PERL_BCDVERSION >= 0x5004000) && !defined(warner)
5568 #if defined(NEED_warner)
5569 static void DPPP_(my_warner)(U32 err, const char *pat, ...);
5570 static
5571 #else
5572 extern void DPPP_(my_warner)(U32 err, const char *pat, ...);
5573 #endif
5574
5575 #define Perl_warner DPPP_(my_warner)
5576
5577 #if defined(NEED_warner) || defined(NEED_warner_GLOBAL)
5578
5579 void
5580 DPPP_(my_warner)(U32 err, const char *pat, ...)
5581 {
5582 SV *sv;
5583 va_list args;
5584
5585 PERL_UNUSED_ARG(err);
5586
5587 va_start(args, pat);
5588 sv = vnewSVpvf(pat, &args);
5589 va_end(args);
5590 sv_2mortal(sv);
5591 warn("%s", SvPV_nolen(sv));
5592 }
5593
5594 #define warner Perl_warner
5595
5596 #define Perl_warner_nocontext Perl_warner
5597
5598 #endif
5599 #endif
5600
5601 /* concatenating with "" ensures that only literal strings are accepted as argument
5602 * note that STR_WITH_LEN() can't be used as argument to macros or functions that
5603 * under some configurations might be macros
5604 */
5605 #ifndef STR_WITH_LEN
5606 # define STR_WITH_LEN(s) (s ""), (sizeof(s)-1)
5607 #endif
5608 #ifndef newSVpvs
5609 # define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1)
5610 #endif
5611
5612 #ifndef newSVpvs_flags
5613 # define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags)
5614 #endif
5615
5616 #ifndef sv_catpvs
5617 # define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1)
5618 #endif
5619
5620 #ifndef sv_setpvs
5621 # define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1)
5622 #endif
5623
5624 #ifndef hv_fetchs
5625 # define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval)
5626 #endif
5627
5628 #ifndef hv_stores
5629 # define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0)
5630 #endif
5631 #ifndef gv_fetchpvn_flags
5632 # define gv_fetchpvn_flags(name, len, flags, svt) gv_fetchpv(name, flags, svt)
5633 #endif
5634
5635 #ifndef gv_fetchpvs
5636 # define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt)
5637 #endif
5638
5639 #ifndef gv_stashpvs
5640 # define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags)
5641 #endif
5642 #ifndef SvGETMAGIC
5643 # define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
5644 #endif
5645 #ifndef PERL_MAGIC_sv
5646 # define PERL_MAGIC_sv '\0'
5647 #endif
5648
5649 #ifndef PERL_MAGIC_overload
5650 # define PERL_MAGIC_overload 'A'
5651 #endif
5652
5653 #ifndef PERL_MAGIC_overload_elem
5654 # define PERL_MAGIC_overload_elem 'a'
5655 #endif
5656
5657 #ifndef PERL_MAGIC_overload_table
5658 # define PERL_MAGIC_overload_table 'c'
5659 #endif
5660
5661 #ifndef PERL_MAGIC_bm
5662 # define PERL_MAGIC_bm 'B'
5663 #endif
5664
5665 #ifndef PERL_MAGIC_regdata
5666 # define PERL_MAGIC_regdata 'D'
5667 #endif
5668
5669 #ifndef PERL_MAGIC_regdatum
5670 # define PERL_MAGIC_regdatum 'd'
5671 #endif
5672
5673 #ifndef PERL_MAGIC_env
5674 # define PERL_MAGIC_env 'E'
5675 #endif
5676
5677 #ifndef PERL_MAGIC_envelem
5678 # define PERL_MAGIC_envelem 'e'
5679 #endif
5680
5681 #ifndef PERL_MAGIC_fm
5682 # define PERL_MAGIC_fm 'f'
5683 #endif
5684
5685 #ifndef PERL_MAGIC_regex_global
5686 # define PERL_MAGIC_regex_global 'g'
5687 #endif
5688
5689 #ifndef PERL_MAGIC_isa
5690 # define PERL_MAGIC_isa 'I'
5691 #endif
5692
5693 #ifndef PERL_MAGIC_isaelem
5694 # define PERL_MAGIC_isaelem 'i'
5695 #endif
5696
5697 #ifndef PERL_MAGIC_nkeys
5698 # define PERL_MAGIC_nkeys 'k'
5699 #endif
5700
5701 #ifndef PERL_MAGIC_dbfile
5702 # define PERL_MAGIC_dbfile 'L'
5703 #endif
5704
5705 #ifndef PERL_MAGIC_dbline
5706 # define PERL_MAGIC_dbline 'l'
5707 #endif
5708
5709 #ifndef PERL_MAGIC_mutex
5710 # define PERL_MAGIC_mutex 'm'
5711 #endif
5712
5713 #ifndef PERL_MAGIC_shared
5714 # define PERL_MAGIC_shared 'N'
5715 #endif
5716
5717 #ifndef PERL_MAGIC_shared_scalar
5718 # define PERL_MAGIC_shared_scalar 'n'
5719 #endif
5720
5721 #ifndef PERL_MAGIC_collxfrm
5722 # define PERL_MAGIC_collxfrm 'o'
5723 #endif
5724
5725 #ifndef PERL_MAGIC_tied
5726 # define PERL_MAGIC_tied 'P'
5727 #endif
5728
5729 #ifndef PERL_MAGIC_tiedelem
5730 # define PERL_MAGIC_tiedelem 'p'
5731 #endif
5732
5733 #ifndef PERL_MAGIC_tiedscalar
5734 # define PERL_MAGIC_tiedscalar 'q'
5735 #endif
5736
5737 #ifndef PERL_MAGIC_qr
5738 # define PERL_MAGIC_qr 'r'
5739 #endif
5740
5741 #ifndef PERL_MAGIC_sig
5742 # define PERL_MAGIC_sig 'S'
5743 #endif
5744
5745 #ifndef PERL_MAGIC_sigelem
5746 # define PERL_MAGIC_sigelem 's'
5747 #endif
5748
5749 #ifndef PERL_MAGIC_taint
5750 # define PERL_MAGIC_taint 't'
5751 #endif
5752
5753 #ifndef PERL_MAGIC_uvar
5754 # define PERL_MAGIC_uvar 'U'
5755 #endif
5756
5757 #ifndef PERL_MAGIC_uvar_elem
5758 # define PERL_MAGIC_uvar_elem 'u'
5759 #endif
5760
5761 #ifndef PERL_MAGIC_vstring
5762 # define PERL_MAGIC_vstring 'V'
5763 #endif
5764
5765 #ifndef PERL_MAGIC_vec
5766 # define PERL_MAGIC_vec 'v'
5767 #endif
5768
5769 #ifndef PERL_MAGIC_utf8
5770 # define PERL_MAGIC_utf8 'w'
5771 #endif
5772
5773 #ifndef PERL_MAGIC_substr
5774 # define PERL_MAGIC_substr 'x'
5775 #endif
5776
5777 #ifndef PERL_MAGIC_defelem
5778 # define PERL_MAGIC_defelem 'y'
5779 #endif
5780
5781 #ifndef PERL_MAGIC_glob
5782 # define PERL_MAGIC_glob '*'
5783 #endif
5784
5785 #ifndef PERL_MAGIC_arylen
5786 # define PERL_MAGIC_arylen '#'
5787 #endif
5788
5789 #ifndef PERL_MAGIC_pos
5790 # define PERL_MAGIC_pos '.'
5791 #endif
5792
5793 #ifndef PERL_MAGIC_backref
5794 # define PERL_MAGIC_backref '<'
5795 #endif
5796
5797 #ifndef PERL_MAGIC_ext
5798 # define PERL_MAGIC_ext '~'
5799 #endif
5800
5801 /* That's the best we can do... */
5802 #ifndef sv_catpvn_nomg
5803 # define sv_catpvn_nomg sv_catpvn
5804 #endif
5805
5806 #ifndef sv_catsv_nomg
5807 # define sv_catsv_nomg sv_catsv
5808 #endif
5809
5810 #ifndef sv_setsv_nomg
5811 # define sv_setsv_nomg sv_setsv
5812 #endif
5813
5814 #ifndef sv_pvn_nomg
5815 # define sv_pvn_nomg sv_pvn
5816 #endif
5817
5818 #ifndef SvIV_nomg
5819 # define SvIV_nomg SvIV
5820 #endif
5821
5822 #ifndef SvUV_nomg
5823 # define SvUV_nomg SvUV
5824 #endif
5825
5826 #ifndef sv_catpv_mg
5827 # define sv_catpv_mg(sv, ptr) \
5828 STMT_START { \
5829 SV *TeMpSv = sv; \
5830 sv_catpv(TeMpSv,ptr); \
5831 SvSETMAGIC(TeMpSv); \
5832 } STMT_END
5833 #endif
5834
5835 #ifndef sv_catpvn_mg
5836 # define sv_catpvn_mg(sv, ptr, len) \
5837 STMT_START { \
5838 SV *TeMpSv = sv; \
5839 sv_catpvn(TeMpSv,ptr,len); \
5840 SvSETMAGIC(TeMpSv); \
5841 } STMT_END
5842 #endif
5843
5844 #ifndef sv_catsv_mg
5845 # define sv_catsv_mg(dsv, ssv) \
5846 STMT_START { \
5847 SV *TeMpSv = dsv; \
5848 sv_catsv(TeMpSv,ssv); \
5849 SvSETMAGIC(TeMpSv); \
5850 } STMT_END
5851 #endif
5852
5853 #ifndef sv_setiv_mg
5854 # define sv_setiv_mg(sv, i) \
5855 STMT_START { \
5856 SV *TeMpSv = sv; \
5857 sv_setiv(TeMpSv,i); \
5858 SvSETMAGIC(TeMpSv); \
5859 } STMT_END
5860 #endif
5861
5862 #ifndef sv_setnv_mg
5863 # define sv_setnv_mg(sv, num) \
5864 STMT_START { \
5865 SV *TeMpSv = sv; \
5866 sv_setnv(TeMpSv,num); \
5867 SvSETMAGIC(TeMpSv); \
5868 } STMT_END
5869 #endif
5870
5871 #ifndef sv_setpv_mg
5872 # define sv_setpv_mg(sv, ptr) \
5873 STMT_START { \
5874 SV *TeMpSv = sv; \
5875 sv_setpv(TeMpSv,ptr); \
5876 SvSETMAGIC(TeMpSv); \
5877 } STMT_END
5878 #endif
5879
5880 #ifndef sv_setpvn_mg
5881 # define sv_setpvn_mg(sv, ptr, len) \
5882 STMT_START { \
5883 SV *TeMpSv = sv; \
5884 sv_setpvn(TeMpSv,ptr,len); \
5885 SvSETMAGIC(TeMpSv); \
5886 } STMT_END
5887 #endif
5888
5889 #ifndef sv_setsv_mg
5890 # define sv_setsv_mg(dsv, ssv) \
5891 STMT_START { \
5892 SV *TeMpSv = dsv; \
5893 sv_setsv(TeMpSv,ssv); \
5894 SvSETMAGIC(TeMpSv); \
5895 } STMT_END
5896 #endif
5897
5898 #ifndef sv_setuv_mg
5899 # define sv_setuv_mg(sv, i) \
5900 STMT_START { \
5901 SV *TeMpSv = sv; \
5902 sv_setuv(TeMpSv,i); \
5903 SvSETMAGIC(TeMpSv); \
5904 } STMT_END
5905 #endif
5906
5907 #ifndef sv_usepvn_mg
5908 # define sv_usepvn_mg(sv, ptr, len) \
5909 STMT_START { \
5910 SV *TeMpSv = sv; \
5911 sv_usepvn(TeMpSv,ptr,len); \
5912 SvSETMAGIC(TeMpSv); \
5913 } STMT_END
5914 #endif
5915 #ifndef SvVSTRING_mg
5916 # define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL)
5917 #endif
5918
5919 /* Hint: sv_magic_portable
5920 * This is a compatibility function that is only available with
5921 * Devel::PPPort. It is NOT in the perl core.
5922 * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when
5923 * it is being passed a name pointer with namlen == 0. In that
5924 * case, perl 5.8.0 and later store the pointer, not a copy of it.
5925 * The compatibility can be provided back to perl 5.004. With
5926 * earlier versions, the code will not compile.
5927 */
5928
5929 #if (PERL_BCDVERSION < 0x5004000)
5930
5931 /* code that uses sv_magic_portable will not compile */
5932
5933 #elif (PERL_BCDVERSION < 0x5008000)
5934
5935 # define sv_magic_portable(sv, obj, how, name, namlen) \
5936 STMT_START { \
5937 SV *SvMp_sv = (sv); \
5938 char *SvMp_name = (char *) (name); \
5939 I32 SvMp_namlen = (namlen); \
5940 if (SvMp_name && SvMp_namlen == 0) \
5941 { \
5942 MAGIC *mg; \
5943 sv_magic(SvMp_sv, obj, how, 0, 0); \
5944 mg = SvMAGIC(SvMp_sv); \
5945 mg->mg_len = -42; /* XXX: this is the tricky part */ \
5946 mg->mg_ptr = SvMp_name; \
5947 } \
5948 else \
5949 { \
5950 sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \
5951 } \
5952 } STMT_END
5953
5954 #else
5955
5956 # define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e)
5957
5958 #endif
5959
5960 #ifdef USE_ITHREADS
5961 #ifndef CopFILE
5962 # define CopFILE(c) ((c)->cop_file)
5963 #endif
5964
5965 #ifndef CopFILEGV
5966 # define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
5967 #endif
5968
5969 #ifndef CopFILE_set
5970 # define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv))
5971 #endif
5972
5973 #ifndef CopFILESV
5974 # define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
5975 #endif
5976
5977 #ifndef CopFILEAV
5978 # define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
5979 #endif
5980
5981 #ifndef CopSTASHPV
5982 # define CopSTASHPV(c) ((c)->cop_stashpv)
5983 #endif
5984
5985 #ifndef CopSTASHPV_set
5986 # define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
5987 #endif
5988
5989 #ifndef CopSTASH
5990 # define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
5991 #endif
5992
5993 #ifndef CopSTASH_set
5994 # define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
5995 #endif
5996
5997 #ifndef CopSTASH_eq
5998 # define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
5999 || (CopSTASHPV(c) && HvNAME(hv) \
6000 && strEQ(CopSTASHPV(c), HvNAME(hv)))))
6001 #endif
6002
6003 #else
6004 #ifndef CopFILEGV
6005 # define CopFILEGV(c) ((c)->cop_filegv)
6006 #endif
6007
6008 #ifndef CopFILEGV_set
6009 # define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
6010 #endif
6011
6012 #ifndef CopFILE_set
6013 # define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv))
6014 #endif
6015
6016 #ifndef CopFILESV
6017 # define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
6018 #endif
6019
6020 #ifndef CopFILEAV
6021 # define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
6022 #endif
6023
6024 #ifndef CopFILE
6025 # define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
6026 #endif
6027
6028 #ifndef CopSTASH
6029 # define CopSTASH(c) ((c)->cop_stash)
6030 #endif
6031
6032 #ifndef CopSTASH_set
6033 # define CopSTASH_set(c,hv) ((c)->cop_stash = (hv))
6034 #endif
6035
6036 #ifndef CopSTASHPV
6037 # define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
6038 #endif
6039
6040 #ifndef CopSTASHPV_set
6041 # define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
6042 #endif
6043
6044 #ifndef CopSTASH_eq
6045 # define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv))
6046 #endif
6047
6048 #endif /* USE_ITHREADS */
6049 #ifndef IN_PERL_COMPILETIME
6050 # define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling)
6051 #endif
6052
6053 #ifndef IN_LOCALE_RUNTIME
6054 # define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE)
6055 #endif
6056
6057 #ifndef IN_LOCALE_COMPILETIME
6058 # define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE)
6059 #endif
6060
6061 #ifndef IN_LOCALE
6062 # define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
6063 #endif
6064 #ifndef IS_NUMBER_IN_UV
6065 # define IS_NUMBER_IN_UV 0x01
6066 #endif
6067
6068 #ifndef IS_NUMBER_GREATER_THAN_UV_MAX
6069 # define IS_NUMBER_GREATER_THAN_UV_MAX 0x02
6070 #endif
6071
6072 #ifndef IS_NUMBER_NOT_INT
6073 # define IS_NUMBER_NOT_INT 0x04
6074 #endif
6075
6076 #ifndef IS_NUMBER_NEG
6077 # define IS_NUMBER_NEG 0x08
6078 #endif
6079
6080 #ifndef IS_NUMBER_INFINITY
6081 # define IS_NUMBER_INFINITY 0x10
6082 #endif
6083
6084 #ifndef IS_NUMBER_NAN
6085 # define IS_NUMBER_NAN 0x20
6086 #endif
6087 #ifndef GROK_NUMERIC_RADIX
6088 # define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send)
6089 #endif
6090 #ifndef PERL_SCAN_GREATER_THAN_UV_MAX
6091 # define PERL_SCAN_GREATER_THAN_UV_MAX 0x02
6092 #endif
6093
6094 #ifndef PERL_SCAN_SILENT_ILLDIGIT
6095 # define PERL_SCAN_SILENT_ILLDIGIT 0x04
6096 #endif
6097
6098 #ifndef PERL_SCAN_ALLOW_UNDERSCORES
6099 # define PERL_SCAN_ALLOW_UNDERSCORES 0x01
6100 #endif
6101
6102 #ifndef PERL_SCAN_DISALLOW_PREFIX
6103 # define PERL_SCAN_DISALLOW_PREFIX 0x02
6104 #endif
6105
6106 #ifndef grok_numeric_radix
6107 #if defined(NEED_grok_numeric_radix)
6108 static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
6109 static
6110 #else
6111 extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
6112 #endif
6113
6114 #ifdef grok_numeric_radix
6115 # undef grok_numeric_radix
6116 #endif
6117 #define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
6118 #define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
6119
6120 #if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
6121 bool
6122 DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
6123 {
6124 #ifdef USE_LOCALE_NUMERIC
6125 #ifdef PL_numeric_radix_sv
6126 if (PL_numeric_radix_sv && IN_LOCALE) {
6127 STRLEN len;
6128 char* radix = SvPV(PL_numeric_radix_sv, len);
6129 if (*sp + len <= send && memEQ(*sp, radix, len)) {
6130 *sp += len;
6131 return TRUE;
6132 }
6133 }
6134 #else
6135 /* older perls don't have PL_numeric_radix_sv so the radix
6136 * must manually be requested from locale.h
6137 */
6138 #include <locale.h>
6139 dTHR; /* needed for older threaded perls */
6140 struct lconv *lc = localeconv();
6141 char *radix = lc->decimal_point;
6142 if (radix && IN_LOCALE) {
6143 STRLEN len = strlen(radix);
6144 if (*sp + len <= send && memEQ(*sp, radix, len)) {
6145 *sp += len;
6146 return TRUE;
6147 }
6148 }
6149 #endif
6150 #endif /* USE_LOCALE_NUMERIC */
6151 /* always try "." if numeric radix didn't match because
6152 * we may have data from different locales mixed */
6153 if (*sp < send && **sp == '.') {
6154 ++*sp;
6155 return TRUE;
6156 }
6157 return FALSE;
6158 }
6159 #endif
6160 #endif
6161
6162 #ifndef grok_number
6163 #if defined(NEED_grok_number)
6164 static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
6165 static
6166 #else
6167 extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
6168 #endif
6169
6170 #ifdef grok_number
6171 # undef grok_number
6172 #endif
6173 #define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
6174 #define Perl_grok_number DPPP_(my_grok_number)
6175
6176 #if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
6177 int
6178 DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
6179 {
6180 const char *s = pv;
6181 const char *send = pv + len;
6182 const UV max_div_10 = UV_MAX / 10;
6183 const char max_mod_10 = UV_MAX % 10;
6184 int numtype = 0;
6185 int sawinf = 0;
6186 int sawnan = 0;
6187
6188 while (s < send && isSPACE(*s))
6189 s++;
6190 if (s == send) {
6191 return 0;
6192 } else if (*s == '-') {
6193 s++;
6194 numtype = IS_NUMBER_NEG;
6195 }
6196 else if (*s == '+')
6197 s++;
6198
6199 if (s == send)
6200 return 0;
6201
6202 /* next must be digit or the radix separator or beginning of infinity */
6203 if (isDIGIT(*s)) {
6204 /* UVs are at least 32 bits, so the first 9 decimal digits cannot
6205 overflow. */
6206 UV value = *s - '0';
6207 /* This construction seems to be more optimiser friendly.
6208 (without it gcc does the isDIGIT test and the *s - '0' separately)
6209 With it gcc on arm is managing 6 instructions (6 cycles) per digit.
6210 In theory the optimiser could deduce how far to unroll the loop
6211 before checking for overflow. */
6212 if (++s < send) {
6213 int digit = *s - '0';
6214 if (digit >= 0 && digit <= 9) {
6215 value = value * 10 + digit;
6216 if (++s < send) {
6217 digit = *s - '0';
6218 if (digit >= 0 && digit <= 9) {
6219 value = value * 10 + digit;
6220 if (++s < send) {
6221 digit = *s - '0';
6222 if (digit >= 0 && digit <= 9) {
6223 value = value * 10 + digit;
6224 if (++s < send) {
6225 digit = *s - '0';
6226 if (digit >= 0 && digit <= 9) {
6227 value = value * 10 + digit;
6228 if (++s < send) {
6229 digit = *s - '0';
6230 if (digit >= 0 && digit <= 9) {
6231 value = value * 10 + digit;
6232 if (++s < send) {
6233 digit = *s - '0';
6234 if (digit >= 0 && digit <= 9) {
6235 value = value * 10 + digit;
6236 if (++s < send) {
6237 digit = *s - '0';
6238 if (digit >= 0 && digit <= 9) {
6239 value = value * 10 + digit;
6240 if (++s < send) {
6241 digit = *s - '0';
6242 if (digit >= 0 && digit <= 9) {
6243 value = value * 10 + digit;
6244 if (++s < send) {
6245 /* Now got 9 digits, so need to check
6246 each time for overflow. */
6247 digit = *s - '0';
6248 while (digit >= 0 && digit <= 9
6249 && (value < max_div_10
6250 || (value == max_div_10
6251 && digit <= max_mod_10))) {
6252 value = value * 10 + digit;
6253 if (++s < send)
6254 digit = *s - '0';
6255 else
6256 break;
6257 }
6258 if (digit >= 0 && digit <= 9
6259 && (s < send)) {
6260 /* value overflowed.
6261 skip the remaining digits, don't
6262 worry about setting *valuep. */
6263 do {
6264 s++;
6265 } while (s < send && isDIGIT(*s));
6266 numtype |=
6267 IS_NUMBER_GREATER_THAN_UV_MAX;
6268 goto skip_value;
6269 }
6270 }
6271 }
6272 }
6273 }
6274 }
6275 }
6276 }
6277 }
6278 }
6279 }
6280 }
6281 }
6282 }
6283 }
6284 }
6285 }
6286 }
6287 numtype |= IS_NUMBER_IN_UV;
6288 if (valuep)
6289 *valuep = value;
6290
6291 skip_value:
6292 if (GROK_NUMERIC_RADIX(&s, send)) {
6293 numtype |= IS_NUMBER_NOT_INT;
6294 while (s < send && isDIGIT(*s)) /* optional digits after the radix */
6295 s++;
6296 }
6297 }
6298 else if (GROK_NUMERIC_RADIX(&s, send)) {
6299 numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
6300 /* no digits before the radix means we need digits after it */
6301 if (s < send && isDIGIT(*s)) {
6302 do {
6303 s++;
6304 } while (s < send && isDIGIT(*s));
6305 if (valuep) {
6306 /* integer approximation is valid - it's 0. */
6307 *valuep = 0;
6308 }
6309 }
6310 else
6311 return 0;
6312 } else if (*s == 'I' || *s == 'i') {
6313 s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
6314 s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
6315 s++; if (s < send && (*s == 'I' || *s == 'i')) {
6316 s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
6317 s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
6318 s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
6319 s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
6320 s++;
6321 }
6322 sawinf = 1;
6323 } else if (*s == 'N' || *s == 'n') {
6324 /* XXX TODO: There are signaling NaNs and quiet NaNs. */
6325 s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
6326 s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
6327 s++;
6328 sawnan = 1;
6329 } else
6330 return 0;
6331
6332 if (sawinf) {
6333 numtype &= IS_NUMBER_NEG; /* Keep track of sign */
6334 numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
6335 } else if (sawnan) {
6336 numtype &= IS_NUMBER_NEG; /* Keep track of sign */
6337 numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
6338 } else if (s < send) {
6339 /* we can have an optional exponent part */
6340 if (*s == 'e' || *s == 'E') {
6341 /* The only flag we keep is sign. Blow away any "it's UV" */
6342 numtype &= IS_NUMBER_NEG;
6343 numtype |= IS_NUMBER_NOT_INT;
6344 s++;
6345 if (s < send && (*s == '-' || *s == '+'))
6346 s++;
6347 if (s < send && isDIGIT(*s)) {
6348 do {
6349 s++;
6350 } while (s < send && isDIGIT(*s));
6351 }
6352 else
6353 return 0;
6354 }
6355 }
6356 while (s < send && isSPACE(*s))
6357 s++;
6358 if (s >= send)
6359 return numtype;
6360 if (len == 10 && memEQ(pv, "0 but true", 10)) {
6361 if (valuep)
6362 *valuep = 0;
6363 return IS_NUMBER_IN_UV;
6364 }
6365 return 0;
6366 }
6367 #endif
6368 #endif
6369
6370 /*
6371 * The grok_* routines have been modified to use warn() instead of
6372 * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
6373 * which is why the stack variable has been renamed to 'xdigit'.
6374 */
6375
6376 #ifndef grok_bin
6377 #if defined(NEED_grok_bin)
6378 static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
6379 static
6380 #else
6381 extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
6382 #endif
6383
6384 #ifdef grok_bin
6385 # undef grok_bin
6386 #endif
6387 #define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
6388 #define Perl_grok_bin DPPP_(my_grok_bin)
6389
6390 #if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
6391 UV
6392 DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
6393 {
6394 const char *s = start;
6395 STRLEN len = *len_p;
6396 UV value = 0;
6397 NV value_nv = 0;
6398
6399 const UV max_div_2 = UV_MAX / 2;
6400 bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
6401 bool overflowed = FALSE;
6402
6403 if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
6404 /* strip off leading b or 0b.
6405 for compatibility silently suffer "b" and "0b" as valid binary
6406 numbers. */
6407 if (len >= 1) {
6408 if (s[0] == 'b') {
6409 s++;
6410 len--;
6411 }
6412 else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
6413 s+=2;
6414 len-=2;
6415 }
6416 }
6417 }
6418
6419 for (; len-- && *s; s++) {
6420 char bit = *s;
6421 if (bit == '0' || bit == '1') {
6422 /* Write it in this wonky order with a goto to attempt to get the
6423 compiler to make the common case integer-only loop pretty tight.
6424 With gcc seems to be much straighter code than old scan_bin. */
6425 redo:
6426 if (!overflowed) {
6427 if (value <= max_div_2) {
6428 value = (value << 1) | (bit - '0');
6429 continue;
6430 }
6431 /* Bah. We're just overflowed. */
6432 warn("Integer overflow in binary number");
6433 overflowed = TRUE;
6434 value_nv = (NV) value;
6435 }
6436 value_nv *= 2.0;
6437 /* If an NV has not enough bits in its mantissa to
6438 * represent a UV this summing of small low-order numbers
6439 * is a waste of time (because the NV cannot preserve
6440 * the low-order bits anyway): we could just remember when
6441 * did we overflow and in the end just multiply value_nv by the
6442 * right amount. */
6443 value_nv += (NV)(bit - '0');
6444 continue;
6445 }
6446 if (bit == '_' && len && allow_underscores && (bit = s[1])
6447 && (bit == '0' || bit == '1'))
6448 {
6449 --len;
6450 ++s;
6451 goto redo;
6452 }
6453 if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
6454 warn("Illegal binary digit '%c' ignored", *s);
6455 break;
6456 }
6457
6458 if ( ( overflowed && value_nv > 4294967295.0)
6459 #if UVSIZE > 4
6460 || (!overflowed && value > 0xffffffff )
6461 #endif
6462 ) {
6463 warn("Binary number > 0b11111111111111111111111111111111 non-portable");
6464 }
6465 *len_p = s - start;
6466 if (!overflowed) {
6467 *flags = 0;
6468 return value;
6469 }
6470 *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
6471 if (result)
6472 *result = value_nv;
6473 return UV_MAX;
6474 }
6475 #endif
6476 #endif
6477
6478 #ifndef grok_hex
6479 #if defined(NEED_grok_hex)
6480 static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
6481 static
6482 #else
6483 extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
6484 #endif
6485
6486 #ifdef grok_hex
6487 # undef grok_hex
6488 #endif
6489 #define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
6490 #define Perl_grok_hex DPPP_(my_grok_hex)
6491
6492 #if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
6493 UV
6494 DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
6495 {
6496 const char *s = start;
6497 STRLEN len = *len_p;
6498 UV value = 0;
6499 NV value_nv = 0;
6500
6501 const UV max_div_16 = UV_MAX / 16;
6502 bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
6503 bool overflowed = FALSE;
6504 const char *xdigit;
6505
6506 if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
6507 /* strip off leading x or 0x.
6508 for compatibility silently suffer "x" and "0x" as valid hex numbers.
6509 */
6510 if (len >= 1) {
6511 if (s[0] == 'x') {
6512 s++;
6513 len--;
6514 }
6515 else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
6516 s+=2;
6517 len-=2;
6518 }
6519 }
6520 }
6521
6522 for (; len-- && *s; s++) {
6523 xdigit = strchr((char *) PL_hexdigit, *s);
6524 if (xdigit) {
6525 /* Write it in this wonky order with a goto to attempt to get the
6526 compiler to make the common case integer-only loop pretty tight.
6527 With gcc seems to be much straighter code than old scan_hex. */
6528 redo:
6529 if (!overflowed) {
6530 if (value <= max_div_16) {
6531 value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
6532 continue;
6533 }
6534 warn("Integer overflow in hexadecimal number");
6535 overflowed = TRUE;
6536 value_nv = (NV) value;
6537 }
6538 value_nv *= 16.0;
6539 /* If an NV has not enough bits in its mantissa to
6540 * represent a UV this summing of small low-order numbers
6541 * is a waste of time (because the NV cannot preserve
6542 * the low-order bits anyway): we could just remember when
6543 * did we overflow and in the end just multiply value_nv by the
6544 * right amount of 16-tuples. */
6545 value_nv += (NV)((xdigit - PL_hexdigit) & 15);
6546 continue;
6547 }
6548 if (*s == '_' && len && allow_underscores && s[1]
6549 && (xdigit = strchr((char *) PL_hexdigit, s[1])))
6550 {
6551 --len;
6552 ++s;
6553 goto redo;
6554 }
6555 if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
6556 warn("Illegal hexadecimal digit '%c' ignored", *s);
6557 break;
6558 }
6559
6560 if ( ( overflowed && value_nv > 4294967295.0)
6561 #if UVSIZE > 4
6562 || (!overflowed && value > 0xffffffff )
6563 #endif
6564 ) {
6565 warn("Hexadecimal number > 0xffffffff non-portable");
6566 }
6567 *len_p = s - start;
6568 if (!overflowed) {
6569 *flags = 0;
6570 return value;
6571 }
6572 *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
6573 if (result)
6574 *result = value_nv;
6575 return UV_MAX;
6576 }
6577 #endif
6578 #endif
6579
6580 #ifndef grok_oct
6581 #if defined(NEED_grok_oct)
6582 static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
6583 static
6584 #else
6585 extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
6586 #endif
6587
6588 #ifdef grok_oct
6589 # undef grok_oct
6590 #endif
6591 #define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
6592 #define Perl_grok_oct DPPP_(my_grok_oct)
6593
6594 #if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
6595 UV
6596 DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
6597 {
6598 const char *s = start;
6599 STRLEN len = *len_p;
6600 UV value = 0;
6601 NV value_nv = 0;
6602
6603 const UV max_div_8 = UV_MAX / 8;
6604 bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
6605 bool overflowed = FALSE;
6606
6607 for (; len-- && *s; s++) {
6608 /* gcc 2.95 optimiser not smart enough to figure that this subtraction
6609 out front allows slicker code. */
6610 int digit = *s - '0';
6611 if (digit >= 0 && digit <= 7) {
6612 /* Write it in this wonky order with a goto to attempt to get the
6613 compiler to make the common case integer-only loop pretty tight.
6614 */
6615 redo:
6616 if (!overflowed) {
6617 if (value <= max_div_8) {
6618 value = (value << 3) | digit;
6619 continue;
6620 }
6621 /* Bah. We're just overflowed. */
6622 warn("Integer overflow in octal number");
6623 overflowed = TRUE;
6624 value_nv = (NV) value;
6625 }
6626 value_nv *= 8.0;
6627 /* If an NV has not enough bits in its mantissa to
6628 * represent a UV this summing of small low-order numbers
6629 * is a waste of time (because the NV cannot preserve
6630 * the low-order bits anyway): we could just remember when
6631 * did we overflow and in the end just multiply value_nv by the
6632 * right amount of 8-tuples. */
6633 value_nv += (NV)digit;
6634 continue;
6635 }
6636 if (digit == ('_' - '0') && len && allow_underscores
6637 && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
6638 {
6639 --len;
6640 ++s;
6641 goto redo;
6642 }
6643 /* Allow \octal to work the DWIM way (that is, stop scanning
6644 * as soon as non-octal characters are seen, complain only iff
6645 * someone seems to want to use the digits eight and nine). */
6646 if (digit == 8 || digit == 9) {
6647 if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
6648 warn("Illegal octal digit '%c' ignored", *s);
6649 }
6650 break;
6651 }
6652
6653 if ( ( overflowed && value_nv > 4294967295.0)
6654 #if UVSIZE > 4
6655 || (!overflowed && value > 0xffffffff )
6656 #endif
6657 ) {
6658 warn("Octal number > 037777777777 non-portable");
6659 }
6660 *len_p = s - start;
6661 if (!overflowed) {
6662 *flags = 0;
6663 return value;
6664 }
6665 *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
6666 if (result)
6667 *result = value_nv;
6668 return UV_MAX;
6669 }
6670 #endif
6671 #endif
6672
6673 #if !defined(my_snprintf)
6674 #if defined(NEED_my_snprintf)
6675 static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
6676 static
6677 #else
6678 extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
6679 #endif
6680
6681 #define my_snprintf DPPP_(my_my_snprintf)
6682 #define Perl_my_snprintf DPPP_(my_my_snprintf)
6683
6684 #if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL)
6685
6686 int
6687 DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...)
6688 {
6689 dTHX;
6690 int retval;
6691 va_list ap;
6692 va_start(ap, format);
6693 #ifdef HAS_VSNPRINTF
6694 retval = vsnprintf(buffer, len, format, ap);
6695 #else
6696 retval = vsprintf(buffer, format, ap);
6697 #endif
6698 va_end(ap);
6699 if (retval < 0 || (len > 0 && (Size_t)retval >= len))
6700 Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
6701 return retval;
6702 }
6703
6704 #endif
6705 #endif
6706
6707 #if !defined(my_sprintf)
6708 #if defined(NEED_my_sprintf)
6709 static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
6710 static
6711 #else
6712 extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
6713 #endif
6714
6715 #define my_sprintf DPPP_(my_my_sprintf)
6716 #define Perl_my_sprintf DPPP_(my_my_sprintf)
6717
6718 #if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL)
6719
6720 int
6721 DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...)
6722 {
6723 va_list args;
6724 va_start(args, pat);
6725 vsprintf(buffer, pat, args);
6726 va_end(args);
6727 return strlen(buffer);
6728 }
6729
6730 #endif
6731 #endif
6732
6733 #ifdef NO_XSLOCKS
6734 # ifdef dJMPENV
6735 # define dXCPT dJMPENV; int rEtV = 0
6736 # define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0)
6737 # define XCPT_TRY_END JMPENV_POP;
6738 # define XCPT_CATCH if (rEtV != 0)
6739 # define XCPT_RETHROW JMPENV_JUMP(rEtV)
6740 # else
6741 # define dXCPT Sigjmp_buf oldTOP; int rEtV = 0
6742 # define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
6743 # define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf);
6744 # define XCPT_CATCH if (rEtV != 0)
6745 # define XCPT_RETHROW Siglongjmp(top_env, rEtV)
6746 # endif
6747 #endif
6748
6749 #if !defined(my_strlcat)
6750 #if defined(NEED_my_strlcat)
6751 static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
6752 static
6753 #else
6754 extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
6755 #endif
6756
6757 #define my_strlcat DPPP_(my_my_strlcat)
6758 #define Perl_my_strlcat DPPP_(my_my_strlcat)
6759
6760 #if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL)
6761
6762 Size_t
6763 DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size)
6764 {
6765 Size_t used, length, copy;
6766
6767 used = strlen(dst);
6768 length = strlen(src);
6769 if (size > 0 && used < size - 1) {
6770 copy = (length >= size - used) ? size - used - 1 : length;
6771 memcpy(dst + used, src, copy);
6772 dst[used + copy] = '\0';
6773 }
6774 return used + length;
6775 }
6776 #endif
6777 #endif
6778
6779 #if !defined(my_strlcpy)
6780 #if defined(NEED_my_strlcpy)
6781 static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
6782 static
6783 #else
6784 extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
6785 #endif
6786
6787 #define my_strlcpy DPPP_(my_my_strlcpy)
6788 #define Perl_my_strlcpy DPPP_(my_my_strlcpy)
6789
6790 #if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL)
6791
6792 Size_t
6793 DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size)
6794 {
6795 Size_t length, copy;
6796
6797 length = strlen(src);
6798 if (size > 0) {
6799 copy = (length >= size) ? size - 1 : length;
6800 memcpy(dst, src, copy);
6801 dst[copy] = '\0';
6802 }
6803 return length;
6804 }
6805
6806 #endif
6807 #endif
6808 #ifndef PERL_PV_ESCAPE_QUOTE
6809 # define PERL_PV_ESCAPE_QUOTE 0x0001
6810 #endif
6811
6812 #ifndef PERL_PV_PRETTY_QUOTE
6813 # define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE
6814 #endif
6815
6816 #ifndef PERL_PV_PRETTY_ELLIPSES
6817 # define PERL_PV_PRETTY_ELLIPSES 0x0002
6818 #endif
6819
6820 #ifndef PERL_PV_PRETTY_LTGT
6821 # define PERL_PV_PRETTY_LTGT 0x0004
6822 #endif
6823
6824 #ifndef PERL_PV_ESCAPE_FIRSTCHAR
6825 # define PERL_PV_ESCAPE_FIRSTCHAR 0x0008
6826 #endif
6827
6828 #ifndef PERL_PV_ESCAPE_UNI
6829 # define PERL_PV_ESCAPE_UNI 0x0100
6830 #endif
6831
6832 #ifndef PERL_PV_ESCAPE_UNI_DETECT
6833 # define PERL_PV_ESCAPE_UNI_DETECT 0x0200
6834 #endif
6835
6836 #ifndef PERL_PV_ESCAPE_ALL
6837 # define PERL_PV_ESCAPE_ALL 0x1000
6838 #endif
6839
6840 #ifndef PERL_PV_ESCAPE_NOBACKSLASH
6841 # define PERL_PV_ESCAPE_NOBACKSLASH 0x2000
6842 #endif
6843
6844 #ifndef PERL_PV_ESCAPE_NOCLEAR
6845 # define PERL_PV_ESCAPE_NOCLEAR 0x4000
6846 #endif
6847
6848 #ifndef PERL_PV_ESCAPE_RE
6849 # define PERL_PV_ESCAPE_RE 0x8000
6850 #endif
6851
6852 #ifndef PERL_PV_PRETTY_NOCLEAR
6853 # define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR
6854 #endif
6855 #ifndef PERL_PV_PRETTY_DUMP
6856 # define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE
6857 #endif
6858
6859 #ifndef PERL_PV_PRETTY_REGPROP
6860 # define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE
6861 #endif
6862
6863 /* Hint: pv_escape
6864 * Note that unicode functionality is only backported to
6865 * those perl versions that support it. For older perl
6866 * versions, the implementation will fall back to bytes.
6867 */
6868
6869 #ifndef pv_escape
6870 #if defined(NEED_pv_escape)
6871 static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
6872 static
6873 #else
6874 extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
6875 #endif
6876
6877 #ifdef pv_escape
6878 # undef pv_escape
6879 #endif
6880 #define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f)
6881 #define Perl_pv_escape DPPP_(my_pv_escape)
6882
6883 #if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL)
6884
6885 char *
6886 DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str,
6887 const STRLEN count, const STRLEN max,
6888 STRLEN * const escaped, const U32 flags)
6889 {
6890 const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\';
6891 const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc;
6892 char octbuf[32] = "%123456789ABCDF";
6893 STRLEN wrote = 0;
6894 STRLEN chsize = 0;
6895 STRLEN readsize = 1;
6896 #if defined(is_utf8_string) && defined(utf8_to_uvchr)
6897 bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0;
6898 #endif
6899 const char *pv = str;
6900 const char * const end = pv + count;
6901 octbuf[0] = esc;
6902
6903 if (!(flags & PERL_PV_ESCAPE_NOCLEAR))
6904 sv_setpvs(dsv, "");
6905
6906 #if defined(is_utf8_string) && defined(utf8_to_uvchr)
6907 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
6908 isuni = 1;
6909 #endif
6910
6911 for (; pv < end && (!max || wrote < max) ; pv += readsize) {
6912 const UV u =
6913 #if defined(is_utf8_string) && defined(utf8_to_uvchr)
6914 isuni ? utf8_to_uvchr((U8*)pv, &readsize) :
6915 #endif
6916 (U8)*pv;
6917 const U8 c = (U8)u & 0xFF;
6918
6919 if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) {
6920 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
6921 chsize = my_snprintf(octbuf, sizeof octbuf,
6922 "%"UVxf, u);
6923 else
6924 chsize = my_snprintf(octbuf, sizeof octbuf,
6925 "%cx{%"UVxf"}", esc, u);
6926 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
6927 chsize = 1;
6928 } else {
6929 if (c == dq || c == esc || !isPRINT(c)) {
6930 chsize = 2;
6931 switch (c) {
6932 case '\\' : /* fallthrough */
6933 case '%' : if (c == esc)
6934 octbuf[1] = esc;
6935 else
6936 chsize = 1;
6937 break;
6938 case '\v' : octbuf[1] = 'v'; break;
6939 case '\t' : octbuf[1] = 't'; break;
6940 case '\r' : octbuf[1] = 'r'; break;
6941 case '\n' : octbuf[1] = 'n'; break;
6942 case '\f' : octbuf[1] = 'f'; break;
6943 case '"' : if (dq == '"')
6944 octbuf[1] = '"';
6945 else
6946 chsize = 1;
6947 break;
6948 default: chsize = my_snprintf(octbuf, sizeof octbuf,
6949 pv < end && isDIGIT((U8)*(pv+readsize))
6950 ? "%c%03o" : "%c%o", esc, c);
6951 }
6952 } else {
6953 chsize = 1;
6954 }
6955 }
6956 if (max && wrote + chsize > max) {
6957 break;
6958 } else if (chsize > 1) {
6959 sv_catpvn(dsv, octbuf, chsize);
6960 wrote += chsize;
6961 } else {
6962 char tmp[2];
6963 my_snprintf(tmp, sizeof tmp, "%c", c);
6964 sv_catpvn(dsv, tmp, 1);
6965 wrote++;
6966 }
6967 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
6968 break;
6969 }
6970 if (escaped != NULL)
6971 *escaped= pv - str;
6972 return SvPVX(dsv);
6973 }
6974
6975 #endif
6976 #endif
6977
6978 #ifndef pv_pretty
6979 #if defined(NEED_pv_pretty)
6980 static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
6981 static
6982 #else
6983 extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
6984 #endif
6985
6986 #ifdef pv_pretty
6987 # undef pv_pretty
6988 #endif
6989 #define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g)
6990 #define Perl_pv_pretty DPPP_(my_pv_pretty)
6991
6992 #if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL)
6993
6994 char *
6995 DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count,
6996 const STRLEN max, char const * const start_color, char const * const end_color,
6997 const U32 flags)
6998 {
6999 const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
7000 STRLEN escaped;
7001
7002 if (!(flags & PERL_PV_PRETTY_NOCLEAR))
7003 sv_setpvs(dsv, "");
7004
7005 if (dq == '"')
7006 sv_catpvs(dsv, "\"");
7007 else if (flags & PERL_PV_PRETTY_LTGT)
7008 sv_catpvs(dsv, "<");
7009
7010 if (start_color != NULL)
7011 sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color));
7012
7013 pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR);
7014
7015 if (end_color != NULL)
7016 sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color));
7017
7018 if (dq == '"')
7019 sv_catpvs(dsv, "\"");
7020 else if (flags & PERL_PV_PRETTY_LTGT)
7021 sv_catpvs(dsv, ">");
7022
7023 if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count)
7024 sv_catpvs(dsv, "...");
7025
7026 return SvPVX(dsv);
7027 }
7028
7029 #endif
7030 #endif
7031
7032 #ifndef pv_display
7033 #if defined(NEED_pv_display)
7034 static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
7035 static
7036 #else
7037 extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
7038 #endif
7039
7040 #ifdef pv_display
7041 # undef pv_display
7042 #endif
7043 #define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e)
7044 #define Perl_pv_display DPPP_(my_pv_display)
7045
7046 #if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL)
7047
7048 char *
7049 DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
7050 {
7051 pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
7052 if (len > cur && pv[cur] == '\0')
7053 sv_catpvs(dsv, "\\0");
7054 return SvPVX(dsv);
7055 }
7056
7057 #endif
7058 #endif
7059
7060 #endif /* _P_P_PORTABILITY_H_ */
7061
7062 /* End of File ppport.h */
0 #include "3DScene.hpp"
1
2 #include <assert.h>
3
4 namespace Slic3r {
5
6 // caller is responsible for supplying NO lines with zero length
7 void
8 _3DScene::_extrusionentity_to_verts_do(const Lines &lines, const std::vector<double> &widths,
9 const std::vector<double> &heights, bool closed, double top_z, const Point &copy,
10 GLVertexArray* qverts, GLVertexArray* tverts)
11 {
12 /* It looks like it's faster without reserving capacity...
13 // each segment has 4 quads, thus 16 vertices; + 2 caps
14 qverts->reserve_more(3 * 4 * (4 * lines.size() + 2));
15
16 // two triangles for each corner
17 tverts->reserve_more(3 * 3 * 2 * (lines.size() + 1));
18 */
19
20 assert(! lines.empty());
21 if (lines.empty())
22 return;
23
24 Line prev_line;
25 Pointf prev_b1, prev_b2;
26 Vectorf3 prev_xy_left_normal, prev_xy_right_normal;
27
28 // loop once more in case of closed loops
29 bool first_done = false;
30 for (size_t i = 0; i <= lines.size(); ++i) {
31 if (i == lines.size()) i = 0;
32
33 const Line &line = lines.at(i);
34 if (i == 0 && first_done && !closed) break;
35
36 double len = line.length();
37 double unscaled_len = unscale(len);
38
39 double bottom_z = top_z - heights.at(i);
40 double middle_z = (top_z + bottom_z) / 2;
41 double dist = widths.at(i)/2; // scaled
42
43 Vectorf v = Vectorf::new_unscale(line.vector());
44 v.scale(1/unscaled_len);
45
46 Pointf a = Pointf::new_unscale(line.a);
47 Pointf b = Pointf::new_unscale(line.b);
48 Pointf a1 = a;
49 Pointf a2 = a;
50 a1.translate(+dist*v.y, -dist*v.x);
51 a2.translate(-dist*v.y, +dist*v.x);
52 Pointf b1 = b;
53 Pointf b2 = b;
54 b1.translate(+dist*v.y, -dist*v.x);
55 b2.translate(-dist*v.y, +dist*v.x);
56
57 // calculate new XY normals
58 Vector n = line.normal();
59 Vectorf3 xy_right_normal = Vectorf3::new_unscale(n.x, n.y, 0);
60 xy_right_normal.scale(1/unscaled_len);
61 Vectorf3 xy_left_normal = xy_right_normal;
62 xy_left_normal.scale(-1);
63
64 if (first_done) {
65 // if we're making a ccw turn, draw the triangles on the right side, otherwise draw them on the left side
66 double ccw = line.b.ccw(prev_line);
67 if (ccw > EPSILON) {
68 // top-right vertex triangle between previous line and this one
69 {
70 // use the normal going to the right calculated for the previous line
71 tverts->push_norm(prev_xy_right_normal);
72 tverts->push_vert(prev_b1.x, prev_b1.y, middle_z);
73
74 // use the normal going to the right calculated for this line
75 tverts->push_norm(xy_right_normal);
76 tverts->push_vert(a1.x, a1.y, middle_z);
77
78 // normal going upwards
79 tverts->push_norm(0,0,1);
80 tverts->push_vert(a.x, a.y, top_z);
81 }
82 // bottom-right vertex triangle between previous line and this one
83 {
84 // use the normal going to the right calculated for the previous line
85 tverts->push_norm(prev_xy_right_normal);
86 tverts->push_vert(prev_b1.x, prev_b1.y, middle_z);
87
88 // normal going downwards
89 tverts->push_norm(0,0,-1);
90 tverts->push_vert(a.x, a.y, bottom_z);
91
92 // use the normal going to the right calculated for this line
93 tverts->push_norm(xy_right_normal);
94 tverts->push_vert(a1.x, a1.y, middle_z);
95 }
96 } else if (ccw < -EPSILON) {
97 // top-left vertex triangle between previous line and this one
98 {
99 // use the normal going to the left calculated for the previous line
100 tverts->push_norm(prev_xy_left_normal);
101 tverts->push_vert(prev_b2.x, prev_b2.y, middle_z);
102
103 // normal going upwards
104 tverts->push_norm(0,0,1);
105 tverts->push_vert(a.x, a.y, top_z);
106
107 // use the normal going to the right calculated for this line
108 tverts->push_norm(xy_left_normal);
109 tverts->push_vert(a2.x, a2.y, middle_z);
110 }
111 // bottom-left vertex triangle between previous line and this one
112 {
113 // use the normal going to the left calculated for the previous line
114 tverts->push_norm(prev_xy_left_normal);
115 tverts->push_vert(prev_b2.x, prev_b2.y, middle_z);
116
117 // use the normal going to the right calculated for this line
118 tverts->push_norm(xy_left_normal);
119 tverts->push_vert(a2.x, a2.y, middle_z);
120
121 // normal going downwards
122 tverts->push_norm(0,0,-1);
123 tverts->push_vert(a.x, a.y, bottom_z);
124 }
125 }
126 }
127
128 // if this was the extra iteration we were only interested in the triangles
129 if (first_done && i == 0) break;
130
131 prev_line = line;
132 prev_b1 = b1;
133 prev_b2 = b2;
134 prev_xy_right_normal = xy_right_normal;
135 prev_xy_left_normal = xy_left_normal;
136
137 if (!closed) {
138 // terminate open paths with caps
139 if (i == 0) {
140 // normal pointing downwards
141 qverts->push_norm(0,0,-1);
142 qverts->push_vert(a.x, a.y, bottom_z);
143
144 // normal pointing to the right
145 qverts->push_norm(xy_right_normal);
146 qverts->push_vert(a1.x, a1.y, middle_z);
147
148 // normal pointing upwards
149 qverts->push_norm(0,0,1);
150 qverts->push_vert(a.x, a.y, top_z);
151
152 // normal pointing to the left
153 qverts->push_norm(xy_left_normal);
154 qverts->push_vert(a2.x, a2.y, middle_z);
155 }
156 // we don't use 'else' because both cases are true if we have only one line
157 if (i == lines.size()-1) {
158 // normal pointing downwards
159 qverts->push_norm(0,0,-1);
160 qverts->push_vert(b.x, b.y, bottom_z);
161
162 // normal pointing to the left
163 qverts->push_norm(xy_left_normal);
164 qverts->push_vert(b2.x, b2.y, middle_z);
165
166 // normal pointing upwards
167 qverts->push_norm(0,0,1);
168 qverts->push_vert(b.x, b.y, top_z);
169
170 // normal pointing to the right
171 qverts->push_norm(xy_right_normal);
172 qverts->push_vert(b1.x, b1.y, middle_z);
173 }
174 }
175
176 // bottom-right face
177 {
178 // normal going downwards
179 qverts->push_norm(0,0,-1);
180 qverts->push_norm(0,0,-1);
181 qverts->push_vert(a.x, a.y, bottom_z);
182 qverts->push_vert(b.x, b.y, bottom_z);
183
184 qverts->push_norm(xy_right_normal);
185 qverts->push_norm(xy_right_normal);
186 qverts->push_vert(b1.x, b1.y, middle_z);
187 qverts->push_vert(a1.x, a1.y, middle_z);
188 }
189
190 // top-right face
191 {
192 qverts->push_norm(xy_right_normal);
193 qverts->push_norm(xy_right_normal);
194 qverts->push_vert(a1.x, a1.y, middle_z);
195 qverts->push_vert(b1.x, b1.y, middle_z);
196
197 // normal going upwards
198 qverts->push_norm(0,0,1);
199 qverts->push_norm(0,0,1);
200 qverts->push_vert(b.x, b.y, top_z);
201 qverts->push_vert(a.x, a.y, top_z);
202 }
203
204 // top-left face
205 {
206 qverts->push_norm(0,0,1);
207 qverts->push_norm(0,0,1);
208 qverts->push_vert(a.x, a.y, top_z);
209 qverts->push_vert(b.x, b.y, top_z);
210
211 qverts->push_norm(xy_left_normal);
212 qverts->push_norm(xy_left_normal);
213 qverts->push_vert(b2.x, b2.y, middle_z);
214 qverts->push_vert(a2.x, a2.y, middle_z);
215 }
216
217 // bottom-left face
218 {
219 qverts->push_norm(xy_left_normal);
220 qverts->push_norm(xy_left_normal);
221 qverts->push_vert(a2.x, a2.y, middle_z);
222 qverts->push_vert(b2.x, b2.y, middle_z);
223
224 // normal going downwards
225 qverts->push_norm(0,0,-1);
226 qverts->push_norm(0,0,-1);
227 qverts->push_vert(b.x, b.y, bottom_z);
228 qverts->push_vert(a.x, a.y, bottom_z);
229 }
230
231 first_done = true;
232 }
233 }
234
235 void
236 GLVertexArray::load_mesh(const TriangleMesh &mesh)
237 {
238 this->reserve_more(3 * 3 * mesh.facets_count());
239
240 for (int i = 0; i < mesh.stl.stats.number_of_facets; ++i) {
241 stl_facet &facet = mesh.stl.facet_start[i];
242 for (int j = 0; j <= 2; ++j) {
243 this->push_norm(facet.normal.x, facet.normal.y, facet.normal.z);
244 this->push_vert(facet.vertex[j].x, facet.vertex[j].y, facet.vertex[j].z);
245 }
246 }
247 }
248
249 }
0 #ifndef slic3r_3DScene_hpp_
1 #define slic3r_3DScene_hpp_
2
3 #include "../../libslic3r/libslic3r.h"
4 #include "../../libslic3r/Point.hpp"
5 #include "../../libslic3r/Line.hpp"
6 #include "../../libslic3r/TriangleMesh.hpp"
7
8 namespace Slic3r {
9
10 class GLVertexArray {
11 public:
12 std::vector<float> verts, norms;
13
14 void reserve(size_t len) {
15 this->verts.reserve(len);
16 this->norms.reserve(len);
17 };
18 void reserve_more(size_t len) {
19 len += this->verts.size();
20 this->reserve(len);
21 };
22 void push_vert(const Pointf3 &point) {
23 this->verts.push_back(point.x);
24 this->verts.push_back(point.y);
25 this->verts.push_back(point.z);
26 };
27 void push_vert(float x, float y, float z) {
28 this->verts.push_back(x);
29 this->verts.push_back(y);
30 this->verts.push_back(z);
31 };
32 void push_norm(const Pointf3 &point) {
33 this->norms.push_back(point.x);
34 this->norms.push_back(point.y);
35 this->norms.push_back(point.z);
36 };
37 void push_norm(float x, float y, float z) {
38 this->norms.push_back(x);
39 this->norms.push_back(y);
40 this->norms.push_back(z);
41 };
42 void load_mesh(const TriangleMesh &mesh);
43 };
44
45 class _3DScene
46 {
47 public:
48 static void _extrusionentity_to_verts_do(const Lines &lines, const std::vector<double> &widths,
49 const std::vector<double> &heights, bool closed, double top_z, const Point &copy,
50 GLVertexArray* qverts, GLVertexArray* tverts);
51 };
52
53 }
54
55 #endif
0 #include "GUI.hpp"
1
2 #if __APPLE__
3 #import <IOKit/pwr_mgt/IOPMLib.h>
4 #elif _WIN32
5 #include <Windows.h>
6 #pragma comment(lib, "user32.lib")
7 #endif
8
9 namespace Slic3r { namespace GUI {
10
11 #if __APPLE__
12 IOPMAssertionID assertionID;
13 #endif
14
15 void
16 disable_screensaver()
17 {
18 #if __APPLE__
19 CFStringRef reasonForActivity = CFSTR("Slic3r");
20 IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep,
21 kIOPMAssertionLevelOn, reasonForActivity, &assertionID);
22 // ignore result: success == kIOReturnSuccess
23 #elif _WIN32
24 SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_CONTINUOUS);
25 #endif
26 }
27
28 void
29 enable_screensaver()
30 {
31 #if __APPLE__
32 IOReturn success = IOPMAssertionRelease(assertionID);
33 #elif _WIN32
34 SetThreadExecutionState(ES_CONTINUOUS);
35 #endif
36 }
37
38 bool
39 debugged()
40 {
41 #ifdef _WIN32
42 return IsDebuggerPresent();
43 #else
44 return false;
45 #endif /* _WIN32 */
46 }
47
48 void
49 break_to_debugger()
50 {
51 #ifdef _WIN32
52 if (IsDebuggerPresent())
53 DebugBreak();
54 #endif /* _WIN32 */
55 }
56
57 } }
0 #ifndef slic3r_GUI_hpp_
1 #define slic3r_GUI_hpp_
2
3 namespace Slic3r { namespace GUI {
4
5 void disable_screensaver();
6 void enable_screensaver();
7 bool debugged();
8 void break_to_debugger();
9
10 } }
11
12 #endif
0 #ifndef _xsinit_h_
1 #define _xsinit_h_
2
3 // undef some macros set by Perl which cause compilation errors on Win32
4 #undef read
5 #undef seekdir
6 #undef bind
7 #undef send
8 #undef connect
9 #undef wait
10 #undef accept
11 #undef close
12 #undef open
13 #undef write
14 #undef socket
15 #undef listen
16 #undef shutdown
17 #undef ioctl
18 #undef getpeername
19 #undef rect
20 #undef setsockopt
21 #undef getsockopt
22 #undef getsockname
23 #undef gethostname
24 #undef select
25 #undef socketpair
26 #undef recvfrom
27 #undef sendto
28
29 // these need to be included early for Win32 (listing it in Build.PL is not enough)
30 #include <ostream>
31 #include <iostream>
32 #include <sstream>
33
34 #ifdef SLIC3RXS
35 extern "C" {
36 #include "EXTERN.h"
37 #include "perl.h"
38 #include "XSUB.h"
39 #include "ppport.h"
40 #undef do_open
41 #undef do_close
42 #ifdef _MSC_VER
43 // Undef some of the macros set by Perl <xsinit.h>, which cause compilation errors on Win32
44 #undef send
45 #undef connect
46 #undef bind
47 #endif /* _MSC_VER */
48 }
49 #endif
50
51 #include <libslic3r.h>
52 #include <ClipperUtils.hpp>
53 #include <Config.hpp>
54 #include <ExPolygon.hpp>
55 #include <MultiPoint.hpp>
56 #include <Point.hpp>
57 #include <Polygon.hpp>
58 #include <Polyline.hpp>
59 #include <TriangleMesh.hpp>
60
61 namespace Slic3r {
62
63 template<class T>
64 struct ClassTraits {
65 static const char* name;
66 static const char* name_ref;
67 };
68
69 // use this for typedefs for which the forward prototype
70 // in REGISTER_CLASS won't work
71 #define __REGISTER_CLASS(cname, perlname) \
72 template <>const char* ClassTraits<cname>::name = "Slic3r::" perlname; \
73 template <>const char* ClassTraits<cname>::name_ref = "Slic3r::" perlname "::Ref";
74
75 #define REGISTER_CLASS(cname,perlname) \
76 class cname; \
77 __REGISTER_CLASS(cname, perlname);
78
79 template<class T>
80 const char* perl_class_name(const T*) { return ClassTraits<T>::name; }
81 template<class T>
82 const char* perl_class_name_ref(const T*) { return ClassTraits<T>::name_ref; }
83
84 template<class T>
85 SV* perl_to_SV_ref(T &t) {
86 SV* sv = newSV(0);
87 sv_setref_pv( sv, perl_class_name_ref(&t), &t );
88 return sv;
89 }
90
91 template<class T>
92 SV* perl_to_SV_clone_ref(const T &t) {
93 SV* sv = newSV(0);
94 sv_setref_pv( sv, perl_class_name(&t), new T(t) );
95 return sv;
96 }
97
98 template <class T>
99 class Ref {
100 T* val;
101 public:
102 Ref() : val(NULL) {}
103 Ref(T* t) : val(t) {}
104 Ref(const T* t) : val(const_cast<T*>(t)) {}
105 operator T*() const { return val; }
106 static const char* CLASS() { return ClassTraits<T>::name_ref; }
107 };
108
109 template <class T>
110 class Clone {
111 T* val;
112 public:
113 Clone() : val(NULL) {}
114 Clone(T* t) : val(new T(*t)) {}
115 Clone(const T& t) : val(new T(t)) {}
116 operator T*() const { return val; }
117 static const char* CLASS() { return ClassTraits<T>::name; }
118 };
119
120 SV* ConfigBase__as_hash(ConfigBase* THIS);
121 SV* ConfigOption_to_SV(const ConfigOption &opt, const ConfigOptionDef &def);
122 SV* ConfigBase__get(ConfigBase* THIS, const t_config_option_key &opt_key);
123 SV* ConfigBase__get_at(ConfigBase* THIS, const t_config_option_key &opt_key, size_t i);
124 bool ConfigBase__set(ConfigBase* THIS, const t_config_option_key &opt_key, SV* value);
125 bool ConfigBase__set_deserialize(ConfigBase* THIS, const t_config_option_key &opt_key, SV* str);
126 void ConfigBase__set_ifndef(ConfigBase* THIS, const t_config_option_key &opt_key, SV* value, bool deserialize = false);
127 bool StaticConfig__set(StaticConfig* THIS, const t_config_option_key &opt_key, SV* value);
128 SV* to_AV(ExPolygon* expolygon);
129 SV* to_SV_pureperl(const ExPolygon* expolygon);
130 void from_SV(SV* expoly_sv, ExPolygon* expolygon);
131 void from_SV_check(SV* expoly_sv, ExPolygon* expolygon);
132 void from_SV(SV* line_sv, Line* THIS);
133 void from_SV_check(SV* line_sv, Line* THIS);
134 SV* to_AV(Line* THIS);
135 SV* to_SV_pureperl(const Line* THIS);
136 void from_SV(SV* poly_sv, MultiPoint* THIS);
137 void from_SV_check(SV* poly_sv, MultiPoint* THIS);
138 SV* to_AV(MultiPoint* THIS);
139 SV* to_SV_pureperl(const MultiPoint* THIS);
140 void from_SV_check(SV* poly_sv, Polygon* THIS);
141 void from_SV_check(SV* poly_sv, Polyline* THIS);
142 SV* to_SV_pureperl(const Point* THIS);
143 void from_SV(SV* point_sv, Point* point);
144 void from_SV_check(SV* point_sv, Point* point);
145 SV* to_SV_pureperl(const Pointf* point);
146 bool from_SV(SV* point_sv, Pointf* point);
147 bool from_SV_check(SV* point_sv, Pointf* point);
148 void from_SV_check(SV* surface_sv, Surface* THIS);
149 SV* to_SV(TriangleMesh* THIS);
150 SV* polynode_children_2_perl(const ClipperLib::PolyNode& node);
151 SV* polynode2perl(const ClipperLib::PolyNode& node);
152
153 }
154
155 #ifdef SLIC3R_HAS_BROKEN_CROAK
156 #undef croak
157 #ifdef _MSC_VER
158 #define croak(...) confess_at(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
159 #else
160 #define croak(...) confess_at(__FILE__, __LINE__, __func__, __VA_ARGS__)
161 #endif
162 #endif
163
164 #endif
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 49;
7
8 is Slic3r::TriangleMesh::hello_world(), 'Hello world!',
9 'hello world';
10
11 my $cube = {
12 vertices => [ [20,20,0], [20,0,0], [0,0,0], [0,20,0], [20,20,20], [0,20,20], [0,0,20], [20,0,20] ],
13 facets => [ [0,1,2], [0,2,3], [4,5,6], [4,6,7], [0,4,7], [0,7,1], [1,7,6], [1,6,2], [2,6,5], [2,5,3], [4,0,3], [4,3,5] ],
14 };
15
16 {
17 my $m = Slic3r::TriangleMesh->new;
18 $m->ReadFromPerl($cube->{vertices}, $cube->{facets});
19 $m->repair;
20 my ($vertices, $facets) = ($m->vertices, $m->facets);
21
22 is_deeply $vertices, $cube->{vertices}, 'vertices arrayref roundtrip';
23 is_deeply $facets, $cube->{facets}, 'facets arrayref roundtrip';
24 is scalar(@{$m->normals}), scalar(@$facets), 'normals returns the right number of items';
25
26 {
27 my $m2 = $m->clone;
28 is_deeply $m2->vertices, $cube->{vertices}, 'cloned vertices arrayref roundtrip';
29 is_deeply $m2->facets, $cube->{facets}, 'cloned facets arrayref roundtrip';
30 $m2->scale(3); # check that it does not affect $m
31 }
32
33 {
34 my $stats = $m->stats;
35 is $stats->{number_of_facets}, scalar(@{ $cube->{facets} }), 'stats.number_of_facets';
36 ok abs($stats->{volume} - 20*20*20) < 1E-2, 'stats.volume';
37 }
38
39 $m->scale(2);
40 ok abs($m->stats->{volume} - 40*40*40) < 1E-2, 'scale';
41
42 $m->scale_xyz(Slic3r::Pointf3->new(2,1,1));
43 ok abs($m->stats->{volume} - 2*40*40*40) < 1E-2, 'scale_xyz';
44
45 $m->translate(5,10,0);
46 is_deeply $m->vertices->[0], [85,50,0], 'translate';
47
48 $m->align_to_origin;
49 is_deeply $m->vertices->[2], [0,0,0], 'align_to_origin';
50
51 is_deeply $m->size, [80,40,40], 'size';
52
53 $m->scale_xyz(Slic3r::Pointf3->new(0.5,1,1));
54 $m->rotate(45, Slic3r::Point->new(20,20));
55 ok abs($m->size->[0] - sqrt(2)*40) < 1E-4, 'rotate';
56
57 {
58 my $meshes = $m->split;
59 is scalar(@$meshes), 1, 'split';
60 isa_ok $meshes->[0], 'Slic3r::TriangleMesh', 'split';
61 is_deeply $m->bb3, $meshes->[0]->bb3, 'split populates stats';
62 }
63
64 my $m2 = Slic3r::TriangleMesh->new;
65 $m2->ReadFromPerl($cube->{vertices}, $cube->{facets});
66 $m2->repair;
67 $m->merge($m2);
68 $m->repair;
69 is $m->stats->{number_of_facets}, 2 * $m2->stats->{number_of_facets}, 'merge';
70
71 {
72 my $meshes = $m->split;
73 is scalar(@$meshes), 2, 'split';
74 }
75 }
76
77 {
78 my $m = Slic3r::TriangleMesh->new;
79 $m->ReadFromPerl($cube->{vertices}, $cube->{facets});
80 $m->repair;
81 my @z = (0,2,4,8,6,8,10,12,14,16,18,20);
82 my $result = $m->slice(\@z);
83 my $SCALING_FACTOR = 0.000001;
84 for my $i (0..$#z) {
85 is scalar(@{$result->[$i]}), 1, "number of returned polygons per layer (z = " . $z[$i] . ")";
86 is $result->[$i][0]->area, 20*20/($SCALING_FACTOR**2), 'size of returned polygon';
87 }
88 }
89
90 {
91 my $m = Slic3r::TriangleMesh->new;
92 $m->ReadFromPerl(
93 [ [0,0,0],[0,0,20],[0,5,0],[0,5,20],[50,0,0],[50,0,20],[15,5,0],[35,5,0],[15,20,0],[50,5,0],[35,20,0],[15,5,10],[50,5,20],[35,5,10],[35,20,10],[15,20,10] ],
94 [ [0,1,2],[2,1,3],[1,0,4],[5,1,4],[0,2,4],[4,2,6],[7,6,8],[4,6,7],[9,4,7],[7,8,10],[2,3,6],[11,3,12],[7,12,9],[13,12,7],[6,3,11],[11,12,13],[3,1,5],[12,3,5],[5,4,9],[12,5,9],[13,7,10],[14,13,10],[8,15,10],[10,15,14],[6,11,8],[8,11,15],[15,11,13],[14,15,13] ],
95 );
96 $m->repair;
97 {
98 # at Z = 10 we have a top horizontal surface
99 my $slices = $m->slice([ 5, 10 ]);
100 is $slices->[0][0]->area, $slices->[1][0]->area, 'slicing a top tangent plane includes its area';
101 }
102 $m->mirror_z;
103 {
104 # this second test also checks that performing a second slice on a mesh after
105 # a transformation works properly (shared_vertices is correctly invalidated);
106 # at Z = -10 we have a bottom horizontal surface
107 my $slices = $m->slice([ -5, -10 ]);
108 is $slices->[0][0]->area, $slices->[1][0]->area, 'slicing a bottom tangent plane includes its area';
109 }
110 }
111
112 {
113 my $m = Slic3r::TriangleMesh->new;
114 $m->ReadFromPerl($cube->{vertices}, $cube->{facets});
115 $m->repair;
116 {
117 my $upper = Slic3r::TriangleMesh->new;
118 my $lower = Slic3r::TriangleMesh->new;
119 $m->cut(0, $upper, $lower);
120 $upper->repair; $lower->repair;
121 is $upper->facets_count, 12, 'upper mesh has all facets except those belonging to the slicing plane';
122 is $lower->facets_count, 0, 'lower mesh has no facets';
123 }
124 {
125 my $upper = Slic3r::TriangleMesh->new;
126 my $lower = Slic3r::TriangleMesh->new;
127 $m->cut(10, $upper, $lower);
128 #$upper->repair; $lower->repair;
129 # we expect:
130 # 2 facets on external horizontal surfaces
131 # 3 facets on each side = 12 facets
132 # 6 facets on the triangulated side (8 vertices)
133 is $upper->facets_count, 2+12+6, 'upper mesh has the expected number of facets';
134 is $lower->facets_count, 2+12+6, 'lower mesh has the expected number of facets';
135 }
136 }
137
138 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 24;
7
8 my $point = Slic3r::Point->new(10, 15);
9 is_deeply [ @$point ], [10, 15], 'point roundtrip';
10
11 my $point2 = $point->clone;
12 $point2->scale(2);
13 is_deeply [ @$point2 ], [20, 30], 'scale';
14
15 $point2->translate(10, -15);
16 is_deeply [ @$point2 ], [30, 15], 'translate';
17
18 ok $point->coincides_with($point->clone), 'coincides_with';
19 ok !$point->coincides_with($point2), 'coincides_with';
20
21 {
22 my $point3 = Slic3r::Point->new(4300000, -9880845);
23 is $point->[0], $point->x, 'x accessor';
24 is $point->[1], $point->y, 'y accessor'; #,,
25 }
26
27 {
28 my $nearest = $point->nearest_point([ $point2, Slic3r::Point->new(100, 200) ]);
29 ok $nearest->coincides_with($point2), 'nearest_point';
30 }
31
32 {
33 my $line = Slic3r::Line->new([0,0], [100,0]);
34 is +Slic3r::Point->new(0,0) ->distance_to_line($line), 0, 'distance_to_line()';
35 is +Slic3r::Point->new(100,0)->distance_to_line($line), 0, 'distance_to_line()';
36 is +Slic3r::Point->new(50,0) ->distance_to_line($line), 0, 'distance_to_line()';
37 is +Slic3r::Point->new(150,0)->distance_to_line($line), 50, 'distance_to_line()';
38 is +Slic3r::Point->new(0,50) ->distance_to_line($line), 50, 'distance_to_line()';
39 is +Slic3r::Point->new(50,50)->distance_to_line($line), 50, 'distance_to_line()';
40 is +Slic3r::Point->new(50,50) ->perp_distance_to_line($line), 50, 'perp_distance_to_line()';
41 is +Slic3r::Point->new(150,50)->perp_distance_to_line($line), 50, 'perp_distance_to_line()';
42 }
43
44 {
45 my $line = Slic3r::Line->new([50,50], [125,-25]);
46 is +Slic3r::Point->new(100,0)->distance_to_line($line), 0, 'distance_to_line()';
47 }
48
49 {
50 my $line = Slic3r::Line->new(
51 [18335846,18335845],
52 [18335846,1664160],
53 );
54 $point = Slic3r::Point->new(1664161,18335848);
55 is $point->perp_distance_to_line($line), 16671685, 'perp_distance_to_line() does not overflow';
56 }
57
58 {
59 my $p0 = Slic3r::Point->new(76975850,89989996);
60 my $p1 = Slic3r::Point->new(76989990,109989991);
61 my $p2 = Slic3r::Point->new(76989987,89989994);
62 ok $p0->ccw($p1, $p2) < 0, 'ccw() does not overflow';
63 }
64
65 {
66 my $point = Slic3r::Point->new(15,15);
67 my $line = Slic3r::Line->new([10,10], [20,10]);
68 is_deeply $point->projection_onto_line($line)->pp, [15,10], 'project_onto_line';
69
70 $point = Slic3r::Point->new(0, 15);
71 is_deeply $point->projection_onto_line($line)->pp, [10,10], 'project_onto_line';
72
73 $point = Slic3r::Point->new(25, 15);
74 is_deeply $point->projection_onto_line($line)->pp, [20,10], 'project_onto_line';
75
76 $point = Slic3r::Point->new(10,10);
77 is_deeply $point->projection_onto_line($line)->pp, [10,10], 'project_onto_line';
78
79 $point = Slic3r::Point->new(12, 10);
80 is_deeply $point->projection_onto_line($line)->pp, [12,10], 'project_onto_line';
81 }
82
83 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use List::Util qw(first sum);
6 use Slic3r::XS;
7 use Test::More tests => 33;
8
9 use constant PI => 4 * atan2(1, 1);
10
11 my $square = [ # ccw
12 [100, 100],
13 [200, 100],
14 [200, 200],
15 [100, 200],
16 ];
17 my $hole_in_square = [ # cw
18 [140, 140],
19 [140, 160],
20 [160, 160],
21 [160, 140],
22 ];
23
24 my $expolygon = Slic3r::ExPolygon->new($square, $hole_in_square);
25
26 ok $expolygon->is_valid, 'is_valid';
27 is ref($expolygon->pp), 'ARRAY', 'expolygon pp is unblessed';
28 is_deeply $expolygon->pp, [$square, $hole_in_square], 'expolygon roundtrip';
29
30 is ref($expolygon->arrayref), 'ARRAY', 'expolygon arrayref is unblessed';
31 isa_ok $expolygon->[0], 'Slic3r::Polygon::Ref', 'expolygon polygon is blessed';
32 isa_ok $expolygon->contour, 'Slic3r::Polygon::Ref', 'expolygon contour is blessed';
33 isa_ok $expolygon->holes->[0], 'Slic3r::Polygon::Ref', 'expolygon hole is blessed';
34 isa_ok $expolygon->[0][0], 'Slic3r::Point::Ref', 'expolygon point is blessed';
35
36 {
37 my $expolygon2 = $expolygon->clone;
38 my $polygon = $expolygon2->[0];
39 $polygon->scale(2);
40 is $expolygon2->[0][0][0], $polygon->[0][0], 'polygons are returned by reference';
41 }
42
43 is_deeply $expolygon->clone->pp, [$square, $hole_in_square], 'clone';
44
45 is $expolygon->area, 100*100-20*20, 'area';
46
47 {
48 my $expolygon2 = $expolygon->clone;
49 $expolygon2->scale(2.5);
50 is_deeply $expolygon2->pp, [
51 [map [ 2.5*$_->[0], 2.5*$_->[1] ], @$square],
52 [map [ 2.5*$_->[0], 2.5*$_->[1] ], @$hole_in_square]
53 ], 'scale';
54 }
55
56 {
57 my $expolygon2 = $expolygon->clone;
58 $expolygon2->translate(10, -5);
59 is_deeply $expolygon2->pp, [
60 [map [ $_->[0]+10, $_->[1]-5 ], @$square],
61 [map [ $_->[0]+10, $_->[1]-5 ], @$hole_in_square]
62 ], 'translate';
63 }
64
65 {
66 my $expolygon2 = $expolygon->clone;
67 $expolygon2->rotate(PI/2, Slic3r::Point->new(150,150));
68 is_deeply $expolygon2->pp, [
69 [ @$square[1,2,3,0] ],
70 [ @$hole_in_square[3,0,1,2] ]
71 ], 'rotate around Point';
72 }
73
74 {
75 my $expolygon2 = $expolygon->clone;
76 $expolygon2->rotate(PI/2, [150,150]);
77 is_deeply $expolygon2->pp, [
78 [ @$square[1,2,3,0] ],
79 [ @$hole_in_square[3,0,1,2] ]
80 ], 'rotate around pure-Perl Point';
81 }
82
83 {
84 my $expolygon2 = $expolygon->clone;
85 $expolygon2->scale(2);
86 my $collection = Slic3r::ExPolygon::Collection->new($expolygon->pp, $expolygon2->pp);
87 is_deeply $collection->pp, [ $expolygon->pp, $expolygon2->pp ],
88 'expolygon collection (pure Perl) roundtrip';
89
90 my $collection2 = Slic3r::ExPolygon::Collection->new($expolygon, $expolygon2);
91 is_deeply $collection->pp, $collection2->pp,
92 'expolygon collection (XS) roundtrip';
93
94 $collection->clear;
95 is scalar(@$collection), 0, 'clear collection';
96
97 $collection->append($expolygon);
98 is scalar(@$collection), 1, 'append to collection';
99
100 my $exp = $collection->[0];
101 $exp->scale(3);
102 is $collection->[0][0][0][0], $exp->[0][0][0], 'collection items are returned by reference';
103
104 is_deeply $collection->[0]->clone->pp, $collection->[0]->pp, 'clone collection item';
105 }
106
107 {
108 my $expolygon = Slic3r::ExPolygon->new($square);
109 my $polygons = $expolygon->get_trapezoids2(PI/2);
110 is scalar(@$polygons), 1, 'correct number of trapezoids returned';
111 is scalar(@{$polygons->[0]}), 4, 'trapezoid has 4 points';
112 is $polygons->[0]->area, $expolygon->area, 'trapezoid has correct area';
113 }
114
115 {
116 my $polygons = $expolygon->get_trapezoids2(PI/2);
117 is scalar(@$polygons), 4, 'correct number of trapezoids returned';
118
119 # trapezoid polygons might have more than 4 points in case of collinear segments
120 $polygons = [ map @{$_->simplify(1)}, @$polygons ];
121 ok !defined(first { @$_ != 4 } @$polygons), 'all trapezoids have 4 points';
122
123 is scalar(grep { $_->area == 40*100 } @$polygons), 2, 'trapezoids have expected area';
124 is scalar(grep { $_->area == 20*40 } @$polygons), 2, 'trapezoids have expected area';
125 }
126
127 {
128 my $expolygon = Slic3r::ExPolygon->new([ [0,100],[100,0],[200,0],[300,100],[200,200],[100,200] ]);
129 my $polygons = $expolygon->get_trapezoids2(PI/2);
130 is scalar(@$polygons), 3, 'correct number of trapezoids returned';
131 is scalar(grep { $_->area == 100*200/2 } @$polygons), 2, 'trapezoids have expected area';
132 is scalar(grep { $_->area == 100*200 } @$polygons), 1, 'trapezoids have expected area';
133 }
134
135 {
136 my $triangles = $expolygon->triangulate_pp;
137 is scalar(@$triangles), 8, 'expected number of triangles';
138 is sum(map $_->area, @$triangles), $expolygon->area, 'sum of triangles area equals original expolygon area';
139 }
140
141 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 15;
7
8 my $square = [ # ccw
9 [100, 100],
10 [200, 100],
11 [200, 200],
12 [100, 200],
13 ];
14 my $hole_in_square = [ # cw
15 [140, 140],
16 [140, 160],
17 [160, 160],
18 [160, 140],
19 ];
20
21 my $expolygon = Slic3r::ExPolygon->new($square, $hole_in_square);
22 my $surface = Slic3r::Surface->new(
23 expolygon => $expolygon,
24 surface_type => Slic3r::Surface::S_TYPE_INTERNAL,
25 );
26
27 $surface = $surface->clone;
28
29 isa_ok $surface->expolygon, 'Slic3r::ExPolygon::Ref', 'expolygon';
30 is_deeply [ @{$surface->expolygon->pp} ], [$square, $hole_in_square], 'expolygon roundtrip';
31 is scalar(@{$surface->polygons}), 2, 'polygons roundtrip';
32
33 is $surface->surface_type, Slic3r::Surface::S_TYPE_INTERNAL, 'surface_type';
34 $surface->surface_type(Slic3r::Surface::S_TYPE_BOTTOM);
35 is $surface->surface_type, Slic3r::Surface::S_TYPE_BOTTOM, 'modify surface_type';
36
37 $surface->bridge_angle(30);
38 is $surface->bridge_angle, 30, 'bridge_angle';
39
40 $surface->extra_perimeters(2);
41 is $surface->extra_perimeters, 2, 'extra_perimeters';
42
43 {
44 my $surface2 = $surface->clone;
45 $surface2->expolygon->scale(2);
46 isnt $surface2->expolygon->area, $expolygon->area, 'expolygon is returned by reference';
47 }
48
49 {
50 my $collection = Slic3r::Surface::Collection->new;
51 $collection->append($_) for $surface, $surface->clone;
52 is scalar(@$collection), 2, 'collection has the right number of items';
53 is_deeply $collection->[0]->expolygon->pp, [$square, $hole_in_square],
54 'collection returns a correct surface expolygon';
55 $collection->clear;
56 is scalar(@$collection), 0, 'clear collection';
57 $collection->append($surface);
58 is scalar(@$collection), 1, 'append to collection';
59
60 my $item = $collection->[0];
61 isa_ok $item, 'Slic3r::Surface::Ref';
62 $item->surface_type(Slic3r::Surface::S_TYPE_INTERNAL);
63 is $item->surface_type, $collection->[0]->surface_type, 'collection returns items by reference';
64 }
65
66 {
67 my $collection = Slic3r::Surface::Collection->new;
68 $collection->append($_) for
69 Slic3r::Surface->new(expolygon => $expolygon, surface_type => Slic3r::Surface::S_TYPE_BOTTOM),
70 Slic3r::Surface->new(expolygon => $expolygon, surface_type => Slic3r::Surface::S_TYPE_BOTTOM),
71 Slic3r::Surface->new(expolygon => $expolygon, surface_type => Slic3r::Surface::S_TYPE_TOP);
72 is scalar(@{$collection->group}), 2, 'group() returns correct number of groups';
73 }
74
75 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use List::Util qw(first);
6 use Slic3r::XS;
7 use Test::More tests => 21;
8
9 use constant PI => 4 * atan2(1, 1);
10
11 my $square = [ # ccw
12 [100, 100],
13 [200, 100],
14 [200, 200],
15 [100, 200],
16 ];
17
18 my $polygon = Slic3r::Polygon->new(@$square);
19 my $cw_polygon = $polygon->clone;
20 $cw_polygon->reverse;
21
22 ok $polygon->is_valid, 'is_valid';
23 is_deeply $polygon->pp, $square, 'polygon roundtrip';
24
25 is ref($polygon->arrayref), 'ARRAY', 'polygon arrayref is unblessed';
26 isa_ok $polygon->[0], 'Slic3r::Point::Ref', 'polygon point is blessed';
27
28 my $lines = $polygon->lines;
29 is_deeply [ map $_->pp, @$lines ], [
30 [ [100, 100], [200, 100] ],
31 [ [200, 100], [200, 200] ],
32 [ [200, 200], [100, 200] ],
33 [ [100, 200], [100, 100] ],
34 ], 'polygon lines';
35
36 is_deeply $polygon->split_at_first_point->pp, [ @$square[0,1,2,3,0] ], 'split_at_first_point';
37 is_deeply $polygon->split_at_index(2)->pp, [ @$square[2,3,0,1,2] ], 'split_at_index';
38 is_deeply $polygon->split_at_vertex(Slic3r::Point->new(@{$square->[2]}))->pp, [ @$square[2,3,0,1,2] ], 'split_at';
39 is $polygon->area, 100*100, 'area';
40
41 ok $polygon->is_counter_clockwise, 'is_counter_clockwise';
42 ok !$cw_polygon->is_counter_clockwise, 'is_counter_clockwise';
43 {
44 my $clone = $polygon->clone;
45 $clone->reverse;
46 ok !$clone->is_counter_clockwise, 'is_counter_clockwise';
47 $clone->make_counter_clockwise;
48 ok $clone->is_counter_clockwise, 'make_counter_clockwise';
49 $clone->make_counter_clockwise;
50 ok $clone->is_counter_clockwise, 'make_counter_clockwise';
51 }
52
53 ok ref($polygon->first_point) eq 'Slic3r::Point', 'first_point';
54
55 ok $polygon->contains_point(Slic3r::Point->new(150,150)), 'ccw contains_point';
56 ok $cw_polygon->contains_point(Slic3r::Point->new(150,150)), 'cw contains_point';
57
58 {
59 my @points = (Slic3r::Point->new(100,0));
60 foreach my $i (1..5) {
61 my $point = $points[0]->clone;
62 $point->rotate(PI/3*$i, [0,0]);
63 push @points, $point;
64 }
65 my $hexagon = Slic3r::Polygon->new(@points);
66 my $triangles = $hexagon->triangulate_convex;
67 is scalar(@$triangles), 4, 'right number of triangles';
68 ok !(defined first { $_->is_clockwise } @$triangles), 'all triangles are ccw';
69 }
70
71 {
72 is_deeply $polygon->centroid->pp, [150,150], 'centroid';
73 }
74
75 {
76 my $polygon = Slic3r::Polygon->new(
77 [50000000, 100000000],
78 [300000000, 102000000],
79 [50000000, 104000000],
80 );
81 my $line = Slic3r::Line->new([175992032,102000000], [47983964,102000000]);
82 my $intersection = $polygon->intersection($line);
83 is_deeply $intersection->pp, [50000000, 102000000], 'polygon-line intersection';
84 }
85
86 # this is not a test: this just demonstrates bad usage, where $polygon->clone gets
87 # DESTROY'ed before the derived object ($point), causing bad memory access
88 if (0) {
89 my $point;
90 {
91 $point = $polygon->clone->[0];
92 }
93 $point->scale(2);
94 }
95
96 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 8;
7
8 my $points = [
9 [100, 100],
10 [200, 100],
11 [200, 200],
12 ];
13
14 my $path = Slic3r::ExtrusionPath->new(
15 polyline => Slic3r::Polyline->new(@$points),
16 role => Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER,
17 mm3_per_mm => 1,
18 );
19 isa_ok $path->polyline, 'Slic3r::Polyline::Ref', 'path polyline';
20 is_deeply $path->polyline->pp, $points, 'path points roundtrip';
21
22 $path->reverse;
23 is_deeply $path->polyline->pp, [ reverse @$points ], 'reverse path';
24
25 $path->append([ 150, 150 ]);
26 is scalar(@$path), 4, 'append to path';
27
28 $path->pop_back;
29 is scalar(@$path), 3, 'pop_back from path';
30
31 ok $path->first_point->coincides_with($path->polyline->[0]), 'first_point';
32
33 $path = $path->clone;
34
35 is $path->role, Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER, 'role';
36 $path->role(Slic3r::ExtrusionPath::EXTR_ROLE_FILL);
37 is $path->role, Slic3r::ExtrusionPath::EXTR_ROLE_FILL, 'modify role';
38
39 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use List::Util qw(sum);
6 use Slic3r::XS;
7 use Test::More tests => 48;
8
9 {
10 my $square = [
11 [100, 100],
12 [200, 100],
13 [200, 200],
14 [100, 200],
15 ];
16 my $square_p = Slic3r::Polygon->new(@$square);
17
18 my $loop = Slic3r::ExtrusionLoop->new;
19 $loop->append(Slic3r::ExtrusionPath->new(
20 polyline => $square_p->split_at_first_point,
21 role => Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER,
22 mm3_per_mm => 1,
23 ));
24
25 isa_ok $loop, 'Slic3r::ExtrusionLoop';
26 isa_ok $loop->polygon, 'Slic3r::Polygon', 'loop polygon';
27 is $loop->polygon->area, $square_p->area, 'polygon area';
28 is $loop->length, $square_p->length(), 'loop length';
29
30 $loop = $loop->clone;
31
32 is scalar(@$loop), 1, 'loop contains one path';
33 {
34 my $path = $loop->[0];
35 isa_ok $path, 'Slic3r::ExtrusionPath::Ref';
36 is $path->role, Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER, 'role';
37 $path->role(Slic3r::ExtrusionPath::EXTR_ROLE_FILL);
38 is $path->role, Slic3r::ExtrusionPath::EXTR_ROLE_FILL, 'modify role';
39 }
40
41 $loop->split_at_vertex($square_p->[2]);
42 is scalar(@$loop), 1, 'splitting a single-path loop results in a single path';
43 is scalar(@{$loop->[0]->polyline}), 5, 'path has correct number of points';
44 ok $loop->[0]->polyline->[0]->coincides_with($square_p->[2]), 'expected point order';
45 ok $loop->[0]->polyline->[1]->coincides_with($square_p->[3]), 'expected point order';
46 ok $loop->[0]->polyline->[2]->coincides_with($square_p->[0]), 'expected point order';
47 ok $loop->[0]->polyline->[3]->coincides_with($square_p->[1]), 'expected point order';
48 ok $loop->[0]->polyline->[4]->coincides_with($square_p->[2]), 'expected point order';
49 }
50
51 {
52 my $polyline1 = Slic3r::Polyline->new([100,100], [200,100], [200,200]);
53 my $polyline2 = Slic3r::Polyline->new([200,200], [100,200], [100,100]);
54
55 my $loop = Slic3r::ExtrusionLoop->new_from_paths(
56 Slic3r::ExtrusionPath->new(
57 polyline => $polyline1,
58 role => Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER,
59 mm3_per_mm => 1,
60 ),
61 Slic3r::ExtrusionPath->new(
62 polyline => $polyline2,
63 role => Slic3r::ExtrusionPath::EXTR_ROLE_OVERHANG_PERIMETER,
64 mm3_per_mm => 1,
65 ),
66 );
67 my $tot_len = sum($polyline1->length, $polyline2->length);
68 is $loop->length, $tot_len, 'length';
69 is scalar(@$loop), 2, 'loop contains two paths';
70
71 {
72 # check splitting at intermediate point
73 my $loop2 = $loop->clone;
74 isa_ok $loop2, 'Slic3r::ExtrusionLoop';
75 $loop2->split_at_vertex($polyline1->[1]);
76 is $loop2->length, $tot_len, 'length after splitting is unchanged';
77 is scalar(@$loop2), 3, 'loop contains three paths after splitting';
78 ok $loop2->[0]->polyline->[0]->coincides_with($polyline1->[1]), 'expected starting point';
79 ok $loop2->[-1]->polyline->[-1]->coincides_with($polyline1->[1]), 'expected ending point';
80 ok $loop2->[0]->polyline->[-1]->coincides_with($loop2->[1]->polyline->[0]), 'paths have common point';
81 ok $loop2->[1]->polyline->[-1]->coincides_with($loop2->[2]->polyline->[0]), 'paths have common point';
82 is $loop2->[0]->role, Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER, 'expected order after splitting';
83 is $loop2->[1]->role, Slic3r::ExtrusionPath::EXTR_ROLE_OVERHANG_PERIMETER, 'expected order after splitting';
84 is $loop2->[2]->role, Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER, 'expected order after splitting';
85 is scalar(@{$loop2->[0]->polyline}), 2, 'path has correct number of points';
86 is scalar(@{$loop2->[1]->polyline}), 3, 'path has correct number of points';
87 is scalar(@{$loop2->[2]->polyline}), 2, 'path has correct number of points';
88
89 my @paths = @{$loop2->clip_end(3)};
90 is sum(map $_->length, @paths), $loop2->length - 3, 'returned paths have expected length';
91 }
92
93 {
94 # check splitting at endpoint
95 my $loop2 = $loop->clone;
96 $loop2->split_at_vertex($polyline2->[0]);
97 is $loop2->length, $tot_len, 'length after splitting is unchanged';
98 is scalar(@$loop2), 2, 'loop contains two paths after splitting';
99 ok $loop2->[0]->polyline->[0]->coincides_with($polyline2->[0]), 'expected starting point';
100 ok $loop2->[-1]->polyline->[-1]->coincides_with($polyline2->[0]), 'expected ending point';
101 ok $loop2->[0]->polyline->[-1]->coincides_with($loop2->[1]->polyline->[0]), 'paths have common point';
102 ok $loop2->[1]->polyline->[-1]->coincides_with($loop2->[0]->polyline->[0]), 'paths have common point';
103 is $loop2->[0]->role, Slic3r::ExtrusionPath::EXTR_ROLE_OVERHANG_PERIMETER, 'expected order after splitting';
104 is $loop2->[1]->role, Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER, 'expected order after splitting';
105 is scalar(@{$loop2->[0]->polyline}), 3, 'path has correct number of points';
106 is scalar(@{$loop2->[1]->polyline}), 3, 'path has correct number of points';
107 }
108
109 {
110 my $loop2 = $loop->clone;
111 my $point = Slic3r::Point->new(250,150);
112 $loop2->split_at($point);
113 is $loop2->length, $tot_len, 'length after splitting is unchanged';
114 is scalar(@$loop2), 3, 'loop contains three paths after splitting';
115 my $expected_start_point = Slic3r::Point->new(200,150);
116 ok $loop2->[0]->polyline->[0]->coincides_with($expected_start_point), 'expected starting point';
117 ok $loop2->[-1]->polyline->[-1]->coincides_with($expected_start_point), 'expected ending point';
118 }
119 }
120
121 {
122 my @polylines = (
123 Slic3r::Polyline->new([59312736,4821067],[64321068,4821067],[64321068,4821067],[64321068,9321068],[59312736,9321068]),
124 Slic3r::Polyline->new([59312736,9321068],[9829401,9321068]),
125 Slic3r::Polyline->new([9829401,9321068],[4821067,9321068],[4821067,4821067],[9829401,4821067]),
126 Slic3r::Polyline->new([9829401,4821067],[59312736,4821067]),
127 );
128 my $loop = Slic3r::ExtrusionLoop->new;
129 $loop->append($_) for (
130 Slic3r::ExtrusionPath->new(polyline => $polylines[0], role => Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER, mm3_per_mm => 1),
131 Slic3r::ExtrusionPath->new(polyline => $polylines[1], role => Slic3r::ExtrusionPath::EXTR_ROLE_OVERHANG_PERIMETER, mm3_per_mm => 1),
132 Slic3r::ExtrusionPath->new(polyline => $polylines[2], role => Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER, mm3_per_mm => 1),
133 Slic3r::ExtrusionPath->new(polyline => $polylines[3], role => Slic3r::ExtrusionPath::EXTR_ROLE_OVERHANG_PERIMETER, mm3_per_mm => 1),
134 );
135 my $len = $loop->length;
136 my $point = Slic3r::Point->new(4821067,9321068);
137 $loop->split_at_vertex($point) or $loop->split_at($point);
138 is $loop->length, $len, 'total length is preserved after splitting';
139 is_deeply [ map $_->role, @$loop ], [
140 Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER,
141 Slic3r::ExtrusionPath::EXTR_ROLE_OVERHANG_PERIMETER,
142 Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER,
143 Slic3r::ExtrusionPath::EXTR_ROLE_OVERHANG_PERIMETER,
144 Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER,
145 ], 'order is correctly preserved after splitting';
146 }
147
148 {
149 my $loop = Slic3r::ExtrusionLoop->new;
150 $loop->append(Slic3r::ExtrusionPath->new(
151 polyline => Slic3r::Polyline->new([15896783,15868739],[24842049,12117558],[33853238,15801279],[37591780,24780128],[37591780,24844970],[33853231,33825297],[24842049,37509013],[15896798,33757841],[12211841,24812544],[15896783,15868739]),
152 role => Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER, mm3_per_mm => 1
153 ));
154 my $len = $loop->length;
155 $loop->split_at(Slic3r::Point->new(15896783,15868739));
156 is $loop->length, $len, 'split_at() preserves total length';
157 }
158
159 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 18;
7
8 my $points = [
9 [100, 100],
10 [200, 100],
11 [200, 200],
12 ];
13
14 my $polyline = Slic3r::Polyline->new(@$points);
15
16 is_deeply $polyline->pp, $points, 'polyline roundtrip';
17
18 is ref($polyline->arrayref), 'ARRAY', 'polyline arrayref is unblessed';
19 isa_ok $polyline->[0], 'Slic3r::Point::Ref', 'polyline point is blessed';
20
21 my $lines = $polyline->lines;
22 is_deeply [ map $_->pp, @$lines ], [
23 [ [100, 100], [200, 100] ],
24 [ [200, 100], [200, 200] ],
25 ], 'polyline lines';
26
27 $polyline->append_polyline($polyline->clone);
28 is_deeply $polyline->pp, [ @$points, @$points ], 'append_polyline';
29
30 {
31 my $len = $polyline->length;
32 $polyline->clip_end($len/3);
33 ok abs($polyline->length - ($len-($len/3))) < 1, 'clip_end';
34 }
35
36 {
37 my $polyline = Slic3r::Polyline->new(
38 [0,0], [20,0], [50,0], [80,0], [100,0],
39 );
40 $polyline->simplify(2);
41 is_deeply $polyline->pp, [ [0,0], [100,0] ], 'Douglas-Peucker';
42 }
43
44 {
45 my $polyline = Slic3r::Polyline->new(
46 [0,0], [50,50], [100,0], [125,-25], [150,50],
47 );
48 $polyline->simplify(25);
49 is_deeply $polyline->pp, [ [0, 0], [50, 50], [125, -25], [150, 50] ], 'Douglas-Peucker';
50 }
51
52 {
53 my $polyline = Slic3r::Polyline->new(
54 [0,0], [100,0], [50,10],
55 );
56 $polyline->simplify(25);
57 is_deeply $polyline->pp, [ [0,0], [100,0], [50,10] ], 'Douglas-Peucker uses shortest distance instead of perpendicular distance';
58 }
59
60 {
61 my $polyline = Slic3r::Polyline->new(@$points);
62 is $polyline->length, 100*2, 'length';
63 $polyline->extend_end(50);
64 is $polyline->length, 100*2 + 50, 'extend_end';
65 $polyline->extend_start(50);
66 is $polyline->length, 100*2 + 50 + 50, 'extend_start';
67 }
68
69 {
70 my $polyline = Slic3r::Polyline->new(@$points);
71 my $p1 = Slic3r::Polyline->new;
72 my $p2 = Slic3r::Polyline->new;
73 my $point = Slic3r::Point->new(150, 100);
74 $polyline->split_at($point, $p1, $p2);
75 is scalar(@$p1), 2, 'split_at';
76 is scalar(@$p2), 3, 'split_at';
77 ok $p1->last_point->coincides_with($point), 'split_at';
78 ok $p2->first_point->coincides_with($point), 'split_at';
79 }
80
81 {
82 my $polyline = Slic3r::Polyline->new(@$points[0,1,2,0]);
83 my $p1 = Slic3r::Polyline->new;
84 my $p2 = Slic3r::Polyline->new;
85 $polyline->split_at($polyline->first_point, $p1, $p2);
86 is scalar(@$p1), 1, 'split_at';
87 is scalar(@$p2), 4, 'split_at';
88 }
89
90 # disabled because we now use a more efficient but incomplete algorithm
91 if (0) {
92 my $polyline = Slic3r::Polyline->new(
93 map [$_,10], (0,10,20,30,40,50,60)
94 );
95 {
96 my $expolygon = Slic3r::ExPolygon->new(Slic3r::Polygon->new(
97 [25,0], [55,0], [55,30], [25,30],
98 ));
99 my $p = $polyline->clone;
100 $p->simplify_by_visibility($expolygon);
101 is_deeply $p->pp, [
102 map [$_,10], (0,10,20,30,50,60)
103 ], 'simplify_by_visibility()';
104 }
105 {
106 my $expolygon = Slic3r::ExPolygon->new(Slic3r::Polygon->new(
107 [-15,0], [75,0], [75,30], [-15,30],
108 ));
109 my $p = $polyline->clone;
110 $p->simplify_by_visibility($expolygon);
111 is_deeply $p->pp, [
112 map [$_,10], (0,60)
113 ], 'simplify_by_visibility()';
114 }
115 {
116 my $expolygon = Slic3r::ExPolygon->new(Slic3r::Polygon->new(
117 [-15,0], [25,0], [25,30], [-15,30],
118 ));
119 my $p = $polyline->clone;
120 $p->simplify_by_visibility($expolygon);
121 is_deeply $p->pp, [
122 map [$_,10], (0,20,30,40,50,60)
123 ], 'simplify_by_visibility()';
124 }
125 }
126
127 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 40;
7
8 use constant PI => 4 * atan2(1, 1);
9 use constant EPSILON => 1E-4;
10
11 my $points = [
12 [100, 100],
13 [200, 100],
14 ];
15
16 my $line = Slic3r::Line->new(@$points);
17 is_deeply $line->pp, $points, 'line roundtrip';
18
19 is ref($line->arrayref), 'ARRAY', 'line arrayref is unblessed';
20 isa_ok $line->[0], 'Slic3r::Point::Ref', 'line point is blessed';
21
22 {
23 my $clone = $line->clone;
24 $clone->reverse;
25 is_deeply $clone->pp, [ reverse @$points ], 'reverse';
26 }
27
28 {
29 my $line2 = Slic3r::Line->new($line->a->clone, $line->b->clone);
30 is_deeply $line2->pp, $points, 'line roundtrip with cloned points';
31 }
32
33 {
34 my $clone = $line->clone;
35 $clone->translate(10, -5);
36 is_deeply $clone->pp, [
37 [110, 95],
38 [210, 95],
39 ], 'translate';
40 }
41
42 {
43 ok +Slic3r::Line->new([0,0],[200,0])->parallel_to_line(Slic3r::Line->new([200,200],[0,200])), 'parallel_to';
44 }
45
46 foreach my $base_angle (0, PI/4, PI/2, PI) {
47 my $line = Slic3r::Line->new([0,0], [100,0]);
48 $line->rotate($base_angle, [0,0]);
49 my $clone = $line->clone;
50 ok $line->parallel_to_line($clone), 'line is parallel to self';
51 $clone->reverse;
52 ok $line->parallel_to_line($clone), 'line is parallel to self + PI';
53 ok $line->parallel_to($line->direction), 'line is parallel to its direction';
54 ok $line->parallel_to($line->direction + PI), 'line is parallel to its direction + PI';
55 ok $line->parallel_to($line->direction - PI), 'line is parallel to its direction - PI';
56 {
57 my $line2 = $line->clone;
58 $line2->reverse;
59 ok $line->parallel_to_line($line2), 'line is parallel to its opposite';
60 }
61 {
62 my $line2 = $line->clone;
63 $line2->rotate(+(EPSILON)/2, [0,0]);
64 ok $line->parallel_to_line($line2), 'line is parallel within epsilon';
65 }
66 {
67 my $line2 = $line->clone;
68 $line2->rotate(-(EPSILON)/2, [0,0]);
69 ok $line->parallel_to_line($line2), 'line is parallel within epsilon';
70 }
71 }
72
73 {
74 my $a = Slic3r::Line->new([100, 0], [200, 0]);
75 my $b = Slic3r::Line->new([300, 300], [300, 100]);
76 my $r = $a->intersection_infinite($b);
77 is_deeply $r->pp, [300, 0], 'intersection_infinite';
78 }
79
80 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use List::Util qw(sum);
6 use Slic3r::XS;
7 use Test::More tests => 23;
8
9 my $square = Slic3r::Polygon->new( # ccw
10 [200, 100],
11 [200, 200],
12 [100, 200],
13 [100, 100],
14 );
15 my $hole_in_square = Slic3r::Polygon->new( # cw
16 [160, 140],
17 [140, 140],
18 [140, 160],
19 [160, 160],
20 );
21 my $expolygon = Slic3r::ExPolygon->new($square, $hole_in_square);
22
23 {
24 my $result = Slic3r::Geometry::Clipper::offset([ $square, $hole_in_square ], 5);
25 is_deeply [ map $_->pp, @$result ], [ [
26 [205, 205],
27 [95, 205],
28 [95, 95],
29 [205, 95],
30 ], [
31 [145, 145],
32 [145, 155],
33 [155, 155],
34 [155, 145],
35 ] ], 'offset';
36 }
37
38 {
39 my $result = Slic3r::Geometry::Clipper::offset_ex([ @$expolygon ], 5);
40 is_deeply $result->[0]->pp, [ [
41 [205, 205],
42 [95, 205],
43 [95, 95],
44 [205, 95],
45 ], [
46 [145, 145],
47 [145, 155],
48 [155, 155],
49 [155, 145],
50 ] ], 'offset_ex';
51 }
52
53 {
54 my $result = Slic3r::Geometry::Clipper::offset2_ex([ @$expolygon ], 5, -2);
55 is_deeply $result->[0]->pp, [ [
56 [203, 203],
57 [97, 203],
58 [97, 97],
59 [203, 97],
60 ], [
61 [143, 143],
62 [143, 157],
63 [157, 157],
64 [157, 143],
65 ] ], 'offset2_ex';
66 }
67
68 {
69 my $expolygon2 = Slic3r::ExPolygon->new([
70 [20000000, 20000000],
71 [0, 20000000],
72 [0, 0],
73 [20000000, 0],
74 ], [
75 [5000000, 15000000],
76 [15000000, 15000000],
77 [15000000, 5000000],
78 [5000000, 5000000],
79 ]);
80 my $result = Slic3r::Geometry::Clipper::offset2_ex([ @$expolygon2 ], -1, +1);
81 is $result->[0]->area, $expolygon2->area, 'offset2_ex';
82 }
83
84 {
85 my $polygon1 = Slic3r::Polygon->new(@$square);
86 my $polygon2 = Slic3r::Polygon->new(reverse @$hole_in_square);
87 my $result = Slic3r::Geometry::Clipper::diff_ex([$polygon1], [$polygon2]);
88 is $result->[0]->area, $expolygon->area, 'diff_ex';
89 }
90
91 {
92 my $polyline = Slic3r::Polyline->new([50,150], [300,150]);
93 {
94 my $result = Slic3r::Geometry::Clipper::intersection_pl([$polyline], [$square, $hole_in_square]);
95 is scalar(@$result), 2, 'intersection_pl - correct number of result lines';
96 # results are in no particular order
97 is scalar(grep $_->length == 40, @$result), 2, 'intersection_pl - result lines have correct length';
98 }
99 {
100 my $result = Slic3r::Geometry::Clipper::diff_pl([$polyline], [$square, $hole_in_square]);
101 is scalar(@$result), 3, 'diff_pl - correct number of result lines';
102 # results are in no particular order
103 is scalar(grep $_->length == 50, @$result), 1, 'diff_pl - the left result line has correct length';
104 is scalar(grep $_->length == 100, @$result), 1, 'diff_pl - two right result line has correct length';
105 is scalar(grep $_->length == 20, @$result), 1, 'diff_pl - the central result line has correct length';
106 }
107 }
108
109 if (0) { # Clipper does not preserve polyline orientation
110 my $polyline = Slic3r::Polyline->new([50,150], [300,150]);
111 my $result = Slic3r::Geometry::Clipper::intersection_pl([$polyline], [$square]);
112 is scalar(@$result), 1, 'intersection_pl - correct number of result lines';
113 is_deeply $result->[0]->pp, [[100,150], [200,150]], 'clipped line orientation is preserved';
114 }
115
116 if (0) { # Clipper does not preserve polyline orientation
117 my $polyline = Slic3r::Polyline->new([300,150], [50,150]);
118 my $result = Slic3r::Geometry::Clipper::intersection_pl([$polyline], [$square]);
119 is scalar(@$result), 1, 'intersection_pl - correct number of result lines';
120 is_deeply $result->[0]->pp, [[200,150], [100,150]], 'clipped line orientation is preserved';
121 }
122
123 if (0) { # Clipper does not preserve polyline orientation
124 my $result = Slic3r::Geometry::Clipper::intersection_ppl([$hole_in_square], [$square]);
125 is_deeply $result->[0]->pp, $hole_in_square->split_at_first_point->pp,
126 'intersection_ppl - clipping cw polygon as polyline preserves winding order';
127 }
128
129 {
130 my $square2 = $square->clone;
131 $square2->translate(50,50);
132 {
133 my $result = Slic3r::Geometry::Clipper::intersection_ppl([$square2], [$square]);
134 is scalar(@$result), 1, 'intersection_ppl - result contains a single line';
135 is scalar(@{$result->[0]}), 3, 'intersection_ppl - result contains expected number of points';
136 # Clipper does not preserve polyline orientation so we only check the middle point
137 ###ok $result->[0][0]->coincides_with(Slic3r::Point->new(150,200)), 'intersection_ppl - expected point order';
138 ok $result->[0][1]->coincides_with(Slic3r::Point->new(150,150)), 'intersection_ppl - expected point order';
139 ###ok $result->[0][2]->coincides_with(Slic3r::Point->new(200,150)), 'intersection_ppl - expected point order';
140 }
141 }
142
143 {
144 my $square2 = $square->clone;
145 $square2->reverse;
146 $square2->translate(50,50);
147 {
148 my $result = Slic3r::Geometry::Clipper::intersection_ppl([$square2], [$square]);
149 is scalar(@$result), 1, 'intersection_ppl - result contains a single line';
150 is scalar(@{$result->[0]}), 3, 'intersection_ppl - result contains expected number of points';
151 # Clipper does not preserve polyline orientation so we only check the middle point
152 ###ok $result->[0][0]->coincides_with(Slic3r::Point->new(200,150)), 'intersection_ppl - expected point order';
153 ok $result->[0][1]->coincides_with(Slic3r::Point->new(150,150)), 'intersection_ppl - expected point order';
154 ###ok $result->[0][2]->coincides_with(Slic3r::Point->new(150,200)), 'intersection_ppl - expected point order';
155 }
156 }
157
158 {
159 # Clipper bug #96 (our issue #2028)
160 my $subject = Slic3r::Polyline->new(
161 [44735000,31936670],[55270000,31936670],[55270000,25270000],[74730000,25270000],[74730000,44730000],[68063296,44730000],[68063296,55270000],[74730000,55270000],[74730000,74730000],[55270000,74730000],[55270000,68063296],[44730000,68063296],[44730000,74730000],[25270000,74730000],[25270000,55270000],[31936670,55270000],[31936670,44730000],[25270000,44730000],[25270000,25270000],[44730000,25270000],[44730000,31936670]
162 );
163 my $clip = [
164 Slic3r::Polygon->new([75200000,45200000],[54800000,45200000],[54800000,24800000],[75200000,24800000]),
165 ];
166 my $result = Slic3r::Geometry::Clipper::intersection_pl([$subject], $clip);
167 is scalar(@$result), 1, 'intersection_pl - result is not empty';
168 }
169
170 {
171 my $subject = Slic3r::Polygon->new(
172 [44730000,31936670],[55270000,31936670],[55270000,25270000],[74730000,25270000],[74730000,44730000],[68063296,44730000],[68063296,55270000],[74730000,55270000],[74730000,74730000],[55270000,74730000],[55270000,68063296],[44730000,68063296],[44730000,74730000],[25270000,74730000],[25270000,55270000],[31936670,55270000],[31936670,44730000],[25270000,44730000],[25270000,25270000],[44730000,25270000]
173 );
174 my $clip = [
175 Slic3r::Polygon->new([75200000,45200000],[54800000,45200000],[54800000,24800000],[75200000,24800000]),
176 ];
177 my $result = Slic3r::Geometry::Clipper::intersection_ppl([$subject], $clip);
178 is scalar(@$result), 1, 'intersection_ppl - result is not empty';
179 }
180
181 {
182 # Clipper bug #122
183 my $subject = [
184 Slic3r::Polyline->new([1975,1975],[25,1975],[25,25],[1975,25],[1975,1975]),
185 ];
186 my $clip = [
187 Slic3r::Polygon->new([2025,2025],[-25,2025],[-25,-25],[2025,-25]),
188 Slic3r::Polygon->new([525,525],[525,1475],[1475,1475],[1475,525]),
189 ];
190 my $result = Slic3r::Geometry::Clipper::intersection_pl($subject, $clip);
191 is scalar(@$result), 1, 'intersection_pl - result is not empty';
192 is scalar(@{$result->[0]}), 5, 'intersection_pl - result is not empty';
193 }
194
195 {
196 # Clipper bug #126
197 my $subject = Slic3r::Polyline->new(
198 [200000,19799999],[200000,200000],[24304692,200000],[15102879,17506106],[13883200,19799999],[200000,19799999],
199 );
200 my $clip = [
201 Slic3r::Polygon->new([15257205,18493894],[14350057,20200000],[-200000,20200000],[-200000,-200000],[25196917,-200000]),
202 ];
203 my $result = Slic3r::Geometry::Clipper::intersection_pl([$subject], $clip);
204 is scalar(@$result), 1, 'intersection_pl - result is not empty';
205 is $result->[0]->length, $subject->length, 'intersection_pl - result has same length as subject polyline';
206 }
207
208 if (0) {
209 # Disabled until Clipper bug #127 is fixed
210 my $subject = [
211 Slic3r::Polyline->new([-90000000,-100000000],[-90000000,100000000]), # vertical
212 Slic3r::Polyline->new([-100000000,-10000000],[100000000,-10000000]), # horizontal
213 Slic3r::Polyline->new([-100000000,0],[100000000,0]), # horizontal
214 Slic3r::Polyline->new([-100000000,10000000],[100000000,10000000]), # horizontal
215 ];
216 my $clip = Slic3r::Polygon->new( # a circular, convex, polygon
217 [99452190,10452846],[97814760,20791169],[95105652,30901699],[91354546,40673664],[86602540,50000000],
218 [80901699,58778525],[74314483,66913061],[66913061,74314483],[58778525,80901699],[50000000,86602540],
219 [40673664,91354546],[30901699,95105652],[20791169,97814760],[10452846,99452190],[0,100000000],
220 [-10452846,99452190],[-20791169,97814760],[-30901699,95105652],[-40673664,91354546],
221 [-50000000,86602540],[-58778525,80901699],[-66913061,74314483],[-74314483,66913061],
222 [-80901699,58778525],[-86602540,50000000],[-91354546,40673664],[-95105652,30901699],
223 [-97814760,20791169],[-99452190,10452846],[-100000000,0],[-99452190,-10452846],
224 [-97814760,-20791169],[-95105652,-30901699],[-91354546,-40673664],[-86602540,-50000000],
225 [-80901699,-58778525],[-74314483,-66913061],[-66913061,-74314483],[-58778525,-80901699],
226 [-50000000,-86602540],[-40673664,-91354546],[-30901699,-95105652],[-20791169,-97814760],
227 [-10452846,-99452190],[0,-100000000],[10452846,-99452190],[20791169,-97814760],
228 [30901699,-95105652],[40673664,-91354546],[50000000,-86602540],[58778525,-80901699],
229 [66913061,-74314483],[74314483,-66913061],[80901699,-58778525],[86602540,-50000000],
230 [91354546,-40673664],[95105652,-30901699],[97814760,-20791169],[99452190,-10452846],[100000000,0]
231 );
232 my $result = Slic3r::Geometry::Clipper::intersection_pl($subject, [$clip]);
233 is scalar(@$result), scalar(@$subject), 'intersection_pl - expected number of polylines';
234 is sum(map scalar(@$_), @$result), scalar(@$subject)*2,
235 'intersection_pl - expected number of points in polylines';
236 }
237
238 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 18;
7
8 my $points = [
9 [100, 100],
10 [200, 100],
11 [200, 200],
12 ];
13
14 my $path = Slic3r::ExtrusionPath->new(
15 polyline => Slic3r::Polyline->new(@$points),
16 role => Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER,
17 mm3_per_mm => 1,
18 );
19
20 my $loop = Slic3r::ExtrusionLoop->new_from_paths(
21 Slic3r::ExtrusionPath->new(
22 polyline => Slic3r::Polygon->new(@$points)->split_at_first_point,
23 role => Slic3r::ExtrusionPath::EXTR_ROLE_FILL,
24 mm3_per_mm => 1,
25 ),
26 );
27
28 my $collection = Slic3r::ExtrusionPath::Collection->new(
29 $path,
30 );
31 isa_ok $collection, 'Slic3r::ExtrusionPath::Collection', 'collection object with items in constructor';
32 ok !$collection->no_sort, 'no_sort is false by default';
33
34 $collection->append($collection);
35 is scalar(@$collection), 2, 'append ExtrusionPath::Collection';
36
37 $collection->append($path);
38 is scalar(@$collection), 3, 'append ExtrusionPath';
39
40 $collection->append($loop);
41 is scalar(@$collection), 4, 'append ExtrusionLoop';
42
43 isa_ok $collection->[1], 'Slic3r::ExtrusionPath::Collection::Ref', 'correct object returned for collection';
44 isa_ok $collection->[2], 'Slic3r::ExtrusionPath::Ref', 'correct object returned for path';
45 isa_ok $collection->[3], 'Slic3r::ExtrusionLoop::Ref', 'correct object returned for loop';
46 is ref($collection->[2]->clone), 'Slic3r::ExtrusionPath', 'correct object returned for cloned path';
47 is ref($collection->[3]->clone), 'Slic3r::ExtrusionLoop', 'correct object returned for cloned loop';
48
49 is scalar(@{$collection->[1]}), 1, 'appended collection was duplicated';
50
51 {
52 my $collection_loop = $collection->[3];
53 $collection_loop->polygon->scale(2);
54 is_deeply $collection->[3]->polygon->pp, $collection_loop->polygon->pp, 'items are returned by reference';
55 }
56
57 {
58 my $collection = Slic3r::ExtrusionPath::Collection->new(
59 map Slic3r::ExtrusionPath->new(polyline => $_, role => 0, mm3_per_mm => 1),
60 Slic3r::Polyline->new([0,15], [0,18], [0,20]),
61 Slic3r::Polyline->new([0,10], [0,8], [0,5]),
62 );
63 is_deeply
64 [ map $_->y, map @{$_->polyline}, @{$collection->chained_path_from(Slic3r::Point->new(0,30), 0)} ],
65 [20, 18, 15, 10, 8, 5],
66 'chained_path_from';
67 is_deeply
68 [ map $_->y, map @{$_->polyline}, @{$collection->chained_path(0)} ],
69 [15, 18, 20, 10, 8, 5],
70 'chained_path';
71 }
72
73 {
74 my $collection = Slic3r::ExtrusionPath::Collection->new(
75 map Slic3r::ExtrusionPath->new(polyline => $_, role => 0, mm3_per_mm => 1),
76 Slic3r::Polyline->new([15,0], [10,0], [4,0]),
77 Slic3r::Polyline->new([10,5], [15,5], [20,5]),
78 );
79 is_deeply
80 [ map $_->x, map @{$_->polyline}, @{$collection->chained_path_from(Slic3r::Point->new(30,0), 0)} ],
81 [reverse 4, 10, 15, 10, 15, 20],
82 'chained_path_from';
83
84 $collection->no_sort(1);
85 my @foo = @{$collection->chained_path(0)};
86 pass 'chained_path with no_sort';
87 }
88
89 {
90 my $coll2 = $collection->clone;
91 ok !$coll2->no_sort, 'expected no_sort value';
92 $coll2->no_sort(1);
93 ok $coll2->clone->no_sort, 'no_sort is kept after clone';
94 }
95
96 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 3;
7
8 {
9 my $collection = Slic3r::Polyline::Collection->new(
10 Slic3r::Polyline->new([0,15], [0,18], [0,20]),
11 Slic3r::Polyline->new([0,10], [0,8], [0,5]),
12 );
13 is_deeply
14 [ map $_->y, map @$_, @{$collection->chained_path_from(Slic3r::Point->new(0,30), 0)} ],
15 [20, 18, 15, 10, 8, 5],
16 'chained_path_from';
17 is_deeply
18 [ map $_->y, map @$_, @{$collection->chained_path(0)} ],
19 [15, 18, 20, 10, 8, 5],
20 'chained_path';
21 }
22
23 {
24 my $collection = Slic3r::Polyline::Collection->new(
25 Slic3r::Polyline->new([15,0], [10,0], [4,0]),
26 Slic3r::Polyline->new([10,5], [15,5], [20,5]),
27 );
28 is_deeply
29 [ map $_->x, map @$_, @{$collection->chained_path_from(Slic3r::Point->new(30,0), 0)} ],
30 [reverse 4, 10, 15, 10, 15, 20],
31 'chained_path_from';
32 }
33
34 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 9;
7
8 use constant PI => 4 * atan2(1, 1);
9
10 {
11 my @points = (
12 Slic3r::Point->new(100,100),
13 Slic3r::Point->new(100,200),
14 Slic3r::Point->new(200,200),
15 Slic3r::Point->new(200,100),
16 Slic3r::Point->new(150,150),
17 );
18 my $hull = Slic3r::Geometry::convex_hull(\@points);
19 isa_ok $hull, 'Slic3r::Polygon', 'convex_hull returns a Polygon';
20 is scalar(@$hull), 4, 'convex_hull returns the correct number of points';
21 }
22
23 # directions_parallel() and directions_parallel_within() are tested
24 # also with Slic3r::Line::parallel_to() tests in 10_line.t
25 {
26 ok Slic3r::Geometry::directions_parallel_within(0, 0, 0), 'directions_parallel_within';
27 ok Slic3r::Geometry::directions_parallel_within(0, PI, 0), 'directions_parallel_within';
28 ok Slic3r::Geometry::directions_parallel_within(0, 0, PI/180), 'directions_parallel_within';
29 ok Slic3r::Geometry::directions_parallel_within(0, PI, PI/180), 'directions_parallel_within';
30 ok !Slic3r::Geometry::directions_parallel_within(PI/2, PI, 0), 'directions_parallel_within';
31 ok !Slic3r::Geometry::directions_parallel_within(PI/2, PI, PI/180), 'directions_parallel_within';
32 }
33
34 {
35 my $positions = Slic3r::Geometry::arrange(4, Slic3r::Pointf->new(20, 20), 5);
36 is scalar(@$positions), 4, 'arrange() returns expected number of positions';
37 }
38
39 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 146;
7
8 foreach my $config (Slic3r::Config->new, Slic3r::Config::Static::new_FullPrintConfig) {
9 $config->set('layer_height', 0.3);
10 ok abs($config->get('layer_height') - 0.3) < 1e-4, 'set/get float';
11 is $config->serialize('layer_height'), '0.3', 'serialize float';
12
13 $config->set('perimeters', 2);
14 is $config->get('perimeters'), 2, 'set/get int';
15 is $config->serialize('perimeters'), '2', 'serialize int';
16
17 $config->set('extrusion_axis', 'A');
18 is $config->get('extrusion_axis'), 'A', 'set/get string';
19 is $config->serialize('extrusion_axis'), 'A', 'serialize string';
20
21 $config->set('notes', "foo\nbar");
22 is $config->get('notes'), "foo\nbar", 'set/get string with newline';
23 is $config->serialize('notes'), 'foo\nbar', 'serialize string with newline';
24 $config->set_deserialize('notes', 'bar\nbaz');
25 is $config->get('notes'), "bar\nbaz", 'deserialize string with newline';
26
27 foreach my $test_data (
28 {
29 name => 'empty',
30 values => [],
31 serialized => ''
32 },
33 {
34 name => 'single empty',
35 values => [''],
36 serialized => '""'
37 },
38 {
39 name => 'single noempty, simple',
40 values => ['RGB'],
41 serialized => 'RGB'
42 },
43 {
44 name => 'multiple noempty, simple',
45 values => ['ABC', 'DEF', '09182745@!#$*(&'],
46 serialized => 'ABC;DEF;09182745@!#$*(&'
47 },
48 {
49 name => 'multiple, simple, some empty',
50 values => ['ABC', 'DEF', '', '09182745@!#$*(&', ''],
51 serialized => 'ABC;DEF;;09182745@!#$*(&;'
52 },
53 {
54 name => 'complex',
55 values => ['some "quoted" notes', "yet\n some notes", "whatever \n notes", ''],
56 serialized => '"some \"quoted\" notes";"yet\n some notes";"whatever \n notes";'
57 }
58 )
59 {
60 $config->set('filament_notes', $test_data->{values});
61 is $config->serialize('filament_notes'), $test_data->{serialized}, 'serialize multi-string value ' . $test_data->{name};
62 $config->set_deserialize('filament_notes', '');
63 is_deeply $config->get('filament_notes'), [], 'deserialize multi-string value - empty ' . $test_data->{name};
64 $config->set_deserialize('filament_notes', $test_data->{serialized});
65 is_deeply $config->get('filament_notes'), $test_data->{values}, 'deserialize complex multi-string value ' . $test_data->{name};
66 }
67
68 $config->set('first_layer_height', 0.3);
69 ok abs($config->get('first_layer_height') - 0.3) < 1e-4, 'set/get absolute floatOrPercent';
70 is $config->serialize('first_layer_height'), '0.3', 'serialize absolute floatOrPercent';
71
72 $config->set('first_layer_height', '50%');
73 $config->get_abs_value('first_layer_height');
74 ok abs($config->get_abs_value('first_layer_height') - 0.15) < 1e-4, 'set/get relative floatOrPercent';
75 is $config->serialize('first_layer_height'), '50%', 'serialize relative floatOrPercent';
76
77 # Uh-oh, we have no point option to test at the moment
78 #ok $config->set('print_center', [50,80]), 'valid point coordinates';
79 #is_deeply $config->get('print_center'), [50,80], 'set/get point';
80 #is $config->serialize('print_center'), '50,80', 'serialize point';
81 #$config->set_deserialize('print_center', '20,10');
82 #is_deeply $config->get('print_center'), [20,10], 'deserialize point';
83 #ok !$config->set('print_center', ['t',80]), 'invalid point X';
84 #ok !$config->set('print_center', [50,'t']), 'invalid point Y';
85
86 $config->set('use_relative_e_distances', 1);
87 is $config->get('use_relative_e_distances'), 1, 'set/get bool';
88 is $config->serialize('use_relative_e_distances'), '1', 'serialize bool';
89
90 $config->set('gcode_flavor', 'teacup');
91 is $config->get('gcode_flavor'), 'teacup', 'set/get enum';
92 is $config->serialize('gcode_flavor'), 'teacup', 'serialize enum';
93 $config->set_deserialize('gcode_flavor', 'mach3');
94 is $config->get('gcode_flavor'), 'mach3', 'deserialize enum (gcode_flavor)';
95 $config->set_deserialize('gcode_flavor', 'machinekit');
96 is $config->get('gcode_flavor'), 'machinekit', 'deserialize enum (gcode_flavor)';
97
98 $config->set_deserialize('fill_pattern', 'line');
99 is $config->get('fill_pattern'), 'line', 'deserialize enum (fill_pattern)';
100
101 $config->set_deserialize('support_material_pattern', 'pillars');
102 is $config->get('support_material_pattern'), 'pillars', 'deserialize enum (support_material_pattern)';
103
104 $config->set('extruder_offset', [[10,20],[30,45]]);
105 is_deeply [ map $_->pp, @{$config->get('extruder_offset')} ], [[10,20],[30,45]], 'set/get points';
106 $config->set('extruder_offset', [Slic3r::Pointf->new(10,20),Slic3r::Pointf->new(30,45)]);
107 is_deeply [ map $_->pp, @{$config->get('extruder_offset')} ], [[10,20],[30,45]], 'set/get points';
108 is $config->serialize('extruder_offset'), '10x20,30x45', 'serialize points';
109 $config->set_deserialize('extruder_offset', '20x10');
110 is_deeply [ map $_->pp, @{$config->get('extruder_offset')} ], [[20,10]], 'deserialize points';
111 $config->set_deserialize('extruder_offset', '0x0');
112 is_deeply [ map $_->pp, @{$config->get('extruder_offset')} ], [[0,0]], 'deserialize points';
113 {
114 my @values = ([10,20]);
115 $values[2] = [10,20]; # implicitely extend array; this is not the same as explicitely assigning undef to second item
116 ok !$config->set('extruder_offset', \@values), 'reject undef points';
117 }
118
119 # truncate ->get() to first decimal digit
120 $config->set('nozzle_diameter', [0.2,3]);
121 is_deeply [ map int($_*10)/10, @{$config->get('nozzle_diameter')} ], [0.2,3], 'set/get floats';
122 is $config->serialize('nozzle_diameter'), '0.2,3', 'serialize floats';
123 $config->set_deserialize('nozzle_diameter', '0.1,0.4');
124 is_deeply [ map int($_*10)/10, @{$config->get('nozzle_diameter')} ], [0.1,0.4], 'deserialize floats';
125 $config->set_deserialize('nozzle_diameter', '3');
126 is_deeply [ map int($_*10)/10, @{$config->get('nozzle_diameter')} ], [3], 'deserialize a single float';
127 {
128 my @values = (0.4);
129 $values[2] = 2; # implicitely extend array; this is not the same as explicitely assigning undef to second item
130 ok !$config->set('nozzle_diameter', \@values), 'reject undef floats';
131 }
132
133 $config->set('temperature', [180,210]);
134 is_deeply $config->get('temperature'), [180,210], 'set/get ints';
135 is $config->serialize('temperature'), '180,210', 'serialize ints';
136 $config->set_deserialize('temperature', '195,220');
137 is_deeply $config->get('temperature'), [195,220], 'deserialize ints';
138 {
139 my @values = (180);
140 $values[2] = 200; # implicitely extend array; this is not the same as explicitely assigning undef to second item
141 ok !$config->set('temperature', \@values), 'reject undef ints';
142 }
143
144 $config->set('wipe', [1,0]);
145 is_deeply $config->get('wipe'), [1,0], 'set/get bools';
146 is $config->get_at('wipe', 0), 1, 'get_at bools';
147 is $config->get_at('wipe', 1), 0, 'get_at bools';
148 is $config->get_at('wipe', 9), 1, 'get_at bools';
149 is $config->serialize('wipe'), '1,0', 'serialize bools';
150 $config->set_deserialize('wipe', '0,1,1');
151 is_deeply $config->get('wipe'), [0,1,1], 'deserialize bools';
152 $config->set_deserialize('wipe', '');
153 is_deeply $config->get('wipe'), [], 'deserialize bools from empty string';
154 $config->set_deserialize('retract_layer_change', 0);
155 is_deeply $config->get('retract_layer_change'), [0], 'deserialize bools from non-string value';
156 {
157 my @values = (1);
158 $values[2] = 1; # implicitely extend array; this is not the same as explicitely assigning undef to second item
159 ok !$config->set('wipe', \@values), 'reject undef bools';
160 }
161
162 $config->set('post_process', ['foo','bar']);
163 is_deeply $config->get('post_process'), ['foo','bar'], 'set/get strings';
164 is $config->serialize('post_process'), 'foo;bar', 'serialize strings';
165 $config->set_deserialize('post_process', 'bar;baz');
166 is_deeply $config->get('post_process'), ['bar','baz'], 'deserialize strings';
167 {
168 my @values = ('foo');
169 $values[2] = 'bar'; # implicitely extend array; this is not the same as explicitely assigning undef to second item
170 ok !$config->set('post_process', \@values), 'reject undef strings';
171 }
172
173 is_deeply [ sort @{$config->get_keys} ], [ sort keys %{$config->as_hash} ], 'get_keys and as_hash';
174 }
175
176 {
177 my $config = Slic3r::Config->new;
178 $config->set('perimeters', 2);
179
180 # test that no crash happens when using set_deserialize() with a key that hasn't been set() yet
181 $config->set_deserialize('filament_diameter', '3');
182
183 my $config2 = Slic3r::Config::Static::new_FullPrintConfig;
184 $config2->apply_dynamic($config);
185 is $config2->get('perimeters'), 2, 'apply_dynamic';
186 }
187
188 {
189 my $config = Slic3r::Config::Static::new_FullPrintConfig;
190 my $config2 = Slic3r::Config->new;
191 $config2->apply_static($config);
192 is $config2->get('perimeters'), Slic3r::Config::print_config_def()->{perimeters}{default}, 'apply_static and print_config_def';
193
194 $config->set('top_solid_infill_speed', 70);
195 is $config->get_abs_value('top_solid_infill_speed'), 70, 'get_abs_value() works when ratio_over references a floatOrPercent option';
196 }
197
198 {
199 my $config = Slic3r::Config->new;
200 $config->set('fill_pattern', 'line');
201
202 my $config2 = Slic3r::Config->new;
203 $config2->set('fill_pattern', 'hilbertcurve');
204
205 is $config->get('fill_pattern'), 'line', 'no interferences between DynamicConfig objects';
206 }
207
208 {
209 my $config = Slic3r::Config->new;
210 # the pair [0,0] is part of the test, since it checks whether the 0x0 serialized value is correctly parsed
211 $config->set('extruder_offset', [ [0,0], [20,0], [0,20] ]);
212 my $config2 = Slic3r::Config->new;
213 $config2->apply($config);
214 is_deeply [ map $_->pp, @{$config->get('extruder_offset')} ], [ map $_->pp, @{$config2->get('extruder_offset')} ],
215 'apply dynamic over dynamic';
216 }
217
218 {
219 my $config = Slic3r::Config->new;
220 $config->set('extruder', 2);
221 $config->set('perimeter_extruder', 3);
222 $config->normalize;
223 ok !$config->has('extruder'), 'extruder option is removed after normalize()';
224 is $config->get('infill_extruder'), 2, 'undefined extruder is populated with default extruder';
225 is $config->get('perimeter_extruder'), 3, 'defined extruder is not overwritten by default extruder';
226 }
227
228 {
229 my $config = Slic3r::Config->new;
230 $config->set('infill_extruder', 2);
231 $config->normalize;
232 is $config->get('solid_infill_extruder'), 2, 'undefined solid infill extruder is populated with infill extruder';
233 }
234
235 {
236 my $config = Slic3r::Config->new;
237 $config->set('spiral_vase', 1);
238 $config->set('retract_layer_change', [1,0]);
239 $config->normalize;
240 is_deeply $config->get('retract_layer_change'), [0,0], 'retract_layer_change is disabled with spiral_vase';
241 }
242
243 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 2;
7
8 {
9 my $flow = Slic3r::Flow->new_from_width(
10 role => Slic3r::Flow::FLOW_ROLE_PERIMETER,
11 width => '1',
12 nozzle_diameter => 0.5,
13 layer_height => 0.3,
14 bridge_flow_ratio => 1,
15 );
16 isa_ok $flow, 'Slic3r::Flow', 'new_from_width';
17 }
18
19 {
20 my $flow = Slic3r::Flow->new(
21 width => 1,
22 height => 0.4,
23 nozzle_diameter => 0.5,
24 );
25 isa_ok $flow, 'Slic3r::Flow', 'new';
26 }
27
28 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 5;
7
8 {
9 my @points = (
10 Slic3r::Point->new(100, 200),
11 Slic3r::Point->new(500, -600),
12 );
13 my $bb = Slic3r::Geometry::BoundingBox->new_from_points(\@points);
14 isa_ok $bb, 'Slic3r::Geometry::BoundingBox', 'new_from_points';
15 is_deeply $bb->min_point->pp, [100,-600], 'min_point';
16 is_deeply $bb->max_point->pp, [500,200], 'max_point';
17 }
18
19 {
20 my $bb = Slic3r::Geometry::BoundingBox->new;
21 $bb->merge_point(Slic3r::Point->new(10, 10));
22 is_deeply $bb->min_point->pp, [10,10], 'min_point equals to the only defined point';
23 is_deeply $bb->max_point->pp, [10,10], 'max_point equals to the only defined point';
24 }
25
26 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 BEGIN {
6 use FindBin;
7 use lib "$FindBin::Bin/../../lib";
8 }
9
10 use Slic3r::XS;
11 use Test::More tests => 20;
12
13 my $square = Slic3r::Polygon->new( # ccw
14 [100, 100],
15 [200, 100],
16 [200, 200],
17 [100, 200],
18 );
19 my $hole_in_square = Slic3r::Polygon->new( # cw
20 [140, 140],
21 [140, 160],
22 [160, 160],
23 [160, 140],
24 );
25 $_->scale(1/0.000001) for $square, $hole_in_square;
26
27 my $expolygon = Slic3r::ExPolygon->new($square, $hole_in_square);
28
29 {
30 my $mp = Slic3r::MotionPlanner->new([ $expolygon ]);
31 isa_ok $mp, 'Slic3r::MotionPlanner';
32
33 my $from = Slic3r::Point->new(120, 120);
34 my $to = Slic3r::Point->new(180,180);
35 $_->scale(1/0.000001) for $from, $to;
36 my $path = $mp->shortest_path($from, $to);
37 ok $path->is_valid(), 'return path is valid';
38 ok $path->length > Slic3r::Line->new($from, $to)->length, 'path length is greater than straight line';
39 ok $path->first_point->coincides_with($from), 'first path point coincides with initial point';
40 ok $path->last_point->coincides_with($to), 'last path point coincides with destination point';
41 ok $expolygon->contains_polyline($path), 'path is fully contained in expolygon';
42 }
43
44 {
45 my $mp = Slic3r::MotionPlanner->new([ $expolygon ]);
46 isa_ok $mp, 'Slic3r::MotionPlanner';
47
48 my $from = Slic3r::Point->new(80, 100);
49 my $to = Slic3r::Point->new(220,200);
50 $_->scale(1/0.000001) for $from, $to;
51
52 my $path = $mp->shortest_path($from, $to);
53 ok $path->is_valid(), 'return path is valid';
54 ok $path->length > Slic3r::Line->new($from, $to)->length, 'path length is greater than straight line';
55 ok $path->first_point->coincides_with($from), 'first path point coincides with initial point';
56 ok $path->last_point->coincides_with($to), 'last path point coincides with destination point';
57 is scalar(@{ Slic3r::Geometry::Clipper::intersection_pl([$path], [@$expolygon]) }), 0, 'path has no intersection with expolygon';
58 }
59
60 {
61 my $expolygon2 = $expolygon->clone;
62 $expolygon2->translate(300/0.000001, 0);
63 my $mp = Slic3r::MotionPlanner->new([ $expolygon, $expolygon2 ]);
64 isa_ok $mp, 'Slic3r::MotionPlanner';
65
66 my $from = Slic3r::Point->new(120, 120);
67 my $to = Slic3r::Point->new(120 + 300, 120);
68 $_->scale(1/0.000001) for $from, $to;
69 ok $expolygon->contains_point($from), 'start point is contained in first expolygon';
70 ok $expolygon2->contains_point($to), 'end point is contained in second expolygon';
71 my $path = $mp->shortest_path($from, $to);
72 ok $path->is_valid(), 'return path is valid';
73 }
74
75 {
76 my $expolygons = [
77 Slic3r::ExPolygon->new([[123800962,89330311],[123959159,89699438],[124000004,89898430],[124000012,110116427],[123946510,110343065],[123767391,110701303],[123284087,111000001],[102585791,111000009],[102000004,110414223],[102000004,89585787],[102585790,89000000],[123300022,88999993]]),
78 Slic3r::ExPolygon->new([[97800954,89330311],[97959151,89699438],[97999996,89898430],[98000004,110116427],[97946502,110343065],[97767383,110701303],[97284079,111000001],[76585783,111000009],[75999996,110414223],[75999996,89585787],[76585782,89000000],[97300014,88999993]]),
79 ];
80 my $mp = Slic3r::MotionPlanner->new($expolygons);
81 isa_ok $mp, 'Slic3r::MotionPlanner';
82
83 my $from = Slic3r::Point->new(79120520, 107839491);
84 my $to = Slic3r::Point->new(104664164, 108335852);
85 ok $expolygons->[1]->contains_point($from), 'start point is contained in second expolygon';
86 ok $expolygons->[0]->contains_point($to), 'end point is contained in first expolygon';
87 my $path = $mp->shortest_path($from, $to);
88 ok $path->is_valid(), 'return path is valid';
89 }
90
91 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 4;
7
8 {
9 my $model = Slic3r::Model->new;
10 my $object = $model->_add_object;
11 isa_ok $object, 'Slic3r::Model::Object::Ref';
12 isa_ok $object->origin_translation, 'Slic3r::Pointf3::Ref';
13 $object->origin_translation->translate(10,0,0);
14 is_deeply \@{$object->origin_translation}, [10,0,0], 'origin_translation is modified by ref';
15
16 my $lhr = [ [ 5, 10, 0.1 ] ];
17 $object->set_layer_height_ranges($lhr);
18 is_deeply $object->layer_height_ranges, $lhr, 'layer_height_ranges roundtrip';
19 }
20
21 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 5;
7
8 {
9 my $print = Slic3r::Print->new;
10 isa_ok $print, 'Slic3r::Print';
11 isa_ok $print->config, 'Slic3r::Config::Static::Ref';
12 isa_ok $print->default_object_config, 'Slic3r::Config::Static::Ref';
13 isa_ok $print->default_region_config, 'Slic3r::Config::Static::Ref';
14 isa_ok $print->placeholder_parser, 'Slic3r::GCode::PlaceholderParser::Ref';
15 }
16
17 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 2;
7
8 {
9 my $gcodegen = Slic3r::GCode->new;
10 $gcodegen->set_origin(Slic3r::Pointf->new(10,0));
11 is_deeply $gcodegen->origin->pp, [10,0], 'set_origin';
12 $gcodegen->origin->translate(5,5);
13 is_deeply $gcodegen->origin->pp, [15,5], 'origin returns reference to point';
14 }
15
16 __END__
0 #!/usr/bin/perl
1
2 use strict;
3 use warnings;
4
5 use Slic3r::XS;
6 use Test::More tests => 1;
7
8 if ($ENV{SLIC3R_HAS_BROKEN_CROAK})
9 {
10 ok 1, 'SLIC3R_HAS_BROKEN_CROAK set, croaks and confesses from a C++ code will lead to an application exit!';
11 }
12 else
13 {
14 eval {
15 Slic3r::xspp_test_croak_hangs_on_strawberry();
16 };
17 is $@, "xspp_test_croak_hangs_on_strawberry: exception catched\n", 'croak from inside a C++ exception delivered';
18 }
19
20 __END__
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/BoundingBox.hpp"
5 #include "libslic3r/Point.hpp"
6 %}
7
8 %name{Slic3r::Geometry::BoundingBox} class BoundingBox {
9 BoundingBox();
10 ~BoundingBox();
11 Clone<BoundingBox> clone()
12 %code{% RETVAL = THIS; %};
13 void merge(BoundingBox* bb) %code{% THIS->merge(*bb); %};
14 void merge_point(Point* point) %code{% THIS->merge(*point); %};
15 void scale(double factor);
16 void translate(double x, double y);
17 void offset(double delta);
18 bool contains_point(Point* point) %code{% RETVAL = THIS->contains(*point); %};
19 bool overlap(BoundingBox* bbox) %code{% RETVAL = THIS->overlap(*bbox); %};
20 Clone<Polygon> polygon();
21 Clone<Point> size();
22 Clone<Point> center();
23 bool empty() %code{% RETVAL = empty(*THIS); %};
24 double radius();
25 Clone<Point> min_point() %code{% RETVAL = THIS->min; %};
26 Clone<Point> max_point() %code{% RETVAL = THIS->max; %};
27 long x_min() %code{% RETVAL = THIS->min.x; %};
28 long x_max() %code{% RETVAL = THIS->max.x; %};
29 long y_min() %code{% RETVAL = THIS->min.y; %};
30 long y_max() %code{% RETVAL = THIS->max.y; %};
31 std::string serialize() %code{% char buf[2048]; sprintf(buf, "%d,%d;%d,%d", THIS->min.x, THIS->min.y, THIS->max.x, THIS->max.y); RETVAL = buf; %};
32
33 %{
34
35 BoundingBox*
36 new_from_points(CLASS, points)
37 char* CLASS
38 Points points
39 CODE:
40 RETVAL = new BoundingBox(points);
41 OUTPUT:
42 RETVAL
43
44 %}
45 };
46
47 %name{Slic3r::Geometry::BoundingBoxf} class BoundingBoxf {
48 BoundingBoxf();
49 ~BoundingBoxf();
50 Clone<BoundingBoxf> clone()
51 %code{% RETVAL = THIS; %};
52 void merge(BoundingBoxf* bb) %code{% THIS->merge(*bb); %};
53 void merge_point(Pointf* point) %code{% THIS->merge(*point); %};
54 void scale(double factor);
55 void translate(double x, double y);
56 Clone<Pointf> size();
57 Clone<Pointf> center();
58 double radius();
59 bool empty() %code{% RETVAL = empty(*THIS); %};
60 Clone<Pointf> min_point() %code{% RETVAL = THIS->min; %};
61 Clone<Pointf> max_point() %code{% RETVAL = THIS->max; %};
62 double x_min() %code{% RETVAL = THIS->min.x; %};
63 double x_max() %code{% RETVAL = THIS->max.x; %};
64 double y_min() %code{% RETVAL = THIS->min.y; %};
65 double y_max() %code{% RETVAL = THIS->max.y; %};
66 void set_x_min(double val) %code{% THIS->min.x = val; %};
67 void set_x_max(double val) %code{% THIS->max.x = val; %};
68 void set_y_min(double val) %code{% THIS->min.y = val; %};
69 void set_y_max(double val) %code{% THIS->max.y = val; %};
70 std::string serialize() %code{% char buf[2048]; sprintf(buf, "%lf,%lf;%lf,%lf", THIS->min.x, THIS->min.y, THIS->max.x, THIS->max.y); RETVAL = buf; %};
71
72 %{
73
74 BoundingBoxf*
75 new_from_points(CLASS, points)
76 char* CLASS
77 Pointfs points
78 CODE:
79 RETVAL = new BoundingBoxf(points);
80 OUTPUT:
81 RETVAL
82
83 %}
84 };
85
86 %name{Slic3r::Geometry::BoundingBoxf3} class BoundingBoxf3 {
87 BoundingBoxf3();
88 ~BoundingBoxf3();
89 Clone<BoundingBoxf3> clone()
90 %code{% RETVAL = THIS; %};
91 void merge(BoundingBoxf3* bb) %code{% THIS->merge(*bb); %};
92 void merge_point(Pointf3* point) %code{% THIS->merge(*point); %};
93 void scale(double factor);
94 void translate(double x, double y, double z);
95 Clone<Pointf3> size();
96 Clone<Pointf3> center();
97 double radius();
98 bool empty() %code{% RETVAL = empty(*THIS); %};
99 Clone<Pointf3> min_point() %code{% RETVAL = THIS->min; %};
100 Clone<Pointf3> max_point() %code{% RETVAL = THIS->max; %};
101 double x_min() %code{% RETVAL = THIS->min.x; %};
102 double x_max() %code{% RETVAL = THIS->max.x; %};
103 double y_min() %code{% RETVAL = THIS->min.y; %};
104 double y_max() %code{% RETVAL = THIS->max.y; %};
105 double z_min() %code{% RETVAL = THIS->min.z; %};
106 double z_max() %code{% RETVAL = THIS->max.z; %};
107 std::string serialize() %code{% char buf[2048]; sprintf(buf, "%lf,%lf,%lf;%lf,%lf,%lf", THIS->min.x, THIS->min.y, THIS->min.z, THIS->max.x, THIS->max.y, THIS->max.z); RETVAL = buf; %};
108 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/BridgeDetector.hpp"
5 %}
6
7 %name{Slic3r::BridgeDetector} class BridgeDetector {
8 ~BridgeDetector();
9
10 bool detect_angle();
11 Polygons coverage();
12 %name{coverage_by_angle} Polygons coverage(double angle);
13 Polylines unsupported_edges();
14 %name{unsupported_edges_by_angle} Polylines unsupported_edges(double angle);
15 double angle()
16 %code{% RETVAL = THIS->angle; %};
17 double resolution()
18 %code{% RETVAL = THIS->resolution; %};
19 %{
20
21 BridgeDetector*
22 BridgeDetector::new(expolygon, lower_slices, extrusion_width)
23 ExPolygon* expolygon;
24 ExPolygonCollection* lower_slices;
25 long extrusion_width;
26 CODE:
27 RETVAL = new BridgeDetector(*expolygon, *lower_slices, extrusion_width);
28 OUTPUT:
29 RETVAL
30
31 BridgeDetector*
32 BridgeDetector::new_expolygons(expolygons, lower_slices, extrusion_width)
33 ExPolygonCollection* expolygons;
34 ExPolygonCollection* lower_slices;
35 long extrusion_width;
36 CODE:
37 RETVAL = new BridgeDetector(expolygons->expolygons, *lower_slices, extrusion_width);
38 OUTPUT:
39 RETVAL
40
41 %}
42 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "clipper.hpp"
5 #include "libslic3r/ClipperUtils.hpp"
6 %}
7
8 %package{Slic3r::Geometry::Clipper};
9
10 %{
11
12 IV
13 _constant()
14 ALIAS:
15 JT_MITER = jtMiter
16 JT_ROUND = jtRound
17 JT_SQUARE = jtSquare
18 CLIPPER_OFFSET_SCALE = CLIPPER_OFFSET_SCALE
19 CODE:
20 RETVAL = ix;
21 OUTPUT: RETVAL
22
23 Polygons
24 offset(polygons, delta, scale = CLIPPER_OFFSET_SCALE, joinType = ClipperLib::jtMiter, miterLimit = 3)
25 Polygons polygons
26 const float delta
27 double scale
28 ClipperLib::JoinType joinType
29 double miterLimit
30 CODE:
31 offset(polygons, &RETVAL, delta, scale, joinType, miterLimit);
32 OUTPUT:
33 RETVAL
34
35 ExPolygons
36 offset_ex(polygons, delta, scale = CLIPPER_OFFSET_SCALE, joinType = ClipperLib::jtMiter, miterLimit = 3)
37 Polygons polygons
38 const float delta
39 double scale
40 ClipperLib::JoinType joinType
41 double miterLimit
42 CODE:
43 offset(polygons, &RETVAL, delta, scale, joinType, miterLimit);
44 OUTPUT:
45 RETVAL
46
47 Polygons
48 offset2(polygons, delta1, delta2, scale = CLIPPER_OFFSET_SCALE, joinType = ClipperLib::jtMiter, miterLimit = 3)
49 Polygons polygons
50 const float delta1
51 const float delta2
52 double scale
53 ClipperLib::JoinType joinType
54 double miterLimit
55 CODE:
56 offset2(polygons, &RETVAL, delta1, delta2, scale, joinType, miterLimit);
57 OUTPUT:
58 RETVAL
59
60 ExPolygons
61 offset2_ex(polygons, delta1, delta2, scale = CLIPPER_OFFSET_SCALE, joinType = ClipperLib::jtMiter, miterLimit = 3)
62 Polygons polygons
63 const float delta1
64 const float delta2
65 double scale
66 ClipperLib::JoinType joinType
67 double miterLimit
68 CODE:
69 offset2(polygons, &RETVAL, delta1, delta2, scale, joinType, miterLimit);
70 OUTPUT:
71 RETVAL
72
73 Polygons
74 diff(subject, clip, safety_offset = false)
75 Polygons subject
76 Polygons clip
77 bool safety_offset
78 CODE:
79 diff(subject, clip, &RETVAL, safety_offset);
80 OUTPUT:
81 RETVAL
82
83 ExPolygons
84 diff_ex(subject, clip, safety_offset = false)
85 Polygons subject
86 Polygons clip
87 bool safety_offset
88 CODE:
89 diff(subject, clip, &RETVAL, safety_offset);
90 OUTPUT:
91 RETVAL
92
93 Polylines
94 diff_pl(subject, clip)
95 Polylines subject
96 Polygons clip
97 CODE:
98 diff(subject, clip, &RETVAL);
99 OUTPUT:
100 RETVAL
101
102 Polylines
103 diff_ppl(subject, clip)
104 Polygons subject
105 Polygons clip
106 CODE:
107 diff(subject, clip, &RETVAL);
108 OUTPUT:
109 RETVAL
110
111 Polygons
112 intersection(subject, clip, safety_offset = false)
113 Polygons subject
114 Polygons clip
115 bool safety_offset
116 CODE:
117 intersection(subject, clip, &RETVAL, safety_offset);
118 OUTPUT:
119 RETVAL
120
121 ExPolygons
122 intersection_ex(subject, clip, safety_offset = false)
123 Polygons subject
124 Polygons clip
125 bool safety_offset
126 CODE:
127 intersection(subject, clip, &RETVAL, safety_offset);
128 OUTPUT:
129 RETVAL
130
131 Polylines
132 intersection_pl(subject, clip)
133 Polylines subject
134 Polygons clip
135 CODE:
136 intersection(subject, clip, &RETVAL);
137 OUTPUT:
138 RETVAL
139
140 Polylines
141 intersection_ppl(subject, clip)
142 Polygons subject
143 Polygons clip
144 CODE:
145 intersection(subject, clip, &RETVAL);
146 OUTPUT:
147 RETVAL
148
149 ExPolygons
150 xor_ex(subject, clip, safety_offset = false)
151 Polygons subject
152 Polygons clip
153 bool safety_offset
154 CODE:
155 xor_(subject, clip, &RETVAL, safety_offset);
156 OUTPUT:
157 RETVAL
158
159 Polygons
160 union(subject, safety_offset = false)
161 Polygons subject
162 bool safety_offset
163 CODE:
164 union_(subject, &RETVAL, safety_offset);
165 OUTPUT:
166 RETVAL
167
168 ExPolygons
169 union_ex(subject, safety_offset = false)
170 Polygons subject
171 bool safety_offset
172 CODE:
173 union_(subject, &RETVAL, safety_offset);
174 OUTPUT:
175 RETVAL
176
177 SV*
178 union_pt(subject, safety_offset = false)
179 Polygons subject
180 bool safety_offset
181 CODE:
182 // perform operation
183 ClipperLib::PolyTree polytree;
184 union_pt(subject, &polytree, safety_offset);
185
186 RETVAL = polynode_children_2_perl(polytree);
187 OUTPUT:
188 RETVAL
189
190 Polygons
191 union_pt_chained(subject, safety_offset = false)
192 Polygons subject
193 bool safety_offset
194 CODE:
195 union_pt_chained(subject, &RETVAL, safety_offset);
196 OUTPUT:
197 RETVAL
198
199 Polygons
200 simplify_polygons(subject)
201 Polygons subject
202 CODE:
203 simplify_polygons(subject, &RETVAL);
204 OUTPUT:
205 RETVAL
206
207 %}
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/PrintConfig.hpp"
5 %}
6
7 %name{Slic3r::Config} class DynamicPrintConfig {
8 DynamicPrintConfig();
9 ~DynamicPrintConfig();
10 bool has(t_config_option_key opt_key);
11 SV* as_hash()
12 %code{% RETVAL = ConfigBase__as_hash(THIS); %};
13 SV* get(t_config_option_key opt_key)
14 %code{% RETVAL = ConfigBase__get(THIS, opt_key); %};
15 SV* get_at(t_config_option_key opt_key, int i)
16 %code{% RETVAL = ConfigBase__get_at(THIS, opt_key, i); %};
17 bool set(t_config_option_key opt_key, SV* value)
18 %code{% RETVAL = ConfigBase__set(THIS, opt_key, value); %};
19 bool set_deserialize(t_config_option_key opt_key, SV* str)
20 %code{% RETVAL = ConfigBase__set_deserialize(THIS, opt_key, str); %};
21 void set_ifndef(t_config_option_key opt_key, SV* value, bool deserialize = false)
22 %code{% ConfigBase__set_ifndef(THIS, opt_key, value, deserialize); %};
23 std::string serialize(t_config_option_key opt_key);
24 double get_abs_value(t_config_option_key opt_key);
25 %name{get_abs_value_over}
26 double get_abs_value(t_config_option_key opt_key, double ratio_over);
27 void apply(DynamicPrintConfig* other)
28 %code{% THIS->apply(*other, true); %};
29 std::vector<std::string> diff(DynamicPrintConfig* other)
30 %code{% RETVAL = THIS->diff(*other); %};
31 bool equals(DynamicPrintConfig* other)
32 %code{% RETVAL = THIS->equals(*other); %};
33 void apply_static(StaticPrintConfig* other)
34 %code{% THIS->apply(*other, true); %};
35 %name{get_keys} std::vector<std::string> keys();
36 void erase(t_config_option_key opt_key);
37 void normalize();
38 %name{setenv} void setenv_();
39 double min_object_distance();
40 };
41
42 %name{Slic3r::Config::Static} class StaticPrintConfig {
43 static StaticPrintConfig* new_GCodeConfig()
44 %code{% RETVAL = new GCodeConfig (); %};
45 static StaticPrintConfig* new_PrintConfig()
46 %code{% RETVAL = new PrintConfig (); %};
47 static StaticPrintConfig* new_PrintObjectConfig()
48 %code{% RETVAL = new PrintObjectConfig (); %};
49 static StaticPrintConfig* new_PrintRegionConfig()
50 %code{% RETVAL = new PrintRegionConfig (); %};
51 static StaticPrintConfig* new_FullPrintConfig()
52 %code{% RETVAL = new FullPrintConfig (); %};
53 ~StaticPrintConfig();
54 bool has(t_config_option_key opt_key);
55 SV* as_hash()
56 %code{% RETVAL = ConfigBase__as_hash(THIS); %};
57 SV* get(t_config_option_key opt_key)
58 %code{% RETVAL = ConfigBase__get(THIS, opt_key); %};
59 SV* get_at(t_config_option_key opt_key, int i)
60 %code{% RETVAL = ConfigBase__get_at(THIS, opt_key, i); %};
61 bool set(t_config_option_key opt_key, SV* value)
62 %code{% RETVAL = StaticConfig__set(THIS, opt_key, value); %};
63 bool set_deserialize(t_config_option_key opt_key, SV* str)
64 %code{% RETVAL = ConfigBase__set_deserialize(THIS, opt_key, str); %};
65 void set_ifndef(t_config_option_key opt_key, SV* value, bool deserialize = false)
66 %code{% ConfigBase__set_ifndef(THIS, opt_key, value, deserialize); %};
67 std::string serialize(t_config_option_key opt_key);
68 double get_abs_value(t_config_option_key opt_key);
69 %name{get_abs_value_over}
70 double get_abs_value(t_config_option_key opt_key, double ratio_over);
71 void apply_static(StaticPrintConfig* other)
72 %code{% THIS->apply(*other, true); %};
73 void apply_dynamic(DynamicPrintConfig* other)
74 %code{% THIS->apply(*other, true); %};
75 %name{get_keys} std::vector<std::string> keys();
76 std::string get_extrusion_axis()
77 %code{%
78 if (GCodeConfig* config = dynamic_cast<GCodeConfig*>(THIS)) {
79 RETVAL = config->get_extrusion_axis();
80 } else {
81 CONFESS("This StaticConfig object does not provide get_extrusion_axis()");
82 }
83 %};
84 %name{setenv} void setenv_();
85 double min_object_distance();
86 };
87
88 %package{Slic3r::Config};
89
90 %{
91 PROTOTYPES: DISABLE
92
93 SV*
94 print_config_def()
95 CODE:
96 t_optiondef_map &def = Slic3r::print_config_def.options;
97
98 HV* options_hv = newHV();
99 for (t_optiondef_map::iterator oit = def.begin(); oit != def.end(); ++oit) {
100 HV* hv = newHV();
101
102 t_config_option_key opt_key = oit->first;
103 ConfigOptionDef* optdef = &oit->second;
104
105 const char* opt_type;
106 if (optdef->type == coFloat || optdef->type == coFloats || optdef->type == coFloatOrPercent) {
107 opt_type = "f";
108 } else if (optdef->type == coPercent) {
109 opt_type = "percent";
110 } else if (optdef->type == coInt || optdef->type == coInts) {
111 opt_type = "i";
112 } else if (optdef->type == coString) {
113 opt_type = "s";
114 } else if (optdef->type == coStrings) {
115 opt_type = "s@";
116 } else if (optdef->type == coPoint || optdef->type == coPoints) {
117 opt_type = "point";
118 } else if (optdef->type == coBool || optdef->type == coBools) {
119 opt_type = "bool";
120 } else if (optdef->type == coEnum) {
121 opt_type = "select";
122 } else {
123 throw "Unknown option type";
124 }
125 (void)hv_stores( hv, "type", newSVpv(opt_type, 0) );
126 (void)hv_stores( hv, "gui_type", newSVpvn(optdef->gui_type.c_str(), optdef->gui_type.length()) );
127 (void)hv_stores( hv, "gui_flags", newSVpvn(optdef->gui_flags.c_str(), optdef->gui_flags.length()) );
128 (void)hv_stores( hv, "label", newSVpvn_utf8(optdef->label.c_str(), optdef->label.length(), true) );
129 if (!optdef->full_label.empty())
130 (void)hv_stores( hv, "full_label", newSVpvn_utf8(optdef->full_label.c_str(), optdef->full_label.length(), true) );
131 (void)hv_stores( hv, "category", newSVpvn(optdef->category.c_str(), optdef->category.length()) );
132 (void)hv_stores( hv, "tooltip", newSVpvn_utf8(optdef->tooltip.c_str(), optdef->tooltip.length(), true) );
133 (void)hv_stores( hv, "sidetext", newSVpvn_utf8(optdef->sidetext.c_str(), optdef->sidetext.length(), true) );
134 (void)hv_stores( hv, "cli", newSVpvn(optdef->cli.c_str(), optdef->cli.length()) );
135 (void)hv_stores( hv, "ratio_over", newSVpvn(optdef->ratio_over.c_str(), optdef->ratio_over.length()) );
136 (void)hv_stores( hv, "multiline", newSViv(optdef->multiline ? 1 : 0) );
137 (void)hv_stores( hv, "full_width", newSViv(optdef->full_width ? 1 : 0) );
138 (void)hv_stores( hv, "readonly", newSViv(optdef->readonly ? 1 : 0) );
139 (void)hv_stores( hv, "height", newSViv(optdef->height) );
140 (void)hv_stores( hv, "width", newSViv(optdef->width) );
141 (void)hv_stores( hv, "min", newSViv(optdef->min) );
142 (void)hv_stores( hv, "max", newSViv(optdef->max) );
143
144 // aliases
145 if (!optdef->aliases.empty()) {
146 AV* av = newAV();
147 av_fill(av, optdef->aliases.size()-1);
148 for (std::vector<t_config_option_key>::iterator it = optdef->aliases.begin(); it != optdef->aliases.end(); ++it)
149 av_store(av, it - optdef->aliases.begin(), newSVpvn(it->c_str(), it->length()));
150 (void)hv_stores( hv, "aliases", newRV_noinc((SV*)av) );
151 }
152
153 // shortcut
154 if (!optdef->shortcut.empty()) {
155 AV* av = newAV();
156 av_fill(av, optdef->shortcut.size()-1);
157 for (std::vector<t_config_option_key>::iterator it = optdef->shortcut.begin(); it != optdef->shortcut.end(); ++it)
158 av_store(av, it - optdef->shortcut.begin(), newSVpvn(it->c_str(), it->length()));
159 (void)hv_stores( hv, "shortcut", newRV_noinc((SV*)av) );
160 }
161
162 // enum_values
163 if (!optdef->enum_values.empty()) {
164 AV* av = newAV();
165 av_fill(av, optdef->enum_values.size()-1);
166 for (std::vector<std::string>::iterator it = optdef->enum_values.begin(); it != optdef->enum_values.end(); ++it)
167 av_store(av, it - optdef->enum_values.begin(), newSVpvn(it->c_str(), it->length()));
168 (void)hv_stores( hv, "values", newRV_noinc((SV*)av) );
169 }
170
171 // enum_labels
172 if (!optdef->enum_labels.empty()) {
173 AV* av = newAV();
174 av_fill(av, optdef->enum_labels.size()-1);
175 for (std::vector<std::string>::iterator it = optdef->enum_labels.begin(); it != optdef->enum_labels.end(); ++it)
176 av_store(av, it - optdef->enum_labels.begin(), newSVpvn_utf8(it->c_str(), it->length(), true));
177 (void)hv_stores( hv, "labels", newRV_noinc((SV*)av) );
178 }
179
180 if (optdef->default_value != NULL)
181 (void)hv_stores( hv, "default", ConfigOption_to_SV(*optdef->default_value, *optdef) );
182 (void)hv_store( options_hv, opt_key.c_str(), opt_key.length(), newRV_noinc((SV*)hv), 0 );
183 }
184
185 RETVAL = newRV_noinc((SV*)options_hv);
186 OUTPUT:
187 RETVAL
188 %}
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/ExPolygon.hpp"
5 %}
6
7 %name{Slic3r::ExPolygon} class ExPolygon {
8 ~ExPolygon();
9 Clone<ExPolygon> clone()
10 %code{% RETVAL = THIS; %};
11 SV* arrayref()
12 %code{% RETVAL = to_AV(THIS); %};
13 SV* pp()
14 %code{% RETVAL = to_SV_pureperl(THIS); %};
15 Ref<Polygon> contour()
16 %code{% RETVAL = &(THIS->contour); %};
17 Polygons* holes()
18 %code{% RETVAL = &(THIS->holes); %};
19 void scale(double factor);
20 void translate(double x, double y);
21 double area();
22 bool is_valid();
23 bool contains_line(Line* line)
24 %code{% RETVAL = THIS->contains(*line); %};
25 bool contains_polyline(Polyline* polyline)
26 %code{% RETVAL = THIS->contains(*polyline); %};
27 bool contains_point(Point* point)
28 %code{% RETVAL = THIS->contains(*point); %};
29 ExPolygons simplify(double tolerance);
30 Polygons simplify_p(double tolerance);
31 Polylines medial_axis(double max_width, double min_width)
32 %code{% THIS->medial_axis(max_width, min_width, &RETVAL); %};
33 Polygons get_trapezoids(double angle)
34 %code{% THIS->get_trapezoids(&RETVAL, angle); %};
35 Polygons get_trapezoids2(double angle)
36 %code{% THIS->get_trapezoids2(&RETVAL, angle); %};
37 Polygons triangulate()
38 %code{% THIS->triangulate(&RETVAL); %};
39 Polygons triangulate_pp()
40 %code{% THIS->triangulate_pp(&RETVAL); %};
41 %{
42
43 ExPolygon*
44 ExPolygon::new(...)
45 CODE:
46 RETVAL = new ExPolygon ();
47 // ST(0) is class name, ST(1) is contour and others are holes
48 from_SV_check(ST(1), &RETVAL->contour);
49 RETVAL->holes.resize(items-2);
50 for (unsigned int i = 2; i < items; i++) {
51 from_SV_check(ST(i), &RETVAL->holes[i-2]);
52 }
53 OUTPUT:
54 RETVAL
55
56 void
57 ExPolygon::rotate(angle, center_sv)
58 double angle;
59 SV* center_sv;
60 CODE:
61 Point center;
62 from_SV_check(center_sv, &center);
63 THIS->rotate(angle, center);
64
65 %}
66 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/ExPolygonCollection.hpp"
5 %}
6
7 %name{Slic3r::ExPolygon::Collection} class ExPolygonCollection {
8 ~ExPolygonCollection();
9 Clone<ExPolygonCollection> clone()
10 %code{% RETVAL = THIS; %};
11 void clear()
12 %code{% THIS->expolygons.clear(); %};
13 void scale(double factor);
14 void translate(double x, double y);
15 void rotate(double angle, Point* center)
16 %code{% THIS->rotate(angle, *center); %};
17 int count()
18 %code{% RETVAL = THIS->expolygons.size(); %};
19 bool contains_point(Point* point)
20 %code{% RETVAL = THIS->contains(*point); %};
21 bool contains_line(Line* line)
22 %code{% RETVAL = THIS->contains(*line); %};
23 bool contains_polyline(Polyline* polyline)
24 %code{% RETVAL = THIS->contains(*polyline); %};
25 void simplify(double tolerance);
26 Polygons polygons()
27 %code{% RETVAL = *THIS; %};
28 Clone<Polygon> convex_hull();
29 %{
30
31 ExPolygonCollection*
32 ExPolygonCollection::new(...)
33 CODE:
34 RETVAL = new ExPolygonCollection ();
35 // ST(0) is class name, others are expolygons
36 RETVAL->expolygons.resize(items-1);
37 for (unsigned int i = 1; i < items; i++) {
38 // Note: a COPY of the input is stored
39 from_SV_check(ST(i), &RETVAL->expolygons[i-1]);
40 }
41 OUTPUT:
42 RETVAL
43
44 SV*
45 ExPolygonCollection::arrayref()
46 CODE:
47 AV* av = newAV();
48 av_fill(av, THIS->expolygons.size()-1);
49 int i = 0;
50 for (ExPolygons::iterator it = THIS->expolygons.begin(); it != THIS->expolygons.end(); ++it) {
51 av_store(av, i++, perl_to_SV_ref(*it));
52 }
53 RETVAL = newRV_noinc((SV*)av);
54 OUTPUT:
55 RETVAL
56
57 SV*
58 ExPolygonCollection::pp()
59 CODE:
60 AV* av = newAV();
61 av_fill(av, THIS->expolygons.size()-1);
62 int i = 0;
63 for (ExPolygons::iterator it = THIS->expolygons.begin(); it != THIS->expolygons.end(); ++it) {
64 av_store(av, i++, to_SV_pureperl(&*it));
65 }
66 RETVAL = newRV_noinc((SV*)av);
67 OUTPUT:
68 RETVAL
69
70 void
71 ExPolygonCollection::append(...)
72 CODE:
73 for (unsigned int i = 1; i < items; i++) {
74 ExPolygon expolygon;
75 from_SV_check(ST(i), &expolygon);
76 THIS->expolygons.push_back(expolygon);
77 }
78
79 %}
80 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/Extruder.hpp"
5 %}
6
7 %name{Slic3r::Extruder} class Extruder {
8 Extruder(unsigned int id, StaticPrintConfig* config)
9 %code%{ RETVAL = new Extruder (id, dynamic_cast<GCodeConfig*>(config)); %};
10 ~Extruder();
11 void reset();
12 double extrude(double dE);
13 double retract(double length, double restart_extra);
14 double unretract();
15 double e_per_mm(double mm3_per_mm);
16 double extruded_volume();
17 double used_filament();
18
19 unsigned int id()
20 %code%{ RETVAL = THIS->id; %};
21
22 double E()
23 %code%{ RETVAL = THIS->E; %};
24 double set_E(double val)
25 %code%{ RETVAL = THIS->E = val; %};
26 double absolute_E()
27 %code%{ RETVAL = THIS->absolute_E; %};
28 double set_absolute_E(double val)
29 %code%{ RETVAL = THIS->absolute_E = val; %};
30 double retracted()
31 %code%{ RETVAL = THIS->retracted; %};
32 double set_retracted(double val)
33 %code%{ RETVAL = THIS->retracted = val; %};
34 double restart_extra()
35 %code%{ RETVAL = THIS->restart_extra; %};
36 double set_restart_extra(double val)
37 %code%{ RETVAL = THIS->restart_extra = val; %};
38 double e_per_mm3()
39 %code%{ RETVAL = THIS->e_per_mm3; %};
40 double retract_speed_mm_min()
41 %code%{ RETVAL = THIS->retract_speed_mm_min; %};
42
43 double filament_diameter();
44 double extrusion_multiplier();
45 double retract_length();
46 double retract_lift();
47 int retract_speed();
48 double retract_restart_extra();
49 double retract_length_toolchange();
50 double retract_restart_extra_toolchange();
51 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/ExtrusionEntityCollection.hpp"
5 %}
6
7 %name{Slic3r::ExtrusionPath::Collection} class ExtrusionEntityCollection {
8 %name{_new} ExtrusionEntityCollection();
9 ~ExtrusionEntityCollection();
10 Clone<ExtrusionEntityCollection> clone()
11 %code{% RETVAL = THIS->clone(); %};
12 void reverse();
13 void clear();
14 ExtrusionEntityCollection* chained_path(bool no_reverse)
15 %code{%
16 RETVAL = new ExtrusionEntityCollection();
17 THIS->chained_path(RETVAL, no_reverse);
18 %};
19 ExtrusionEntityCollection* chained_path_from(Point* start_near, bool no_reverse)
20 %code{%
21 RETVAL = new ExtrusionEntityCollection();
22 THIS->chained_path_from(*start_near, RETVAL, no_reverse);
23 %};
24 Clone<Point> first_point();
25 Clone<Point> last_point();
26 int count()
27 %code{% RETVAL = THIS->entities.size(); %};
28 int items_count()
29 %code{% RETVAL = THIS->items_count(); %};
30 ExtrusionEntityCollection* flatten()
31 %code{%
32 RETVAL = new ExtrusionEntityCollection();
33 THIS->flatten(RETVAL);
34 %};
35 double min_mm3_per_mm();
36 bool empty()
37 %code{% RETVAL = THIS->entities.empty(); %};
38 std::vector<size_t> orig_indices()
39 %code{% RETVAL = THIS->orig_indices; %};
40 Polygons polygons_covered_by_width();
41 Polygons polygons_covered_by_spacing();
42 %{
43
44 SV*
45 ExtrusionEntityCollection::arrayref()
46 CODE:
47 AV* av = newAV();
48 av_fill(av, THIS->entities.size()-1);
49 int i = 0;
50 for (ExtrusionEntitiesPtr::iterator it = THIS->entities.begin(); it != THIS->entities.end(); ++it) {
51 SV* sv = newSV(0);
52 // return our item by reference
53 if (ExtrusionPath* path = dynamic_cast<ExtrusionPath*>(*it)) {
54 sv_setref_pv( sv, perl_class_name_ref(path), path );
55 } else if (ExtrusionLoop* loop = dynamic_cast<ExtrusionLoop*>(*it)) {
56 sv_setref_pv( sv, perl_class_name_ref(loop), loop );
57 } else if (ExtrusionEntityCollection* collection = dynamic_cast<ExtrusionEntityCollection*>(*it)) {
58 sv_setref_pv( sv, perl_class_name_ref(collection), collection );
59 } else {
60 croak("Unexpected type in ExtrusionEntityCollection");
61 }
62 av_store(av, i++, sv);
63 }
64 RETVAL = newRV_noinc((SV*)av);
65 OUTPUT:
66 RETVAL
67
68 void
69 ExtrusionEntityCollection::append(...)
70 CODE:
71 for (unsigned int i = 1; i < items; i++) {
72 if(!sv_isobject( ST(i) ) || (SvTYPE(SvRV( ST(i) )) != SVt_PVMG)) {
73 croak("Argument %d is not object", i);
74 }
75 ExtrusionEntity* entity = (ExtrusionEntity *)SvIV((SV*)SvRV( ST(i) ));
76 // append COPIES
77 if (ExtrusionPath* path = dynamic_cast<ExtrusionPath*>(entity)) {
78 THIS->entities.push_back( new ExtrusionPath(*path) );
79 } else if (ExtrusionLoop* loop = dynamic_cast<ExtrusionLoop*>(entity)) {
80 THIS->entities.push_back( new ExtrusionLoop(*loop) );
81 } else if(ExtrusionEntityCollection* collection = dynamic_cast<ExtrusionEntityCollection*>(entity)) {
82 THIS->entities.push_back( collection->clone() );
83 } else {
84 croak("Argument %d is of unknown type", i);
85 }
86 }
87
88 bool
89 ExtrusionEntityCollection::no_sort(...)
90 CODE:
91 if (items > 1) {
92 THIS->no_sort = SvTRUE(ST(1));
93 }
94 RETVAL = THIS->no_sort;
95 OUTPUT:
96 RETVAL
97
98 ExtrusionEntityCollection*
99 ExtrusionEntityCollection::chained_path_indices(bool no_reverse)
100 CODE:
101 RETVAL = new ExtrusionEntityCollection();
102 THIS->chained_path(RETVAL, no_reverse, &RETVAL->orig_indices);
103 OUTPUT:
104 RETVAL
105
106 %}
107 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/ExtrusionEntity.hpp"
5 %}
6
7 %name{Slic3r::ExtrusionLoop} class ExtrusionLoop {
8 ExtrusionLoop();
9 ~ExtrusionLoop();
10 Clone<ExtrusionLoop> clone()
11 %code{% RETVAL = THIS; %};
12 void reverse();
13 bool make_clockwise();
14 bool make_counter_clockwise();
15 Clone<Point> first_point();
16 Clone<Point> last_point();
17 Clone<Polygon> polygon();
18 void append(ExtrusionPath* path)
19 %code{% THIS->paths.push_back(*path); %};
20 double length();
21 bool split_at_vertex(Point* point)
22 %code{% RETVAL = THIS->split_at_vertex(*point); %};
23 void split_at(Point* point)
24 %code{% THIS->split_at(*point); %};
25 ExtrusionPaths clip_end(double distance)
26 %code{% THIS->clip_end(distance, &RETVAL); %};
27 bool has_overhang_point(Point* point)
28 %code{% RETVAL = THIS->has_overhang_point(*point); %};
29 bool is_perimeter();
30 bool is_infill();
31 bool is_solid_infill();
32 Polygons polygons_covered_by_width();
33 Polygons polygons_covered_by_spacing();
34 %{
35
36 SV*
37 ExtrusionLoop::arrayref()
38 CODE:
39 AV* av = newAV();
40 av_fill(av, THIS->paths.size()-1);
41 for (ExtrusionPaths::iterator it = THIS->paths.begin(); it != THIS->paths.end(); ++it) {
42 av_store(av, it - THIS->paths.begin(), perl_to_SV_ref(*it));
43 }
44 RETVAL = newRV_noinc((SV*)av);
45 OUTPUT:
46 RETVAL
47
48 ExtrusionLoopRole
49 ExtrusionLoop::role(...)
50 CODE:
51 if (items > 1) {
52 THIS->role = (ExtrusionLoopRole)SvUV(ST(1));
53 }
54 RETVAL = THIS->role;
55 OUTPUT:
56 RETVAL
57
58 %}
59 };
60
61 %package{Slic3r::ExtrusionLoop};
62 %{
63
64 IV
65 _constant()
66 ALIAS:
67 EXTRL_ROLE_DEFAULT = elrDefault
68 EXTRL_ROLE_CONTOUR_INTERNAL_PERIMETER = elrContourInternalPerimeter
69 EXTRL_ROLE_SKIRT = elrSkirt
70 PROTOTYPE:
71 CODE:
72 RETVAL = ix;
73 OUTPUT: RETVAL
74
75 %}
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/ExtrusionEntity.hpp"
5 #include "libslic3r/ExtrusionEntityCollection.hpp"
6 %}
7
8 %name{Slic3r::ExtrusionPath} class ExtrusionPath {
9 ~ExtrusionPath();
10 SV* arrayref()
11 %code{% RETVAL = to_AV(&THIS->polyline); %};
12 SV* pp()
13 %code{% RETVAL = to_SV_pureperl(&THIS->polyline); %};
14 void pop_back()
15 %code{% THIS->polyline.points.pop_back(); %};
16 void reverse();
17 Lines lines()
18 %code{% RETVAL = THIS->polyline.lines(); %};
19 Clone<Point> first_point();
20 Clone<Point> last_point();
21 void clip_end(double distance);
22 void simplify(double tolerance);
23 double length();
24 bool is_perimeter();
25 bool is_infill();
26 bool is_solid_infill();
27 bool is_bridge();
28 Polygons polygons_covered_by_width();
29 Polygons polygons_covered_by_spacing();
30 %{
31
32 ExtrusionPath*
33 _new(CLASS, polyline_sv, role, mm3_per_mm, width, height)
34 char* CLASS;
35 SV* polyline_sv;
36 ExtrusionRole role;
37 double mm3_per_mm;
38 float width;
39 float height;
40 CODE:
41 RETVAL = new ExtrusionPath (role);
42 from_SV_check(polyline_sv, &RETVAL->polyline);
43 RETVAL->mm3_per_mm = mm3_per_mm;
44 RETVAL->width = width;
45 RETVAL->height = height;
46 OUTPUT:
47 RETVAL
48
49 Ref<Polyline>
50 ExtrusionPath::polyline(...)
51 CODE:
52 if (items > 1) {
53 from_SV_check(ST(1), &THIS->polyline);
54 }
55 RETVAL = &(THIS->polyline);
56 OUTPUT:
57 RETVAL
58
59 ExtrusionRole
60 ExtrusionPath::role(...)
61 CODE:
62 if (items > 1) {
63 THIS->role = (ExtrusionRole)SvUV(ST(1));
64 }
65 RETVAL = THIS->role;
66 OUTPUT:
67 RETVAL
68
69 double
70 ExtrusionPath::mm3_per_mm(...)
71 CODE:
72 if (items > 1) {
73 THIS->mm3_per_mm = (double)SvNV(ST(1));
74 }
75 RETVAL = THIS->mm3_per_mm;
76 OUTPUT:
77 RETVAL
78
79 float
80 ExtrusionPath::width(...)
81 CODE:
82 if (items > 1) {
83 THIS->width = (float)SvNV(ST(1));
84 }
85 RETVAL = THIS->width;
86 OUTPUT:
87 RETVAL
88
89 float
90 ExtrusionPath::height(...)
91 CODE:
92 if (items > 1) {
93 THIS->height = (float)SvNV(ST(1));
94 }
95 RETVAL = THIS->height;
96 OUTPUT:
97 RETVAL
98
99 void
100 ExtrusionPath::append(...)
101 CODE:
102 for (unsigned int i = 1; i < items; i++) {
103 Point p;
104 from_SV_check(ST(i), &p);
105 THIS->polyline.points.push_back(p);
106 }
107
108 ExtrusionEntityCollection*
109 ExtrusionPath::intersect_expolygons(ExPolygonCollection* collection)
110 CODE:
111 RETVAL = new ExtrusionEntityCollection ();
112 THIS->intersect_expolygons(*collection, RETVAL);
113 OUTPUT:
114 RETVAL
115
116 ExtrusionEntityCollection*
117 ExtrusionPath::subtract_expolygons(ExPolygonCollection* collection)
118 CODE:
119 RETVAL = new ExtrusionEntityCollection ();
120 THIS->subtract_expolygons(*collection, RETVAL);
121 OUTPUT:
122 RETVAL
123
124 %}
125 };
126
127 %package{Slic3r::ExtrusionPath};
128 %{
129
130 IV
131 _constant()
132 ALIAS:
133 EXTR_ROLE_NONE = erNone
134 EXTR_ROLE_PERIMETER = erPerimeter
135 EXTR_ROLE_EXTERNAL_PERIMETER = erExternalPerimeter
136 EXTR_ROLE_OVERHANG_PERIMETER = erOverhangPerimeter
137 EXTR_ROLE_FILL = erInternalInfill
138 EXTR_ROLE_SOLIDFILL = erSolidInfill
139 EXTR_ROLE_TOPSOLIDFILL = erTopSolidInfill
140 EXTR_ROLE_BRIDGE = erBridgeInfill
141 EXTR_ROLE_GAPFILL = erGapFill
142 EXTR_ROLE_SKIRT = erSkirt
143 EXTR_ROLE_SUPPORTMATERIAL = erSupportMaterial
144 EXTR_ROLE_SUPPORTMATERIAL_INTERFACE = erSupportMaterialInterface
145 PROTOTYPE:
146 CODE:
147 RETVAL = ix;
148 OUTPUT: RETVAL
149
150 %}
151
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/ExtrusionSimulator.hpp"
5 %}
6
7 %name{Slic3r::ExtrusionSimulator} class ExtrusionSimulator {
8 ~ExtrusionSimulator();
9 %name{_new} ExtrusionSimulator();
10
11 Clone<ExtrusionSimulator> clone()
12 %code{% RETVAL = THIS; %};
13
14 void set_image_size(Point *image_size)
15 %code{% THIS->set_image_size(*image_size); %};
16 void set_viewport(BoundingBox *viewport)
17 %code{% THIS->set_viewport(*viewport); %};
18 void set_bounding_box(BoundingBox *bbox)
19 %code{% THIS->set_bounding_box(*bbox); %};
20
21 void reset_accumulator();
22 void extrude_to_accumulator(ExtrusionPath *path, Point *shift, ExtrusionSimulationType simulationType)
23 %code{% THIS->extrude_to_accumulator(*path, *shift, simulationType); %};
24 void evaluate_accumulator(ExtrusionSimulationType simulationType);
25 void* image_ptr()
26 %code{% RETVAL = const_cast<void*>(const_cast<Slic3r::ExtrusionSimulator*>(THIS)->image_ptr()); %};
27
28 %{
29
30 %}
31 };
32
33 %package{Slic3r::ExtrusionSimulator};
34 %{
35
36 IV
37 _constant()
38 ALIAS:
39 EXTRSIM_SIMPLE = ExtrusionSimulationSimple
40 EXTRSIM_DONT_SPREAD = ExtrusionSimulationDontSpread
41 EXTRSIM_SPREAD_NFULL = ExtrisopmSimulationSpreadNotOverfilled
42 EXTRSIM_SPREAD_FULL = ExtrusionSimulationSpreadFull
43 EXTRSIM_SPREAD_EXCESS = ExtrusionSimulationSpreadExcess
44 PROTOTYPE:
45 CODE:
46 RETVAL = ix;
47 OUTPUT: RETVAL
48
49 %}
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/Fill/Fill.hpp"
5 #include "libslic3r/PolylineCollection.hpp"
6 #include "libslic3r/ExtrusionEntity.hpp"
7 #include "libslic3r/ExtrusionEntityCollection.hpp"
8 %}
9
10 %name{Slic3r::Filler} class Filler {
11 ~Filler();
12
13 void set_bounding_box(BoundingBox *bbox)
14 %code{% THIS->fill->set_bounding_box(*bbox); %};
15 void set_spacing(coordf_t spacing)
16 %code{% THIS->fill->spacing = spacing; %};
17 coordf_t spacing()
18 %code{% RETVAL = THIS->fill->spacing; %};
19 void set_layer_id(size_t layer_id)
20 %code{% THIS->fill->layer_id = layer_id; %};
21 void set_z(coordf_t z)
22 %code{% THIS->fill->z = z; %};
23 void set_angle(float angle)
24 %code{% THIS->fill->angle = angle; %};
25 void set_link_max_length(coordf_t len)
26 %code{% THIS->fill->link_max_length = len; %};
27 void set_loop_clipping(coordf_t clipping)
28 %code{% THIS->fill->loop_clipping = clipping; %};
29
30 bool use_bridge_flow()
31 %code{% RETVAL = THIS->fill->use_bridge_flow(); %};
32 bool no_sort()
33 %code{% RETVAL = THIS->fill->no_sort(); %};
34
35 void set_density(float density)
36 %code{% THIS->params.density = density; %};
37 void set_dont_connect(bool dont_connect)
38 %code{% THIS->params.dont_connect = dont_connect; %};
39 void set_dont_adjust(bool dont_adjust)
40 %code{% THIS->params.dont_adjust = dont_adjust; %};
41 void set_complete(bool complete)
42 %code{% THIS->params.complete = complete; %};
43
44 PolylineCollection* _fill_surface(Surface *surface)
45 %code{%
46 PolylineCollection *pc = NULL;
47 if (THIS->fill != NULL) {
48 pc = new PolylineCollection();
49 pc->polylines = THIS->fill->fill_surface(surface, THIS->params);
50 }
51 RETVAL = pc;
52 %};
53
54 %{
55
56 Filler*
57 new_from_type(CLASS, type)
58 char* CLASS;
59 std::string type;
60 CODE:
61 Filler *filler = new Filler();
62 filler->fill = Fill::new_from_type(type);
63 RETVAL = filler;
64 OUTPUT:
65 RETVAL
66
67 void
68 make_fill(CLASS, layer_region, out_append)
69 char* CLASS;
70 LayerRegion* layer_region;
71 ExtrusionEntityCollection* out_append;
72 CODE:
73 make_fill(*layer_region, *out_append);
74 %}
75
76 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/Flow.hpp"
5 %}
6
7 %name{Slic3r::Flow} class Flow {
8 ~Flow();
9 %name{_new} Flow(float width, float height, float nozzle_diameter);
10 void set_height(float height)
11 %code{% THIS->height = height; %};
12 void set_bridge(bool bridge)
13 %code{% THIS->bridge = bridge; %};
14 Clone<Flow> clone()
15 %code{% RETVAL = THIS; %};
16
17 float width()
18 %code{% RETVAL = THIS->width; %};
19 float height()
20 %code{% RETVAL = THIS->height; %};
21 float nozzle_diameter()
22 %code{% RETVAL = THIS->nozzle_diameter; %};
23 bool bridge()
24 %code{% RETVAL = THIS->bridge; %};
25 float spacing();
26 float spacing_to(Flow* other)
27 %code{% RETVAL = THIS->spacing(*other); %};
28 long scaled_width();
29 long scaled_spacing();
30 double mm3_per_mm();
31 %{
32
33 Flow*
34 _new_from_width(CLASS, role, width, nozzle_diameter, height, bridge_flow_ratio)
35 char* CLASS;
36 FlowRole role;
37 std::string width;
38 float nozzle_diameter;
39 float height;
40 float bridge_flow_ratio;
41 CODE:
42 ConfigOptionFloatOrPercent optwidth;
43 optwidth.deserialize(width);
44 RETVAL = new Flow(Flow::new_from_config_width(role, optwidth, nozzle_diameter, height, bridge_flow_ratio));
45 OUTPUT:
46 RETVAL
47
48 Flow*
49 _new_from_spacing(CLASS, spacing, nozzle_diameter, height, bridge)
50 char* CLASS;
51 float spacing;
52 float nozzle_diameter;
53 float height;
54 bool bridge;
55 CODE:
56 RETVAL = new Flow(Flow::new_from_spacing(spacing, nozzle_diameter, height, bridge));
57 OUTPUT:
58 RETVAL
59
60 %}
61 };
62
63 %package{Slic3r::Flow};
64 %{
65
66 IV
67 _constant()
68 ALIAS:
69 FLOW_ROLE_EXTERNAL_PERIMETER = frExternalPerimeter
70 FLOW_ROLE_PERIMETER = frPerimeter
71 FLOW_ROLE_INFILL = frInfill
72 FLOW_ROLE_SOLID_INFILL = frSolidInfill
73 FLOW_ROLE_TOP_SOLID_INFILL = frTopSolidInfill
74 FLOW_ROLE_SUPPORT_MATERIAL = frSupportMaterial
75 FLOW_ROLE_SUPPORT_MATERIAL_INTERFACE = frSupportMaterialInterface
76 PROTOTYPE:
77 CODE:
78 RETVAL = ix;
79 OUTPUT: RETVAL
80
81 %}
82
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/GCode.hpp"
5 %}
6
7 %name{Slic3r::GCode::AvoidCrossingPerimeters} class AvoidCrossingPerimeters {
8 AvoidCrossingPerimeters();
9 ~AvoidCrossingPerimeters();
10
11 void init_external_mp(ExPolygons islands);
12 void init_layer_mp(ExPolygons islands);
13 Clone<Polyline> travel_to(GCode* gcode, Point* point)
14 %code{% RETVAL = THIS->travel_to(*gcode, *point); %};
15
16 bool use_external_mp()
17 %code{% RETVAL = THIS->use_external_mp; %};
18 void set_use_external_mp(bool value)
19 %code{% THIS->use_external_mp = value; %};
20
21 bool use_external_mp_once()
22 %code{% RETVAL = THIS->use_external_mp_once; %};
23 void set_use_external_mp_once(bool value)
24 %code{% THIS->use_external_mp_once = value; %};
25
26 bool disable_once()
27 %code{% RETVAL = THIS->disable_once; %};
28 void set_disable_once(bool value)
29 %code{% THIS->disable_once = value; %};
30 };
31
32 %name{Slic3r::GCode::OozePrevention} class OozePrevention {
33 OozePrevention();
34 ~OozePrevention();
35
36 bool enable()
37 %code{% RETVAL = THIS->enable; %};
38 void set_enable(bool value)
39 %code{% THIS->enable = value; %};
40
41 Points standby_points()
42 %code{% RETVAL = THIS->standby_points; %};
43 void set_standby_points(Points points)
44 %code{% THIS->standby_points = points; %};
45
46 std::string pre_toolchange(GCode* gcodegen)
47 %code{% RETVAL = THIS->pre_toolchange(*gcodegen); %};
48 std::string post_toolchange(GCode* gcodegen)
49 %code{% RETVAL = THIS->post_toolchange(*gcodegen); %};
50 };
51
52 %name{Slic3r::GCode::Wipe} class Wipe {
53 Wipe();
54 ~Wipe();
55
56 bool has_path();
57 void reset_path();
58 std::string wipe(GCode* gcodegen, bool toolchange = false)
59 %code{% RETVAL = THIS->wipe(*gcodegen, toolchange); %};
60
61 bool enable()
62 %code{% RETVAL = THIS->enable; %};
63 void set_enable(bool value)
64 %code{% THIS->enable = value; %};
65
66 Ref<Polyline> path()
67 %code{% RETVAL = &(THIS->path); %};
68 void set_path(Polyline* value)
69 %code{% THIS->path = *value; %};
70 };
71
72 %name{Slic3r::GCode} class GCode {
73 GCode();
74 ~GCode();
75
76 Ref<Pointf> origin()
77 %code{% RETVAL = &(THIS->origin); %};
78
79 Ref<StaticPrintConfig> config()
80 %code{% RETVAL = &(THIS->config); %};
81
82 Ref<GCodeWriter> writer()
83 %code{% RETVAL = &(THIS->writer); %};
84
85 Ref<PlaceholderParser> placeholder_parser()
86 %code{% RETVAL = THIS->placeholder_parser; %};
87 void set_placeholder_parser(PlaceholderParser* ptr)
88 %code{% THIS->placeholder_parser = ptr; %};
89
90 Ref<OozePrevention> ooze_prevention()
91 %code{% RETVAL = &(THIS->ooze_prevention); %};
92
93 Ref<Wipe> wipe()
94 %code{% RETVAL = &(THIS->wipe); %};
95
96 Ref<AvoidCrossingPerimeters> avoid_crossing_perimeters()
97 %code{% RETVAL = &(THIS->avoid_crossing_perimeters); %};
98
99 bool enable_loop_clipping()
100 %code{% RETVAL = THIS->enable_loop_clipping; %};
101 void set_enable_loop_clipping(bool value)
102 %code{% THIS->enable_loop_clipping = value; %};
103
104 bool enable_cooling_markers()
105 %code{% RETVAL = THIS->enable_cooling_markers; %};
106 void set_enable_cooling_markers(bool value)
107 %code{% THIS->enable_cooling_markers = value; %};
108
109 bool enable_extrusion_role_markers()
110 %code{% RETVAL = THIS->enable_extrusion_role_markers; %};
111 void set_enable_extrusion_role_markers(bool value)
112 %code{% THIS->enable_extrusion_role_markers = value; %};
113
114 int layer_count()
115 %code{% RETVAL = THIS->layer_count; %};
116 void set_layer_count(int value)
117 %code{% THIS->layer_count = value; %};
118
119 int layer_index()
120 %code{% RETVAL = THIS->layer_index; %};
121 void set_layer_index(int value)
122 %code{% THIS->layer_index = value; %};
123
124 bool has_layer()
125 %code{% RETVAL = THIS->layer != NULL; %};
126 Ref<Layer> layer()
127 %code{% RETVAL = THIS->layer; %};
128 void set_layer(Layer* ptr)
129 %code{% THIS->layer = ptr; %};
130
131 bool first_layer()
132 %code{% RETVAL = THIS->first_layer; %};
133 void set_first_layer(bool value)
134 %code{% THIS->first_layer = value; %};
135
136 float elapsed_time()
137 %code{% RETVAL = THIS->elapsed_time; %};
138 void set_elapsed_time(float value)
139 %code{% THIS->elapsed_time = value; %};
140
141 bool last_pos_defined();
142 Ref<Point> last_pos()
143 %code{% RETVAL = &(THIS->last_pos()); %};
144 void set_last_pos(Point* pos)
145 %code{% THIS->set_last_pos(*pos); %};
146
147 double volumetric_speed()
148 %code{% RETVAL = THIS->volumetric_speed; %};
149 void set_volumetric_speed(double value)
150 %code{% THIS->volumetric_speed = value; %};
151
152 void apply_print_config(StaticPrintConfig* print_config)
153 %code{%
154 if (const PrintConfig* config = dynamic_cast<PrintConfig*>(print_config)) {
155 THIS->apply_print_config(*config);
156 } else {
157 CONFESS("A PrintConfig object was not supplied to apply_print_config()");
158 }
159 %};
160 void set_extruders(std::vector<unsigned int> extruder_ids);
161 void set_origin(Pointf* pointf)
162 %code{% THIS->set_origin(*pointf); %};
163 std::string preamble();
164 std::string change_layer(Layer* layer)
165 %code{% RETVAL = THIS->change_layer(*layer); %};
166 %name{extrude_loop} std::string extrude(ExtrusionLoop* loop, std::string description = "", double speed = -1)
167 %code{% RETVAL = THIS->extrude(*loop, description, speed); %};
168 %name{extrude_path} std::string extrude(ExtrusionPath* path, std::string description = "", double speed = -1)
169 %code{% RETVAL = THIS->extrude(*path, description, speed); %};
170 std::string travel_to(Point* point, ExtrusionRole role, std::string comment)
171 %code{% RETVAL = THIS->travel_to(*point, role, comment); %};
172 bool needs_retraction(Polyline* travel, ExtrusionRole role = erNone)
173 %code{% RETVAL = THIS->needs_retraction(*travel, role); %};
174 std::string retract(bool toolchange = false);
175 std::string unretract();
176 std::string set_extruder(unsigned int extruder_id);
177 Clone<Pointf> point_to_gcode(Point* point)
178 %code{% RETVAL = THIS->point_to_gcode(*point); %};
179
180 %{
181 std::string
182 GCode::extrude(entity, description, speed)
183 SV* entity
184 std::string description;
185 double speed;
186 CODE:
187 ExtrusionEntity* e = (ExtrusionEntity *)SvIV((SV*)SvRV( entity ));
188 RETVAL = THIS->extrude(*e, description, speed);
189 OUTPUT:
190 RETVAL
191 %}
192
193 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/GCode/PressureEqualizer.hpp"
5 %}
6
7 %name{Slic3r::GCode::PressureEqualizer} class GCodePressureEqualizer {
8 GCodePressureEqualizer(StaticPrintConfig* config)
9 %code%{ RETVAL = new GCodePressureEqualizer(dynamic_cast<GCodeConfig*>(config)); %};
10 ~GCodePressureEqualizer();
11
12 void reset();
13
14 // Process a next batch of G-code lines. Flush the internal buffers if asked for.
15 // const char* process(const char *szGCode, bool flush);
16 // std::string process(const char *szGCode, bool flush)
17 // %code{% const char *out = THIS->process(szGCode, flush); RETVAL = (out == NULL) ? "" : std::string(out); %};
18
19 %{
20
21 SV*
22 GCodePressureEqualizer::process(const char *szGCode, bool flush)
23 CODE:
24 const char *out = THIS->process(szGCode, flush);
25 RETVAL = newSVpv(out, THIS->get_output_buffer_length());
26 OUTPUT:
27 RETVAL
28
29 %}
30
31 };
0 %module{Slic3r::XS};
1
2 #ifdef BOOST_LIBS
3
4 %{
5 #include <xsinit.h>
6 #include "libslic3r/GCodeSender.hpp"
7 %}
8
9 %name{Slic3r::GCode::Sender} class GCodeSender {
10 GCodeSender();
11 ~GCodeSender();
12
13 bool connect(std::string port, unsigned int baud_rate);
14 void disconnect();
15 bool is_connected();
16 bool wait_connected(unsigned int timeout = 3);
17 int queue_size();
18 void send(std::string s, bool priority = false);
19 void pause_queue();
20 void resume_queue();
21 void purge_queue(bool priority = false);
22 std::vector<std::string> purge_log();
23 std::string getT();
24 std::string getB();
25 };
26
27 #endif
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/GCodeWriter.hpp"
5 %}
6
7 %name{Slic3r::GCode::Writer} class GCodeWriter {
8 GCodeWriter();
9 ~GCodeWriter();
10
11 Ref<StaticPrintConfig> config()
12 %code%{ RETVAL = &THIS->config; %};
13 bool multiple_extruders()
14 %code{% RETVAL = THIS->multiple_extruders; %};
15 Ref<Extruder> extruder();
16 std::string extrusion_axis();
17 void apply_print_config(PrintConfig* print_config)
18 %code{% THIS->apply_print_config(*print_config); %};
19 void set_extruders(std::vector<unsigned int> extruder_ids);
20 std::string preamble();
21 std::string postamble();
22 std::string set_temperature(unsigned int temperature, bool wait = false, int tool = -1);
23 std::string set_bed_temperature(unsigned int temperature, bool wait = false);
24 std::string set_fan(unsigned int speed, bool dont_save = false);
25 std::string set_acceleration(unsigned int acceleration);
26 std::string reset_e(bool force = false);
27 std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false);
28 bool need_toolchange(unsigned int extruder_id);
29 std::string set_extruder(unsigned int extruder_id);
30 std::string toolchange(unsigned int extruder_id);
31 std::string set_speed(double F, std::string comment = std::string());
32 std::string travel_to_xy(Pointf* point, std::string comment = std::string())
33 %code{% RETVAL = THIS->travel_to_xy(*point, comment); %};
34 std::string travel_to_xyz(Pointf3* point, std::string comment = std::string())
35 %code{% RETVAL = THIS->travel_to_xyz(*point, comment); %};
36 std::string travel_to_z(double z, std::string comment = std::string());
37 bool will_move_z(double z);
38 std::string extrude_to_xy(Pointf* point, double dE, std::string comment = std::string())
39 %code{% RETVAL = THIS->extrude_to_xy(*point, dE, comment); %};
40 std::string extrude_to_xyz(Pointf3* point, double dE, std::string comment = std::string())
41 %code{% RETVAL = THIS->extrude_to_xyz(*point, dE, comment); %};
42 std::string retract();
43 std::string retract_for_toolchange();
44 std::string unretract();
45 std::string lift();
46 std::string unlift();
47 Clone<Pointf3> get_position() const;
48 %{
49
50 SV*
51 GCodeWriter::extruders()
52 CODE:
53 AV* av = newAV();
54 av_fill(av, THIS->extruders.size()-1);
55 int i = 0;
56 for (std::map<unsigned int,Extruder>::iterator it = THIS->extruders.begin(); it != THIS->extruders.end(); ++it) {
57 av_store(av, i++, perl_to_SV_ref(it->second));
58 }
59 RETVAL = newRV_noinc((SV*)av);
60 OUTPUT:
61 RETVAL
62
63 %}
64 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "slic3r/GUI/GUI.hpp"
5 %}
6
7
8 %package{Slic3r::GUI};
9
10 void disable_screensaver()
11 %code{% Slic3r::GUI::disable_screensaver(); %};
12
13 void enable_screensaver()
14 %code{% Slic3r::GUI::enable_screensaver(); %};
15
16 bool debugged()
17 %code{% RETVAL=Slic3r::GUI::debugged(); %};
18
19 void break_to_debugger()
20 %code{% Slic3r::GUI::break_to_debugger(); %};
0 %module{Slic3r::XS};
1
2 #include <xsinit.h>
3 #include "slic3r/GUI/3DScene.hpp"
4
5 %name{Slic3r::GUI::_3DScene::GLVertexArray} class GLVertexArray {
6 GLVertexArray();
7 ~GLVertexArray();
8 void load_mesh(TriangleMesh* mesh) const
9 %code%{ THIS->load_mesh(*mesh); %};
10 size_t size() const
11 %code%{ RETVAL = THIS->verts.size(); %};
12 void* verts_ptr() const
13 %code%{ RETVAL = THIS->verts.empty() ? 0 : &THIS->verts.front(); %};
14 void* norms_ptr() const
15 %code%{ RETVAL = THIS->verts.empty() ? 0 : &THIS->norms.front(); %};
16 };
17
18 %package{Slic3r::GUI::_3DScene};
19 %{
20
21 void
22 _extrusionentity_to_verts_do(Lines lines, std::vector<double> widths, std::vector<double> heights, bool closed, double top_z, Point* copy, GLVertexArray* qverts, GLVertexArray* tverts)
23 CODE:
24 _3DScene::_extrusionentity_to_verts_do(lines, widths, heights, closed,
25 top_z, *copy, qverts, tverts);
26
27 %}
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/Geometry.hpp"
5 %}
6
7
8 %package{Slic3r::Geometry};
9
10 Pointfs arrange(size_t total_parts, Pointf* part, coordf_t dist, BoundingBoxf* bb = NULL)
11 %code{%
12 Pointfs points;
13 if (! Slic3r::Geometry::arrange(total_parts, *part, dist, bb, points))
14 CONFESS(PRINTF_ZU " parts won't fit in your print area!\n", total_parts);
15 RETVAL = points;
16 %};
17
18 %{
19
20 bool
21 directions_parallel(angle1, angle2)
22 double angle1
23 double angle2
24 CODE:
25 RETVAL = Slic3r::Geometry::directions_parallel(angle1, angle2);
26 OUTPUT:
27 RETVAL
28
29 bool
30 directions_parallel_within(angle1, angle2, max_diff)
31 double angle1
32 double angle2
33 double max_diff
34 CODE:
35 RETVAL = Slic3r::Geometry::directions_parallel(angle1, angle2, max_diff);
36 OUTPUT:
37 RETVAL
38
39 Clone<Polygon>
40 convex_hull(points)
41 Points points
42 CODE:
43 RETVAL = Slic3r::Geometry::convex_hull(points);
44 OUTPUT:
45 RETVAL
46
47 std::vector<Points::size_type>
48 chained_path(points)
49 Points points
50 CODE:
51 Slic3r::Geometry::chained_path(points, RETVAL);
52 OUTPUT:
53 RETVAL
54
55 std::vector<Points::size_type>
56 chained_path_from(points, start_from)
57 Points points
58 Point* start_from
59 CODE:
60 Slic3r::Geometry::chained_path(points, RETVAL, *start_from);
61 OUTPUT:
62 RETVAL
63
64 double
65 rad2deg(angle)
66 double angle
67 CODE:
68 RETVAL = Slic3r::Geometry::rad2deg(angle);
69 OUTPUT:
70 RETVAL
71
72 double
73 rad2deg_dir(angle)
74 double angle
75 CODE:
76 RETVAL = Slic3r::Geometry::rad2deg_dir(angle);
77 OUTPUT:
78 RETVAL
79
80 double
81 deg2rad(angle)
82 double angle
83 CODE:
84 RETVAL = Slic3r::Geometry::deg2rad(angle);
85 OUTPUT:
86 RETVAL
87
88 Polygons
89 simplify_polygons(polygons, tolerance)
90 Polygons polygons
91 double tolerance
92 CODE:
93 Slic3r::Geometry::simplify_polygons(polygons, tolerance, &RETVAL);
94 OUTPUT:
95 RETVAL
96
97
98 IV
99 _constant()
100 ALIAS:
101 X = X
102 Y = Y
103 Z = Z
104 PROTOTYPE:
105 CODE:
106 RETVAL = ix;
107 OUTPUT: RETVAL
108
109 %}
110
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/Layer.hpp"
5 %}
6
7 %name{Slic3r::Layer::Region} class LayerRegion {
8 // owned by Layer, no constructor/destructor
9
10 Ref<Layer> layer();
11 Ref<PrintRegion> region();
12
13 Ref<SurfaceCollection> slices()
14 %code%{ RETVAL = &THIS->slices; %};
15 Ref<ExtrusionEntityCollection> thin_fills()
16 %code%{ RETVAL = &THIS->thin_fills; %};
17 Ref<SurfaceCollection> fill_surfaces()
18 %code%{ RETVAL = &THIS->fill_surfaces; %};
19 Ref<SurfaceCollection> perimeter_surfaces()
20 %code%{ RETVAL = &THIS->perimeter_surfaces; %};
21 Polygons bridged()
22 %code%{ RETVAL = THIS->bridged; %};
23 Ref<PolylineCollection> unsupported_bridge_edges()
24 %code%{ RETVAL = &THIS->unsupported_bridge_edges; %};
25 Ref<ExtrusionEntityCollection> perimeters()
26 %code%{ RETVAL = &THIS->perimeters; %};
27 Ref<ExtrusionEntityCollection> fills()
28 %code%{ RETVAL = &THIS->fills; %};
29
30 Clone<Flow> flow(FlowRole role, bool bridge = false, double width = -1)
31 %code%{ RETVAL = THIS->flow(role, bridge, width); %};
32 void merge_slices();
33 void prepare_fill_surfaces();
34 void make_perimeters(SurfaceCollection* slices, SurfaceCollection* perimeter_surfaces, SurfaceCollection* fill_surfaces)
35 %code%{ THIS->make_perimeters(*slices, perimeter_surfaces, fill_surfaces); %};
36 double infill_area_threshold();
37
38 void export_region_slices_to_svg(const char *path);
39 void export_region_fill_surfaces_to_svg(const char *path);
40 void export_region_slices_to_svg_debug(const char *name);
41 void export_region_fill_surfaces_to_svg_debug(const char *name);
42 };
43
44 %name{Slic3r::Layer} class Layer {
45 // owned by PrintObject, no constructor/destructor
46
47 Ref<Layer> as_layer()
48 %code%{ RETVAL = THIS; %};
49
50 int id();
51 void set_id(int id);
52 Ref<PrintObject> object();
53 Ref<Layer> upper_layer()
54 %code%{ RETVAL = THIS->upper_layer; %};
55 Ref<Layer> lower_layer()
56 %code%{ RETVAL = THIS->lower_layer; %};
57 bool slicing_errors()
58 %code%{ RETVAL = THIS->slicing_errors; %};
59 coordf_t slice_z()
60 %code%{ RETVAL = THIS->slice_z; %};
61 coordf_t print_z()
62 %code%{ RETVAL = THIS->print_z; %};
63 coordf_t height()
64 %code%{ RETVAL = THIS->height; %};
65
66 void set_upper_layer(Layer *layer)
67 %code%{ THIS->upper_layer = layer; %};
68 void set_lower_layer(Layer *layer)
69 %code%{ THIS->lower_layer = layer; %};
70 bool has_upper_layer()
71 %code%{ RETVAL = (THIS->upper_layer != NULL); %};
72 bool has_lower_layer()
73 %code%{ RETVAL = (THIS->lower_layer != NULL); %};
74
75 size_t region_count();
76 Ref<LayerRegion> get_region(int idx);
77 Ref<LayerRegion> add_region(PrintRegion* print_region);
78
79 Ref<ExPolygonCollection> slices()
80 %code%{ RETVAL = &THIS->slices; %};
81
82 Ref<ExPolygonCollection> perimeter_expolygons()
83 %code%{ RETVAL = &THIS->perimeter_expolygons; %};
84
85 int ptr()
86 %code%{ RETVAL = (int)(intptr_t)THIS; %};
87
88 Ref<SupportLayer> as_support_layer()
89 %code%{ RETVAL = dynamic_cast<SupportLayer*>(THIS); %};
90
91 void make_slices();
92 void merge_slices();
93 bool any_internal_region_slice_contains_polyline(Polyline* polyline)
94 %code%{ RETVAL = THIS->any_internal_region_slice_contains(*polyline); %};
95 bool any_bottom_region_slice_contains_polyline(Polyline* polyline)
96 %code%{ RETVAL = THIS->any_bottom_region_slice_contains(*polyline); %};
97 void make_perimeters();
98 void make_fills();
99
100 void export_region_slices_to_svg(const char *path);
101 void export_region_fill_surfaces_to_svg(const char *path);
102 void export_region_slices_to_svg_debug(const char *name);
103 void export_region_fill_surfaces_to_svg_debug(const char *name);
104 };
105
106 %name{Slic3r::Layer::Support} class SupportLayer {
107 // owned by PrintObject, no constructor/destructor
108
109 Ref<Layer> as_layer()
110 %code%{ RETVAL = THIS; %};
111
112 Ref<ExPolygonCollection> support_islands()
113 %code%{ RETVAL = &THIS->support_islands; %};
114 Ref<ExtrusionEntityCollection> support_fills()
115 %code%{ RETVAL = &THIS->support_fills; %};
116 Ref<ExtrusionEntityCollection> support_interface_fills()
117 %code%{ RETVAL = &THIS->support_interface_fills; %};
118
119
120 // copies of some Layer methods, because the parameter wrapper code
121 // gets confused about getting a Layer::Support instead of a Layer
122 int id();
123 void set_id(int id);
124 Ref<PrintObject> object();
125 Ref<SupportLayer> upper_layer()
126 %code%{ RETVAL = (SupportLayer*)THIS->upper_layer; %};
127 Ref<SupportLayer> lower_layer()
128 %code%{ RETVAL = (SupportLayer*)THIS->lower_layer; %};
129 bool slicing_errors()
130 %code%{ RETVAL = THIS->slicing_errors; %};
131 coordf_t slice_z()
132 %code%{ RETVAL = THIS->slice_z; %};
133 coordf_t print_z()
134 %code%{ RETVAL = THIS->print_z; %};
135 coordf_t height()
136 %code%{ RETVAL = THIS->height; %};
137
138 void set_upper_layer(SupportLayer *layer)
139 %code%{ THIS->upper_layer = layer; %};
140 void set_lower_layer(SupportLayer *layer)
141 %code%{ THIS->lower_layer = layer; %};
142 bool has_upper_layer()
143 %code%{ RETVAL = (THIS->upper_layer != NULL); %};
144 bool has_lower_layer()
145 %code%{ RETVAL = (THIS->lower_layer != NULL); %};
146
147 size_t region_count();
148 Ref<LayerRegion> get_region(int idx);
149 Ref<LayerRegion> add_region(PrintRegion* print_region);
150
151 Ref<ExPolygonCollection> slices()
152 %code%{ RETVAL = &THIS->slices; %};
153
154 void export_region_slices_to_svg(const char *path);
155 void export_region_fill_surfaces_to_svg(const char *path);
156 void export_region_slices_to_svg_debug(const char *name);
157 void export_region_fill_surfaces_to_svg_debug(const char *name);
158 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/Line.hpp"
5 #include "libslic3r/Polyline.hpp"
6 %}
7
8 %name{Slic3r::Line} class Line {
9 ~Line();
10 Clone<Line> clone()
11 %code{% RETVAL = THIS; %};
12 SV* arrayref()
13 %code{% RETVAL = to_AV(THIS); %};
14 SV* pp()
15 %code{% RETVAL = to_SV_pureperl(THIS); %};
16 Ref<Point> a()
17 %code{% RETVAL=&THIS->a; %};
18 Ref<Point> b()
19 %code{% RETVAL=&THIS->b; %};
20 void reverse();
21 void scale(double factor);
22 void translate(double x, double y);
23 double length();
24 double atan2_();
25 double orientation();
26 double direction();
27 bool parallel_to(double angle);
28 bool parallel_to_line(Line* line)
29 %code{% RETVAL = THIS->parallel_to(*line); %};
30 Clone<Point> midpoint();
31 Clone<Point> point_at(double distance);
32 Clone<Point> intersection_infinite(Line* other)
33 %code{%
34 Point p;
35 bool res = THIS->intersection_infinite(*other, &p);
36 if (!res) CONFESS("Intersection failed");
37 RETVAL = p;
38 %};
39 Clone<Polyline> as_polyline()
40 %code{% RETVAL = Polyline(*THIS); %};
41 Clone<Point> normal();
42 Clone<Point> vector();
43 double ccw(Point* point)
44 %code{% RETVAL = THIS->ccw(*point); %};
45 %{
46
47 Line*
48 Line::new(...)
49 CODE:
50 RETVAL = new Line ();
51 // ST(0) is class name, ST(1) and ST(2) are endpoints
52 from_SV_check(ST(1), &RETVAL->a);
53 from_SV_check(ST(2), &RETVAL->b);
54 OUTPUT:
55 RETVAL
56
57 void
58 Line::rotate(angle, center_sv)
59 double angle;
60 SV* center_sv;
61 CODE:
62 Point center;
63 from_SV_check(center_sv, &center);
64 THIS->rotate(angle, center);
65
66 bool
67 Line::coincides_with(line_sv)
68 SV* line_sv;
69 CODE:
70 Line line;
71 from_SV_check(line_sv, &line);
72 RETVAL = THIS->coincides_with(line);
73 OUTPUT:
74 RETVAL
75
76 %}
77 };
78
79
80 %name{Slic3r::Linef3} class Linef3 {
81 Linef3(Pointf3* a, Pointf3* b)
82 %code{% RETVAL = new Linef3(*a, *b); %};
83 ~Linef3();
84 Clone<Linef3> clone()
85 %code{% RETVAL = THIS; %};
86 Ref<Pointf3> a()
87 %code{% RETVAL = &THIS->a; %};
88 Ref<Pointf3> b()
89 %code{% RETVAL = &THIS->b; %};
90 Clone<Pointf3> intersect_plane(double z);
91 void scale(double factor);
92 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/Model.hpp"
5 #include "libslic3r/PrintConfig.hpp"
6 %}
7
8 %name{Slic3r::Model} class Model {
9 Model();
10 ~Model();
11
12 Clone<Model> clone()
13 %code%{ RETVAL = THIS; %};
14
15 %name{_add_object} Ref<ModelObject> add_object();
16 Ref<ModelObject> _add_object_clone(ModelObject* other, bool copy_volumes = true)
17 %code%{ RETVAL = THIS->add_object(*other, copy_volumes); %};
18 void delete_object(size_t idx);
19 void clear_objects();
20 size_t objects_count()
21 %code%{ RETVAL = THIS->objects.size(); %};
22 Ref<ModelObject> get_object(int idx)
23 %code%{ RETVAL = THIS->objects.at(idx); %};
24
25 Ref<ModelMaterial> get_material(t_model_material_id material_id)
26 %code%{
27 RETVAL = THIS->get_material(material_id);
28 if (RETVAL == NULL) {
29 XSRETURN_UNDEF;
30 }
31 %};
32
33 %name{add_material} Ref<ModelMaterial> add_material(t_model_material_id material_id);
34 Ref<ModelMaterial> add_material_clone(t_model_material_id material_id, ModelMaterial* other)
35 %code%{ RETVAL = THIS->add_material(material_id, *other); %};
36 bool has_material(t_model_material_id material_id) const
37 %code%{
38 RETVAL = (THIS->get_material(material_id) != NULL);
39 %};
40 void delete_material(t_model_material_id material_id);
41 void clear_materials();
42
43 std::vector<std::string> material_names() const
44 %code%{
45 for (ModelMaterialMap::iterator i = THIS->materials.begin();
46 i != THIS->materials.end(); ++i)
47 {
48 RETVAL.push_back(i->first);
49 }
50 %};
51
52 size_t material_count() const
53 %code%{ RETVAL = THIS->materials.size(); %};
54
55 bool has_objects_with_no_instances();
56 bool add_default_instances();
57 Clone<BoundingBoxf3> bounding_box();
58 void center_instances_around_point(Pointf* point)
59 %code%{ THIS->center_instances_around_point(*point); %};
60 void align_instances_to_origin();
61 void translate(double x, double y, double z);
62 Clone<TriangleMesh> mesh();
63 Clone<TriangleMesh> raw_mesh();
64
65 ModelObjectPtrs* objects()
66 %code%{ RETVAL = &THIS->objects; %};
67
68 bool arrange_objects(double dist, BoundingBoxf* bb = NULL);
69 void duplicate(unsigned int copies_num, double dist, BoundingBoxf* bb = NULL);
70 void duplicate_objects(unsigned int copies_num, double dist, BoundingBoxf* bb = NULL);
71 void duplicate_objects_grid(unsigned int x, unsigned int y, double dist);
72 };
73
74
75 %name{Slic3r::Model::Material} class ModelMaterial {
76 Ref<Model> model()
77 %code%{ RETVAL = THIS->get_model(); %};
78
79 Ref<DynamicPrintConfig> config()
80 %code%{ RETVAL = &THIS->config; %};
81
82 std::string get_attribute(std::string name)
83 %code%{ if (THIS->attributes.find(name) != THIS->attributes.end()) RETVAL = THIS->attributes[name]; %};
84
85 void set_attribute(std::string name, std::string value)
86 %code%{ THIS->attributes[name] = value; %};
87
88 %{
89
90 SV*
91 ModelMaterial::attributes()
92 CODE:
93 HV* hv = newHV();
94 for (t_model_material_attributes::const_iterator attr = THIS->attributes.begin(); attr != THIS->attributes.end(); ++attr) {
95 (void)hv_store( hv, attr->first.c_str(), attr->first.length(), newSVpv(attr->second.c_str(), attr->second.length()), 0 );
96 }
97 RETVAL = (SV*)newRV_noinc((SV*)hv);
98 OUTPUT:
99 RETVAL
100 %}
101
102 };
103
104
105 %name{Slic3r::Model::Object} class ModelObject {
106 ModelVolumePtrs* volumes()
107 %code%{ RETVAL = &THIS->volumes; %};
108
109 ModelInstancePtrs* instances()
110 %code%{ RETVAL = &THIS->instances; %};
111
112 void invalidate_bounding_box();
113 void update_bounding_box();
114 Clone<TriangleMesh> mesh();
115 Clone<TriangleMesh> raw_mesh();
116 Clone<BoundingBoxf3> raw_bounding_box();
117 Clone<BoundingBoxf3> instance_bounding_box(int idx);
118
119 Ref<BoundingBoxf3> _bounding_box(BoundingBoxf3* new_bbox = NULL)
120 %code{%
121 if (NULL != new_bbox) {
122 THIS->_bounding_box = *new_bbox;
123 THIS->_bounding_box_valid = true;
124 }
125
126 if (!THIS->_bounding_box_valid) {
127 XSRETURN_UNDEF;
128 }
129
130 RETVAL = &THIS->_bounding_box;
131 %};
132 Clone<BoundingBoxf3> bounding_box();
133
134 %name{_add_volume} Ref<ModelVolume> add_volume(TriangleMesh* mesh)
135 %code%{ RETVAL = THIS->add_volume(*mesh); %};
136 Ref<ModelVolume> _add_volume_clone(ModelVolume* other)
137 %code%{ RETVAL = THIS->add_volume(*other); %};
138
139 void delete_volume(size_t idx);
140 void clear_volumes();
141 int volumes_count()
142 %code%{ RETVAL = THIS->volumes.size(); %};
143
144 %name{_add_instance} Ref<ModelInstance> add_instance();
145 Ref<ModelInstance> _add_instance_clone(ModelInstance* other)
146 %code%{ RETVAL = THIS->add_instance(*other); %};
147 void delete_last_instance();
148 void clear_instances();
149 int instances_count()
150 %code%{ RETVAL = THIS->instances.size(); %};
151
152 std::string name()
153 %code%{ RETVAL = THIS->name; %};
154 void set_name(std::string value)
155 %code%{ THIS->name = value; %};
156 std::string input_file()
157 %code%{ RETVAL = THIS->input_file; %};
158 void set_input_file(std::string value)
159 %code%{ THIS->input_file = value; %};
160 Ref<DynamicPrintConfig> config()
161 %code%{ RETVAL = &THIS->config; %};
162
163 Ref<Model> model()
164 %code%{ RETVAL = THIS->get_model(); %};
165
166 t_layer_height_ranges layer_height_ranges()
167 %code%{ RETVAL = THIS->layer_height_ranges; %};
168 void set_layer_height_ranges(t_layer_height_ranges ranges)
169 %code%{ THIS->layer_height_ranges = ranges; %};
170
171 Ref<Pointf3> origin_translation()
172 %code%{ RETVAL = &THIS->origin_translation; %};
173 void set_origin_translation(Pointf3* point)
174 %code%{ THIS->origin_translation = *point; %};
175
176 bool needed_repair() const;
177 int materials_count() const;
178 int facets_count();
179 void center_around_origin();
180 void translate(double x, double y, double z);
181 void scale_xyz(Pointf3* versor)
182 %code{% THIS->scale(*versor); %};
183 void rotate(float angle, Axis axis);
184 void mirror(Axis axis);
185
186 Model* cut(double z)
187 %code%{
188 RETVAL = new Model();
189 THIS->cut(z, RETVAL);
190 %};
191
192 ModelObjectPtrs* split_object()
193 %code%{
194 RETVAL = new ModelObjectPtrs(); // leak?
195 THIS->split(RETVAL);
196 %};
197 };
198
199
200 %name{Slic3r::Model::Volume} class ModelVolume {
201 Ref<ModelObject> object()
202 %code%{ RETVAL = THIS->get_object(); %};
203
204 std::string name()
205 %code%{ RETVAL = THIS->name; %};
206 void set_name(std::string value)
207 %code%{ THIS->name = value; %};
208 t_model_material_id material_id();
209 void set_material_id(t_model_material_id material_id)
210 %code%{ THIS->material_id(material_id); %};
211 Ref<ModelMaterial> material();
212
213 Ref<DynamicPrintConfig> config()
214 %code%{ RETVAL = &THIS->config; %};
215 Ref<TriangleMesh> mesh()
216 %code%{ RETVAL = &THIS->mesh; %};
217
218 bool modifier()
219 %code%{ RETVAL = THIS->modifier; %};
220 void set_modifier(bool modifier)
221 %code%{ THIS->modifier = modifier; %};
222
223 ModelMaterial* assign_unique_material();
224 };
225
226
227 %name{Slic3r::Model::Instance} class ModelInstance {
228 Ref<ModelObject> object()
229 %code%{ RETVAL = THIS->get_object(); %};
230
231 double rotation()
232 %code%{ RETVAL = THIS->rotation; %};
233 double scaling_factor()
234 %code%{ RETVAL = THIS->scaling_factor; %};
235 Ref<Pointf> offset()
236 %code%{ RETVAL = &THIS->offset; %};
237
238 void set_rotation(double val)
239 %code%{ THIS->rotation = val; %};
240 void set_scaling_factor(double val)
241 %code%{ THIS->scaling_factor = val; %};
242 void set_offset(Pointf *offset)
243 %code%{ THIS->offset = *offset; %};
244
245 void transform_mesh(TriangleMesh* mesh, bool dont_translate = false) const;
246 void transform_polygon(Polygon* polygon) const;
247 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/MotionPlanner.hpp"
5 %}
6
7 %name{Slic3r::MotionPlanner} class MotionPlanner {
8 MotionPlanner(ExPolygons islands);
9 ~MotionPlanner();
10
11 int islands_count();
12 Clone<Polyline> shortest_path(Point* from, Point* to)
13 %code%{ RETVAL = THIS->shortest_path(*from, *to); %};
14 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/PerimeterGenerator.hpp"
5 %}
6
7 %name{Slic3r::Layer::PerimeterGenerator} class PerimeterGenerator {
8 PerimeterGenerator(SurfaceCollection* slices, double layer_height, Flow* flow,
9 StaticPrintConfig* region_config, StaticPrintConfig* object_config,
10 StaticPrintConfig* print_config, ExtrusionEntityCollection* loops,
11 ExtrusionEntityCollection* gap_fill,
12 SurfaceCollection* perimeter_surfaces, SurfaceCollection* fill_surfaces)
13 %code{% RETVAL = new PerimeterGenerator(slices, layer_height, *flow,
14 dynamic_cast<PrintRegionConfig*>(region_config),
15 dynamic_cast<PrintObjectConfig*>(object_config),
16 dynamic_cast<PrintConfig*>(print_config),
17 loops, gap_fill, perimeter_surfaces, fill_surfaces); %};
18 ~PerimeterGenerator();
19
20 void set_lower_slices(ExPolygonCollection* lower_slices)
21 %code{% THIS->lower_slices = lower_slices; %};
22 void set_layer_id(int layer_id)
23 %code{% THIS->layer_id = layer_id; %};
24 void set_perimeter_flow(Flow* flow)
25 %code{% THIS->perimeter_flow = *flow; %};
26 void set_ext_perimeter_flow(Flow* flow)
27 %code{% THIS->ext_perimeter_flow = *flow; %};
28 void set_overhang_flow(Flow* flow)
29 %code{% THIS->overhang_flow = *flow; %};
30 void set_solid_infill_flow(Flow* flow)
31 %code{% THIS->solid_infill_flow = *flow; %};
32
33 Ref<StaticPrintConfig> config()
34 %code{% RETVAL = THIS->config; %};
35
36 void process();
37 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include <vector>
5 #include "libslic3r/PlaceholderParser.hpp"
6 %}
7
8 %name{Slic3r::GCode::PlaceholderParser} class PlaceholderParser {
9 PlaceholderParser();
10 ~PlaceholderParser();
11 Clone<PlaceholderParser> clone()
12 %code{% RETVAL = THIS; %};
13
14 void update_timestamp();
15 void apply_env_variables();
16 void apply_config(DynamicPrintConfig *config)
17 %code%{ THIS->apply_config(*config); %};
18 void set(std::string key, std::string value);
19 %name{set_multiple} void set(std::string key, std::vector<std::string> values);
20 std::string process(std::string str) const;
21 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/Point.hpp"
5 #include "libslic3r/Polygon.hpp"
6 #include "libslic3r/Polyline.hpp"
7 %}
8
9 %name{Slic3r::Point} class Point {
10 Point(long _x = 0, long _y = 0);
11 ~Point();
12 Clone<Point> clone()
13 %code{% RETVAL=THIS; %};
14 void scale(double factor);
15 void translate(double x, double y);
16 SV* arrayref()
17 %code{% RETVAL = to_SV_pureperl(THIS); %};
18 SV* pp()
19 %code{% RETVAL = to_SV_pureperl(THIS); %};
20 long x()
21 %code{% RETVAL = THIS->x; %};
22 long y()
23 %code{% RETVAL = THIS->y; %};
24 void set_x(long val)
25 %code{% THIS->x = val; %};
26 void set_y(long val)
27 %code{% THIS->y = val; %};
28 int nearest_point_index(Points points);
29 Clone<Point> nearest_point(Points points)
30 %code{% Point p; THIS->nearest_point(points, &p); RETVAL = p; %};
31 double distance_to(Point* point)
32 %code{% RETVAL = THIS->distance_to(*point); %};
33 double distance_to_line(Line* line)
34 %code{% RETVAL = THIS->distance_to(*line); %};
35 double perp_distance_to_line(Line* line)
36 %code{% RETVAL = THIS->perp_distance_to(*line); %};
37 double ccw(Point* p1, Point* p2)
38 %code{% RETVAL = THIS->ccw(*p1, *p2); %};
39 double ccw_angle(Point* p1, Point* p2)
40 %code{% RETVAL = THIS->ccw_angle(*p1, *p2); %};
41 Clone<Point> projection_onto_polygon(Polygon* polygon)
42 %code{% RETVAL = new Point(THIS->projection_onto(*polygon)); %};
43 Clone<Point> projection_onto_polyline(Polyline* polyline)
44 %code{% RETVAL = new Point(THIS->projection_onto(*polyline)); %};
45 Clone<Point> projection_onto_line(Line* line)
46 %code{% RETVAL = new Point(THIS->projection_onto(*line)); %};
47 Clone<Point> negative()
48 %code{% RETVAL = new Point(THIS->negative()); %};
49 bool coincides_with_epsilon(Point* point)
50 %code{% RETVAL = THIS->coincides_with_epsilon(*point); %};
51 std::string serialize() %code{% char buf[2048]; sprintf(buf, "%d,%d", THIS->x, THIS->y); RETVAL = buf; %};
52
53 %{
54
55 void
56 Point::rotate(angle, center_sv)
57 double angle;
58 SV* center_sv;
59 CODE:
60 Point center;
61 from_SV_check(center_sv, &center);
62 THIS->rotate(angle, center);
63
64 bool
65 Point::coincides_with(point_sv)
66 SV* point_sv;
67 CODE:
68 Point point;
69 from_SV_check(point_sv, &point);
70 RETVAL = THIS->coincides_with(point);
71 OUTPUT:
72 RETVAL
73
74 %}
75
76 };
77
78 %name{Slic3r::Point3} class Point3 {
79 Point3(long _x = 0, long _y = 0, long _z = 0);
80 ~Point3();
81 Clone<Point3> clone()
82 %code{% RETVAL = THIS; %};
83 long x()
84 %code{% RETVAL = THIS->x; %};
85 long y()
86 %code{% RETVAL = THIS->y; %};
87 long z()
88 %code{% RETVAL = THIS->z; %};
89 std::string serialize() %code{% char buf[2048]; sprintf(buf, "%d,%d,%d", THIS->x, THIS->y, THIS->z); RETVAL = buf; %};
90 };
91
92 %name{Slic3r::Pointf} class Pointf {
93 Pointf(double _x = 0, double _y = 0);
94 ~Pointf();
95 Clone<Pointf> clone()
96 %code{% RETVAL = THIS; %};
97 SV* arrayref()
98 %code{% RETVAL = to_SV_pureperl(THIS); %};
99 SV* pp()
100 %code{% RETVAL = to_SV_pureperl(THIS); %};
101 double x()
102 %code{% RETVAL = THIS->x; %};
103 double y()
104 %code{% RETVAL = THIS->y; %};
105 void set_x(double val)
106 %code{% THIS->x = val; %};
107 void set_y(double val)
108 %code{% THIS->y = val; %};
109 void translate(double x, double y);
110 void scale(double factor);
111 void rotate(double angle, Pointf* center)
112 %code{% THIS->rotate(angle, *center); %};
113 Clone<Pointf> negative()
114 %code{% RETVAL = THIS->negative(); %};
115 Clone<Pointf> vector_to(Pointf* point)
116 %code{% RETVAL = THIS->vector_to(*point); %};
117 std::string serialize() %code{% char buf[2048]; sprintf(buf, "%lf,%lf", THIS->x, THIS->y); RETVAL = buf; %};
118 };
119
120 %name{Slic3r::Pointf3} class Pointf3 {
121 Pointf3(double _x = 0, double _y = 0, double _z = 0);
122 ~Pointf3();
123 Clone<Pointf3> clone()
124 %code{% RETVAL = THIS; %};
125 double x()
126 %code{% RETVAL = THIS->x; %};
127 double y()
128 %code{% RETVAL = THIS->y; %};
129 double z()
130 %code{% RETVAL = THIS->z; %};
131 void set_x(double val)
132 %code{% THIS->x = val; %};
133 void set_y(double val)
134 %code{% THIS->y = val; %};
135 void set_z(double val)
136 %code{% THIS->z = val; %};
137 void translate(double x, double y, double z);
138 void scale(double factor);
139 double distance_to(Pointf3* point)
140 %code{% RETVAL = THIS->distance_to(*point); %};
141 Clone<Pointf3> negative()
142 %code{% RETVAL = THIS->negative(); %};
143 Clone<Pointf3> vector_to(Pointf3* point)
144 %code{% RETVAL = THIS->vector_to(*point); %};
145 std::string serialize() %code{% char buf[2048]; sprintf(buf, "%lf,%lf,%lf", THIS->x, THIS->y, THIS->z); RETVAL = buf; %};
146 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/BoundingBox.hpp"
5 #include "libslic3r/Polygon.hpp"
6 #include "libslic3r/BoundingBox.hpp"
7 %}
8
9 %name{Slic3r::Polygon} class Polygon {
10 ~Polygon();
11 Clone<Polygon> clone()
12 %code{% RETVAL = THIS; %};
13 SV* arrayref()
14 %code{% RETVAL = to_AV(THIS); %};
15 SV* pp()
16 %code{% RETVAL = to_SV_pureperl(THIS); %};
17 void scale(double factor);
18 void translate(double x, double y);
19 void reverse();
20 Lines lines();
21 Clone<Polyline> split_at_vertex(Point* point)
22 %code{% RETVAL = THIS->split_at_vertex(*point); %};
23 Clone<Polyline> split_at_index(int index);
24 Clone<Polyline> split_at_first_point();
25 Points equally_spaced_points(double distance);
26 double length();
27 double area();
28 bool is_counter_clockwise();
29 bool is_clockwise();
30 bool make_counter_clockwise();
31 bool make_clockwise();
32 bool is_valid();
33 Clone<Point> first_point();
34 bool contains_point(Point* point)
35 %code{% RETVAL = THIS->contains(*point); %};
36 Polygons simplify(double tolerance);
37 Polygons triangulate_convex()
38 %code{% THIS->triangulate_convex(&RETVAL); %};
39 Clone<Point> centroid();
40 Clone<BoundingBox> bounding_box();
41 std::string wkt();
42 Points concave_points(double angle);
43 Points convex_points(double angle);
44 Clone<Point> intersection(Line* line)
45 %code{%
46 Point p;
47 (void)THIS->intersection(*line, &p);
48 RETVAL = p;
49 %};
50 %{
51
52 Polygon*
53 Polygon::new(...)
54 CODE:
55 RETVAL = new Polygon ();
56 // ST(0) is class name, ST(1) is first point
57 RETVAL->points.resize(items-1);
58 for (unsigned int i = 1; i < items; i++) {
59 from_SV_check(ST(i), &RETVAL->points[i-1]);
60 }
61 OUTPUT:
62 RETVAL
63
64 void
65 Polygon::rotate(angle, center_sv)
66 double angle;
67 SV* center_sv;
68 CODE:
69 Point center;
70 from_SV_check(center_sv, &center);
71 THIS->rotate(angle, center);
72
73 %}
74 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/BoundingBox.hpp"
5 #include "libslic3r/ClipperUtils.hpp"
6 #include "libslic3r/Polyline.hpp"
7 %}
8
9 %name{Slic3r::Polyline} class Polyline {
10 ~Polyline();
11 Clone<Polyline> clone()
12 %code{% RETVAL = THIS; %};
13 SV* arrayref()
14 %code{% RETVAL = to_AV(THIS); %};
15 SV* pp()
16 %code{% RETVAL = to_SV_pureperl(THIS); %};
17 void scale(double factor);
18 void translate(double x, double y);
19 void pop_back()
20 %code{% THIS->points.pop_back(); %};
21 void reverse();
22 Lines lines();
23 Clone<Point> first_point();
24 Clone<Point> last_point();
25 Points equally_spaced_points(double distance);
26 double length();
27 bool is_valid();
28 void clip_end(double distance);
29 void clip_start(double distance);
30 void extend_end(double distance);
31 void extend_start(double distance);
32 void simplify(double tolerance);
33 void simplify_by_visibility(ExPolygon* expolygon)
34 %code{% THIS->simplify_by_visibility(*expolygon); %};
35 void split_at(Point* point, Polyline* p1, Polyline* p2)
36 %code{% THIS->split_at(*point, p1, p2); %};
37 bool is_straight();
38 Clone<BoundingBox> bounding_box();
39 void remove_duplicate_points();
40 std::string wkt();
41 %{
42
43 Polyline*
44 Polyline::new(...)
45 CODE:
46 RETVAL = new Polyline ();
47 // ST(0) is class name, ST(1) is first point
48 RETVAL->points.resize(items-1);
49 for (unsigned int i = 1; i < items; i++) {
50 from_SV_check(ST(i), &RETVAL->points[i-1]);
51 }
52 OUTPUT:
53 RETVAL
54
55 void
56 Polyline::append(...)
57 CODE:
58 for (unsigned int i = 1; i < items; i++) {
59 Point p;
60 from_SV_check(ST(i), &p);
61 THIS->points.push_back(p);
62 }
63
64 void
65 Polyline::append_polyline(polyline)
66 Polyline* polyline;
67 CODE:
68 for (Points::const_iterator it = polyline->points.begin(); it != polyline->points.end(); ++it) {
69 THIS->points.push_back((*it));
70 }
71
72 void
73 Polyline::rotate(angle, center_sv)
74 double angle;
75 SV* center_sv;
76 CODE:
77 Point center;
78 from_SV_check(center_sv, &center);
79 THIS->rotate(angle, center);
80
81 Polygons
82 Polyline::grow(delta, scale = CLIPPER_OFFSET_SCALE, joinType = ClipperLib::jtSquare, miterLimit = 3)
83 const float delta
84 double scale
85 ClipperLib::JoinType joinType
86 double miterLimit
87 CODE:
88 offset(*THIS, &RETVAL, delta, scale, joinType, miterLimit);
89 OUTPUT:
90 RETVAL
91
92 %}
93 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/PolylineCollection.hpp"
5 %}
6
7 %name{Slic3r::Polyline::Collection} class PolylineCollection {
8 ~PolylineCollection();
9 Clone<PolylineCollection> clone()
10 %code{% RETVAL = THIS; %};
11 void clear()
12 %code{% THIS->polylines.clear(); %};
13 PolylineCollection* chained_path(bool no_reverse)
14 %code{%
15 RETVAL = new PolylineCollection();
16 THIS->chained_path(RETVAL, no_reverse);
17 %};
18 PolylineCollection* chained_path_from(Point* start_near, bool no_reverse)
19 %code{%
20 RETVAL = new PolylineCollection();
21 THIS->chained_path_from(*start_near, RETVAL, no_reverse);
22 %};
23 int count()
24 %code{% RETVAL = THIS->polylines.size(); %};
25 Clone<Point> leftmost_point();
26 %{
27
28 PolylineCollection*
29 PolylineCollection::new(...)
30 CODE:
31 RETVAL = new PolylineCollection ();
32 // ST(0) is class name, others are Polylines
33 RETVAL->polylines.resize(items-1);
34 for (unsigned int i = 1; i < items; i++) {
35 // Note: a COPY of the input is stored
36 from_SV_check(ST(i), &RETVAL->polylines[i-1]);
37 }
38 OUTPUT:
39 RETVAL
40
41 SV*
42 PolylineCollection::arrayref()
43 CODE:
44 AV* av = newAV();
45 av_fill(av, THIS->polylines.size()-1);
46 int i = 0;
47 for (Polylines::iterator it = THIS->polylines.begin(); it != THIS->polylines.end(); ++it) {
48 av_store(av, i++, perl_to_SV_ref(*it));
49 }
50 RETVAL = newRV_noinc((SV*)av);
51 OUTPUT:
52 RETVAL
53
54 SV*
55 PolylineCollection::pp()
56 CODE:
57 AV* av = newAV();
58 av_fill(av, THIS->polylines.size()-1);
59 int i = 0;
60 for (Polylines::iterator it = THIS->polylines.begin(); it != THIS->polylines.end(); ++it) {
61 av_store(av, i++, to_SV_pureperl(&*it));
62 }
63 RETVAL = newRV_noinc((SV*)av);
64 OUTPUT:
65 RETVAL
66
67 void
68 PolylineCollection::append(...)
69 CODE:
70 for (unsigned int i = 1; i < items; i++) {
71 Polyline polyline;
72 from_SV_check(ST(i), &polyline);
73 THIS->polylines.push_back(polyline);
74 }
75
76 %}
77 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/Print.hpp"
5 #include "libslic3r/PlaceholderParser.hpp"
6 %}
7
8 %package{Slic3r::Print::State};
9 %{
10
11 IV
12 _constant()
13 ALIAS:
14 STEP_SLICE = posSlice
15 STEP_PERIMETERS = posPerimeters
16 STEP_PREPARE_INFILL = posPrepareInfill
17 STEP_INFILL = posInfill
18 STEP_SUPPORTMATERIAL = posSupportMaterial
19 STEP_SKIRT = psSkirt
20 STEP_BRIM = psBrim
21 PROTOTYPE:
22 CODE:
23 RETVAL = ix;
24 OUTPUT: RETVAL
25
26 %}
27
28
29 %name{Slic3r::Print::Region} class PrintRegion {
30 // owned by Print, no constructor/destructor
31
32 Ref<StaticPrintConfig> config()
33 %code%{ RETVAL = &THIS->config; %};
34 Ref<Print> print();
35
36 Clone<Flow> flow(FlowRole role, double layer_height, bool bridge, bool first_layer, double width, PrintObject* object)
37 %code%{ RETVAL = THIS->flow(role, layer_height, bridge, first_layer, width, *object); %};
38 };
39
40
41 %name{Slic3r::Print::Object} class PrintObject {
42 // owned by Print, no constructor/destructor
43
44 void add_region_volume(int region_id, int volume_id);
45 std::vector<int> get_region_volumes(int region_id)
46 %code%{
47 if (0 <= region_id && region_id < THIS->region_volumes.size())
48 RETVAL = THIS->region_volumes[region_id];
49 %};
50 int region_count()
51 %code%{ RETVAL = THIS->print()->regions.size(); %};
52
53 Ref<Print> print();
54 Ref<ModelObject> model_object();
55 Ref<StaticPrintConfig> config()
56 %code%{ RETVAL = &THIS->config; %};
57 Points copies();
58 t_layer_height_ranges layer_height_ranges()
59 %code%{ RETVAL = THIS->layer_height_ranges; %};
60 Ref<Point3> size()
61 %code%{ RETVAL = &THIS->size; %};
62 Clone<BoundingBox> bounding_box();
63 Ref<Point> _copies_shift()
64 %code%{ RETVAL = &THIS->_copies_shift; %};
65
66 bool typed_slices()
67 %code%{ RETVAL = THIS->typed_slices; %};
68 void set_typed_slices(bool value)
69 %code%{ THIS->typed_slices = value; %};
70
71 Points _shifted_copies()
72 %code%{ RETVAL = THIS->_shifted_copies; %};
73 void set_shifted_copies(Points value)
74 %code%{ THIS->_shifted_copies = value; %};
75
76 bool add_copy(Pointf* point)
77 %code%{ RETVAL = THIS->add_copy(*point); %};
78 bool delete_last_copy();
79 bool delete_all_copies();
80 bool set_copies(Points copies);
81 bool reload_model_instances();
82 void set_layer_height_ranges(t_layer_height_ranges layer_height_ranges)
83 %code%{ THIS->layer_height_ranges = layer_height_ranges; %};
84
85 size_t total_layer_count();
86 size_t layer_count();
87 void clear_layers();
88 Ref<Layer> get_layer(int idx);
89 Ref<Layer> add_layer(int id, coordf_t height, coordf_t print_z,
90 coordf_t slice_z);
91 void delete_layer(int idx);
92
93 size_t support_layer_count();
94 void clear_support_layers();
95 Ref<SupportLayer> get_support_layer(int idx);
96 Ref<SupportLayer> add_support_layer(int id, coordf_t height, coordf_t print_z);
97 void delete_support_layer(int idx);
98
99 bool invalidate_state_by_config_options(std::vector<std::string> opt_keys);
100 bool invalidate_step(PrintObjectStep step);
101 bool invalidate_all_steps();
102 bool step_done(PrintObjectStep step)
103 %code%{ RETVAL = THIS->state.is_done(step); %};
104 void set_step_done(PrintObjectStep step)
105 %code%{ THIS->state.set_done(step); %};
106 void set_step_started(PrintObjectStep step)
107 %code%{ THIS->state.set_started(step); %};
108
109 void detect_surfaces_type();
110 void process_external_surfaces();
111 void discover_vertical_shells();
112 void bridge_over_infill();
113
114 int ptr()
115 %code%{ RETVAL = (int)(intptr_t)THIS; %};
116 };
117
118
119 %name{Slic3r::Print} class Print {
120 Print();
121 ~Print();
122
123 Ref<StaticPrintConfig> config()
124 %code%{ RETVAL = &THIS->config; %};
125 Ref<StaticPrintConfig> default_object_config()
126 %code%{ RETVAL = &THIS->default_object_config; %};
127 Ref<StaticPrintConfig> default_region_config()
128 %code%{ RETVAL = &THIS->default_region_config; %};
129 Ref<PlaceholderParser> placeholder_parser()
130 %code%{ RETVAL = &THIS->placeholder_parser; %};
131 // TODO: status_cb
132 Ref<ExtrusionEntityCollection> skirt()
133 %code%{ RETVAL = &THIS->skirt; %};
134 Ref<ExtrusionEntityCollection> brim()
135 %code%{ RETVAL = &THIS->brim; %};
136
137 PrintObjectPtrs* objects()
138 %code%{ RETVAL = &THIS->objects; %};
139 void clear_objects();
140 Ref<PrintObject> get_object(int idx);
141 void delete_object(int idx);
142 void reload_object(int idx);
143 bool reload_model_instances();
144 size_t object_count()
145 %code%{ RETVAL = THIS->objects.size(); %};
146
147 PrintRegionPtrs* regions()
148 %code%{ RETVAL = &THIS->regions; %};
149 Ref<PrintRegion> get_region(int idx);
150 Ref<PrintRegion> add_region();
151 size_t region_count()
152 %code%{ RETVAL = THIS->regions.size(); %};
153
154 bool invalidate_state_by_config_options(std::vector<std::string> opt_keys);
155 bool invalidate_step(PrintStep step);
156 bool invalidate_all_steps();
157 bool step_done(PrintStep step)
158 %code%{ RETVAL = THIS->state.is_done(step); %};
159 bool object_step_done(PrintObjectStep step)
160 %code%{ RETVAL = THIS->step_done(step); %};
161 void set_step_done(PrintStep step)
162 %code%{ THIS->state.set_done(step); %};
163 void set_step_started(PrintStep step)
164 %code%{ THIS->state.set_started(step); %};
165
166 std::vector<int> object_extruders()
167 %code%{
168 std::set<size_t> extruders = THIS->object_extruders();
169 RETVAL.reserve(extruders.size());
170 for (std::set<size_t>::const_iterator e = extruders.begin(); e != extruders.end(); ++e) {
171 RETVAL.push_back(*e);
172 }
173 %};
174 std::vector<int> support_material_extruders()
175 %code%{
176 std::set<size_t> extruders = THIS->support_material_extruders();
177 RETVAL.reserve(extruders.size());
178 for (std::set<size_t>::const_iterator e = extruders.begin(); e != extruders.end(); ++e) {
179 RETVAL.push_back(*e);
180 }
181 %};
182 std::vector<int> extruders()
183 %code%{
184 std::set<size_t> extruders = THIS->extruders();
185 RETVAL.reserve(extruders.size());
186 for (std::set<size_t>::const_iterator e = extruders.begin(); e != extruders.end(); ++e) {
187 RETVAL.push_back(*e);
188 }
189 %};
190 void clear_filament_stats()
191 %code%{
192 THIS->filament_stats.clear();
193 %};
194 void set_filament_stats(int extruder_id, float length)
195 %code%{
196 THIS->filament_stats.insert(std::pair<size_t,float>(extruder_id, 0));
197 THIS->filament_stats[extruder_id] += length;
198 %};
199 SV* filament_stats()
200 %code%{
201 HV* hv = newHV();
202 for (std::map<size_t,float>::const_iterator it = THIS->filament_stats.begin(); it != THIS->filament_stats.end(); ++it) {
203 // stringify extruder_id
204 std::ostringstream ss;
205 ss << it->first;
206 std::string str = ss.str();
207
208 (void)hv_store( hv, str.c_str(), str.length(), newSViv(it->second), 0 );
209 RETVAL = newRV_noinc((SV*)hv);
210 }
211 %};
212 void _simplify_slices(double distance);
213 double max_allowed_layer_height() const;
214 bool has_support_material() const;
215 void auto_assign_extruders(ModelObject* model_object);
216
217 void add_model_object(ModelObject* model_object, int idx = -1);
218 bool apply_config(DynamicPrintConfig* config)
219 %code%{ RETVAL = THIS->apply_config(*config); %};
220 bool has_infinite_skirt();
221 bool has_skirt();
222 std::string _validate()
223 %code%{ RETVAL = THIS->validate(); %};
224 Clone<BoundingBox> bounding_box();
225 Clone<BoundingBox> total_bounding_box();
226 double skirt_first_layer_height();
227 Clone<Flow> brim_flow();
228 Clone<Flow> skirt_flow();
229 %{
230
231 double
232 Print::total_used_filament(...)
233 CODE:
234 if (items > 1) {
235 THIS->total_used_filament = (double)SvNV(ST(1));
236 }
237 RETVAL = THIS->total_used_filament;
238 OUTPUT:
239 RETVAL
240
241 double
242 Print::total_extruded_volume(...)
243 CODE:
244 if (items > 1) {
245 THIS->total_extruded_volume = (double)SvNV(ST(1));
246 }
247 RETVAL = THIS->total_extruded_volume;
248 OUTPUT:
249 RETVAL
250
251 %}
252 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/SupportMaterial.hpp"
5 %}
6
7 %name{Slic3r::Print::SupportMaterial2} class PrintObjectSupportMaterial {
8 PrintObjectSupportMaterial(PrintObject *print_object);
9 ~PrintObjectSupportMaterial();
10
11 void generate(PrintObject *object)
12 %code{% THIS->generate(*object); %};
13 };
14
15 %package{Slic3r::Print::SupportMaterial};
16 %{
17
18 SV*
19 MARGIN()
20 PROTOTYPE:
21 CODE:
22 RETVAL = newSVnv(SUPPORT_MATERIAL_MARGIN);
23 OUTPUT: RETVAL
24
25 %}
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/Surface.hpp"
5 #include "libslic3r/ClipperUtils.hpp"
6 %}
7
8 %name{Slic3r::Surface} class Surface {
9 ~Surface();
10 Ref<ExPolygon> expolygon()
11 %code{% RETVAL = &(THIS->expolygon); %};
12 double thickness()
13 %code{% RETVAL = THIS->thickness; %};
14 unsigned short thickness_layers()
15 %code{% RETVAL = THIS->thickness_layers; %};
16 double area();
17 bool is_solid() const;
18 bool is_external() const;
19 bool is_internal() const;
20 bool is_bottom() const;
21 bool is_bridge() const;
22 %{
23
24 Surface*
25 _new(CLASS, expolygon, surface_type, thickness, thickness_layers, bridge_angle, extra_perimeters)
26 char* CLASS;
27 ExPolygon* expolygon;
28 SurfaceType surface_type;
29 double thickness;
30 unsigned short thickness_layers;
31 double bridge_angle;
32 unsigned short extra_perimeters;
33 CODE:
34 RETVAL = new Surface (surface_type, *expolygon);
35 RETVAL->thickness = thickness;
36 RETVAL->thickness_layers = thickness_layers;
37 RETVAL->bridge_angle = bridge_angle;
38 RETVAL->extra_perimeters = extra_perimeters;
39 // we don't delete expolygon here because it's referenced by a Perl SV
40 // whose DESTROY will take care of destruction
41 OUTPUT:
42 RETVAL
43
44 SurfaceType
45 Surface::surface_type(...)
46 CODE:
47 if (items > 1) {
48 THIS->surface_type = (SurfaceType)SvUV(ST(1));
49 }
50 RETVAL = THIS->surface_type;
51 OUTPUT:
52 RETVAL
53
54 double
55 Surface::bridge_angle(...)
56 CODE:
57 if (items > 1) {
58 THIS->bridge_angle = (double)SvNV(ST(1));
59 }
60 RETVAL = THIS->bridge_angle;
61 OUTPUT:
62 RETVAL
63
64 unsigned short
65 Surface::extra_perimeters(...)
66 CODE:
67 if (items > 1) {
68 THIS->extra_perimeters = (double)SvUV(ST(1));
69 }
70 RETVAL = THIS->extra_perimeters;
71 OUTPUT:
72 RETVAL
73
74 Polygons
75 Surface::polygons()
76 CODE:
77 RETVAL.push_back(THIS->expolygon.contour);
78 for (Polygons::iterator it = THIS->expolygon.holes.begin(); it != THIS->expolygon.holes.end(); ++it) {
79 RETVAL.push_back((*it));
80 }
81 OUTPUT:
82 RETVAL
83
84 Surfaces
85 Surface::offset(delta, scale = CLIPPER_OFFSET_SCALE, joinType = ClipperLib::jtMiter, miterLimit = 3)
86 const float delta
87 double scale
88 ClipperLib::JoinType joinType
89 double miterLimit
90 CODE:
91 offset(*THIS, &RETVAL, delta, scale, joinType, miterLimit);
92 OUTPUT:
93 RETVAL
94
95 %}
96 };
97
98 %package{Slic3r::Surface};
99 %{
100
101 IV
102 _constant()
103 ALIAS:
104 S_TYPE_TOP = stTop
105 S_TYPE_BOTTOM = stBottom
106 S_TYPE_BOTTOMBRIDGE = stBottomBridge
107 S_TYPE_INTERNAL = stInternal
108 S_TYPE_INTERNALSOLID = stInternalSolid
109 S_TYPE_INTERNALBRIDGE = stInternalBridge
110 S_TYPE_INTERNALVOID = stInternalVoid
111 S_TYPW_PERIMETER = stPerimeter
112 PROTOTYPE:
113 CODE:
114 RETVAL = ix;
115 OUTPUT: RETVAL
116
117 %}
118
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/SurfaceCollection.hpp"
5 %}
6
7 %name{Slic3r::Surface::Collection} class SurfaceCollection {
8 %name{_new} SurfaceCollection();
9 ~SurfaceCollection();
10 void clear()
11 %code{% THIS->surfaces.clear(); %};
12 void append(Surface* surface)
13 %code{% THIS->surfaces.push_back(*surface); %};
14 int count()
15 %code{% RETVAL = THIS->surfaces.size(); %};
16 void simplify(double tolerance);
17 %{
18
19 SV*
20 SurfaceCollection::arrayref()
21 CODE:
22 AV* av = newAV();
23 av_fill(av, THIS->surfaces.size()-1);
24 int i = 0;
25 for (Surfaces::iterator it = THIS->surfaces.begin(); it != THIS->surfaces.end(); ++it) {
26 av_store(av, i++, perl_to_SV_ref(*it));
27 }
28 RETVAL = newRV_noinc((SV*)av);
29 OUTPUT:
30 RETVAL
31
32 SV*
33 SurfaceCollection::filter_by_type(surface_type)
34 SurfaceType surface_type;
35 CODE:
36 AV* av = newAV();
37 for (Surfaces::iterator it = THIS->surfaces.begin(); it != THIS->surfaces.end(); ++it) {
38 if ((*it).surface_type == surface_type) av_push(av, perl_to_SV_ref(*it));
39 }
40 RETVAL = newRV_noinc((SV*)av);
41 OUTPUT:
42 RETVAL
43
44 void
45 SurfaceCollection::replace(index, surface)
46 int index
47 Surface* surface
48 CODE:
49 THIS->surfaces[index] = *surface;
50
51 void
52 SurfaceCollection::set_surface_type(index, surface_type)
53 int index
54 SurfaceType surface_type;
55 CODE:
56 THIS->surfaces[index].surface_type = surface_type;
57
58 SV*
59 SurfaceCollection::group()
60 CODE:
61 // perform grouping
62 std::vector<SurfacesPtr> groups;
63 THIS->group(&groups);
64
65 // build return arrayref
66 AV* av = newAV();
67 av_fill(av, groups.size()-1);
68 size_t i = 0;
69 for (std::vector<SurfacesPtr>::iterator it = groups.begin(); it != groups.end(); ++it) {
70 AV* innerav = newAV();
71 av_fill(innerav, it->size()-1);
72 size_t j = 0;
73 for (SurfacesPtr::iterator it_s = it->begin(); it_s != it->end(); ++it_s) {
74 av_store(innerav, j++, perl_to_SV_clone_ref(**it_s));
75 }
76 av_store(av, i++, newRV_noinc((SV*)innerav));
77 }
78 RETVAL = newRV_noinc((SV*)av);
79 OUTPUT:
80 RETVAL
81
82 %}
83 };
0 %module{Slic3r::XS};
1
2 %{
3 #include <xsinit.h>
4 #include "libslic3r/TriangleMesh.hpp"
5 %}
6
7 %name{Slic3r::TriangleMesh} class TriangleMesh {
8 TriangleMesh();
9 ~TriangleMesh();
10 Clone<TriangleMesh> clone()
11 %code{% RETVAL = THIS; %};
12 void ReadSTLFile(char* input_file);
13 void write_ascii(char* output_file);
14 void write_binary(char* output_file);
15 void repair();
16 void WriteOBJFile(char* output_file);
17 void scale(float factor);
18 void scale_xyz(Pointf3* versor)
19 %code{% THIS->scale(*versor); %};
20 void translate(float x, float y, float z);
21 void rotate_x(float angle);
22 void rotate_y(float angle);
23 void rotate_z(float angle);
24 void mirror_x();
25 void mirror_y();
26 void mirror_z();
27 void align_to_origin();
28 void rotate(double angle, Point* center);
29 TriangleMeshPtrs split();
30 void merge(TriangleMesh* mesh)
31 %code{% THIS->merge(*mesh); %};
32 ExPolygons horizontal_projection();
33 Clone<Polygon> convex_hull();
34 Clone<BoundingBoxf3> bounding_box();
35 Clone<Pointf3> center()
36 %code{% RETVAL = THIS->bounding_box().center(); %};
37 int facets_count();
38 void reset_repair_stats();
39 %{
40
41 void
42 TriangleMesh::ReadFromPerl(vertices, facets)
43 SV* vertices
44 SV* facets
45 CODE:
46 stl_file &stl = THIS->stl;
47 stl.error = 0;
48 stl.stats.type = inmemory;
49
50 // count facets and allocate memory
51 AV* facets_av = (AV*)SvRV(facets);
52 stl.stats.number_of_facets = av_len(facets_av)+1;
53 stl.stats.original_num_facets = stl.stats.number_of_facets;
54 stl_allocate(&stl);
55
56 // read geometry
57 AV* vertices_av = (AV*)SvRV(vertices);
58 for (int i = 0; i < stl.stats.number_of_facets; i++) {
59 AV* facet_av = (AV*)SvRV(*av_fetch(facets_av, i, 0));
60 stl_facet facet;
61 facet.normal.x = 0;
62 facet.normal.y = 0;
63 facet.normal.z = 0;
64 for (unsigned int v = 0; v <= 2; v++) {
65 AV* vertex_av = (AV*)SvRV(*av_fetch(vertices_av, SvIV(*av_fetch(facet_av, v, 0)), 0));
66 facet.vertex[v].x = SvNV(*av_fetch(vertex_av, 0, 0));
67 facet.vertex[v].y = SvNV(*av_fetch(vertex_av, 1, 0));
68 facet.vertex[v].z = SvNV(*av_fetch(vertex_av, 2, 0));
69 }
70 facet.extra[0] = 0;
71 facet.extra[1] = 0;
72
73 stl.facet_start[i] = facet;
74 }
75
76 stl_get_size(&stl);
77
78 SV*
79 TriangleMesh::stats()
80 CODE:
81 HV* hv = newHV();
82 (void)hv_stores( hv, "number_of_facets", newSViv(THIS->stl.stats.number_of_facets) );
83 (void)hv_stores( hv, "number_of_parts", newSViv(THIS->stl.stats.number_of_parts) );
84 (void)hv_stores( hv, "volume", newSVnv(THIS->stl.stats.volume) );
85 (void)hv_stores( hv, "degenerate_facets", newSViv(THIS->stl.stats.degenerate_facets) );
86 (void)hv_stores( hv, "edges_fixed", newSViv(THIS->stl.stats.edges_fixed) );
87 (void)hv_stores( hv, "facets_removed", newSViv(THIS->stl.stats.facets_removed) );
88 (void)hv_stores( hv, "facets_added", newSViv(THIS->stl.stats.facets_added) );
89 (void)hv_stores( hv, "facets_reversed", newSViv(THIS->stl.stats.facets_reversed) );
90 (void)hv_stores( hv, "backwards_edges", newSViv(THIS->stl.stats.backwards_edges) );
91 (void)hv_stores( hv, "normals_fixed", newSViv(THIS->stl.stats.normals_fixed) );
92 RETVAL = (SV*)newRV_noinc((SV*)hv);
93 OUTPUT:
94 RETVAL
95
96 SV*
97 TriangleMesh::vertices()
98 CODE:
99 if (!THIS->repaired) CONFESS("vertices() requires repair()");
100
101 if (THIS->stl.v_shared == NULL)
102 stl_generate_shared_vertices(&(THIS->stl));
103
104 // vertices
105 AV* vertices = newAV();
106 av_extend(vertices, THIS->stl.stats.shared_vertices);
107 for (int i = 0; i < THIS->stl.stats.shared_vertices; i++) {
108 AV* vertex = newAV();
109 av_store(vertices, i, newRV_noinc((SV*)vertex));
110 av_extend(vertex, 2);
111 av_store(vertex, 0, newSVnv(THIS->stl.v_shared[i].x));
112 av_store(vertex, 1, newSVnv(THIS->stl.v_shared[i].y));
113 av_store(vertex, 2, newSVnv(THIS->stl.v_shared[i].z));
114 }
115
116 RETVAL = newRV_noinc((SV*)vertices);
117 OUTPUT:
118 RETVAL
119
120 SV*
121 TriangleMesh::facets()
122 CODE:
123 if (!THIS->repaired) CONFESS("facets() requires repair()");
124
125 if (THIS->stl.v_shared == NULL)
126 stl_generate_shared_vertices(&(THIS->stl));
127
128 // facets
129 AV* facets = newAV();
130 av_extend(facets, THIS->stl.stats.number_of_facets);
131 for (int i = 0; i < THIS->stl.stats.number_of_facets; i++) {
132 AV* facet = newAV();
133 av_store(facets, i, newRV_noinc((SV*)facet));
134 av_extend(facet, 2);
135 av_store(facet, 0, newSVnv(THIS->stl.v_indices[i].vertex[0]));
136 av_store(facet, 1, newSVnv(THIS->stl.v_indices[i].vertex[1]));
137 av_store(facet, 2, newSVnv(THIS->stl.v_indices[i].vertex[2]));
138 }
139
140 RETVAL = newRV_noinc((SV*)facets);
141 OUTPUT:
142 RETVAL
143
144 SV*
145 TriangleMesh::normals()
146 CODE:
147 if (!THIS->repaired) CONFESS("normals() requires repair()");
148
149 // normals
150 AV* normals = newAV();
151 av_extend(normals, THIS->stl.stats.number_of_facets);
152 for (int i = 0; i < THIS->stl.stats.number_of_facets; i++) {
153 AV* facet = newAV();
154 av_store(normals, i, newRV_noinc((SV*)facet));
155 av_extend(facet, 2);
156 av_store(facet, 0, newSVnv(THIS->stl.facet_start[i].normal.x));
157 av_store(facet, 1, newSVnv(THIS->stl.facet_start[i].normal.y));
158 av_store(facet, 2, newSVnv(THIS->stl.facet_start[i].normal.z));
159 }
160
161 RETVAL = newRV_noinc((SV*)normals);
162 OUTPUT:
163 RETVAL
164
165 SV*
166 TriangleMesh::size()
167 CODE:
168 AV* size = newAV();
169 av_extend(size, 2);
170 av_store(size, 0, newSVnv(THIS->stl.stats.size.x));
171 av_store(size, 1, newSVnv(THIS->stl.stats.size.y));
172 av_store(size, 2, newSVnv(THIS->stl.stats.size.z));
173 RETVAL = newRV_noinc((SV*)size);
174 OUTPUT:
175 RETVAL
176
177 SV*
178 TriangleMesh::slice(z)
179 std::vector<double> z
180 CODE:
181 // convert doubles to floats
182 std::vector<float> z_f(z.begin(), z.end());
183
184 std::vector<ExPolygons> layers;
185 TriangleMeshSlicer mslicer(THIS);
186 mslicer.slice(z_f, &layers);
187
188 AV* layers_av = newAV();
189 size_t len = layers.size();
190 if (len > 0) av_extend(layers_av, len-1);
191 for (unsigned int i = 0; i < layers.size(); i++) {
192 AV* expolygons_av = newAV();
193 len = layers[i].size();
194 if (len > 0) av_extend(expolygons_av, len-1);
195 unsigned int j = 0;
196 for (ExPolygons::iterator it = layers[i].begin(); it != layers[i].end(); ++it) {
197 av_store(expolygons_av, j++, perl_to_SV_clone_ref(*it));
198 }
199 av_store(layers_av, i, newRV_noinc((SV*)expolygons_av));
200 }
201 RETVAL = (SV*)newRV_noinc((SV*)layers_av);
202 OUTPUT:
203 RETVAL
204
205 void
206 TriangleMesh::cut(z, upper, lower)
207 float z;
208 TriangleMesh* upper;
209 TriangleMesh* lower;
210 CODE:
211 TriangleMeshSlicer mslicer(THIS);
212 mslicer.cut(z, upper, lower);
213
214 std::vector<double>
215 TriangleMesh::bb3()
216 CODE:
217 RETVAL.push_back(THIS->stl.stats.min.x);
218 RETVAL.push_back(THIS->stl.stats.min.y);
219 RETVAL.push_back(THIS->stl.stats.max.x);
220 RETVAL.push_back(THIS->stl.stats.max.y);
221 RETVAL.push_back(THIS->stl.stats.min.z);
222 RETVAL.push_back(THIS->stl.stats.max.z);
223 OUTPUT:
224 RETVAL
225
226 %}
227 };
228
229 %package{Slic3r::TriangleMesh};
230
231 %{
232 PROTOTYPES: DISABLE
233
234 std::string
235 hello_world()
236 CODE:
237 RETVAL = "Hello world!";
238 OUTPUT:
239 RETVAL
240 %}
0 %module{Slic3r::XS};
1 %package{Slic3r::XS};
2
3 #include <xsinit.h>
4
5 %{
6
7 %}
8
9 %package{Slic3r};
10 %{
11
12 SV*
13 VERSION()
14 CODE:
15 RETVAL = newSVpv(SLIC3R_VERSION, 0);
16 OUTPUT: RETVAL
17
18 SV*
19 DEBUG_OUT_PATH_PREFIX()
20 CODE:
21 RETVAL = newSVpv(SLIC3R_DEBUG_OUT_PATH_PREFIX, 0);
22 OUTPUT: RETVAL
23
24 SV*
25 FORK_NAME()
26 CODE:
27 RETVAL = newSVpv(SLIC3R_FORK_NAME, 0);
28 OUTPUT: RETVAL
29
30 void
31 xspp_test_croak_hangs_on_strawberry()
32 CODE:
33 try {
34 throw 1;
35 } catch (...) {
36 croak("xspp_test_croak_hangs_on_strawberry: exception catched\n");
37 }
38 %}
0 coordf_t T_NV
1
2 std::string T_STD_STRING
3 t_config_option_key T_STD_STRING
4 t_model_material_id T_STD_STRING
5
6 std::vector<std::string> T_STD_VECTOR_STD_STRING
7
8 std::vector<int> T_STD_VECTOR_INT
9 std::vector<Points::size_type> T_STD_VECTOR_INT
10 std::vector<size_t> T_STD_VECTOR_INT
11
12 std::vector<unsigned int> T_STD_VECTOR_UINT
13
14 std::vector<double> T_STD_VECTOR_DOUBLE
15
16 t_layer_height_ranges T_LAYER_HEIGHT_RANGES
17
18
19 BoundingBox* O_OBJECT_SLIC3R
20 Ref<BoundingBox> O_OBJECT_SLIC3R_T
21 Clone<BoundingBox> O_OBJECT_SLIC3R_T
22
23 BoundingBoxf* O_OBJECT_SLIC3R
24 Ref<BoundingBoxf> O_OBJECT_SLIC3R_T
25 Clone<BoundingBoxf> O_OBJECT_SLIC3R_T
26
27 BoundingBoxf3* O_OBJECT_SLIC3R
28 Ref<BoundingBoxf3> O_OBJECT_SLIC3R_T
29 Clone<BoundingBoxf3> O_OBJECT_SLIC3R_T
30
31 DynamicPrintConfig* O_OBJECT_SLIC3R
32 Ref<DynamicPrintConfig> O_OBJECT_SLIC3R_T
33
34 StaticPrintConfig* O_OBJECT_SLIC3R
35 Ref<StaticPrintConfig> O_OBJECT_SLIC3R_T
36
37 PrintObjectConfig* O_OBJECT_SLIC3R
38 Ref<PrintObjectConfig> O_OBJECT_SLIC3R_T
39
40 PrintRegionConfig* O_OBJECT_SLIC3R
41 Ref<PrintRegionConfig> O_OBJECT_SLIC3R_T
42
43 GCodeConfig* O_OBJECT_SLIC3R
44 Ref<GCodeConfig> O_OBJECT_SLIC3R_T
45
46 PrintConfig* O_OBJECT_SLIC3R
47 Ref<PrintConfig> O_OBJECT_SLIC3R_T
48
49 FullPrintConfig* O_OBJECT_SLIC3R
50 Ref<FullPrintConfig> O_OBJECT_SLIC3R_T
51
52 ZTable* O_OBJECT
53
54 TriangleMesh* O_OBJECT_SLIC3R
55 Ref<TriangleMesh> O_OBJECT_SLIC3R_T
56 Clone<TriangleMesh> O_OBJECT_SLIC3R_T
57
58 Point* O_OBJECT_SLIC3R
59 Ref<Point> O_OBJECT_SLIC3R_T
60 Clone<Point> O_OBJECT_SLIC3R_T
61
62 Point3* O_OBJECT_SLIC3R
63 Ref<Point3> O_OBJECT_SLIC3R_T
64 Clone<Point3> O_OBJECT_SLIC3R_T
65
66 Pointf* O_OBJECT_SLIC3R
67 Ref<Pointf> O_OBJECT_SLIC3R_T
68 Clone<Pointf> O_OBJECT_SLIC3R_T
69
70 Pointf3* O_OBJECT_SLIC3R
71 Ref<Pointf3> O_OBJECT_SLIC3R_T
72 Clone<Pointf3> O_OBJECT_SLIC3R_T
73
74 Line* O_OBJECT_SLIC3R
75 Ref<Line> O_OBJECT_SLIC3R_T
76 Clone<Line> O_OBJECT_SLIC3R_T
77
78 Linef3* O_OBJECT_SLIC3R
79 Ref<Linef3> O_OBJECT_SLIC3R_T
80 Clone<Linef3> O_OBJECT_SLIC3R_T
81
82 Polyline* O_OBJECT_SLIC3R
83 Ref<Polyline> O_OBJECT_SLIC3R_T
84 Clone<Polyline> O_OBJECT_SLIC3R_T
85
86 PolylineCollection* O_OBJECT_SLIC3R
87 Ref<PolylineCollection> O_OBJECT_SLIC3R_T
88 Clone<PolylineCollection> O_OBJECT_SLIC3R_T
89
90 Polygon* O_OBJECT_SLIC3R
91 Ref<Polygon> O_OBJECT_SLIC3R_T
92 Clone<Polygon> O_OBJECT_SLIC3R_T
93
94 ExPolygon* O_OBJECT_SLIC3R
95 Ref<ExPolygon> O_OBJECT_SLIC3R_T
96 Clone<ExPolygon> O_OBJECT_SLIC3R_T
97
98 ExPolygonCollection* O_OBJECT_SLIC3R
99 Ref<ExPolygonCollection> O_OBJECT_SLIC3R_T
100 Clone<ExPolygonCollection> O_OBJECT_SLIC3R_T
101
102 ExtrusionEntityCollection* O_OBJECT_SLIC3R
103 Ref<ExtrusionEntityCollection> O_OBJECT_SLIC3R_T
104 Clone<ExtrusionEntityCollection> O_OBJECT_SLIC3R_T
105
106 ExtrusionPath* O_OBJECT_SLIC3R
107 Ref<ExtrusionPath> O_OBJECT_SLIC3R_T
108 Clone<ExtrusionPath> O_OBJECT_SLIC3R_T
109
110 ExtrusionLoop* O_OBJECT_SLIC3R
111 Ref<ExtrusionLoop> O_OBJECT_SLIC3R_T
112 Clone<ExtrusionLoop> O_OBJECT_SLIC3R_T
113
114 ExtrusionSimulator* O_OBJECT_SLIC3R
115 Ref<ExtrusionSimulator> O_OBJECT_SLIC3R_T
116 Clone<ExtrusionSimulator> O_OBJECT_SLIC3R_T
117
118 Filler* O_OBJECT_SLIC3R
119 Ref<Filler> O_OBJECT_SLIC3R_T
120 Clone<Filler> O_OBJECT_SLIC3R_T
121
122 Flow* O_OBJECT_SLIC3R
123 Ref<Flow> O_OBJECT_SLIC3R_T
124 Clone<Flow> O_OBJECT_SLIC3R_T
125
126 PrintState* O_OBJECT_SLIC3R
127 Ref<PrintState> O_OBJECT_SLIC3R_T
128
129 Surface* O_OBJECT_SLIC3R
130 Ref<Surface> O_OBJECT_SLIC3R_T
131 Clone<Surface> O_OBJECT_SLIC3R_T
132
133 SurfaceCollection* O_OBJECT_SLIC3R
134 Ref<SurfaceCollection> O_OBJECT_SLIC3R_T
135
136 Extruder* O_OBJECT_SLIC3R
137 Ref<Extruder> O_OBJECT_SLIC3R_T
138 Clone<Extruder> O_OBJECT_SLIC3R_T
139
140 Model* O_OBJECT_SLIC3R
141 Ref<Model> O_OBJECT_SLIC3R_T
142 Clone<Model> O_OBJECT_SLIC3R_T
143
144 ModelMaterial* O_OBJECT_SLIC3R
145 Ref<ModelMaterial> O_OBJECT_SLIC3R_T
146 Clone<ModelMaterial> O_OBJECT_SLIC3R_T
147
148 ModelObject* O_OBJECT_SLIC3R
149 Ref<ModelObject> O_OBJECT_SLIC3R_T
150 Clone<ModelObject> O_OBJECT_SLIC3R_T
151
152 ModelVolume* O_OBJECT_SLIC3R
153 Ref<ModelVolume> O_OBJECT_SLIC3R_T
154 Clone<ModelVolume> O_OBJECT_SLIC3R_T
155
156 ModelInstance* O_OBJECT_SLIC3R
157 Ref<ModelInstance> O_OBJECT_SLIC3R_T
158 Clone<ModelInstance> O_OBJECT_SLIC3R_T
159
160 PrintRegion* O_OBJECT_SLIC3R
161 Ref<PrintRegion> O_OBJECT_SLIC3R_T
162
163 PrintObject* O_OBJECT_SLIC3R
164 Ref<PrintObject> O_OBJECT_SLIC3R_T
165
166 Print* O_OBJECT_SLIC3R
167 Ref<Print> O_OBJECT_SLIC3R_T
168 Clone<Print> O_OBJECT_SLIC3R_T
169
170 LayerRegion* O_OBJECT_SLIC3R
171 Ref<LayerRegion> O_OBJECT_SLIC3R_T
172
173 Layer* O_OBJECT_SLIC3R
174 Ref<Layer> O_OBJECT_SLIC3R_T
175
176 SupportLayer* O_OBJECT_SLIC3R
177 Ref<SupportLayer> O_OBJECT_SLIC3R_T
178
179 PlaceholderParser* O_OBJECT_SLIC3R
180 Ref<PlaceholderParser> O_OBJECT_SLIC3R_T
181 Clone<PlaceholderParser> O_OBJECT_SLIC3R_T
182
183 AvoidCrossingPerimeters* O_OBJECT_SLIC3R
184 Ref<AvoidCrossingPerimeters> O_OBJECT_SLIC3R_T
185 Clone<AvoidCrossingPerimeters> O_OBJECT_SLIC3R_T
186
187 Wipe* O_OBJECT_SLIC3R
188 Ref<Wipe> O_OBJECT_SLIC3R_T
189 Clone<Wipe> O_OBJECT_SLIC3R_T
190
191 OozePrevention* O_OBJECT_SLIC3R
192 Ref<OozePrevention> O_OBJECT_SLIC3R_T
193 Clone<OozePrevention> O_OBJECT_SLIC3R_T
194
195 GCode* O_OBJECT_SLIC3R
196 Ref<GCode> O_OBJECT_SLIC3R_T
197 Clone<GCode> O_OBJECT_SLIC3R_T
198
199 MotionPlanner* O_OBJECT_SLIC3R
200 Ref<MotionPlanner> O_OBJECT_SLIC3R_T
201 Clone<MotionPlanner> O_OBJECT_SLIC3R_T
202
203 GCodeSender* O_OBJECT_SLIC3R
204 Ref<GCodeSender> O_OBJECT_SLIC3R_T
205 Clone<GCodeSender> O_OBJECT_SLIC3R_T
206
207 GCodeWriter* O_OBJECT_SLIC3R
208 Ref<GCodeWriter> O_OBJECT_SLIC3R_T
209 Clone<GCodeWriter> O_OBJECT_SLIC3R_T
210
211 GCodePressureEqualizer* O_OBJECT_SLIC3R
212 Ref<GCodePressureEqualizer> O_OBJECT_SLIC3R_T
213 Clone<GCodePressureEqualizer> O_OBJECT_SLIC3R_T
214
215 BridgeDetector* O_OBJECT_SLIC3R
216 Ref<BridgeDetector> O_OBJECT_SLIC3R_T
217 Clone<BridgeDetector> O_OBJECT_SLIC3R_T
218
219 PerimeterGenerator* O_OBJECT_SLIC3R
220 Ref<PerimeterGenerator> O_OBJECT_SLIC3R_T
221 Clone<PerimeterGenerator> O_OBJECT_SLIC3R_T
222
223 PrintObjectSupportMaterial* O_OBJECT_SLIC3R
224 Ref<PrintObjectSupportMaterial> O_OBJECT_SLIC3R_T
225 Clone<PrintObjectSupportMaterial> O_OBJECT_SLIC3R_T
226
227 GLVertexArray* O_OBJECT_SLIC3R
228
229 Axis T_UV
230 ExtrusionLoopRole T_UV
231 ExtrusionRole T_UV
232 ExtrusionSimulationType T_UV
233 FlowRole T_UV
234 PrintStep T_UV
235 PrintObjectStep T_UV
236 SurfaceType T_UV
237 ClipperLib::JoinType T_UV
238 ClipperLib::PolyFillType T_UV
239
240 # we return these types whenever we want the items to be cloned
241 Points T_ARRAYREF
242 Pointfs T_ARRAYREF
243 Lines T_ARRAYREF
244 Polygons T_ARRAYREF
245 Polylines T_ARRAYREF
246 ExPolygons T_ARRAYREF
247 ExtrusionPaths T_ARRAYREF
248 Surfaces T_ARRAYREF
249
250 # we return these types whenever we want the items to be returned
251 # by reference and marked ::Ref because they're contained in another
252 # Perl object
253 Polygons* T_ARRAYREF_PTR
254 ModelObjectPtrs* T_PTR_ARRAYREF_PTR
255 ModelVolumePtrs* T_PTR_ARRAYREF_PTR
256 ModelInstancePtrs* T_PTR_ARRAYREF_PTR
257 PrintRegionPtrs* T_PTR_ARRAYREF_PTR
258 PrintObjectPtrs* T_PTR_ARRAYREF_PTR
259 LayerPtrs* T_PTR_ARRAYREF_PTR
260 SupportLayerPtrs* T_PTR_ARRAYREF_PTR
261
262 # we return these types whenever we want the items to be returned
263 # by reference and not marked ::Ref because they're newly allocated
264 # and not referenced by any Perl object
265 TriangleMeshPtrs T_PTR_ARRAYREF
266
267
268 INPUT
269
270 T_STD_STRING
271 {
272 size_t len;
273 // const char * c = SvPV($arg, len);
274 // Always convert strings to UTF-8 before passing them to XS
275 const char * c = SvPVutf8($arg, len);
276 $var = std::string(c, len);
277 }
278
279 T_STD_VECTOR_STD_STRING
280 if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
281 AV* av = (AV*)SvRV($arg);
282 const unsigned int alen = av_len(av)+1;
283 $var = std::vector<std::string>(alen);
284 STRLEN len;
285 char* tmp;
286 SV** elem;
287 for (unsigned int i = 0; i < alen; i++) {
288 elem = av_fetch(av, i, 0);
289 if (elem != NULL) {
290 tmp = SvPV(*elem, len);
291 ${var}[i] = std::string(tmp, len);
292 }
293 else
294 ${var}[i] = std::string(\"\");
295 }
296 }
297 else
298 Perl_croak(aTHX_ \"%s: %s is not an array reference\",
299 ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
300 \"$var\");
301
302 T_STD_VECTOR_INT
303 if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
304 AV* av = (AV*)SvRV($arg);
305 const unsigned int len = av_len(av)+1;
306 $var = std::vector<int>(len);
307 SV** elem;
308 for (unsigned int i = 0; i < len; i++) {
309 elem = av_fetch(av, i, 0);
310 if (elem != NULL)
311 ${var}[i] = SvIV(*elem);
312 else
313 ${var}[i] = 0;
314 }
315 }
316 else
317 Perl_croak(aTHX_ \"%s: %s is not an array reference\",
318 ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
319 \"$var\");
320
321 T_STD_VECTOR_UINT
322 if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
323 AV* av = (AV*)SvRV($arg);
324 const unsigned int len = av_len(av)+1;
325 $var = std::vector<unsigned int>(len);
326 SV** elem;
327 for (unsigned int i = 0; i < len; i++) {
328 elem = av_fetch(av, i, 0);
329 if (elem != NULL)
330 ${var}[i] = SvUV(*elem);
331 else
332 ${var}[i] = 0;
333 }
334 }
335 else
336 Perl_croak(aTHX_ \"%s: %s is not an array reference\",
337 ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
338 \"$var\");
339
340 T_STD_VECTOR_DOUBLE
341 if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
342 AV* av = (AV*)SvRV($arg);
343 const unsigned int len = av_len(av)+1;
344 $var = std::vector<double>(len);
345 SV** elem;
346 for (unsigned int i = 0; i < len; i++) {
347 elem = av_fetch(av, i, 0);
348 if (elem != NULL)
349 ${var}[i] = SvNV(*elem);
350 else
351 ${var}[i] = 0.;
352 }
353 }
354 else
355 Perl_croak(aTHX_ \"%s: %s is not an array reference\",
356 ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
357 \"$var\");
358
359 O_OBJECT_SLIC3R
360 if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) {
361 if ( sv_isa($arg, Slic3r::perl_class_name($var) ) || sv_isa($arg, Slic3r::perl_class_name_ref($var) )) {
362 $var = ($type)SvIV((SV*)SvRV( $arg ));
363 } else {
364 croak(\"$var is not of type %s (got %s)\", Slic3r::perl_class_name($var), HvNAME(SvSTASH(SvRV($arg))));
365 XSRETURN_UNDEF;
366 }
367 } else {
368 warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
369 XSRETURN_UNDEF;
370 }
371
372 T_ARRAYREF
373 if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVAV) {
374 AV* av = (AV*)SvRV($arg);
375 const unsigned int len = av_len(av)+1;
376 $var.resize(len);
377 for (unsigned int i = 0; i < len; i++) {
378 SV** elem = av_fetch(av, i, 0);
379 from_SV_check(*elem, &$var\[i]);
380 }
381 } else
382 Perl_croak(aTHX_ \"%s: %s is not an array reference\",
383 ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
384 \"$var\");
385
386 T_LAYER_HEIGHT_RANGES
387 {
388 if (!SvROK($arg) || SvTYPE(SvRV($arg)) != SVt_PVAV) {
389 Perl_croak(aTHX_ \"%s: %s is not an array reference\",
390 ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
391 \"$var\");
392 }
393
394 AV* av = (AV*)SvRV($arg);
395 const unsigned int len = av_len(av)+1;
396 t_layer_height_ranges tmp_ranges;
397 for (unsigned int i = 0; i < len; i++) {
398 SV* elem = *av_fetch(av, i, 0);
399 if (!SvROK(elem) || SvTYPE(SvRV(elem)) != SVt_PVAV) {
400 Perl_croak(
401 aTHX_ \"%s: %s contains something that is not an array reference\",
402 ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
403 \"$var\");
404 }
405
406 AV* elemAV = (AV*)SvRV(elem);
407 if (av_len(elemAV) + 1 != 3) {
408 Perl_croak(
409 aTHX_ \"%s: %s contains an array that isn't 3 elements long\",
410 ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
411 \"$var\");
412 }
413
414 coordf_t vals[3];
415 for (unsigned int j = 0; j < 3; ++j) {
416 SV *elem_elem = *av_fetch(elemAV, j, 0);
417 if (!looks_like_number(elem_elem)) {
418 Perl_croak(
419 aTHX_ \"%s: layer ranges and heights must be numbers\",
420 ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]});
421 }
422
423 vals[j] = SvNV(elem_elem);
424 }
425
426 tmp_ranges[t_layer_height_range(vals[0], vals[1])] = vals[2];
427 }
428
429 $var = tmp_ranges;
430 }
431
432
433 OUTPUT
434
435 T_STD_STRING
436 $arg = newSVpvn_utf8( $var.c_str(), $var.length(), true );
437
438 T_STD_VECTOR_STD_STRING
439 AV* av = newAV();
440 $arg = newRV_noinc((SV*)av);
441 sv_2mortal($arg);
442 const unsigned int len = $var.size();
443 if (len)
444 av_extend(av, len-1);
445 for (unsigned int i = 0; i < len; i++) {
446 const std::string& str = ${var}[i];
447 STRLEN len = str.length();
448 av_store(av, i, newSVpvn_utf8(str.c_str(), len, true));
449 }
450
451 T_STD_VECTOR_INT
452 AV* av = newAV();
453 $arg = newRV_noinc((SV*)av);
454 sv_2mortal($arg);
455 const unsigned int len = $var.size();
456 if (len)
457 av_extend(av, len-1);
458 for (unsigned int i = 0; i < len; i++) {
459 av_store(av, i, newSViv(${var}[i]));
460 }
461
462 T_STD_VECTOR_UINT
463 AV* av = newAV();
464 $arg = newRV_noinc((SV*)av);
465 sv_2mortal($arg);
466 const unsigned int len = $var.size();
467 if (len)
468 av_extend(av, len-1);
469 for (unsigned int i = 0; i < len; i++) {
470 av_store(av, i, newSVuv(${var}[i]));
471 }
472
473 T_STD_VECTOR_DOUBLE
474 AV* av = newAV();
475 $arg = newRV_noinc((SV*)av);
476 sv_2mortal($arg);
477 const unsigned int len = $var.size();
478 if (len)
479 av_extend(av, len-1);
480 for (unsigned int i = 0; i < len; i++) {
481 av_store(av, i, newSVnv(${var}[i]));
482 }
483
484 # return object from pointer
485 O_OBJECT_SLIC3R
486 if ($var == NULL)
487 XSRETURN_UNDEF;
488 sv_setref_pv( $arg, Slic3r::perl_class_name($var), (void*)$var );
489
490 # return value handled by template class
491 O_OBJECT_SLIC3R_T
492 if ($var == NULL)
493 XSRETURN_UNDEF;
494 sv_setref_pv( $arg, $type\::CLASS(), (void*)$var );
495
496
497 T_ARRAYREF
498 AV* av = newAV();
499 $arg = newRV_noinc((SV*)av);
500 sv_2mortal($arg);
501 const unsigned int len = $var.size();
502 if (len > 0) av_extend(av, len-1);
503 int i = 0;
504 for (${type}::const_iterator it = $var.begin(); it != $var.end(); ++it) {
505 av_store(av, i++, perl_to_SV_clone_ref(*it));
506 }
507
508 T_ARRAYREF_PTR
509 AV* av = newAV();
510 $arg = newRV_noinc((SV*)av);
511 sv_2mortal($arg);
512 const unsigned int len = $var->size();
513 if (len > 0) av_extend(av, len-1);
514 int i = 0;
515 for (${ my $t = $type; $t =~ s/\*$//; \$t }::iterator it = $var->begin(); it != $var->end(); ++it) {
516 av_store(av, i++, perl_to_SV_ref(*it));
517 }
518
519 T_PTR_ARRAYREF_PTR
520 AV* av = newAV();
521 $arg = newRV_noinc((SV*)av);
522 sv_2mortal($arg);
523 const unsigned int len = $var->size();
524 if (len > 0) av_extend(av, len-1);
525 int i = 0;
526 for (${ my $t = $type; $t =~ s/\*$//; \$t }::iterator it = $var->begin(); it != $var->end(); ++it) {
527 av_store(av, i++, perl_to_SV_ref(**it));
528 }
529
530 T_PTR_ARRAYREF
531 AV* av = newAV();
532 $arg = newRV_noinc((SV*)av);
533 sv_2mortal($arg);
534 const unsigned int len = $var.size();
535 if (len > 0) av_extend(av, len-1);
536 int i = 0;
537 for (${type}::iterator it = $var.begin(); it != $var.end(); ++it) {
538 av_store(av, i++, to_SV(*it));
539 }
540
541 T_LAYER_HEIGHT_RANGES
542 AV* av = newAV();
543 $arg = newRV_noinc((SV*)av);
544 sv_2mortal($arg);
545 const unsigned int len = $var.size();
546 if (len > 0) av_extend(av, len-1);
547 // map is sorted, so we can just copy it in order
548 int i = 0;
549 for (${type}::iterator it = $var.begin(); it != $var.end(); ++it) {
550 const coordf_t range_values[] = {
551 it->first.first, // key's first = minz
552 it->first.second, // key's second = maxz
553 it->second, // value = height
554 };
555
556 AV *rangeAV = newAV();
557 av_extend(rangeAV, 2);
558 for (int j = 0; j < 3; ++j) {
559 av_store(rangeAV, j, newSVnv(range_values[j]));
560 }
561
562 av_store(av, i++, (SV*)newRV_noinc((SV*)rangeAV));
563 }
(New empty file)
0 %typemap{bool}{simple};
1 %typemap{size_t}{simple};
2 %typemap{coordf_t}{simple};
3 %typemap{std::string};
4 %typemap{t_config_option_key};
5 %typemap{t_model_material_id};
6 %typemap{std::vector<int>};
7 %typemap{std::vector<size_t>};
8 %typemap{std::vector<unsigned int>*};
9 %typemap{std::vector<double>};
10 %typemap{std::vector<double>*};
11 %typemap{std::vector<unsigned int>};
12 %typemap{std::vector<unsigned int>*};
13 %typemap{std::vector<std::string>};
14 %typemap{t_layer_height_ranges};
15 %typemap{void*};
16 %typemap{SV*};
17 %typemap{AV*};
18 %typemap{Point*};
19 %typemap{Ref<Point>}{simple};
20 %typemap{Clone<Point>}{simple};
21 %typemap{Point3*};
22 %typemap{Ref<Point3>}{simple};
23 %typemap{Clone<Point3>}{simple};
24 %typemap{Pointf*};
25 %typemap{Ref<Pointf>}{simple};
26 %typemap{Clone<Pointf>}{simple};
27 %typemap{Pointf3*};
28 %typemap{Ref<Pointf3>}{simple};
29 %typemap{Clone<Pointf3>}{simple};
30 %typemap{BoundingBox*};
31 %typemap{Ref<BoundingBox>}{simple};
32 %typemap{Clone<BoundingBox>}{simple};
33 %typemap{BoundingBoxf*};
34 %typemap{Ref<BoundingBoxf>}{simple};
35 %typemap{Clone<BoundingBoxf>}{simple};
36 %typemap{BoundingBoxf3*};
37 %typemap{Ref<BoundingBoxf3>}{simple};
38 %typemap{Clone<BoundingBoxf3>}{simple};
39 %typemap{DynamicPrintConfig*};
40 %typemap{Ref<DynamicPrintConfig>}{simple};
41 %typemap{StaticPrintConfig*};
42 %typemap{Ref<StaticPrintConfig>}{simple};
43 %typemap{PrintObjectConfig*};
44 %typemap{Ref<PrintObjectConfig>}{simple};
45 %typemap{PrintRegionConfig*};
46 %typemap{Ref<PrintRegionConfig>}{simple};
47 %typemap{GCodeConfig*};
48 %typemap{Ref<GCodeConfig>}{simple};
49 %typemap{PrintConfig*};
50 %typemap{Ref<PrintConfig>}{simple};
51 %typemap{FullPrintConfig*};
52 %typemap{Ref<FullPrintConfig>}{simple};
53 %typemap{ExPolygon*};
54 %typemap{Ref<ExPolygon>}{simple};
55 %typemap{Clone<ExPolygon>}{simple};
56 %typemap{ExPolygonCollection*};
57 %typemap{Ref<ExPolygonCollection>}{simple};
58 %typemap{Clone<ExPolygonCollection>}{simple};
59 %typemap{Filler*};
60 %typemap{Ref<Filler>}{simple};
61 %typemap{Clone<Filler>}{simple};
62 %typemap{Flow*};
63 %typemap{Ref<Flow>}{simple};
64 %typemap{Clone<Flow>}{simple};
65 %typemap{Line*};
66 %typemap{Ref<Line>}{simple};
67 %typemap{Clone<Line>}{simple};
68 %typemap{Linef3*};
69 %typemap{Ref<Linef3>}{simple};
70 %typemap{Clone<Linef3>}{simple};
71 %typemap{Polyline*};
72 %typemap{Ref<Polyline>}{simple};
73 %typemap{Clone<Polyline>}{simple};
74 %typemap{Polygon*};
75 %typemap{Ref<Polygon>}{simple};
76 %typemap{Clone<Polygon>}{simple};
77 %typemap{ExtrusionEntityCollection*};
78 %typemap{Ref<ExtrusionEntityCollection>}{simple};
79 %typemap{Clone<ExtrusionEntityCollection>}{simple};
80 %typemap{ExtrusionPath*};
81 %typemap{Ref<ExtrusionPath>}{simple};
82 %typemap{Clone<ExtrusionPath>}{simple};
83 %typemap{ExtrusionLoop*};
84 %typemap{Ref<ExtrusionLoop>}{simple};
85 %typemap{Clone<ExtrusionLoop>}{simple};
86 %typemap{ExtrusionSimulator*};
87 %typemap{Ref<ExtrusionSimulator>}{simple};
88 %typemap{Clone<ExtrusionSimulator>}{simple};
89 %typemap{TriangleMesh*};
90 %typemap{Ref<TriangleMesh>}{simple};
91 %typemap{Clone<TriangleMesh>}{simple};
92 %typemap{PolylineCollection*};
93 %typemap{Ref<PolylineCollection>}{simple};
94 %typemap{Clone<PolylineCollection>}{simple};
95 %typemap{MotionPlanner*};
96 %typemap{Ref<MotionPlanner>}{simple};
97 %typemap{Clone<MotionPlanner>}{simple};
98 %typemap{GCodeWriter*};
99 %typemap{Ref<GCodeWriter>}{simple};
100 %typemap{Clone<GCodeWriter>}{simple};
101 %typemap{GCodeSender*};
102 %typemap{Ref<GCodeSender>}{simple};
103 %typemap{Clone<GCodeSender>}{simple};
104 %typemap{GCodePressureEqualizer*};
105 %typemap{Ref<GCodePressureEqualizer>}{simple};
106 %typemap{Clone<GCodePressureEqualizer>}{simple};
107 %typemap{BridgeDetector*};
108 %typemap{Ref<BridgeDetector>}{simple};
109 %typemap{Clone<BridgeDetector>}{simple};
110 %typemap{SurfaceCollection*};
111 %typemap{Ref<SurfaceCollection>}{simple};
112 %typemap{Clone<SurfaceCollection>}{simple};
113 %typemap{PerimeterGenerator*};
114 %typemap{Ref<PerimeterGenerator>}{simple};
115 %typemap{Clone<PerimeterGenerator>}{simple};
116
117 %typemap{Surface*};
118 %typemap{Ref<Surface>}{simple};
119 %typemap{Clone<Surface>}{simple};
120
121 %typemap{PrintState*};
122 %typemap{Ref<PrintState>}{simple};
123
124 %typemap{PrintRegion*};
125 %typemap{Ref<PrintRegion>}{simple};
126
127 %typemap{PrintObject*};
128 %typemap{Ref<PrintObject>}{simple};
129
130 %typemap{Print*};
131 %typemap{Ref<Print>}{simple};
132 %typemap{Clone<Print>}{simple};
133
134 %typemap{LayerRegion*};
135 %typemap{Ref<LayerRegion>}{simple};
136
137 %typemap{Layer*};
138 %typemap{Ref<Layer>}{simple};
139
140 %typemap{SupportLayer*};
141 %typemap{Ref<SupportLayer>}{simple};
142
143 %typemap{PrintObjectSupportMaterial*};
144 %typemap{Ref<PrintObjectSupportMaterial>}{simple};
145 %typemap{Clone<PrintObjectSupportMaterial>}{simple};
146
147 %typemap{PlaceholderParser*};
148 %typemap{Ref<PlaceholderParser>}{simple};
149 %typemap{Clone<PlaceholderParser>}{simple};
150
151 %typemap{AvoidCrossingPerimeters*};
152 %typemap{Ref<AvoidCrossingPerimeters>}{simple};
153 %typemap{Clone<AvoidCrossingPerimeters>}{simple};
154
155 %typemap{Wipe*};
156 %typemap{Ref<Wipe>}{simple};
157 %typemap{Clone<Wipe>}{simple};
158
159 %typemap{OozePrevention*};
160 %typemap{Ref<OozePrevention>}{simple};
161 %typemap{Clone<OozePrevention>}{simple};
162
163 %typemap{GCode*};
164 %typemap{Ref<GCode>}{simple};
165 %typemap{Clone<GCode>}{simple};
166
167
168 %typemap{Points};
169 %typemap{Pointfs};
170 %typemap{Lines};
171 %typemap{Polygons};
172 %typemap{Polylines};
173 %typemap{ExPolygons};
174 %typemap{ExtrusionPaths};
175 %typemap{Surfaces};
176 %typemap{Polygons*};
177 %typemap{TriangleMesh*};
178 %typemap{TriangleMeshPtrs};
179 %typemap{Extruder*};
180 %typemap{Ref<Extruder>}{simple};
181 %typemap{Clone<Extruder>}{simple};
182 %typemap{Model*};
183 %typemap{Ref<Model>}{simple};
184 %typemap{Clone<Model>}{simple};
185 %typemap{ModelMaterial*};
186 %typemap{Ref<ModelMaterial>}{simple};
187 %typemap{Clone<ModelMaterial>}{simple};
188 %typemap{ModelObject*};
189 %typemap{Ref<ModelObject>}{simple};
190 %typemap{Clone<ModelObject>}{simple};
191 %typemap{ModelObjectPtrs*};
192 %typemap{Ref<ModelObjectPtrs>}{simple};
193 %typemap{Clone<ModelObjectPtrs>}{simple};
194 %typemap{ModelVolume*};
195 %typemap{Ref<ModelVolume>}{simple};
196 %typemap{Clone<ModelVolume>}{simple};
197 %typemap{ModelVolumePtrs*};
198 %typemap{Ref<ModelVolumePtrs>}{simple};
199 %typemap{Clone<ModelVolumePtrs>}{simple};
200 %typemap{ModelInstance*};
201 %typemap{Ref<ModelInstance>}{simple};
202 %typemap{Clone<ModelInstance>}{simple};
203 %typemap{ModelInstancePtrs*};
204 %typemap{Ref<ModelInstancePtrs>}{simple};
205 %typemap{Clone<ModelInstancePtrs>}{simple};
206 %typemap{GLVertexArray*};
207
208 %typemap{PrintRegionPtrs*};
209 %typemap{PrintObjectPtrs*};
210 %typemap{LayerPtrs*};
211 %typemap{SupportLayerPtrs*};
212
213
214 %typemap{Axis}{parsed}{
215 %cpp_type{Axis};
216 %precall_code{%
217 $CVar = (Axis)SvUV($PerlVar);
218 %};
219 };
220 %typemap{SurfaceType}{parsed}{
221 %cpp_type{SurfaceType};
222 %precall_code{%
223 $CVar = (SurfaceType)SvUV($PerlVar);
224 %};
225 };
226 %typemap{ExtrusionLoopRole}{parsed}{
227 %cpp_type{ExtrusionLoopRole};
228 %precall_code{%
229 $CVar = (ExtrusionLoopRole)SvUV($PerlVar);
230 %};
231 };
232 %typemap{ExtrusionRole}{parsed}{
233 %cpp_type{ExtrusionRole};
234 %precall_code{%
235 $CVar = (ExtrusionRole)SvUV($PerlVar);
236 %};
237 };
238 %typemap{ExtrusionSimulationType}{parsed}{
239 %cpp_type{ExtrusionSimulationType};
240 %precall_code{%
241 $CVar = (ExtrusionSimulationType)SvUV($PerlVar);
242 %};
243 };
244 %typemap{FlowRole}{parsed}{
245 %cpp_type{FlowRole};
246 %precall_code{%
247 $CVar = (FlowRole)SvUV($PerlVar);
248 %};
249 };
250 %typemap{PrintStep}{parsed}{
251 %cpp_type{PrintStep};
252 %precall_code{%
253 $CVar = (PrintStep)SvUV($PerlVar);
254 %};
255 };
256 %typemap{PrintObjectStep}{parsed}{
257 %cpp_type{PrintObjectStep};
258 %precall_code{%
259 $CVar = (PrintObjectStep)SvUV($PerlVar);
260 %};
261 };